1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_AARCH64_H |
14 | #define LLVM_CLANG_LIB_BASIC_TARGETS_AARCH64_H |
15 | |
16 | #include "OSTargets.h" |
17 | #include "clang/Basic/TargetBuiltins.h" |
18 | #include "llvm/Support/TargetParser.h" |
19 | |
20 | namespace clang { |
21 | namespace targets { |
22 | |
23 | class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo { |
24 | virtual void setDataLayout() = 0; |
25 | static const TargetInfo::GCCRegAlias GCCRegAliases[]; |
26 | static const char *const GCCRegNames[]; |
27 | |
28 | enum FPUModeEnum { FPUMode, NeonMode = (1 << 0), SveMode = (1 << 1) }; |
29 | |
30 | unsigned FPU; |
31 | unsigned CRC; |
32 | unsigned Crypto; |
33 | unsigned Unaligned; |
34 | unsigned HasFullFP16; |
35 | unsigned HasDotProd; |
36 | unsigned HasFP16FML; |
37 | llvm::AArch64::ArchKind ArchKind; |
38 | |
39 | static const Builtin::Info BuiltinInfo[]; |
40 | |
41 | std::string ABI; |
42 | |
43 | public: |
44 | AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); |
45 | |
46 | StringRef getABI() const override; |
47 | bool setABI(const std::string &Name) override; |
48 | |
49 | bool isValidCPUName(StringRef Name) const override; |
50 | void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override; |
51 | bool setCPU(const std::string &Name) override; |
52 | |
53 | bool useFP16ConversionIntrinsics() const override { |
54 | return false; |
55 | } |
56 | |
57 | void getTargetDefinesARMV81A(const LangOptions &Opts, |
58 | MacroBuilder &Builder) const; |
59 | void getTargetDefinesARMV82A(const LangOptions &Opts, |
60 | MacroBuilder &Builder) const; |
61 | void getTargetDefines(const LangOptions &Opts, |
62 | MacroBuilder &Builder) const override; |
63 | |
64 | ArrayRef<Builtin::Info> getTargetBuiltins() const override; |
65 | |
66 | bool hasFeature(StringRef Feature) const override; |
67 | bool handleTargetFeatures(std::vector<std::string> &Features, |
68 | DiagnosticsEngine &Diags) override; |
69 | |
70 | CallingConvCheckResult checkCallingConvention(CallingConv CC) const override; |
71 | |
72 | bool isCLZForZeroUndef() const override; |
73 | |
74 | BuiltinVaListKind getBuiltinVaListKind() const override; |
75 | |
76 | ArrayRef<const char *> getGCCRegNames() const override; |
77 | ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override; |
78 | bool validateAsmConstraint(const char *&Name, |
79 | TargetInfo::ConstraintInfo &Info) const override; |
80 | bool |
81 | validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size, |
82 | std::string &SuggestedModifier) const override; |
83 | const char *getClobbers() const override; |
84 | |
85 | StringRef getConstraintRegister(StringRef Constraint, |
86 | StringRef Expression) const override { |
87 | return Expression; |
88 | } |
89 | |
90 | int getEHDataRegisterNumber(unsigned RegNo) const override; |
91 | }; |
92 | |
93 | class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo { |
94 | public: |
95 | AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); |
96 | |
97 | void getTargetDefines(const LangOptions &Opts, |
98 | MacroBuilder &Builder) const override; |
99 | private: |
100 | void setDataLayout() override; |
101 | }; |
102 | |
103 | class LLVM_LIBRARY_VISIBILITY WindowsARM64TargetInfo |
104 | : public WindowsTargetInfo<AArch64leTargetInfo> { |
105 | const llvm::Triple Triple; |
106 | |
107 | public: |
108 | WindowsARM64TargetInfo(const llvm::Triple &Triple, |
109 | const TargetOptions &Opts); |
110 | |
111 | void setDataLayout() override; |
112 | |
113 | BuiltinVaListKind getBuiltinVaListKind() const override; |
114 | |
115 | CallingConvCheckResult checkCallingConvention(CallingConv CC) const override; |
116 | }; |
117 | |
118 | |
119 | class LLVM_LIBRARY_VISIBILITY MicrosoftARM64TargetInfo |
120 | : public WindowsARM64TargetInfo { |
121 | public: |
122 | MicrosoftARM64TargetInfo(const llvm::Triple &Triple, |
123 | const TargetOptions &Opts); |
124 | |
125 | void getVisualStudioDefines(const LangOptions &Opts, |
126 | MacroBuilder &Builder) const; |
127 | void getTargetDefines(const LangOptions &Opts, |
128 | MacroBuilder &Builder) const override; |
129 | TargetInfo::CallingConvKind |
130 | getCallingConvKind(bool ClangABICompat4) const override; |
131 | }; |
132 | |
133 | |
134 | class LLVM_LIBRARY_VISIBILITY MinGWARM64TargetInfo |
135 | : public WindowsARM64TargetInfo { |
136 | public: |
137 | MinGWARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); |
138 | }; |
139 | |
140 | class LLVM_LIBRARY_VISIBILITY AArch64beTargetInfo : public AArch64TargetInfo { |
141 | public: |
142 | AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); |
143 | void getTargetDefines(const LangOptions &Opts, |
144 | MacroBuilder &Builder) const override; |
145 | |
146 | private: |
147 | void setDataLayout() override; |
148 | }; |
149 | |
150 | class LLVM_LIBRARY_VISIBILITY DarwinAArch64TargetInfo |
151 | : public DarwinTargetInfo<AArch64leTargetInfo> { |
152 | public: |
153 | DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); |
154 | |
155 | BuiltinVaListKind getBuiltinVaListKind() const override; |
156 | |
157 | protected: |
158 | void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, |
159 | MacroBuilder &Builder) const override; |
160 | }; |
161 | |
162 | |
163 | class LLVM_LIBRARY_VISIBILITY RenderScript64TargetInfo |
164 | : public AArch64leTargetInfo { |
165 | public: |
166 | RenderScript64TargetInfo(const llvm::Triple &Triple, |
167 | const TargetOptions &Opts); |
168 | |
169 | void getTargetDefines(const LangOptions &Opts, |
170 | MacroBuilder &Builder) const override; |
171 | }; |
172 | |
173 | } |
174 | } |
175 | |
176 | #endif |
177 | |