Targets.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. //===--- Targets.cpp - Implement -arch option and targets -----------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file was developed by Chris Lattner and is distributed under
  6. // the University of Illinois Open Source License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file implements the -arch command line option and creates a TargetInfo
  11. // that represents them.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #include "clang.h"
  15. #include "clang/AST/Builtins.h"
  16. #include "clang/Basic/Diagnostic.h"
  17. #include "clang/Basic/TargetInfo.h"
  18. #include "llvm/Support/CommandLine.h"
  19. using namespace clang;
  20. /// Note: a hard coded list of targets is clearly silly, these should be
  21. /// dynamicly registered and loadable with "-load".
  22. enum SupportedTargets {
  23. target_ppc, target_ppc64,
  24. target_i386, target_x86_64,
  25. target_linux_i386
  26. };
  27. static llvm::cl::list<SupportedTargets>
  28. Archs("arch", llvm::cl::desc("Architectures to compile for"),
  29. llvm::cl::values(clEnumValN(target_ppc, "ppc", "32-bit Darwin PowerPC"),
  30. clEnumValN(target_ppc64, "ppc64", "64-bit Darwin PowerPC"),
  31. clEnumValN(target_i386, "i386", "32-bit Darwin X86"),
  32. clEnumValN(target_x86_64, "x86_64","64-bit Darwin X86"),
  33. clEnumValN(target_linux_i386,"linux", "Linux i386"),
  34. clEnumValEnd));
  35. //===----------------------------------------------------------------------===//
  36. // Common code shared among targets.
  37. //===----------------------------------------------------------------------===//
  38. namespace {
  39. class DarwinTargetInfo : public TargetInfoImpl {
  40. public:
  41. virtual void getTargetDefines(std::vector<std::string> &Defines) const {
  42. Defines.push_back("__APPLE__=1");
  43. Defines.push_back("__MACH__=1");
  44. if (1) {// -fobjc-gc controls this.
  45. Defines.push_back("__weak=");
  46. Defines.push_back("__strong=");
  47. } else {
  48. Defines.push_back("__weak=__attribute__((objc_gc(weak)))");
  49. Defines.push_back("__strong=__attribute__((objc_gc(strong)))");
  50. Defines.push_back("__OBJC_GC__");
  51. }
  52. // darwin_constant_cfstrings controls this.
  53. Defines.push_back("__CONSTANT_CFSTRINGS__=1");
  54. if (0) // darwin_pascal_strings
  55. Defines.push_back("__PASCAL_STRINGS__");
  56. }
  57. };
  58. } // end anonymous namespace.
  59. /// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
  60. /// not tied to a specific subtarget.
  61. static void getPowerPCDefines(std::vector<std::string> &Defines, bool is64Bit) {
  62. // Target identification.
  63. Defines.push_back("__ppc__");
  64. Defines.push_back("_ARCH_PPC=1");
  65. Defines.push_back("__POWERPC__=1");
  66. if (is64Bit) {
  67. Defines.push_back("_ARCH_PPC64");
  68. Defines.push_back("_LP64");
  69. Defines.push_back("__LP64__");
  70. Defines.push_back("__ppc64__");
  71. } else {
  72. Defines.push_back("__ppc__=1");
  73. }
  74. // Target properties.
  75. Defines.push_back("_BIG_ENDIAN=1");
  76. Defines.push_back("__BIG_ENDIAN__=1");
  77. if (is64Bit) {
  78. Defines.push_back("__INTMAX_MAX__=9223372036854775807L");
  79. Defines.push_back("__INTMAX_TYPE__=long int");
  80. Defines.push_back("__LONG_MAX__=9223372036854775807L");
  81. Defines.push_back("__PTRDIFF_TYPE__=long int");
  82. Defines.push_back("__UINTMAX_TYPE__=long unsigned int");
  83. } else {
  84. Defines.push_back("__INTMAX_MAX__=9223372036854775807LL");
  85. Defines.push_back("__INTMAX_TYPE__=long long int");
  86. Defines.push_back("__LONG_MAX__=2147483647L");
  87. Defines.push_back("__PTRDIFF_TYPE__=int");
  88. Defines.push_back("__UINTMAX_TYPE__=long long unsigned int");
  89. }
  90. Defines.push_back("__INT_MAX__=2147483647");
  91. Defines.push_back("__LONG_LONG_MAX__=9223372036854775807LL");
  92. Defines.push_back("__CHAR_BIT__=8");
  93. Defines.push_back("__SCHAR_MAX__=127");
  94. Defines.push_back("__SHRT_MAX__=32767");
  95. Defines.push_back("__SIZE_TYPE__=long unsigned int");
  96. // Subtarget options.
  97. Defines.push_back("__USER_LABEL_PREFIX__=_");
  98. Defines.push_back("__NATURAL_ALIGNMENT__=1");
  99. Defines.push_back("__REGISTER_PREFIX__=");
  100. Defines.push_back("__WCHAR_MAX__=2147483647");
  101. Defines.push_back("__WCHAR_TYPE__=int");
  102. Defines.push_back("__WINT_TYPE__=int");
  103. // Float macros.
  104. Defines.push_back("__FLT_DENORM_MIN__=1.40129846e-45F");
  105. Defines.push_back("__FLT_DIG__=6");
  106. Defines.push_back("__FLT_EPSILON__=1.19209290e-7F");
  107. Defines.push_back("__FLT_EVAL_METHOD__=0");
  108. Defines.push_back("__FLT_HAS_INFINITY__=1");
  109. Defines.push_back("__FLT_HAS_QUIET_NAN__=1");
  110. Defines.push_back("__FLT_MANT_DIG__=24");
  111. Defines.push_back("__FLT_MAX_10_EXP__=38");
  112. Defines.push_back("__FLT_MAX_EXP__=128");
  113. Defines.push_back("__FLT_MAX__=3.40282347e+38F");
  114. Defines.push_back("__FLT_MIN_10_EXP__=(-37)");
  115. Defines.push_back("__FLT_MIN_EXP__=(-125)");
  116. Defines.push_back("__FLT_MIN__=1.17549435e-38F");
  117. Defines.push_back("__FLT_RADIX__=2");
  118. // double macros.
  119. Defines.push_back("__DBL_DENORM_MIN__=4.9406564584124654e-324");
  120. Defines.push_back("__DBL_DIG__=15");
  121. Defines.push_back("__DBL_EPSILON__=2.2204460492503131e-16");
  122. Defines.push_back("__DBL_HAS_INFINITY__=1");
  123. Defines.push_back("__DBL_HAS_QUIET_NAN__=1");
  124. Defines.push_back("__DBL_MANT_DIG__=53");
  125. Defines.push_back("__DBL_MAX_10_EXP__=308");
  126. Defines.push_back("__DBL_MAX_EXP__=1024");
  127. Defines.push_back("__DBL_MAX__=1.7976931348623157e+308");
  128. Defines.push_back("__DBL_MIN_10_EXP__=(-307)");
  129. Defines.push_back("__DBL_MIN_EXP__=(-1021)");
  130. Defines.push_back("__DBL_MIN__=2.2250738585072014e-308");
  131. Defines.push_back("__DECIMAL_DIG__=33");
  132. // 128-bit long double macros.
  133. Defines.push_back("__LDBL_DENORM_MIN__=4.940656458412465441765687"
  134. "92868221e-324L");
  135. Defines.push_back("__LDBL_DIG__=31");
  136. Defines.push_back("__LDBL_EPSILON__=4.9406564584124654417656879286822"
  137. "1e-324L");
  138. Defines.push_back("__LDBL_HAS_INFINITY__=1");
  139. Defines.push_back("__LDBL_HAS_QUIET_NAN__=1");
  140. Defines.push_back("__LDBL_MANT_DIG__=106");
  141. Defines.push_back("__LDBL_MAX_10_EXP__=308");
  142. Defines.push_back("__LDBL_MAX_EXP__=1024");
  143. Defines.push_back("__LDBL_MAX__=1.7976931348623158079372897140"
  144. "5301e+308L");
  145. Defines.push_back("__LDBL_MIN_10_EXP__=(-291)");
  146. Defines.push_back("__LDBL_MIN_EXP__=(-968)");
  147. Defines.push_back("__LDBL_MIN__=2.004168360008972777996108051350"
  148. "16e-292L");
  149. Defines.push_back("__LONG_DOUBLE_128__=1");
  150. }
  151. /// getX86Defines - Return a set of the X86-specific #defines that are
  152. /// not tied to a specific subtarget.
  153. static void getX86Defines(std::vector<std::string> &Defines, bool is64Bit) {
  154. // Target identification.
  155. if (is64Bit) {
  156. Defines.push_back("_LP64");
  157. Defines.push_back("__LP64__");
  158. Defines.push_back("__amd64__");
  159. Defines.push_back("__amd64");
  160. Defines.push_back("__x86_64");
  161. Defines.push_back("__x86_64__");
  162. } else {
  163. Defines.push_back("__i386__=1");
  164. Defines.push_back("__i386=1");
  165. Defines.push_back("i386=1");
  166. }
  167. // Target properties.
  168. Defines.push_back("__LITTLE_ENDIAN__=1");
  169. if (is64Bit) {
  170. Defines.push_back("__INTMAX_MAX__=9223372036854775807L");
  171. Defines.push_back("__INTMAX_TYPE__=long int");
  172. Defines.push_back("__LONG_MAX__=9223372036854775807L");
  173. Defines.push_back("__PTRDIFF_TYPE__=long int");
  174. Defines.push_back("__UINTMAX_TYPE__=long unsigned int");
  175. } else {
  176. Defines.push_back("__INTMAX_MAX__=9223372036854775807LL");
  177. Defines.push_back("__INTMAX_TYPE__=long long int");
  178. Defines.push_back("__LONG_MAX__=2147483647L");
  179. Defines.push_back("__PTRDIFF_TYPE__=int");
  180. Defines.push_back("__UINTMAX_TYPE__=long long unsigned int");
  181. }
  182. Defines.push_back("__CHAR_BIT__=8");
  183. Defines.push_back("__INT_MAX__=2147483647");
  184. Defines.push_back("__LONG_LONG_MAX__=9223372036854775807LL");
  185. Defines.push_back("__SCHAR_MAX__=127");
  186. Defines.push_back("__SHRT_MAX__=32767");
  187. Defines.push_back("__SIZE_TYPE__=long unsigned int");
  188. // Subtarget options.
  189. Defines.push_back("__nocona=1");
  190. Defines.push_back("__nocona__=1");
  191. Defines.push_back("__tune_nocona__=1");
  192. Defines.push_back("__SSE2_MATH__=1");
  193. Defines.push_back("__SSE2__=1");
  194. Defines.push_back("__SSE_MATH__=1");
  195. Defines.push_back("__SSE__=1");
  196. Defines.push_back("__MMX__=1");
  197. Defines.push_back("__REGISTER_PREFIX__=");
  198. Defines.push_back("__WCHAR_MAX__=2147483647");
  199. Defines.push_back("__WCHAR_TYPE__=int");
  200. Defines.push_back("__WINT_TYPE__=int");
  201. // Float macros.
  202. Defines.push_back("__FLT_DENORM_MIN__=1.40129846e-45F");
  203. Defines.push_back("__FLT_DIG__=6");
  204. Defines.push_back("__FLT_EPSILON__=1.19209290e-7F");
  205. Defines.push_back("__FLT_EVAL_METHOD__=0");
  206. Defines.push_back("__FLT_HAS_INFINITY__=1");
  207. Defines.push_back("__FLT_HAS_QUIET_NAN__=1");
  208. Defines.push_back("__FLT_MANT_DIG__=24");
  209. Defines.push_back("__FLT_MAX_10_EXP__=38");
  210. Defines.push_back("__FLT_MAX_EXP__=128");
  211. Defines.push_back("__FLT_MAX__=3.40282347e+38F");
  212. Defines.push_back("__FLT_MIN_10_EXP__=(-37)");
  213. Defines.push_back("__FLT_MIN_EXP__=(-125)");
  214. Defines.push_back("__FLT_MIN__=1.17549435e-38F");
  215. Defines.push_back("__FLT_RADIX__=2");
  216. // Double macros.
  217. Defines.push_back("__DBL_DENORM_MIN__=4.9406564584124654e-324");
  218. Defines.push_back("__DBL_DIG__=15");
  219. Defines.push_back("__DBL_EPSILON__=2.2204460492503131e-16");
  220. Defines.push_back("__DBL_HAS_INFINITY__=1");
  221. Defines.push_back("__DBL_HAS_QUIET_NAN__=1");
  222. Defines.push_back("__DBL_MANT_DIG__=53");
  223. Defines.push_back("__DBL_MAX_10_EXP__=308");
  224. Defines.push_back("__DBL_MAX_EXP__=1024");
  225. Defines.push_back("__DBL_MAX__=1.7976931348623157e+308");
  226. Defines.push_back("__DBL_MIN_10_EXP__=(-307)");
  227. Defines.push_back("__DBL_MIN_EXP__=(-1021)");
  228. Defines.push_back("__DBL_MIN__=2.2250738585072014e-308");
  229. Defines.push_back("__DECIMAL_DIG__=21");
  230. // 80-bit Long double macros.
  231. Defines.push_back("__LDBL_DENORM_MIN__=3.64519953188247460253e-4951L");
  232. Defines.push_back("__LDBL_DIG__=18");
  233. Defines.push_back("__LDBL_EPSILON__=1.08420217248550443401e-19L");
  234. Defines.push_back("__LDBL_HAS_INFINITY__=1");
  235. Defines.push_back("__LDBL_HAS_QUIET_NAN__=1");
  236. Defines.push_back("__LDBL_MANT_DIG__=64");
  237. Defines.push_back("__LDBL_MAX_10_EXP__=4932");
  238. Defines.push_back("__LDBL_MAX_EXP__=16384");
  239. Defines.push_back("__LDBL_MAX__=1.18973149535723176502e+4932L");
  240. Defines.push_back("__LDBL_MIN_10_EXP__=(-4931)");
  241. Defines.push_back("__LDBL_MIN_EXP__=(-16381)");
  242. Defines.push_back("__LDBL_MIN__=3.36210314311209350626e-4932L");
  243. }
  244. /// PPC builtin info.
  245. namespace PPC {
  246. enum {
  247. LastTIBuiltin = Builtin::FirstTSBuiltin-1,
  248. #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
  249. #include "PPCBuiltins.def"
  250. LastTSBuiltin
  251. };
  252. static const Builtin::Info BuiltinInfo[] = {
  253. #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
  254. #include "PPCBuiltins.def"
  255. };
  256. static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
  257. Records = BuiltinInfo;
  258. NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
  259. }
  260. } // End namespace PPC
  261. /// X86 builtin info.
  262. namespace X86 {
  263. enum {
  264. LastTIBuiltin = Builtin::FirstTSBuiltin-1,
  265. #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
  266. #include "X86Builtins.def"
  267. LastTSBuiltin
  268. };
  269. static const Builtin::Info BuiltinInfo[] = {
  270. #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
  271. #include "X86Builtins.def"
  272. };
  273. static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
  274. Records = BuiltinInfo;
  275. NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
  276. }
  277. } // End namespace X86
  278. //===----------------------------------------------------------------------===//
  279. // Specific target implementations.
  280. //===----------------------------------------------------------------------===//
  281. namespace {
  282. class DarwinPPCTargetInfo : public DarwinTargetInfo {
  283. public:
  284. virtual void getTargetDefines(std::vector<std::string> &Defines) const {
  285. DarwinTargetInfo::getTargetDefines(Defines);
  286. getPowerPCDefines(Defines, false);
  287. }
  288. virtual void getTargetBuiltins(const Builtin::Info *&Records,
  289. unsigned &NumRecords) const {
  290. PPC::getBuiltins(Records, NumRecords);
  291. }
  292. };
  293. } // end anonymous namespace.
  294. namespace {
  295. class DarwinPPC64TargetInfo : public DarwinTargetInfo {
  296. public:
  297. virtual void getTargetDefines(std::vector<std::string> &Defines) const {
  298. DarwinTargetInfo::getTargetDefines(Defines);
  299. getPowerPCDefines(Defines, true);
  300. }
  301. virtual void getTargetBuiltins(const Builtin::Info *&Records,
  302. unsigned &NumRecords) const {
  303. PPC::getBuiltins(Records, NumRecords);
  304. }
  305. };
  306. } // end anonymous namespace.
  307. namespace {
  308. class DarwinI386TargetInfo : public DarwinTargetInfo {
  309. public:
  310. virtual void getTargetDefines(std::vector<std::string> &Defines) const {
  311. DarwinTargetInfo::getTargetDefines(Defines);
  312. getX86Defines(Defines, false);
  313. }
  314. virtual void getTargetBuiltins(const Builtin::Info *&Records,
  315. unsigned &NumRecords) const {
  316. X86::getBuiltins(Records, NumRecords);
  317. }
  318. };
  319. } // end anonymous namespace.
  320. namespace {
  321. class DarwinX86_64TargetInfo : public DarwinTargetInfo {
  322. public:
  323. virtual void getTargetDefines(std::vector<std::string> &Defines) const {
  324. DarwinTargetInfo::getTargetDefines(Defines);
  325. getX86Defines(Defines, true);
  326. }
  327. virtual void getTargetBuiltins(const Builtin::Info *&Records,
  328. unsigned &NumRecords) const {
  329. X86::getBuiltins(Records, NumRecords);
  330. }
  331. };
  332. } // end anonymous namespace.
  333. namespace {
  334. class LinuxTargetInfo : public DarwinTargetInfo {
  335. public:
  336. LinuxTargetInfo() {
  337. // Note: I have no idea if this is right, just for testing.
  338. WCharWidth = 16;
  339. }
  340. virtual void getTargetDefines(std::vector<std::string> &Defines) const {
  341. // TODO: linux-specific stuff.
  342. getX86Defines(Defines, false);
  343. }
  344. virtual void getTargetBuiltins(const Builtin::Info *&Records,
  345. unsigned &NumRecords) const {
  346. X86::getBuiltins(Records, NumRecords);
  347. }
  348. };
  349. } // end anonymous namespace.
  350. //===----------------------------------------------------------------------===//
  351. // Driver code
  352. //===----------------------------------------------------------------------===//
  353. /// CreateTarget - Create the TargetInfoImpl object for the specified target
  354. /// enum value.
  355. static TargetInfoImpl *CreateTarget(SupportedTargets T) {
  356. switch (T) {
  357. default: assert(0 && "Unknown target!");
  358. case target_ppc: return new DarwinPPCTargetInfo();
  359. case target_ppc64: return new DarwinPPC64TargetInfo();
  360. case target_i386: return new DarwinI386TargetInfo();
  361. case target_x86_64: return new DarwinX86_64TargetInfo();
  362. case target_linux_i386: return new LinuxTargetInfo();
  363. }
  364. }
  365. /// CreateTargetInfo - Return the set of target info objects as specified by
  366. /// the -arch command line option.
  367. TargetInfo *clang::CreateTargetInfo(Diagnostic &Diags) {
  368. // If the user didn't specify at least one architecture, auto-sense the
  369. // current host. TODO: This is a hack. :)
  370. if (Archs.empty()) {
  371. #ifndef __APPLE__
  372. // Assume non-apple = linux.
  373. Archs.push_back(target_linux_i386);
  374. #elif (defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)) && \
  375. defined(__ppc64__)
  376. Archs.push_back(target_ppc64);
  377. #elif defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)
  378. Archs.push_back(target_ppc);
  379. #elif defined(__x86_64__)
  380. Archs.push_back(target_x86_64);
  381. #elif defined(__i386__) || defined(i386) || defined(_M_IX86)
  382. Archs.push_back(target_i386);
  383. #else
  384. // Don't know what this is!
  385. return 0;
  386. #endif
  387. }
  388. // Create the primary target and target info.
  389. TargetInfo *TI = new TargetInfo(CreateTarget(Archs[0]), &Diags);
  390. // Add all secondary targets.
  391. for (unsigned i = 1, e = Archs.size(); i != e; ++i)
  392. TI->AddSecondaryTarget(CreateTarget(Archs[i]));
  393. return TI;
  394. }