annotate clang/lib/Basic/Targets/OSTargets.h @ 207:2e18cbf3894f

LLVM12
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Jun 2021 06:07:14 +0900
parents 0572611fdcc8
children 5f17cb93ff66
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===--- OSTargets.h - Declare OS target feature support --------*- C++ -*-===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 //
anatofuz
parents:
diff changeset
9 // This file declares OS specific TargetInfo types.
anatofuz
parents:
diff changeset
10 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
11
anatofuz
parents:
diff changeset
12 #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H
anatofuz
parents:
diff changeset
13 #define LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H
anatofuz
parents:
diff changeset
14
anatofuz
parents:
diff changeset
15 #include "Targets.h"
anatofuz
parents:
diff changeset
16
anatofuz
parents:
diff changeset
17 namespace clang {
anatofuz
parents:
diff changeset
18 namespace targets {
anatofuz
parents:
diff changeset
19
anatofuz
parents:
diff changeset
20 template <typename TgtInfo>
anatofuz
parents:
diff changeset
21 class LLVM_LIBRARY_VISIBILITY OSTargetInfo : public TgtInfo {
anatofuz
parents:
diff changeset
22 protected:
anatofuz
parents:
diff changeset
23 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
24 MacroBuilder &Builder) const = 0;
anatofuz
parents:
diff changeset
25
anatofuz
parents:
diff changeset
26 public:
anatofuz
parents:
diff changeset
27 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
28 : TgtInfo(Triple, Opts) {}
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 void getTargetDefines(const LangOptions &Opts,
anatofuz
parents:
diff changeset
31 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
32 TgtInfo::getTargetDefines(Opts, Builder);
anatofuz
parents:
diff changeset
33 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
anatofuz
parents:
diff changeset
34 }
anatofuz
parents:
diff changeset
35 };
anatofuz
parents:
diff changeset
36
anatofuz
parents:
diff changeset
37 // CloudABI Target
anatofuz
parents:
diff changeset
38 template <typename Target>
anatofuz
parents:
diff changeset
39 class LLVM_LIBRARY_VISIBILITY CloudABITargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
40 protected:
anatofuz
parents:
diff changeset
41 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
42 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
43 Builder.defineMacro("__CloudABI__");
anatofuz
parents:
diff changeset
44 Builder.defineMacro("__ELF__");
anatofuz
parents:
diff changeset
45
anatofuz
parents:
diff changeset
46 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
anatofuz
parents:
diff changeset
47 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
anatofuz
parents:
diff changeset
48 Builder.defineMacro("__STDC_UTF_16__");
anatofuz
parents:
diff changeset
49 Builder.defineMacro("__STDC_UTF_32__");
anatofuz
parents:
diff changeset
50 }
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52 public:
anatofuz
parents:
diff changeset
53 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
54 : OSTargetInfo<Target>(Triple, Opts) {}
anatofuz
parents:
diff changeset
55 };
anatofuz
parents:
diff changeset
56
anatofuz
parents:
diff changeset
57 // Ananas target
anatofuz
parents:
diff changeset
58 template <typename Target>
anatofuz
parents:
diff changeset
59 class LLVM_LIBRARY_VISIBILITY AnanasTargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
60 protected:
anatofuz
parents:
diff changeset
61 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
62 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
63 // Ananas defines
anatofuz
parents:
diff changeset
64 Builder.defineMacro("__Ananas__");
anatofuz
parents:
diff changeset
65 Builder.defineMacro("__ELF__");
anatofuz
parents:
diff changeset
66 }
anatofuz
parents:
diff changeset
67
anatofuz
parents:
diff changeset
68 public:
anatofuz
parents:
diff changeset
69 AnanasTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
70 : OSTargetInfo<Target>(Triple, Opts) {}
anatofuz
parents:
diff changeset
71 };
anatofuz
parents:
diff changeset
72
anatofuz
parents:
diff changeset
73 void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
anatofuz
parents:
diff changeset
74 const llvm::Triple &Triple, StringRef &PlatformName,
anatofuz
parents:
diff changeset
75 VersionTuple &PlatformMinVersion);
anatofuz
parents:
diff changeset
76
anatofuz
parents:
diff changeset
77 template <typename Target>
anatofuz
parents:
diff changeset
78 class LLVM_LIBRARY_VISIBILITY DarwinTargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
79 protected:
anatofuz
parents:
diff changeset
80 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
81 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
82 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
anatofuz
parents:
diff changeset
83 this->PlatformMinVersion);
anatofuz
parents:
diff changeset
84 }
anatofuz
parents:
diff changeset
85
anatofuz
parents:
diff changeset
86 public:
anatofuz
parents:
diff changeset
87 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
88 : OSTargetInfo<Target>(Triple, Opts) {
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
89 // By default, no TLS, and we list permitted architecture/OS
150
anatofuz
parents:
diff changeset
90 // combinations.
anatofuz
parents:
diff changeset
91 this->TLSSupported = false;
anatofuz
parents:
diff changeset
92
anatofuz
parents:
diff changeset
93 if (Triple.isMacOSX())
anatofuz
parents:
diff changeset
94 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
anatofuz
parents:
diff changeset
95 else if (Triple.isiOS()) {
anatofuz
parents:
diff changeset
96 // 64-bit iOS supported it from 8 onwards, 32-bit device from 9 onwards,
anatofuz
parents:
diff changeset
97 // 32-bit simulator from 10 onwards.
anatofuz
parents:
diff changeset
98 if (Triple.isArch64Bit())
anatofuz
parents:
diff changeset
99 this->TLSSupported = !Triple.isOSVersionLT(8);
anatofuz
parents:
diff changeset
100 else if (Triple.isArch32Bit()) {
anatofuz
parents:
diff changeset
101 if (!Triple.isSimulatorEnvironment())
anatofuz
parents:
diff changeset
102 this->TLSSupported = !Triple.isOSVersionLT(9);
anatofuz
parents:
diff changeset
103 else
anatofuz
parents:
diff changeset
104 this->TLSSupported = !Triple.isOSVersionLT(10);
anatofuz
parents:
diff changeset
105 }
anatofuz
parents:
diff changeset
106 } else if (Triple.isWatchOS()) {
anatofuz
parents:
diff changeset
107 if (!Triple.isSimulatorEnvironment())
anatofuz
parents:
diff changeset
108 this->TLSSupported = !Triple.isOSVersionLT(2);
anatofuz
parents:
diff changeset
109 else
anatofuz
parents:
diff changeset
110 this->TLSSupported = !Triple.isOSVersionLT(3);
anatofuz
parents:
diff changeset
111 }
anatofuz
parents:
diff changeset
112
anatofuz
parents:
diff changeset
113 this->MCountName = "\01mcount";
anatofuz
parents:
diff changeset
114 }
anatofuz
parents:
diff changeset
115
anatofuz
parents:
diff changeset
116 const char *getStaticInitSectionSpecifier() const override {
anatofuz
parents:
diff changeset
117 // FIXME: We should return 0 when building kexts.
anatofuz
parents:
diff changeset
118 return "__TEXT,__StaticInit,regular,pure_instructions";
anatofuz
parents:
diff changeset
119 }
anatofuz
parents:
diff changeset
120
anatofuz
parents:
diff changeset
121 /// Darwin does not support protected visibility. Darwin's "default"
anatofuz
parents:
diff changeset
122 /// is very similar to ELF's "protected"; Darwin requires a "weak"
anatofuz
parents:
diff changeset
123 /// attribute on declarations that can be dynamically replaced.
anatofuz
parents:
diff changeset
124 bool hasProtectedVisibility() const override { return false; }
anatofuz
parents:
diff changeset
125
anatofuz
parents:
diff changeset
126 unsigned getExnObjectAlignment() const override {
anatofuz
parents:
diff changeset
127 // Older versions of libc++abi guarantee an alignment of only 8-bytes for
anatofuz
parents:
diff changeset
128 // exception objects because of a bug in __cxa_exception that was
anatofuz
parents:
diff changeset
129 // eventually fixed in r319123.
anatofuz
parents:
diff changeset
130 llvm::VersionTuple MinVersion;
anatofuz
parents:
diff changeset
131 const llvm::Triple &T = this->getTriple();
anatofuz
parents:
diff changeset
132
anatofuz
parents:
diff changeset
133 // Compute the earliest OS versions that have the fix to libc++abi.
anatofuz
parents:
diff changeset
134 switch (T.getOS()) {
anatofuz
parents:
diff changeset
135 case llvm::Triple::Darwin:
anatofuz
parents:
diff changeset
136 case llvm::Triple::MacOSX: // Earliest supporting version is 10.14.
anatofuz
parents:
diff changeset
137 MinVersion = llvm::VersionTuple(10U, 14U);
anatofuz
parents:
diff changeset
138 break;
anatofuz
parents:
diff changeset
139 case llvm::Triple::IOS:
anatofuz
parents:
diff changeset
140 case llvm::Triple::TvOS: // Earliest supporting version is 12.0.0.
anatofuz
parents:
diff changeset
141 MinVersion = llvm::VersionTuple(12U);
anatofuz
parents:
diff changeset
142 break;
anatofuz
parents:
diff changeset
143 case llvm::Triple::WatchOS: // Earliest supporting version is 5.0.0.
anatofuz
parents:
diff changeset
144 MinVersion = llvm::VersionTuple(5U);
anatofuz
parents:
diff changeset
145 break;
anatofuz
parents:
diff changeset
146 default:
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
147 // Conservatively return 8 bytes if OS is unknown.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
148 return 64;
150
anatofuz
parents:
diff changeset
149 }
anatofuz
parents:
diff changeset
150
anatofuz
parents:
diff changeset
151 unsigned Major, Minor, Micro;
anatofuz
parents:
diff changeset
152 T.getOSVersion(Major, Minor, Micro);
anatofuz
parents:
diff changeset
153 if (llvm::VersionTuple(Major, Minor, Micro) < MinVersion)
anatofuz
parents:
diff changeset
154 return 64;
anatofuz
parents:
diff changeset
155 return OSTargetInfo<Target>::getExnObjectAlignment();
anatofuz
parents:
diff changeset
156 }
anatofuz
parents:
diff changeset
157
anatofuz
parents:
diff changeset
158 TargetInfo::IntType getLeastIntTypeByWidth(unsigned BitWidth,
anatofuz
parents:
diff changeset
159 bool IsSigned) const final {
anatofuz
parents:
diff changeset
160 // Darwin uses `long long` for `int_least64_t` and `int_fast64_t`.
anatofuz
parents:
diff changeset
161 return BitWidth == 64
anatofuz
parents:
diff changeset
162 ? (IsSigned ? TargetInfo::SignedLongLong
anatofuz
parents:
diff changeset
163 : TargetInfo::UnsignedLongLong)
anatofuz
parents:
diff changeset
164 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
anatofuz
parents:
diff changeset
165 }
anatofuz
parents:
diff changeset
166 };
anatofuz
parents:
diff changeset
167
anatofuz
parents:
diff changeset
168 // DragonFlyBSD Target
anatofuz
parents:
diff changeset
169 template <typename Target>
anatofuz
parents:
diff changeset
170 class LLVM_LIBRARY_VISIBILITY DragonFlyBSDTargetInfo
anatofuz
parents:
diff changeset
171 : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
172 protected:
anatofuz
parents:
diff changeset
173 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
174 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
175 // DragonFly defines; list based off of gcc output
anatofuz
parents:
diff changeset
176 Builder.defineMacro("__DragonFly__");
anatofuz
parents:
diff changeset
177 Builder.defineMacro("__DragonFly_cc_version", "100001");
anatofuz
parents:
diff changeset
178 Builder.defineMacro("__ELF__");
anatofuz
parents:
diff changeset
179 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
anatofuz
parents:
diff changeset
180 Builder.defineMacro("__tune_i386__");
anatofuz
parents:
diff changeset
181 DefineStd(Builder, "unix", Opts);
anatofuz
parents:
diff changeset
182 }
anatofuz
parents:
diff changeset
183
anatofuz
parents:
diff changeset
184 public:
anatofuz
parents:
diff changeset
185 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
186 : OSTargetInfo<Target>(Triple, Opts) {
anatofuz
parents:
diff changeset
187 switch (Triple.getArch()) {
anatofuz
parents:
diff changeset
188 default:
anatofuz
parents:
diff changeset
189 case llvm::Triple::x86:
anatofuz
parents:
diff changeset
190 case llvm::Triple::x86_64:
anatofuz
parents:
diff changeset
191 this->MCountName = ".mcount";
anatofuz
parents:
diff changeset
192 break;
anatofuz
parents:
diff changeset
193 }
anatofuz
parents:
diff changeset
194 }
anatofuz
parents:
diff changeset
195 };
anatofuz
parents:
diff changeset
196
anatofuz
parents:
diff changeset
197 #ifndef FREEBSD_CC_VERSION
anatofuz
parents:
diff changeset
198 #define FREEBSD_CC_VERSION 0U
anatofuz
parents:
diff changeset
199 #endif
anatofuz
parents:
diff changeset
200
anatofuz
parents:
diff changeset
201 // FreeBSD Target
anatofuz
parents:
diff changeset
202 template <typename Target>
anatofuz
parents:
diff changeset
203 class LLVM_LIBRARY_VISIBILITY FreeBSDTargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
204 protected:
anatofuz
parents:
diff changeset
205 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
206 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
207 // FreeBSD defines; list based off of gcc output
anatofuz
parents:
diff changeset
208
anatofuz
parents:
diff changeset
209 unsigned Release = Triple.getOSMajorVersion();
anatofuz
parents:
diff changeset
210 if (Release == 0U)
anatofuz
parents:
diff changeset
211 Release = 8U;
anatofuz
parents:
diff changeset
212 unsigned CCVersion = FREEBSD_CC_VERSION;
anatofuz
parents:
diff changeset
213 if (CCVersion == 0U)
anatofuz
parents:
diff changeset
214 CCVersion = Release * 100000U + 1U;
anatofuz
parents:
diff changeset
215
anatofuz
parents:
diff changeset
216 Builder.defineMacro("__FreeBSD__", Twine(Release));
anatofuz
parents:
diff changeset
217 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
anatofuz
parents:
diff changeset
218 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
anatofuz
parents:
diff changeset
219 DefineStd(Builder, "unix", Opts);
anatofuz
parents:
diff changeset
220 Builder.defineMacro("__ELF__");
anatofuz
parents:
diff changeset
221
anatofuz
parents:
diff changeset
222 // On FreeBSD, wchar_t contains the number of the code point as
anatofuz
parents:
diff changeset
223 // used by the character set of the locale. These character sets are
anatofuz
parents:
diff changeset
224 // not necessarily a superset of ASCII.
anatofuz
parents:
diff changeset
225 //
anatofuz
parents:
diff changeset
226 // FIXME: This is wrong; the macro refers to the numerical values
anatofuz
parents:
diff changeset
227 // of wchar_t *literals*, which are not locale-dependent. However,
anatofuz
parents:
diff changeset
228 // FreeBSD systems apparently depend on us getting this wrong, and
anatofuz
parents:
diff changeset
229 // setting this to 1 is conforming even if all the basic source
anatofuz
parents:
diff changeset
230 // character literals have the same encoding as char and wchar_t.
anatofuz
parents:
diff changeset
231 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
anatofuz
parents:
diff changeset
232 }
anatofuz
parents:
diff changeset
233
anatofuz
parents:
diff changeset
234 public:
anatofuz
parents:
diff changeset
235 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
236 : OSTargetInfo<Target>(Triple, Opts) {
anatofuz
parents:
diff changeset
237 switch (Triple.getArch()) {
anatofuz
parents:
diff changeset
238 default:
anatofuz
parents:
diff changeset
239 case llvm::Triple::x86:
anatofuz
parents:
diff changeset
240 case llvm::Triple::x86_64:
anatofuz
parents:
diff changeset
241 this->MCountName = ".mcount";
anatofuz
parents:
diff changeset
242 break;
anatofuz
parents:
diff changeset
243 case llvm::Triple::mips:
anatofuz
parents:
diff changeset
244 case llvm::Triple::mipsel:
anatofuz
parents:
diff changeset
245 case llvm::Triple::ppc:
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
246 case llvm::Triple::ppcle:
150
anatofuz
parents:
diff changeset
247 case llvm::Triple::ppc64:
anatofuz
parents:
diff changeset
248 case llvm::Triple::ppc64le:
anatofuz
parents:
diff changeset
249 this->MCountName = "_mcount";
anatofuz
parents:
diff changeset
250 break;
anatofuz
parents:
diff changeset
251 case llvm::Triple::arm:
anatofuz
parents:
diff changeset
252 this->MCountName = "__mcount";
anatofuz
parents:
diff changeset
253 break;
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
254 case llvm::Triple::riscv32:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
255 case llvm::Triple::riscv64:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
256 break;
150
anatofuz
parents:
diff changeset
257 }
anatofuz
parents:
diff changeset
258 }
anatofuz
parents:
diff changeset
259 };
anatofuz
parents:
diff changeset
260
anatofuz
parents:
diff changeset
261 // GNU/kFreeBSD Target
anatofuz
parents:
diff changeset
262 template <typename Target>
anatofuz
parents:
diff changeset
263 class LLVM_LIBRARY_VISIBILITY KFreeBSDTargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
264 protected:
anatofuz
parents:
diff changeset
265 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
266 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
267 // GNU/kFreeBSD defines; list based off of gcc output
anatofuz
parents:
diff changeset
268
anatofuz
parents:
diff changeset
269 DefineStd(Builder, "unix", Opts);
anatofuz
parents:
diff changeset
270 Builder.defineMacro("__FreeBSD_kernel__");
anatofuz
parents:
diff changeset
271 Builder.defineMacro("__GLIBC__");
anatofuz
parents:
diff changeset
272 Builder.defineMacro("__ELF__");
anatofuz
parents:
diff changeset
273 if (Opts.POSIXThreads)
anatofuz
parents:
diff changeset
274 Builder.defineMacro("_REENTRANT");
anatofuz
parents:
diff changeset
275 if (Opts.CPlusPlus)
anatofuz
parents:
diff changeset
276 Builder.defineMacro("_GNU_SOURCE");
anatofuz
parents:
diff changeset
277 }
anatofuz
parents:
diff changeset
278
anatofuz
parents:
diff changeset
279 public:
anatofuz
parents:
diff changeset
280 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
281 : OSTargetInfo<Target>(Triple, Opts) {}
anatofuz
parents:
diff changeset
282 };
anatofuz
parents:
diff changeset
283
anatofuz
parents:
diff changeset
284 // Haiku Target
anatofuz
parents:
diff changeset
285 template <typename Target>
anatofuz
parents:
diff changeset
286 class LLVM_LIBRARY_VISIBILITY HaikuTargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
287 protected:
anatofuz
parents:
diff changeset
288 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
289 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
290 // Haiku defines; list based off of gcc output
anatofuz
parents:
diff changeset
291 Builder.defineMacro("__HAIKU__");
anatofuz
parents:
diff changeset
292 Builder.defineMacro("__ELF__");
anatofuz
parents:
diff changeset
293 DefineStd(Builder, "unix", Opts);
anatofuz
parents:
diff changeset
294 if (this->HasFloat128)
anatofuz
parents:
diff changeset
295 Builder.defineMacro("__FLOAT128__");
anatofuz
parents:
diff changeset
296 }
anatofuz
parents:
diff changeset
297
anatofuz
parents:
diff changeset
298 public:
anatofuz
parents:
diff changeset
299 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
300 : OSTargetInfo<Target>(Triple, Opts) {
anatofuz
parents:
diff changeset
301 this->SizeType = TargetInfo::UnsignedLong;
anatofuz
parents:
diff changeset
302 this->IntPtrType = TargetInfo::SignedLong;
anatofuz
parents:
diff changeset
303 this->PtrDiffType = TargetInfo::SignedLong;
anatofuz
parents:
diff changeset
304 this->ProcessIDType = TargetInfo::SignedLong;
anatofuz
parents:
diff changeset
305 this->TLSSupported = false;
anatofuz
parents:
diff changeset
306 switch (Triple.getArch()) {
anatofuz
parents:
diff changeset
307 default:
anatofuz
parents:
diff changeset
308 break;
anatofuz
parents:
diff changeset
309 case llvm::Triple::x86:
anatofuz
parents:
diff changeset
310 case llvm::Triple::x86_64:
anatofuz
parents:
diff changeset
311 this->HasFloat128 = true;
anatofuz
parents:
diff changeset
312 break;
anatofuz
parents:
diff changeset
313 }
anatofuz
parents:
diff changeset
314 }
anatofuz
parents:
diff changeset
315 };
anatofuz
parents:
diff changeset
316
anatofuz
parents:
diff changeset
317 // Hurd target
anatofuz
parents:
diff changeset
318 template <typename Target>
anatofuz
parents:
diff changeset
319 class LLVM_LIBRARY_VISIBILITY HurdTargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
320 protected:
anatofuz
parents:
diff changeset
321 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
322 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
323 // Hurd defines; list based off of gcc output.
anatofuz
parents:
diff changeset
324 DefineStd(Builder, "unix", Opts);
anatofuz
parents:
diff changeset
325 Builder.defineMacro("__GNU__");
anatofuz
parents:
diff changeset
326 Builder.defineMacro("__gnu_hurd__");
anatofuz
parents:
diff changeset
327 Builder.defineMacro("__MACH__");
anatofuz
parents:
diff changeset
328 Builder.defineMacro("__GLIBC__");
anatofuz
parents:
diff changeset
329 Builder.defineMacro("__ELF__");
anatofuz
parents:
diff changeset
330 if (Opts.POSIXThreads)
anatofuz
parents:
diff changeset
331 Builder.defineMacro("_REENTRANT");
anatofuz
parents:
diff changeset
332 if (Opts.CPlusPlus)
anatofuz
parents:
diff changeset
333 Builder.defineMacro("_GNU_SOURCE");
anatofuz
parents:
diff changeset
334 }
anatofuz
parents:
diff changeset
335 public:
anatofuz
parents:
diff changeset
336 HurdTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
337 : OSTargetInfo<Target>(Triple, Opts) {}
anatofuz
parents:
diff changeset
338 };
anatofuz
parents:
diff changeset
339
anatofuz
parents:
diff changeset
340 // Minix Target
anatofuz
parents:
diff changeset
341 template <typename Target>
anatofuz
parents:
diff changeset
342 class LLVM_LIBRARY_VISIBILITY MinixTargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
343 protected:
anatofuz
parents:
diff changeset
344 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
345 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
346 // Minix defines
anatofuz
parents:
diff changeset
347
anatofuz
parents:
diff changeset
348 Builder.defineMacro("__minix", "3");
anatofuz
parents:
diff changeset
349 Builder.defineMacro("_EM_WSIZE", "4");
anatofuz
parents:
diff changeset
350 Builder.defineMacro("_EM_PSIZE", "4");
anatofuz
parents:
diff changeset
351 Builder.defineMacro("_EM_SSIZE", "2");
anatofuz
parents:
diff changeset
352 Builder.defineMacro("_EM_LSIZE", "4");
anatofuz
parents:
diff changeset
353 Builder.defineMacro("_EM_FSIZE", "4");
anatofuz
parents:
diff changeset
354 Builder.defineMacro("_EM_DSIZE", "8");
anatofuz
parents:
diff changeset
355 Builder.defineMacro("__ELF__");
anatofuz
parents:
diff changeset
356 DefineStd(Builder, "unix", Opts);
anatofuz
parents:
diff changeset
357 }
anatofuz
parents:
diff changeset
358
anatofuz
parents:
diff changeset
359 public:
anatofuz
parents:
diff changeset
360 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
361 : OSTargetInfo<Target>(Triple, Opts) {}
anatofuz
parents:
diff changeset
362 };
anatofuz
parents:
diff changeset
363
anatofuz
parents:
diff changeset
364 // Linux target
anatofuz
parents:
diff changeset
365 template <typename Target>
anatofuz
parents:
diff changeset
366 class LLVM_LIBRARY_VISIBILITY LinuxTargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
367 protected:
anatofuz
parents:
diff changeset
368 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
369 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
370 // Linux defines; list based off of gcc output
anatofuz
parents:
diff changeset
371 DefineStd(Builder, "unix", Opts);
anatofuz
parents:
diff changeset
372 DefineStd(Builder, "linux", Opts);
anatofuz
parents:
diff changeset
373 Builder.defineMacro("__ELF__");
anatofuz
parents:
diff changeset
374 if (Triple.isAndroid()) {
anatofuz
parents:
diff changeset
375 Builder.defineMacro("__ANDROID__", "1");
anatofuz
parents:
diff changeset
376 unsigned Maj, Min, Rev;
anatofuz
parents:
diff changeset
377 Triple.getEnvironmentVersion(Maj, Min, Rev);
anatofuz
parents:
diff changeset
378 this->PlatformName = "android";
anatofuz
parents:
diff changeset
379 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
380 if (Maj) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
381 Builder.defineMacro("__ANDROID_MIN_SDK_VERSION__", Twine(Maj));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
382 // This historical but ambiguous name for the minSdkVersion macro. Keep
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
383 // defined for compatibility.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
384 Builder.defineMacro("__ANDROID_API__", "__ANDROID_MIN_SDK_VERSION__");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
385 }
150
anatofuz
parents:
diff changeset
386 } else {
anatofuz
parents:
diff changeset
387 Builder.defineMacro("__gnu_linux__");
anatofuz
parents:
diff changeset
388 }
anatofuz
parents:
diff changeset
389 if (Opts.POSIXThreads)
anatofuz
parents:
diff changeset
390 Builder.defineMacro("_REENTRANT");
anatofuz
parents:
diff changeset
391 if (Opts.CPlusPlus)
anatofuz
parents:
diff changeset
392 Builder.defineMacro("_GNU_SOURCE");
anatofuz
parents:
diff changeset
393 if (this->HasFloat128)
anatofuz
parents:
diff changeset
394 Builder.defineMacro("__FLOAT128__");
anatofuz
parents:
diff changeset
395 }
anatofuz
parents:
diff changeset
396
anatofuz
parents:
diff changeset
397 public:
anatofuz
parents:
diff changeset
398 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
399 : OSTargetInfo<Target>(Triple, Opts) {
anatofuz
parents:
diff changeset
400 this->WIntType = TargetInfo::UnsignedInt;
anatofuz
parents:
diff changeset
401
anatofuz
parents:
diff changeset
402 switch (Triple.getArch()) {
anatofuz
parents:
diff changeset
403 default:
anatofuz
parents:
diff changeset
404 break;
anatofuz
parents:
diff changeset
405 case llvm::Triple::mips:
anatofuz
parents:
diff changeset
406 case llvm::Triple::mipsel:
anatofuz
parents:
diff changeset
407 case llvm::Triple::mips64:
anatofuz
parents:
diff changeset
408 case llvm::Triple::mips64el:
anatofuz
parents:
diff changeset
409 case llvm::Triple::ppc:
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
410 case llvm::Triple::ppcle:
150
anatofuz
parents:
diff changeset
411 case llvm::Triple::ppc64:
anatofuz
parents:
diff changeset
412 case llvm::Triple::ppc64le:
anatofuz
parents:
diff changeset
413 this->MCountName = "_mcount";
anatofuz
parents:
diff changeset
414 break;
anatofuz
parents:
diff changeset
415 case llvm::Triple::x86:
anatofuz
parents:
diff changeset
416 case llvm::Triple::x86_64:
anatofuz
parents:
diff changeset
417 this->HasFloat128 = true;
anatofuz
parents:
diff changeset
418 break;
anatofuz
parents:
diff changeset
419 }
anatofuz
parents:
diff changeset
420 }
anatofuz
parents:
diff changeset
421
anatofuz
parents:
diff changeset
422 const char *getStaticInitSectionSpecifier() const override {
anatofuz
parents:
diff changeset
423 return ".text.startup";
anatofuz
parents:
diff changeset
424 }
anatofuz
parents:
diff changeset
425 };
anatofuz
parents:
diff changeset
426
anatofuz
parents:
diff changeset
427 // NetBSD Target
anatofuz
parents:
diff changeset
428 template <typename Target>
anatofuz
parents:
diff changeset
429 class LLVM_LIBRARY_VISIBILITY NetBSDTargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
430 protected:
anatofuz
parents:
diff changeset
431 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
432 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
433 // NetBSD defines; list based off of gcc output
anatofuz
parents:
diff changeset
434 Builder.defineMacro("__NetBSD__");
anatofuz
parents:
diff changeset
435 Builder.defineMacro("__unix__");
anatofuz
parents:
diff changeset
436 Builder.defineMacro("__ELF__");
anatofuz
parents:
diff changeset
437 if (Opts.POSIXThreads)
anatofuz
parents:
diff changeset
438 Builder.defineMacro("_REENTRANT");
anatofuz
parents:
diff changeset
439 }
anatofuz
parents:
diff changeset
440
anatofuz
parents:
diff changeset
441 public:
anatofuz
parents:
diff changeset
442 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
443 : OSTargetInfo<Target>(Triple, Opts) {
anatofuz
parents:
diff changeset
444 this->MCountName = "__mcount";
anatofuz
parents:
diff changeset
445 }
anatofuz
parents:
diff changeset
446 };
anatofuz
parents:
diff changeset
447
anatofuz
parents:
diff changeset
448 // OpenBSD Target
anatofuz
parents:
diff changeset
449 template <typename Target>
anatofuz
parents:
diff changeset
450 class LLVM_LIBRARY_VISIBILITY OpenBSDTargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
451 protected:
anatofuz
parents:
diff changeset
452 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
453 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
454 // OpenBSD defines; list based off of gcc output
anatofuz
parents:
diff changeset
455
anatofuz
parents:
diff changeset
456 Builder.defineMacro("__OpenBSD__");
anatofuz
parents:
diff changeset
457 DefineStd(Builder, "unix", Opts);
anatofuz
parents:
diff changeset
458 Builder.defineMacro("__ELF__");
anatofuz
parents:
diff changeset
459 if (Opts.POSIXThreads)
anatofuz
parents:
diff changeset
460 Builder.defineMacro("_REENTRANT");
anatofuz
parents:
diff changeset
461 if (this->HasFloat128)
anatofuz
parents:
diff changeset
462 Builder.defineMacro("__FLOAT128__");
anatofuz
parents:
diff changeset
463 }
anatofuz
parents:
diff changeset
464
anatofuz
parents:
diff changeset
465 public:
anatofuz
parents:
diff changeset
466 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
467 : OSTargetInfo<Target>(Triple, Opts) {
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
468 this->WCharType = this->WIntType = this->SignedInt;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
469 this->IntMaxType = TargetInfo::SignedLongLong;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
470 this->Int64Type = TargetInfo::SignedLongLong;
150
anatofuz
parents:
diff changeset
471 switch (Triple.getArch()) {
anatofuz
parents:
diff changeset
472 case llvm::Triple::x86:
anatofuz
parents:
diff changeset
473 case llvm::Triple::x86_64:
anatofuz
parents:
diff changeset
474 this->HasFloat128 = true;
anatofuz
parents:
diff changeset
475 LLVM_FALLTHROUGH;
anatofuz
parents:
diff changeset
476 default:
anatofuz
parents:
diff changeset
477 this->MCountName = "__mcount";
anatofuz
parents:
diff changeset
478 break;
anatofuz
parents:
diff changeset
479 case llvm::Triple::mips64:
anatofuz
parents:
diff changeset
480 case llvm::Triple::mips64el:
anatofuz
parents:
diff changeset
481 case llvm::Triple::ppc:
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
482 case llvm::Triple::ppc64:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
483 case llvm::Triple::ppc64le:
150
anatofuz
parents:
diff changeset
484 case llvm::Triple::sparcv9:
anatofuz
parents:
diff changeset
485 this->MCountName = "_mcount";
anatofuz
parents:
diff changeset
486 break;
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
487 case llvm::Triple::riscv32:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
488 case llvm::Triple::riscv64:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
489 break;
150
anatofuz
parents:
diff changeset
490 }
anatofuz
parents:
diff changeset
491 }
anatofuz
parents:
diff changeset
492 };
anatofuz
parents:
diff changeset
493
anatofuz
parents:
diff changeset
494 // PSP Target
anatofuz
parents:
diff changeset
495 template <typename Target>
anatofuz
parents:
diff changeset
496 class LLVM_LIBRARY_VISIBILITY PSPTargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
497 protected:
anatofuz
parents:
diff changeset
498 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
499 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
500 // PSP defines; list based on the output of the pspdev gcc toolchain.
anatofuz
parents:
diff changeset
501 Builder.defineMacro("PSP");
anatofuz
parents:
diff changeset
502 Builder.defineMacro("_PSP");
anatofuz
parents:
diff changeset
503 Builder.defineMacro("__psp__");
anatofuz
parents:
diff changeset
504 Builder.defineMacro("__ELF__");
anatofuz
parents:
diff changeset
505 }
anatofuz
parents:
diff changeset
506
anatofuz
parents:
diff changeset
507 public:
anatofuz
parents:
diff changeset
508 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
anatofuz
parents:
diff changeset
509 };
anatofuz
parents:
diff changeset
510
anatofuz
parents:
diff changeset
511 // PS3 PPU Target
anatofuz
parents:
diff changeset
512 template <typename Target>
anatofuz
parents:
diff changeset
513 class LLVM_LIBRARY_VISIBILITY PS3PPUTargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
514 protected:
anatofuz
parents:
diff changeset
515 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
516 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
517 // PS3 PPU defines.
anatofuz
parents:
diff changeset
518 Builder.defineMacro("__PPC__");
anatofuz
parents:
diff changeset
519 Builder.defineMacro("__PPU__");
anatofuz
parents:
diff changeset
520 Builder.defineMacro("__CELLOS_LV2__");
anatofuz
parents:
diff changeset
521 Builder.defineMacro("__ELF__");
anatofuz
parents:
diff changeset
522 Builder.defineMacro("__LP32__");
anatofuz
parents:
diff changeset
523 Builder.defineMacro("_ARCH_PPC64");
anatofuz
parents:
diff changeset
524 Builder.defineMacro("__powerpc64__");
anatofuz
parents:
diff changeset
525 }
anatofuz
parents:
diff changeset
526
anatofuz
parents:
diff changeset
527 public:
anatofuz
parents:
diff changeset
528 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
529 : OSTargetInfo<Target>(Triple, Opts) {
anatofuz
parents:
diff changeset
530 this->LongWidth = this->LongAlign = 32;
anatofuz
parents:
diff changeset
531 this->PointerWidth = this->PointerAlign = 32;
anatofuz
parents:
diff changeset
532 this->IntMaxType = TargetInfo::SignedLongLong;
anatofuz
parents:
diff changeset
533 this->Int64Type = TargetInfo::SignedLongLong;
anatofuz
parents:
diff changeset
534 this->SizeType = TargetInfo::UnsignedInt;
anatofuz
parents:
diff changeset
535 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
anatofuz
parents:
diff changeset
536 }
anatofuz
parents:
diff changeset
537 };
anatofuz
parents:
diff changeset
538
anatofuz
parents:
diff changeset
539 template <typename Target>
anatofuz
parents:
diff changeset
540 class LLVM_LIBRARY_VISIBILITY PS4OSTargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
541 protected:
anatofuz
parents:
diff changeset
542 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
543 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
544 Builder.defineMacro("__FreeBSD__", "9");
anatofuz
parents:
diff changeset
545 Builder.defineMacro("__FreeBSD_cc_version", "900001");
anatofuz
parents:
diff changeset
546 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
anatofuz
parents:
diff changeset
547 DefineStd(Builder, "unix", Opts);
anatofuz
parents:
diff changeset
548 Builder.defineMacro("__ELF__");
anatofuz
parents:
diff changeset
549 Builder.defineMacro("__SCE__");
anatofuz
parents:
diff changeset
550 Builder.defineMacro("__ORBIS__");
anatofuz
parents:
diff changeset
551 }
anatofuz
parents:
diff changeset
552
anatofuz
parents:
diff changeset
553 public:
anatofuz
parents:
diff changeset
554 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
555 : OSTargetInfo<Target>(Triple, Opts) {
anatofuz
parents:
diff changeset
556 this->WCharType = TargetInfo::UnsignedShort;
anatofuz
parents:
diff changeset
557
anatofuz
parents:
diff changeset
558 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
anatofuz
parents:
diff changeset
559 this->MaxTLSAlign = 256;
anatofuz
parents:
diff changeset
560
anatofuz
parents:
diff changeset
561 // On PS4, do not honor explicit bit field alignment,
anatofuz
parents:
diff changeset
562 // as in "__attribute__((aligned(2))) int b : 1;".
anatofuz
parents:
diff changeset
563 this->UseExplicitBitFieldAlignment = false;
anatofuz
parents:
diff changeset
564
anatofuz
parents:
diff changeset
565 switch (Triple.getArch()) {
anatofuz
parents:
diff changeset
566 default:
anatofuz
parents:
diff changeset
567 case llvm::Triple::x86_64:
anatofuz
parents:
diff changeset
568 this->MCountName = ".mcount";
anatofuz
parents:
diff changeset
569 this->NewAlign = 256;
anatofuz
parents:
diff changeset
570 break;
anatofuz
parents:
diff changeset
571 }
anatofuz
parents:
diff changeset
572 }
anatofuz
parents:
diff changeset
573 TargetInfo::CallingConvCheckResult
anatofuz
parents:
diff changeset
574 checkCallingConvention(CallingConv CC) const override {
anatofuz
parents:
diff changeset
575 return (CC == CC_C) ? TargetInfo::CCCR_OK : TargetInfo::CCCR_Error;
anatofuz
parents:
diff changeset
576 }
anatofuz
parents:
diff changeset
577 };
anatofuz
parents:
diff changeset
578
anatofuz
parents:
diff changeset
579 // RTEMS Target
anatofuz
parents:
diff changeset
580 template <typename Target>
anatofuz
parents:
diff changeset
581 class LLVM_LIBRARY_VISIBILITY RTEMSTargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
582 protected:
anatofuz
parents:
diff changeset
583 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
584 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
585 // RTEMS defines; list based off of gcc output
anatofuz
parents:
diff changeset
586
anatofuz
parents:
diff changeset
587 Builder.defineMacro("__rtems__");
anatofuz
parents:
diff changeset
588 Builder.defineMacro("__ELF__");
anatofuz
parents:
diff changeset
589 if (Opts.CPlusPlus)
anatofuz
parents:
diff changeset
590 Builder.defineMacro("_GNU_SOURCE");
anatofuz
parents:
diff changeset
591 }
anatofuz
parents:
diff changeset
592
anatofuz
parents:
diff changeset
593 public:
anatofuz
parents:
diff changeset
594 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
595 : OSTargetInfo<Target>(Triple, Opts) {
anatofuz
parents:
diff changeset
596 switch (Triple.getArch()) {
anatofuz
parents:
diff changeset
597 default:
anatofuz
parents:
diff changeset
598 case llvm::Triple::x86:
anatofuz
parents:
diff changeset
599 // this->MCountName = ".mcount";
anatofuz
parents:
diff changeset
600 break;
anatofuz
parents:
diff changeset
601 case llvm::Triple::mips:
anatofuz
parents:
diff changeset
602 case llvm::Triple::mipsel:
anatofuz
parents:
diff changeset
603 case llvm::Triple::ppc:
anatofuz
parents:
diff changeset
604 case llvm::Triple::ppc64:
anatofuz
parents:
diff changeset
605 case llvm::Triple::ppc64le:
anatofuz
parents:
diff changeset
606 // this->MCountName = "_mcount";
anatofuz
parents:
diff changeset
607 break;
anatofuz
parents:
diff changeset
608 case llvm::Triple::arm:
anatofuz
parents:
diff changeset
609 // this->MCountName = "__mcount";
anatofuz
parents:
diff changeset
610 break;
anatofuz
parents:
diff changeset
611 }
anatofuz
parents:
diff changeset
612 }
anatofuz
parents:
diff changeset
613 };
anatofuz
parents:
diff changeset
614
anatofuz
parents:
diff changeset
615 // Solaris target
anatofuz
parents:
diff changeset
616 template <typename Target>
anatofuz
parents:
diff changeset
617 class LLVM_LIBRARY_VISIBILITY SolarisTargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
618 protected:
anatofuz
parents:
diff changeset
619 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
620 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
621 DefineStd(Builder, "sun", Opts);
anatofuz
parents:
diff changeset
622 DefineStd(Builder, "unix", Opts);
anatofuz
parents:
diff changeset
623 Builder.defineMacro("__ELF__");
anatofuz
parents:
diff changeset
624 Builder.defineMacro("__svr4__");
anatofuz
parents:
diff changeset
625 Builder.defineMacro("__SVR4");
anatofuz
parents:
diff changeset
626 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
anatofuz
parents:
diff changeset
627 // newer, but to 500 for everything else. feature_test.h has a check to
anatofuz
parents:
diff changeset
628 // ensure that you are not using C99 with an old version of X/Open or C89
anatofuz
parents:
diff changeset
629 // with a new version.
anatofuz
parents:
diff changeset
630 if (Opts.C99)
anatofuz
parents:
diff changeset
631 Builder.defineMacro("_XOPEN_SOURCE", "600");
anatofuz
parents:
diff changeset
632 else
anatofuz
parents:
diff changeset
633 Builder.defineMacro("_XOPEN_SOURCE", "500");
anatofuz
parents:
diff changeset
634 if (Opts.CPlusPlus) {
anatofuz
parents:
diff changeset
635 Builder.defineMacro("__C99FEATURES__");
anatofuz
parents:
diff changeset
636 Builder.defineMacro("_FILE_OFFSET_BITS", "64");
anatofuz
parents:
diff changeset
637 }
anatofuz
parents:
diff changeset
638 // GCC restricts the next two to C++.
anatofuz
parents:
diff changeset
639 Builder.defineMacro("_LARGEFILE_SOURCE");
anatofuz
parents:
diff changeset
640 Builder.defineMacro("_LARGEFILE64_SOURCE");
anatofuz
parents:
diff changeset
641 Builder.defineMacro("__EXTENSIONS__");
anatofuz
parents:
diff changeset
642 if (Opts.POSIXThreads)
anatofuz
parents:
diff changeset
643 Builder.defineMacro("_REENTRANT");
anatofuz
parents:
diff changeset
644 if (this->HasFloat128)
anatofuz
parents:
diff changeset
645 Builder.defineMacro("__FLOAT128__");
anatofuz
parents:
diff changeset
646 }
anatofuz
parents:
diff changeset
647
anatofuz
parents:
diff changeset
648 public:
anatofuz
parents:
diff changeset
649 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
650 : OSTargetInfo<Target>(Triple, Opts) {
anatofuz
parents:
diff changeset
651 if (this->PointerWidth == 64) {
anatofuz
parents:
diff changeset
652 this->WCharType = this->WIntType = this->SignedInt;
anatofuz
parents:
diff changeset
653 } else {
anatofuz
parents:
diff changeset
654 this->WCharType = this->WIntType = this->SignedLong;
anatofuz
parents:
diff changeset
655 }
anatofuz
parents:
diff changeset
656 switch (Triple.getArch()) {
anatofuz
parents:
diff changeset
657 default:
anatofuz
parents:
diff changeset
658 break;
anatofuz
parents:
diff changeset
659 case llvm::Triple::x86:
anatofuz
parents:
diff changeset
660 case llvm::Triple::x86_64:
anatofuz
parents:
diff changeset
661 this->HasFloat128 = true;
anatofuz
parents:
diff changeset
662 break;
anatofuz
parents:
diff changeset
663 }
anatofuz
parents:
diff changeset
664 }
anatofuz
parents:
diff changeset
665 };
anatofuz
parents:
diff changeset
666
anatofuz
parents:
diff changeset
667 // AIX Target
anatofuz
parents:
diff changeset
668 template <typename Target>
anatofuz
parents:
diff changeset
669 class AIXTargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
670 protected:
anatofuz
parents:
diff changeset
671 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
672 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
673 DefineStd(Builder, "unix", Opts);
anatofuz
parents:
diff changeset
674 Builder.defineMacro("_IBMR2");
anatofuz
parents:
diff changeset
675 Builder.defineMacro("_POWER");
anatofuz
parents:
diff changeset
676
anatofuz
parents:
diff changeset
677 Builder.defineMacro("_AIX");
anatofuz
parents:
diff changeset
678
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
679 if (Opts.EnableAIXExtendedAltivecABI)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
680 Builder.defineMacro("__EXTABI__");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
681
150
anatofuz
parents:
diff changeset
682 unsigned Major, Minor, Micro;
anatofuz
parents:
diff changeset
683 Triple.getOSVersion(Major, Minor, Micro);
anatofuz
parents:
diff changeset
684
anatofuz
parents:
diff changeset
685 // Define AIX OS-Version Macros.
anatofuz
parents:
diff changeset
686 // Includes logic for legacy versions of AIX; no specific intent to support.
anatofuz
parents:
diff changeset
687 std::pair<int, int> OsVersion = {Major, Minor};
anatofuz
parents:
diff changeset
688 if (OsVersion >= std::make_pair(3, 2)) Builder.defineMacro("_AIX32");
anatofuz
parents:
diff changeset
689 if (OsVersion >= std::make_pair(4, 1)) Builder.defineMacro("_AIX41");
anatofuz
parents:
diff changeset
690 if (OsVersion >= std::make_pair(4, 3)) Builder.defineMacro("_AIX43");
anatofuz
parents:
diff changeset
691 if (OsVersion >= std::make_pair(5, 0)) Builder.defineMacro("_AIX50");
anatofuz
parents:
diff changeset
692 if (OsVersion >= std::make_pair(5, 1)) Builder.defineMacro("_AIX51");
anatofuz
parents:
diff changeset
693 if (OsVersion >= std::make_pair(5, 2)) Builder.defineMacro("_AIX52");
anatofuz
parents:
diff changeset
694 if (OsVersion >= std::make_pair(5, 3)) Builder.defineMacro("_AIX53");
anatofuz
parents:
diff changeset
695 if (OsVersion >= std::make_pair(6, 1)) Builder.defineMacro("_AIX61");
anatofuz
parents:
diff changeset
696 if (OsVersion >= std::make_pair(7, 1)) Builder.defineMacro("_AIX71");
anatofuz
parents:
diff changeset
697 if (OsVersion >= std::make_pair(7, 2)) Builder.defineMacro("_AIX72");
anatofuz
parents:
diff changeset
698
anatofuz
parents:
diff changeset
699 // FIXME: Do not define _LONG_LONG when -fno-long-long is specified.
anatofuz
parents:
diff changeset
700 Builder.defineMacro("_LONG_LONG");
anatofuz
parents:
diff changeset
701
anatofuz
parents:
diff changeset
702 if (Opts.POSIXThreads) {
anatofuz
parents:
diff changeset
703 Builder.defineMacro("_THREAD_SAFE");
anatofuz
parents:
diff changeset
704 }
anatofuz
parents:
diff changeset
705
anatofuz
parents:
diff changeset
706 if (this->PointerWidth == 64) {
anatofuz
parents:
diff changeset
707 Builder.defineMacro("__64BIT__");
anatofuz
parents:
diff changeset
708 }
anatofuz
parents:
diff changeset
709
anatofuz
parents:
diff changeset
710 // Define _WCHAR_T when it is a fundamental type
anatofuz
parents:
diff changeset
711 // (i.e., for C++ without -fno-wchar).
anatofuz
parents:
diff changeset
712 if (Opts.CPlusPlus && Opts.WChar) {
anatofuz
parents:
diff changeset
713 Builder.defineMacro("_WCHAR_T");
anatofuz
parents:
diff changeset
714 }
anatofuz
parents:
diff changeset
715 }
anatofuz
parents:
diff changeset
716
anatofuz
parents:
diff changeset
717 public:
anatofuz
parents:
diff changeset
718 AIXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
719 : OSTargetInfo<Target>(Triple, Opts) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
720 this->TheCXXABI.set(TargetCXXABI::XL);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
721
150
anatofuz
parents:
diff changeset
722 if (this->PointerWidth == 64) {
anatofuz
parents:
diff changeset
723 this->WCharType = this->UnsignedInt;
anatofuz
parents:
diff changeset
724 } else {
anatofuz
parents:
diff changeset
725 this->WCharType = this->UnsignedShort;
anatofuz
parents:
diff changeset
726 }
anatofuz
parents:
diff changeset
727 this->UseZeroLengthBitfieldAlignment = true;
anatofuz
parents:
diff changeset
728 }
anatofuz
parents:
diff changeset
729
anatofuz
parents:
diff changeset
730 // AIX sets FLT_EVAL_METHOD to be 1.
anatofuz
parents:
diff changeset
731 unsigned getFloatEvalMethod() const override { return 1; }
anatofuz
parents:
diff changeset
732 bool hasInt128Type() const override { return false; }
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
733
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
734 bool defaultsToAIXPowerAlignment() const override { return true; }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
735 };
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
736
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
737 // z/OS target
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
738 template <typename Target>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
739 class LLVM_LIBRARY_VISIBILITY ZOSTargetInfo : public OSTargetInfo<Target> {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
740 protected:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
741 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
742 MacroBuilder &Builder) const override {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
743 // FIXME: _LONG_LONG should not be defined under -std=c89.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
744 Builder.defineMacro("_LONG_LONG");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
745 Builder.defineMacro("_OPEN_DEFAULT");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
746 // _UNIX03_WITHDRAWN is required to build libcxx.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
747 Builder.defineMacro("_UNIX03_WITHDRAWN");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
748 Builder.defineMacro("__370__");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
749 Builder.defineMacro("__BFP__");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
750 // FIXME: __BOOL__ should not be defined under -std=c89.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
751 Builder.defineMacro("__BOOL__");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
752 Builder.defineMacro("__LONGNAME__");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
753 Builder.defineMacro("__MVS__");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
754 Builder.defineMacro("__THW_370__");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
755 Builder.defineMacro("__THW_BIG_ENDIAN__");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
756 Builder.defineMacro("__TOS_390__");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
757 Builder.defineMacro("__TOS_MVS__");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
758 Builder.defineMacro("__XPLINK__");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
759
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
760 if (this->PointerWidth == 64)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
761 Builder.defineMacro("__64BIT__");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
762
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
763 if (Opts.CPlusPlus) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
764 Builder.defineMacro("__DLL__");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
765 // _XOPEN_SOURCE=600 is required to build libcxx.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
766 Builder.defineMacro("_XOPEN_SOURCE", "600");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
767 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
768
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
769 if (Opts.GNUMode) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
770 Builder.defineMacro("_MI_BUILTIN");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
771 Builder.defineMacro("_EXT");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
772 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
773
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
774 if (Opts.CPlusPlus && Opts.WChar) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
775 // Macro __wchar_t is defined so that the wchar_t data
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
776 // type is not declared as a typedef in system headers.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
777 Builder.defineMacro("__wchar_t");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
778 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
779
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
780 this->PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
781 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
782
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
783 public:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
784 ZOSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
785 : OSTargetInfo<Target>(Triple, Opts) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
786 this->WCharType = TargetInfo::UnsignedInt;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
787 this->MaxAlignedAttribute = 128;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
788 this->UseBitFieldTypeAlignment = false;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
789 this->UseZeroLengthBitfieldAlignment = true;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
790 this->UseLeadingZeroLengthBitfield = false;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
791 this->ZeroLengthBitfieldBoundary = 32;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
792 this->MinGlobalAlign = 0;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
793 this->DefaultAlignForAttributeAligned = 128;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
794 }
150
anatofuz
parents:
diff changeset
795 };
anatofuz
parents:
diff changeset
796
anatofuz
parents:
diff changeset
797 void addWindowsDefines(const llvm::Triple &Triple, const LangOptions &Opts,
anatofuz
parents:
diff changeset
798 MacroBuilder &Builder);
anatofuz
parents:
diff changeset
799
anatofuz
parents:
diff changeset
800 // Windows target
anatofuz
parents:
diff changeset
801 template <typename Target>
anatofuz
parents:
diff changeset
802 class LLVM_LIBRARY_VISIBILITY WindowsTargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
803 protected:
anatofuz
parents:
diff changeset
804 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
805 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
806 addWindowsDefines(Triple, Opts, Builder);
anatofuz
parents:
diff changeset
807 }
anatofuz
parents:
diff changeset
808
anatofuz
parents:
diff changeset
809 public:
anatofuz
parents:
diff changeset
810 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
811 : OSTargetInfo<Target>(Triple, Opts) {
anatofuz
parents:
diff changeset
812 this->WCharType = TargetInfo::UnsignedShort;
anatofuz
parents:
diff changeset
813 this->WIntType = TargetInfo::UnsignedShort;
anatofuz
parents:
diff changeset
814 }
anatofuz
parents:
diff changeset
815 };
anatofuz
parents:
diff changeset
816
anatofuz
parents:
diff changeset
817 template <typename Target>
anatofuz
parents:
diff changeset
818 class LLVM_LIBRARY_VISIBILITY NaClTargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
819 protected:
anatofuz
parents:
diff changeset
820 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
821 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
822 if (Opts.POSIXThreads)
anatofuz
parents:
diff changeset
823 Builder.defineMacro("_REENTRANT");
anatofuz
parents:
diff changeset
824 if (Opts.CPlusPlus)
anatofuz
parents:
diff changeset
825 Builder.defineMacro("_GNU_SOURCE");
anatofuz
parents:
diff changeset
826
anatofuz
parents:
diff changeset
827 DefineStd(Builder, "unix", Opts);
anatofuz
parents:
diff changeset
828 Builder.defineMacro("__ELF__");
anatofuz
parents:
diff changeset
829 Builder.defineMacro("__native_client__");
anatofuz
parents:
diff changeset
830 }
anatofuz
parents:
diff changeset
831
anatofuz
parents:
diff changeset
832 public:
anatofuz
parents:
diff changeset
833 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
834 : OSTargetInfo<Target>(Triple, Opts) {
anatofuz
parents:
diff changeset
835 this->LongAlign = 32;
anatofuz
parents:
diff changeset
836 this->LongWidth = 32;
anatofuz
parents:
diff changeset
837 this->PointerAlign = 32;
anatofuz
parents:
diff changeset
838 this->PointerWidth = 32;
anatofuz
parents:
diff changeset
839 this->IntMaxType = TargetInfo::SignedLongLong;
anatofuz
parents:
diff changeset
840 this->Int64Type = TargetInfo::SignedLongLong;
anatofuz
parents:
diff changeset
841 this->DoubleAlign = 64;
anatofuz
parents:
diff changeset
842 this->LongDoubleWidth = 64;
anatofuz
parents:
diff changeset
843 this->LongDoubleAlign = 64;
anatofuz
parents:
diff changeset
844 this->LongLongWidth = 64;
anatofuz
parents:
diff changeset
845 this->LongLongAlign = 64;
anatofuz
parents:
diff changeset
846 this->SizeType = TargetInfo::UnsignedInt;
anatofuz
parents:
diff changeset
847 this->PtrDiffType = TargetInfo::SignedInt;
anatofuz
parents:
diff changeset
848 this->IntPtrType = TargetInfo::SignedInt;
anatofuz
parents:
diff changeset
849 // RegParmMax is inherited from the underlying architecture.
anatofuz
parents:
diff changeset
850 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble();
anatofuz
parents:
diff changeset
851 if (Triple.getArch() == llvm::Triple::arm) {
anatofuz
parents:
diff changeset
852 // Handled in ARM's setABI().
anatofuz
parents:
diff changeset
853 } else if (Triple.getArch() == llvm::Triple::x86) {
anatofuz
parents:
diff changeset
854 this->resetDataLayout("e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-"
anatofuz
parents:
diff changeset
855 "i64:64-n8:16:32-S128");
anatofuz
parents:
diff changeset
856 } else if (Triple.getArch() == llvm::Triple::x86_64) {
anatofuz
parents:
diff changeset
857 this->resetDataLayout("e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-"
anatofuz
parents:
diff changeset
858 "i64:64-n8:16:32:64-S128");
anatofuz
parents:
diff changeset
859 } else if (Triple.getArch() == llvm::Triple::mipsel) {
anatofuz
parents:
diff changeset
860 // Handled on mips' setDataLayout.
anatofuz
parents:
diff changeset
861 } else {
anatofuz
parents:
diff changeset
862 assert(Triple.getArch() == llvm::Triple::le32);
anatofuz
parents:
diff changeset
863 this->resetDataLayout("e-p:32:32-i64:64");
anatofuz
parents:
diff changeset
864 }
anatofuz
parents:
diff changeset
865 }
anatofuz
parents:
diff changeset
866 };
anatofuz
parents:
diff changeset
867
anatofuz
parents:
diff changeset
868 // Fuchsia Target
anatofuz
parents:
diff changeset
869 template <typename Target>
anatofuz
parents:
diff changeset
870 class LLVM_LIBRARY_VISIBILITY FuchsiaTargetInfo : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
871 protected:
anatofuz
parents:
diff changeset
872 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
873 MacroBuilder &Builder) const override {
anatofuz
parents:
diff changeset
874 Builder.defineMacro("__Fuchsia__");
anatofuz
parents:
diff changeset
875 Builder.defineMacro("__ELF__");
anatofuz
parents:
diff changeset
876 if (Opts.POSIXThreads)
anatofuz
parents:
diff changeset
877 Builder.defineMacro("_REENTRANT");
anatofuz
parents:
diff changeset
878 // Required by the libc++ locale support.
anatofuz
parents:
diff changeset
879 if (Opts.CPlusPlus)
anatofuz
parents:
diff changeset
880 Builder.defineMacro("_GNU_SOURCE");
anatofuz
parents:
diff changeset
881 }
anatofuz
parents:
diff changeset
882
anatofuz
parents:
diff changeset
883 public:
anatofuz
parents:
diff changeset
884 FuchsiaTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
885 : OSTargetInfo<Target>(Triple, Opts) {
anatofuz
parents:
diff changeset
886 this->MCountName = "__mcount";
anatofuz
parents:
diff changeset
887 this->TheCXXABI.set(TargetCXXABI::Fuchsia);
anatofuz
parents:
diff changeset
888 }
anatofuz
parents:
diff changeset
889 };
anatofuz
parents:
diff changeset
890
anatofuz
parents:
diff changeset
891 // WebAssembly target
anatofuz
parents:
diff changeset
892 template <typename Target>
anatofuz
parents:
diff changeset
893 class LLVM_LIBRARY_VISIBILITY WebAssemblyOSTargetInfo
anatofuz
parents:
diff changeset
894 : public OSTargetInfo<Target> {
anatofuz
parents:
diff changeset
895 protected:
anatofuz
parents:
diff changeset
896 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
897 MacroBuilder &Builder) const override {
150
anatofuz
parents:
diff changeset
898 // A common platform macro.
anatofuz
parents:
diff changeset
899 if (Opts.POSIXThreads)
anatofuz
parents:
diff changeset
900 Builder.defineMacro("_REENTRANT");
anatofuz
parents:
diff changeset
901 // Follow g++ convention and predefine _GNU_SOURCE for C++.
anatofuz
parents:
diff changeset
902 if (Opts.CPlusPlus)
anatofuz
parents:
diff changeset
903 Builder.defineMacro("_GNU_SOURCE");
anatofuz
parents:
diff changeset
904 // Indicate that we have __float128.
anatofuz
parents:
diff changeset
905 Builder.defineMacro("__FLOAT128__");
anatofuz
parents:
diff changeset
906 }
anatofuz
parents:
diff changeset
907
anatofuz
parents:
diff changeset
908 public:
anatofuz
parents:
diff changeset
909 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
910 const TargetOptions &Opts)
anatofuz
parents:
diff changeset
911 : OSTargetInfo<Target>(Triple, Opts) {
anatofuz
parents:
diff changeset
912 this->MCountName = "__mcount";
anatofuz
parents:
diff changeset
913 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
anatofuz
parents:
diff changeset
914 this->HasFloat128 = true;
anatofuz
parents:
diff changeset
915 }
anatofuz
parents:
diff changeset
916 };
anatofuz
parents:
diff changeset
917
anatofuz
parents:
diff changeset
918 // WASI target
anatofuz
parents:
diff changeset
919 template <typename Target>
anatofuz
parents:
diff changeset
920 class LLVM_LIBRARY_VISIBILITY WASITargetInfo
anatofuz
parents:
diff changeset
921 : public WebAssemblyOSTargetInfo<Target> {
anatofuz
parents:
diff changeset
922 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
923 MacroBuilder &Builder) const final {
anatofuz
parents:
diff changeset
924 WebAssemblyOSTargetInfo<Target>::getOSDefines(Opts, Triple, Builder);
anatofuz
parents:
diff changeset
925 Builder.defineMacro("__wasi__");
anatofuz
parents:
diff changeset
926 }
anatofuz
parents:
diff changeset
927
anatofuz
parents:
diff changeset
928 public:
anatofuz
parents:
diff changeset
929 explicit WASITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
930 : WebAssemblyOSTargetInfo<Target>(Triple, Opts) {}
anatofuz
parents:
diff changeset
931 };
anatofuz
parents:
diff changeset
932
anatofuz
parents:
diff changeset
933 // Emscripten target
anatofuz
parents:
diff changeset
934 template <typename Target>
anatofuz
parents:
diff changeset
935 class LLVM_LIBRARY_VISIBILITY EmscriptenTargetInfo
anatofuz
parents:
diff changeset
936 : public WebAssemblyOSTargetInfo<Target> {
anatofuz
parents:
diff changeset
937 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
anatofuz
parents:
diff changeset
938 MacroBuilder &Builder) const final {
anatofuz
parents:
diff changeset
939 WebAssemblyOSTargetInfo<Target>::getOSDefines(Opts, Triple, Builder);
anatofuz
parents:
diff changeset
940 Builder.defineMacro("__EMSCRIPTEN__");
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
941 if (Opts.POSIXThreads)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
942 Builder.defineMacro("__EMSCRIPTEN_PTHREADS__");
150
anatofuz
parents:
diff changeset
943 }
anatofuz
parents:
diff changeset
944
anatofuz
parents:
diff changeset
945 public:
anatofuz
parents:
diff changeset
946 explicit EmscriptenTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
anatofuz
parents:
diff changeset
947 : WebAssemblyOSTargetInfo<Target>(Triple, Opts) {}
anatofuz
parents:
diff changeset
948 };
anatofuz
parents:
diff changeset
949
anatofuz
parents:
diff changeset
950 } // namespace targets
anatofuz
parents:
diff changeset
951 } // namespace clang
anatofuz
parents:
diff changeset
952 #endif // LLVM_CLANG_LIB_BASIC_TARGETS_OSTARGETS_H