OLD | NEW |
1 //===--- Targets.cpp - Implement -arch option and targets -----------------===// | 1 //===--- Targets.cpp - Implement -arch option and targets -----------------===// |
2 // | 2 // |
3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // This file implements construction of a TargetInfo object from a | 10 // This file implements construction of a TargetInfo object from a |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 switch (Triple.getArch()) { | 266 switch (Triple.getArch()) { |
267 default: | 267 default: |
268 case llvm::Triple::x86: | 268 case llvm::Triple::x86: |
269 case llvm::Triple::x86_64: | 269 case llvm::Triple::x86_64: |
270 this->MCountName = ".mcount"; | 270 this->MCountName = ".mcount"; |
271 break; | 271 break; |
272 } | 272 } |
273 } | 273 } |
274 }; | 274 }; |
275 | 275 |
276 // @LOCALMOD-START Emscripten | |
277 // Emscripten target | |
278 template <typename Target> | |
279 class EmscriptenTargetInfo : public OSTargetInfo<Target> { | |
280 protected: | |
281 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, | |
282 MacroBuilder &Builder) const override { | |
283 // A macro for the platform. | |
284 Builder.defineMacro("__EMSCRIPTEN__"); | |
285 // Earlier versions of Emscripten defined this, so we continue to define it | |
286 // for compatibility, for now. Users should ideally prefer __EMSCRIPTEN__. | |
287 Builder.defineMacro("EMSCRIPTEN"); | |
288 // A common platform macro. | |
289 if (Opts.POSIXThreads) | |
290 Builder.defineMacro("_REENTRANT"); | |
291 // Follow g++ convention and predefine _GNU_SOURCE for C++. | |
292 if (Opts.CPlusPlus) | |
293 Builder.defineMacro("_GNU_SOURCE"); | |
294 | |
295 // Emscripten's software environment and the asm.js runtime aren't really | |
296 // Unix per se, but they're perhaps more Unix-like than what software | |
297 // expects when "unix" is *not* defined. | |
298 DefineStd(Builder, "unix", Opts); | |
299 } | |
300 | |
301 public: | |
302 explicit EmscriptenTargetInfo(const llvm::Triple &Triple) | |
303 : OSTargetInfo<Target>(Triple) { | |
304 // Emcripten currently does prepend a prefix to user labels, but this is | |
305 // handled outside of clang. TODO: Handling this within clang may be | |
306 // beneficial. | |
307 this->UserLabelPrefix = ""; | |
308 this->MaxAtomicPromoteWidth = this->MaxAtomicInlineWidth = 32; | |
309 | |
310 // Emscripten uses the Itanium ABI mostly, but it uses ARM-style pointers | |
311 // to member functions so that it can avoid having to align function | |
312 // addresses. | |
313 this->TheCXXABI.set(TargetCXXABI::Emscripten); | |
314 } | |
315 }; | |
316 // @LOCALMOD-END Emscripten | |
317 | |
318 // FreeBSD Target | 276 // FreeBSD Target |
319 template<typename Target> | 277 template<typename Target> |
320 class FreeBSDTargetInfo : public OSTargetInfo<Target> { | 278 class FreeBSDTargetInfo : public OSTargetInfo<Target> { |
321 protected: | 279 protected: |
322 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, | 280 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, |
323 MacroBuilder &Builder) const override { | 281 MacroBuilder &Builder) const override { |
324 // FreeBSD defines; list based off of gcc output | 282 // FreeBSD defines; list based off of gcc output |
325 | 283 |
326 unsigned Release = Triple.getOSMajorVersion(); | 284 unsigned Release = Triple.getOSMajorVersion(); |
327 if (Release == 0U) | 285 if (Release == 0U) |
(...skipping 6132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6460 BigEndian = false; | 6418 BigEndian = false; |
6461 } | 6419 } |
6462 void getTargetDefines(const LangOptions &Opts, | 6420 void getTargetDefines(const LangOptions &Opts, |
6463 MacroBuilder &Builder) const override { | 6421 MacroBuilder &Builder) const override { |
6464 DefineStd(Builder, "MIPSEL", Opts); | 6422 DefineStd(Builder, "MIPSEL", Opts); |
6465 Builder.defineMacro("_MIPSEL"); | 6423 Builder.defineMacro("_MIPSEL"); |
6466 Mips64TargetInfoBase::getTargetDefines(Opts, Builder); | 6424 Mips64TargetInfoBase::getTargetDefines(Opts, Builder); |
6467 } | 6425 } |
6468 }; | 6426 }; |
6469 | 6427 |
6470 // @LOCALMOD-START Emscripten | |
6471 namespace { | |
6472 class AsmJSTargetInfo : public TargetInfo { | |
6473 public: | |
6474 explicit AsmJSTargetInfo(const llvm::Triple &T) : TargetInfo(T) { | |
6475 BigEndian = false; | |
6476 NoAsmVariants = true; | |
6477 LongAlign = LongWidth = 32; | |
6478 PointerAlign = PointerWidth = 32; | |
6479 IntMaxType = Int64Type = TargetInfo::SignedLongLong; | |
6480 DoubleAlign = 64; | |
6481 LongDoubleWidth = LongDoubleAlign = 64; | |
6482 SizeType = TargetInfo::UnsignedInt; | |
6483 PtrDiffType = TargetInfo::SignedInt; | |
6484 IntPtrType = TargetInfo::SignedInt; | |
6485 RegParmMax = 0; // Disallow regparm | |
6486 | |
6487 // Set the native integer widths set to just i32, since that's currently the | |
6488 // only integer type we can do arithmetic on without masking or splitting. | |
6489 // | |
6490 // Set the required alignment for 128-bit vectors to just 4 bytes, based on | |
6491 // the direction suggested here: | |
6492 // https://bugzilla.mozilla.org/show_bug.cgi?id=904913#c21 | |
6493 // We can still set the preferred alignment to 16 bytes though. | |
6494 // | |
6495 // Set the natural stack alignment to 16 bytes to accomodate 128-bit aligned | |
6496 // vectors. | |
6497 DescriptionString = "e-p:32:32-i64:64-v128:32:128-n32-S128"; | |
6498 } | |
6499 | |
6500 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {} | |
6501 void getTargetDefines(const LangOptions &Opts, | |
6502 MacroBuilder &Builder) const override { | |
6503 defineCPUMacros(Builder, "asmjs", /*Tuning=*/false); | |
6504 } | |
6505 void getTargetBuiltins(const Builtin::Info *&Records, | |
6506 unsigned &NumRecords) const override {} | |
6507 BuiltinVaListKind getBuiltinVaListKind() const override { | |
6508 // Reuse PNaCl's va_list lowering. | |
6509 return TargetInfo::PNaClABIBuiltinVaList; | |
6510 } | |
6511 void getGCCRegNames(const char *const *&Names, | |
6512 unsigned &NumNames) const override { | |
6513 Names = nullptr; | |
6514 NumNames = 0; | |
6515 } | |
6516 void getGCCRegAliases(const GCCRegAlias *&Aliases, | |
6517 unsigned &NumAliases) const override { | |
6518 Aliases = nullptr; | |
6519 NumAliases = 0; | |
6520 } | |
6521 bool validateAsmConstraint(const char *&Name, | |
6522 TargetInfo::ConstraintInfo &Info) const override { | |
6523 return false; | |
6524 } | |
6525 const char *getClobbers() const override { return ""; } | |
6526 bool isCLZForZeroUndef() const override { | |
6527 // Today we do clz in software, so we just do the right thing. With ES6, | |
6528 // we'll get Math.clz32, which is to be defined to do the right thing: | |
6529 // http://esdiscuss.org/topic/rename-number-prototype-clz-to-math-clz#conten
t-36 | |
6530 return false; | |
6531 } | |
6532 }; | |
6533 } // end anonymous namespace. | |
6534 // @LOCALMOD-END Emscripten | |
6535 | |
6536 class PNaClTargetInfo : public TargetInfo { | 6428 class PNaClTargetInfo : public TargetInfo { |
6537 public: | 6429 public: |
6538 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { | 6430 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { |
6539 BigEndian = false; | 6431 BigEndian = false; |
6540 this->UserLabelPrefix = ""; | 6432 this->UserLabelPrefix = ""; |
6541 this->LongAlign = 32; | 6433 this->LongAlign = 32; |
6542 this->LongWidth = 32; | 6434 this->LongWidth = 32; |
6543 this->PointerAlign = 32; | 6435 this->PointerAlign = 32; |
6544 this->PointerWidth = 32; | 6436 this->PointerWidth = 32; |
6545 this->IntMaxType = TargetInfo::SignedLongLong; | 6437 this->IntMaxType = TargetInfo::SignedLongLong; |
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7006 case llvm::Triple::FreeBSD: | 6898 case llvm::Triple::FreeBSD: |
7007 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple); | 6899 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple); |
7008 case llvm::Triple::NetBSD: | 6900 case llvm::Triple::NetBSD: |
7009 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple); | 6901 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple); |
7010 case llvm::Triple::OpenBSD: | 6902 case llvm::Triple::OpenBSD: |
7011 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple); | 6903 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple); |
7012 default: | 6904 default: |
7013 return new Mips64ELTargetInfo(Triple); | 6905 return new Mips64ELTargetInfo(Triple); |
7014 } | 6906 } |
7015 | 6907 |
7016 // @LOCALMOD-START Emscripten | |
7017 case llvm::Triple::asmjs: | |
7018 switch (os) { | |
7019 case llvm::Triple::Emscripten: | |
7020 return new EmscriptenTargetInfo<AsmJSTargetInfo>(Triple); | |
7021 default: | |
7022 return nullptr; | |
7023 } | |
7024 // @LOCALMOD-END Emscripten | |
7025 | |
7026 case llvm::Triple::le32: | 6908 case llvm::Triple::le32: |
7027 switch (os) { | 6909 switch (os) { |
7028 case llvm::Triple::NaCl: | 6910 case llvm::Triple::NaCl: |
7029 return new NaClTargetInfo<PNaClTargetInfo>(Triple); | 6911 return new NaClTargetInfo<PNaClTargetInfo>(Triple); |
7030 default: | 6912 default: |
7031 return nullptr; | 6913 return nullptr; |
7032 } | 6914 } |
7033 | 6915 |
7034 case llvm::Triple::le64: | 6916 case llvm::Triple::le64: |
7035 return new Le64TargetInfo(Triple); | 6917 return new Le64TargetInfo(Triple); |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7302 if (!Target->handleTargetFeatures(Opts->Features, Diags)) | 7184 if (!Target->handleTargetFeatures(Opts->Features, Diags)) |
7303 return nullptr; | 7185 return nullptr; |
7304 | 7186 |
7305 // @LOCALMOD-START | 7187 // @LOCALMOD-START |
7306 if (!Target->handleLLVMArgs(Opts->LLVMArgs)) | 7188 if (!Target->handleLLVMArgs(Opts->LLVMArgs)) |
7307 return nullptr; | 7189 return nullptr; |
7308 // @LOCALMOD-END | 7190 // @LOCALMOD-END |
7309 | 7191 |
7310 return Target.release(); | 7192 return Target.release(); |
7311 } | 7193 } |
OLD | NEW |