Targets.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  1. //===--- Targets.cpp - Implement target feature support -------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file implements construction of a TargetInfo object from a
  11. // target triple.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #include "Targets.h"
  15. #include "Targets/AArch64.h"
  16. #include "Targets/AMDGPU.h"
  17. #include "Targets/ARM.h"
  18. #include "Targets/AVR.h"
  19. #include "Targets/BPF.h"
  20. #include "Targets/Hexagon.h"
  21. #include "Targets/Lanai.h"
  22. #include "Targets/Le64.h"
  23. #include "Targets/MSP430.h"
  24. #include "Targets/Mips.h"
  25. #include "Targets/NVPTX.h"
  26. #include "Targets/Nios2.h"
  27. #include "Targets/OSTargets.h"
  28. #include "Targets/PNaCl.h"
  29. #include "Targets/PPC.h"
  30. #include "Targets/RISCV.h"
  31. #include "Targets/SPIR.h"
  32. #include "Targets/Sparc.h"
  33. #include "Targets/SystemZ.h"
  34. #include "Targets/TCE.h"
  35. #include "Targets/WebAssembly.h"
  36. #include "Targets/X86.h"
  37. #include "Targets/XCore.h"
  38. #include "clang/Basic/Diagnostic.h"
  39. #include "llvm/ADT/StringExtras.h"
  40. #include "llvm/ADT/Triple.h"
  41. using namespace clang;
  42. namespace clang {
  43. namespace targets {
  44. //===----------------------------------------------------------------------===//
  45. // Common code shared among targets.
  46. //===----------------------------------------------------------------------===//
  47. /// DefineStd - Define a macro name and standard variants. For example if
  48. /// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
  49. /// when in GNU mode.
  50. void DefineStd(MacroBuilder &Builder, StringRef MacroName,
  51. const LangOptions &Opts) {
  52. assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
  53. // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
  54. // in the user's namespace.
  55. if (Opts.GNUMode)
  56. Builder.defineMacro(MacroName);
  57. // Define __unix.
  58. Builder.defineMacro("__" + MacroName);
  59. // Define __unix__.
  60. Builder.defineMacro("__" + MacroName + "__");
  61. }
  62. void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName, bool Tuning) {
  63. Builder.defineMacro("__" + CPUName);
  64. Builder.defineMacro("__" + CPUName + "__");
  65. if (Tuning)
  66. Builder.defineMacro("__tune_" + CPUName + "__");
  67. }
  68. void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
  69. // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
  70. // supports __declspec natively under -fms-extensions, but we define a no-op
  71. // __declspec macro anyway for pre-processor compatibility.
  72. if (Opts.MicrosoftExt)
  73. Builder.defineMacro("__declspec", "__declspec");
  74. else
  75. Builder.defineMacro("__declspec(a)", "__attribute__((a))");
  76. if (!Opts.MicrosoftExt) {
  77. // Provide macros for all the calling convention keywords. Provide both
  78. // single and double underscore prefixed variants. These are available on
  79. // x64 as well as x86, even though they have no effect.
  80. const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
  81. for (const char *CC : CCs) {
  82. std::string GCCSpelling = "__attribute__((__";
  83. GCCSpelling += CC;
  84. GCCSpelling += "__))";
  85. Builder.defineMacro(Twine("_") + CC, GCCSpelling);
  86. Builder.defineMacro(Twine("__") + CC, GCCSpelling);
  87. }
  88. }
  89. }
  90. void addMinGWDefines(const llvm::Triple &Triple, const LangOptions &Opts,
  91. MacroBuilder &Builder) {
  92. DefineStd(Builder, "WIN32", Opts);
  93. DefineStd(Builder, "WINNT", Opts);
  94. if (Triple.isArch64Bit()) {
  95. DefineStd(Builder, "WIN64", Opts);
  96. Builder.defineMacro("__MINGW64__");
  97. }
  98. Builder.defineMacro("__MSVCRT__");
  99. Builder.defineMacro("__MINGW32__");
  100. addCygMingDefines(Opts, Builder);
  101. }
  102. //===----------------------------------------------------------------------===//
  103. // Driver code
  104. //===----------------------------------------------------------------------===//
  105. TargetInfo *AllocateTarget(const llvm::Triple &Triple,
  106. const TargetOptions &Opts) {
  107. llvm::Triple::OSType os = Triple.getOS();
  108. switch (Triple.getArch()) {
  109. default:
  110. return nullptr;
  111. case llvm::Triple::xcore:
  112. return new XCoreTargetInfo(Triple, Opts);
  113. case llvm::Triple::hexagon:
  114. return new HexagonTargetInfo(Triple, Opts);
  115. case llvm::Triple::lanai:
  116. return new LanaiTargetInfo(Triple, Opts);
  117. case llvm::Triple::aarch64:
  118. if (Triple.isOSDarwin())
  119. return new DarwinAArch64TargetInfo(Triple, Opts);
  120. switch (os) {
  121. case llvm::Triple::CloudABI:
  122. return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
  123. case llvm::Triple::FreeBSD:
  124. return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
  125. case llvm::Triple::Fuchsia:
  126. return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
  127. case llvm::Triple::Linux:
  128. return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
  129. case llvm::Triple::NetBSD:
  130. return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
  131. case llvm::Triple::OpenBSD:
  132. return new OpenBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
  133. case llvm::Triple::Win32:
  134. switch (Triple.getEnvironment()) {
  135. case llvm::Triple::GNU:
  136. return new MinGWARM64TargetInfo(Triple, Opts);
  137. case llvm::Triple::MSVC:
  138. default: // Assume MSVC for unknown environments
  139. return new MicrosoftARM64TargetInfo(Triple, Opts);
  140. }
  141. default:
  142. return new AArch64leTargetInfo(Triple, Opts);
  143. }
  144. case llvm::Triple::aarch64_be:
  145. switch (os) {
  146. case llvm::Triple::FreeBSD:
  147. return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
  148. case llvm::Triple::Fuchsia:
  149. return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
  150. case llvm::Triple::Linux:
  151. return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
  152. case llvm::Triple::NetBSD:
  153. return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
  154. default:
  155. return new AArch64beTargetInfo(Triple, Opts);
  156. }
  157. case llvm::Triple::arm:
  158. case llvm::Triple::thumb:
  159. if (Triple.isOSBinFormatMachO())
  160. return new DarwinARMTargetInfo(Triple, Opts);
  161. switch (os) {
  162. case llvm::Triple::CloudABI:
  163. return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
  164. case llvm::Triple::Linux:
  165. return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
  166. case llvm::Triple::FreeBSD:
  167. return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
  168. case llvm::Triple::NetBSD:
  169. return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
  170. case llvm::Triple::OpenBSD:
  171. return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
  172. case llvm::Triple::RTEMS:
  173. return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
  174. case llvm::Triple::NaCl:
  175. return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
  176. case llvm::Triple::Win32:
  177. switch (Triple.getEnvironment()) {
  178. case llvm::Triple::Cygnus:
  179. return new CygwinARMTargetInfo(Triple, Opts);
  180. case llvm::Triple::GNU:
  181. return new MinGWARMTargetInfo(Triple, Opts);
  182. case llvm::Triple::Itanium:
  183. return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
  184. case llvm::Triple::MSVC:
  185. default: // Assume MSVC for unknown environments
  186. return new MicrosoftARMleTargetInfo(Triple, Opts);
  187. }
  188. default:
  189. return new ARMleTargetInfo(Triple, Opts);
  190. }
  191. case llvm::Triple::armeb:
  192. case llvm::Triple::thumbeb:
  193. if (Triple.isOSDarwin())
  194. return new DarwinARMTargetInfo(Triple, Opts);
  195. switch (os) {
  196. case llvm::Triple::Linux:
  197. return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
  198. case llvm::Triple::FreeBSD:
  199. return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
  200. case llvm::Triple::NetBSD:
  201. return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
  202. case llvm::Triple::OpenBSD:
  203. return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
  204. case llvm::Triple::RTEMS:
  205. return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
  206. case llvm::Triple::NaCl:
  207. return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
  208. default:
  209. return new ARMbeTargetInfo(Triple, Opts);
  210. }
  211. case llvm::Triple::avr:
  212. return new AVRTargetInfo(Triple, Opts);
  213. case llvm::Triple::bpfeb:
  214. case llvm::Triple::bpfel:
  215. return new BPFTargetInfo(Triple, Opts);
  216. case llvm::Triple::msp430:
  217. return new MSP430TargetInfo(Triple, Opts);
  218. case llvm::Triple::nios2:
  219. return new LinuxTargetInfo<Nios2TargetInfo>(Triple, Opts);
  220. case llvm::Triple::mips:
  221. switch (os) {
  222. case llvm::Triple::Linux:
  223. return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
  224. case llvm::Triple::RTEMS:
  225. return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
  226. case llvm::Triple::FreeBSD:
  227. return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
  228. case llvm::Triple::NetBSD:
  229. return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
  230. default:
  231. return new MipsTargetInfo(Triple, Opts);
  232. }
  233. case llvm::Triple::mipsel:
  234. switch (os) {
  235. case llvm::Triple::Linux:
  236. return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
  237. case llvm::Triple::RTEMS:
  238. return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
  239. case llvm::Triple::FreeBSD:
  240. return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
  241. case llvm::Triple::NetBSD:
  242. return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
  243. case llvm::Triple::NaCl:
  244. return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
  245. default:
  246. return new MipsTargetInfo(Triple, Opts);
  247. }
  248. case llvm::Triple::mips64:
  249. switch (os) {
  250. case llvm::Triple::Linux:
  251. return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
  252. case llvm::Triple::RTEMS:
  253. return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
  254. case llvm::Triple::FreeBSD:
  255. return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
  256. case llvm::Triple::NetBSD:
  257. return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
  258. case llvm::Triple::OpenBSD:
  259. return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
  260. default:
  261. return new MipsTargetInfo(Triple, Opts);
  262. }
  263. case llvm::Triple::mips64el:
  264. switch (os) {
  265. case llvm::Triple::Linux:
  266. return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
  267. case llvm::Triple::RTEMS:
  268. return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
  269. case llvm::Triple::FreeBSD:
  270. return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
  271. case llvm::Triple::NetBSD:
  272. return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
  273. case llvm::Triple::OpenBSD:
  274. return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
  275. default:
  276. return new MipsTargetInfo(Triple, Opts);
  277. }
  278. case llvm::Triple::le32:
  279. switch (os) {
  280. case llvm::Triple::NaCl:
  281. return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
  282. default:
  283. return nullptr;
  284. }
  285. case llvm::Triple::le64:
  286. return new Le64TargetInfo(Triple, Opts);
  287. case llvm::Triple::ppc:
  288. if (Triple.isOSDarwin())
  289. return new DarwinPPC32TargetInfo(Triple, Opts);
  290. switch (os) {
  291. case llvm::Triple::Linux:
  292. return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
  293. case llvm::Triple::FreeBSD:
  294. return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
  295. case llvm::Triple::NetBSD:
  296. return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
  297. case llvm::Triple::OpenBSD:
  298. return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
  299. case llvm::Triple::RTEMS:
  300. return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
  301. default:
  302. return new PPC32TargetInfo(Triple, Opts);
  303. }
  304. case llvm::Triple::ppc64:
  305. if (Triple.isOSDarwin())
  306. return new DarwinPPC64TargetInfo(Triple, Opts);
  307. switch (os) {
  308. case llvm::Triple::Linux:
  309. return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
  310. case llvm::Triple::Lv2:
  311. return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
  312. case llvm::Triple::FreeBSD:
  313. return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
  314. case llvm::Triple::NetBSD:
  315. return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
  316. default:
  317. return new PPC64TargetInfo(Triple, Opts);
  318. }
  319. case llvm::Triple::ppc64le:
  320. switch (os) {
  321. case llvm::Triple::Linux:
  322. return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
  323. case llvm::Triple::NetBSD:
  324. return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
  325. default:
  326. return new PPC64TargetInfo(Triple, Opts);
  327. }
  328. case llvm::Triple::nvptx:
  329. return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
  330. case llvm::Triple::nvptx64:
  331. return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
  332. case llvm::Triple::amdgcn:
  333. case llvm::Triple::r600:
  334. return new AMDGPUTargetInfo(Triple, Opts);
  335. case llvm::Triple::riscv32:
  336. // TODO: add cases for FreeBSD, NetBSD, RTEMS once tested.
  337. if (os == llvm::Triple::Linux)
  338. return new LinuxTargetInfo<RISCV32TargetInfo>(Triple, Opts);
  339. return new RISCV32TargetInfo(Triple, Opts);
  340. case llvm::Triple::riscv64:
  341. // TODO: add cases for FreeBSD, NetBSD, RTEMS once tested.
  342. if (os == llvm::Triple::Linux)
  343. return new LinuxTargetInfo<RISCV64TargetInfo>(Triple, Opts);
  344. return new RISCV64TargetInfo(Triple, Opts);
  345. case llvm::Triple::sparc:
  346. switch (os) {
  347. case llvm::Triple::Linux:
  348. return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
  349. case llvm::Triple::Solaris:
  350. return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
  351. case llvm::Triple::NetBSD:
  352. return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
  353. case llvm::Triple::OpenBSD:
  354. return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
  355. case llvm::Triple::RTEMS:
  356. return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
  357. default:
  358. return new SparcV8TargetInfo(Triple, Opts);
  359. }
  360. // The 'sparcel' architecture copies all the above cases except for Solaris.
  361. case llvm::Triple::sparcel:
  362. switch (os) {
  363. case llvm::Triple::Linux:
  364. return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
  365. case llvm::Triple::NetBSD:
  366. return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
  367. case llvm::Triple::OpenBSD:
  368. return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
  369. case llvm::Triple::RTEMS:
  370. return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
  371. default:
  372. return new SparcV8elTargetInfo(Triple, Opts);
  373. }
  374. case llvm::Triple::sparcv9:
  375. switch (os) {
  376. case llvm::Triple::Linux:
  377. return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
  378. case llvm::Triple::Solaris:
  379. return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
  380. case llvm::Triple::NetBSD:
  381. return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
  382. case llvm::Triple::OpenBSD:
  383. return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
  384. case llvm::Triple::FreeBSD:
  385. return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
  386. default:
  387. return new SparcV9TargetInfo(Triple, Opts);
  388. }
  389. case llvm::Triple::systemz:
  390. switch (os) {
  391. case llvm::Triple::Linux:
  392. return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
  393. default:
  394. return new SystemZTargetInfo(Triple, Opts);
  395. }
  396. case llvm::Triple::tce:
  397. return new TCETargetInfo(Triple, Opts);
  398. case llvm::Triple::tcele:
  399. return new TCELETargetInfo(Triple, Opts);
  400. case llvm::Triple::x86:
  401. if (Triple.isOSDarwin())
  402. return new DarwinI386TargetInfo(Triple, Opts);
  403. switch (os) {
  404. case llvm::Triple::Ananas:
  405. return new AnanasTargetInfo<X86_32TargetInfo>(Triple, Opts);
  406. case llvm::Triple::CloudABI:
  407. return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
  408. case llvm::Triple::Linux: {
  409. switch (Triple.getEnvironment()) {
  410. default:
  411. return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
  412. case llvm::Triple::Android:
  413. return new AndroidX86_32TargetInfo(Triple, Opts);
  414. }
  415. }
  416. case llvm::Triple::DragonFly:
  417. return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
  418. case llvm::Triple::NetBSD:
  419. return new NetBSDI386TargetInfo(Triple, Opts);
  420. case llvm::Triple::OpenBSD:
  421. return new OpenBSDI386TargetInfo(Triple, Opts);
  422. case llvm::Triple::FreeBSD:
  423. return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
  424. case llvm::Triple::KFreeBSD:
  425. return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
  426. case llvm::Triple::Minix:
  427. return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
  428. case llvm::Triple::Solaris:
  429. return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
  430. case llvm::Triple::Win32: {
  431. switch (Triple.getEnvironment()) {
  432. case llvm::Triple::Cygnus:
  433. return new CygwinX86_32TargetInfo(Triple, Opts);
  434. case llvm::Triple::GNU:
  435. return new MinGWX86_32TargetInfo(Triple, Opts);
  436. case llvm::Triple::Itanium:
  437. case llvm::Triple::MSVC:
  438. default: // Assume MSVC for unknown environments
  439. return new MicrosoftX86_32TargetInfo(Triple, Opts);
  440. }
  441. }
  442. case llvm::Triple::Haiku:
  443. return new HaikuX86_32TargetInfo(Triple, Opts);
  444. case llvm::Triple::RTEMS:
  445. return new RTEMSX86_32TargetInfo(Triple, Opts);
  446. case llvm::Triple::NaCl:
  447. return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
  448. case llvm::Triple::ELFIAMCU:
  449. return new MCUX86_32TargetInfo(Triple, Opts);
  450. default:
  451. return new X86_32TargetInfo(Triple, Opts);
  452. }
  453. case llvm::Triple::x86_64:
  454. if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
  455. return new DarwinX86_64TargetInfo(Triple, Opts);
  456. switch (os) {
  457. case llvm::Triple::Ananas:
  458. return new AnanasTargetInfo<X86_64TargetInfo>(Triple, Opts);
  459. case llvm::Triple::CloudABI:
  460. return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
  461. case llvm::Triple::Linux: {
  462. switch (Triple.getEnvironment()) {
  463. default:
  464. return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
  465. case llvm::Triple::Android:
  466. return new AndroidX86_64TargetInfo(Triple, Opts);
  467. }
  468. }
  469. case llvm::Triple::DragonFly:
  470. return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
  471. case llvm::Triple::NetBSD:
  472. return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
  473. case llvm::Triple::OpenBSD:
  474. return new OpenBSDX86_64TargetInfo(Triple, Opts);
  475. case llvm::Triple::FreeBSD:
  476. return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
  477. case llvm::Triple::Fuchsia:
  478. return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
  479. case llvm::Triple::KFreeBSD:
  480. return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
  481. case llvm::Triple::Solaris:
  482. return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
  483. case llvm::Triple::Win32: {
  484. switch (Triple.getEnvironment()) {
  485. case llvm::Triple::Cygnus:
  486. return new CygwinX86_64TargetInfo(Triple, Opts);
  487. case llvm::Triple::GNU:
  488. return new MinGWX86_64TargetInfo(Triple, Opts);
  489. case llvm::Triple::MSVC:
  490. default: // Assume MSVC for unknown environments
  491. return new MicrosoftX86_64TargetInfo(Triple, Opts);
  492. }
  493. }
  494. case llvm::Triple::Haiku:
  495. return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
  496. case llvm::Triple::NaCl:
  497. return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
  498. case llvm::Triple::PS4:
  499. return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
  500. default:
  501. return new X86_64TargetInfo(Triple, Opts);
  502. }
  503. case llvm::Triple::spir: {
  504. if (Triple.getOS() != llvm::Triple::UnknownOS ||
  505. Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
  506. return nullptr;
  507. return new SPIR32TargetInfo(Triple, Opts);
  508. }
  509. case llvm::Triple::spir64: {
  510. if (Triple.getOS() != llvm::Triple::UnknownOS ||
  511. Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
  512. return nullptr;
  513. return new SPIR64TargetInfo(Triple, Opts);
  514. }
  515. case llvm::Triple::wasm32:
  516. if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
  517. Triple.getVendor() != llvm::Triple::UnknownVendor ||
  518. Triple.getOS() != llvm::Triple::UnknownOS ||
  519. Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
  520. !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
  521. return nullptr;
  522. return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
  523. case llvm::Triple::wasm64:
  524. if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
  525. Triple.getVendor() != llvm::Triple::UnknownVendor ||
  526. Triple.getOS() != llvm::Triple::UnknownOS ||
  527. Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
  528. !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
  529. return nullptr;
  530. return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
  531. case llvm::Triple::renderscript32:
  532. return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
  533. case llvm::Triple::renderscript64:
  534. return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
  535. }
  536. }
  537. } // namespace targets
  538. } // namespace clang
  539. using namespace clang::targets;
  540. /// CreateTargetInfo - Return the target info object for the specified target
  541. /// options.
  542. TargetInfo *
  543. TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
  544. const std::shared_ptr<TargetOptions> &Opts) {
  545. llvm::Triple Triple(Opts->Triple);
  546. // Construct the target
  547. std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
  548. if (!Target) {
  549. Diags.Report(diag::err_target_unknown_triple) << Triple.str();
  550. return nullptr;
  551. }
  552. Target->TargetOpts = Opts;
  553. // Set the target CPU if specified.
  554. if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
  555. Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
  556. SmallVector<StringRef, 32> ValidList;
  557. Target->fillValidCPUList(ValidList);
  558. if (!ValidList.empty())
  559. Diags.Report(diag::note_valid_options) << llvm::join(ValidList, ", ");
  560. return nullptr;
  561. }
  562. // Set the target ABI if specified.
  563. if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
  564. Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
  565. return nullptr;
  566. }
  567. // Set the fp math unit.
  568. if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
  569. Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
  570. return nullptr;
  571. }
  572. // Compute the default target features, we need the target to handle this
  573. // because features may have dependencies on one another.
  574. llvm::StringMap<bool> Features;
  575. if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
  576. Opts->FeaturesAsWritten))
  577. return nullptr;
  578. // Add the features to the compile options.
  579. Opts->Features.clear();
  580. for (const auto &F : Features)
  581. Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
  582. // Sort here, so we handle the features in a predictable order. (This matters
  583. // when we're dealing with features that overlap.)
  584. llvm::sort(Opts->Features.begin(), Opts->Features.end());
  585. if (!Target->handleTargetFeatures(Opts->Features, Diags))
  586. return nullptr;
  587. Target->setSupportedOpenCLOpts();
  588. Target->setOpenCLExtensionOpts();
  589. Target->setMaxAtomicWidth();
  590. if (!Target->validateTarget(Diags))
  591. return nullptr;
  592. Target->CheckFixedPointBits();
  593. return Target.release();
  594. }