OSTargets.h 29 KB

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