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