Chromium Code Reviews| 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 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 245 switch (Triple.getArch()) { | 245 switch (Triple.getArch()) { |
| 246 default: | 246 default: |
| 247 case llvm::Triple::x86: | 247 case llvm::Triple::x86: |
| 248 case llvm::Triple::x86_64: | 248 case llvm::Triple::x86_64: |
| 249 this->MCountName = ".mcount"; | 249 this->MCountName = ".mcount"; |
| 250 break; | 250 break; |
| 251 } | 251 } |
| 252 } | 252 } |
| 253 }; | 253 }; |
| 254 | 254 |
| 255 // @LOCALMOD-START Emscripten | |
| 256 // Emscripten target | |
| 257 template <typename Target> | |
| 258 class EmscriptenTargetInfo : public OSTargetInfo<Target> { | |
| 259 protected: | |
| 260 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, | |
| 261 MacroBuilder &Builder) const override { | |
| 262 // A macro for the platform. | |
| 263 Builder.defineMacro("__EMSCRIPTEN__"); | |
| 264 // Earlier versions of Emscripten defined this, so we continue to define it | |
| 265 // for compatibility, for now. Users should ideally prefer __EMSCRIPTEN__. | |
| 266 Builder.defineMacro("EMSCRIPTEN"); | |
| 267 // A common platform macro. | |
| 268 if (Opts.POSIXThreads) | |
| 269 Builder.defineMacro("_REENTRANT"); | |
| 270 // Follow g++ convention and predefine _GNU_SOURCE for C++. | |
| 271 if (Opts.CPlusPlus) | |
| 272 Builder.defineMacro("_GNU_SOURCE"); | |
| 273 | |
| 274 // Emscripten's software environment and the asm.js runtime aren't really | |
| 275 // Unix per se, but they're perhaps more Unix-like than what software | |
| 276 // expects when "unix" is *not* defined. | |
| 277 DefineStd(Builder, "unix", Opts); | |
| 278 } | |
| 279 | |
| 280 public: | |
| 281 explicit EmscriptenTargetInfo(const llvm::Triple &Triple) | |
| 282 : OSTargetInfo<Target>(Triple) { | |
| 283 // Emcripten currently does prepend a prefix to user labels, but this is | |
| 284 // handled outside of clang. TODO: Handling this within clang may be | |
| 285 // beneficial. | |
| 286 this->UserLabelPrefix = ""; | |
| 287 this->MaxAtomicPromoteWidth = this->MaxAtomicInlineWidth = 32; | |
| 288 | |
| 289 // Emscripten uses the Itanium ABI mostly, but it uses ARM-style pointers | |
| 290 // to member functions so that it can avoid having to align function | |
| 291 // addresses. | |
| 292 this->TheCXXABI.set(TargetCXXABI::Emscripten); | |
| 293 } | |
| 294 }; | |
| 295 // @LOCALMOD-END Emscripten | |
| 296 | |
| 255 // FreeBSD Target | 297 // FreeBSD Target |
| 256 template<typename Target> | 298 template<typename Target> |
| 257 class FreeBSDTargetInfo : public OSTargetInfo<Target> { | 299 class FreeBSDTargetInfo : public OSTargetInfo<Target> { |
| 258 protected: | 300 protected: |
| 259 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, | 301 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, |
| 260 MacroBuilder &Builder) const override { | 302 MacroBuilder &Builder) const override { |
| 261 // FreeBSD defines; list based off of gcc output | 303 // FreeBSD defines; list based off of gcc output |
| 262 | 304 |
| 263 unsigned Release = Triple.getOSMajorVersion(); | 305 unsigned Release = Triple.getOSMajorVersion(); |
| 264 if (Release == 0U) | 306 if (Release == 0U) |
| (...skipping 5716 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5981 } | 6023 } |
| 5982 void getTargetDefines(const LangOptions &Opts, | 6024 void getTargetDefines(const LangOptions &Opts, |
| 5983 MacroBuilder &Builder) const override { | 6025 MacroBuilder &Builder) const override { |
| 5984 DefineStd(Builder, "MIPSEL", Opts); | 6026 DefineStd(Builder, "MIPSEL", Opts); |
| 5985 Builder.defineMacro("_MIPSEL"); | 6027 Builder.defineMacro("_MIPSEL"); |
| 5986 Mips64TargetInfoBase::getTargetDefines(Opts, Builder); | 6028 Mips64TargetInfoBase::getTargetDefines(Opts, Builder); |
| 5987 } | 6029 } |
| 5988 }; | 6030 }; |
| 5989 } // end anonymous namespace. | 6031 } // end anonymous namespace. |
| 5990 | 6032 |
| 6033 // @LOCALMOD-START Emscripten | |
| 6034 namespace { | |
| 6035 class AsmJSTargetInfo : public TargetInfo { | |
| 6036 public: | |
| 6037 explicit AsmJSTargetInfo(const llvm::Triple &T) : TargetInfo(T) { | |
| 6038 BigEndian = false; | |
| 6039 NoAsmVariants = true; | |
| 6040 LongAlign = LongWidth = 32; | |
| 6041 PointerAlign = PointerWidth = 32; | |
| 6042 IntMaxType = Int64Type = TargetInfo::SignedLongLong; | |
| 6043 DoubleAlign = 64; | |
| 6044 LongDoubleWidth = LongDoubleAlign = 64; | |
| 6045 SizeType = TargetInfo::UnsignedInt; | |
| 6046 PtrDiffType = TargetInfo::SignedInt; | |
| 6047 IntPtrType = TargetInfo::SignedInt; | |
| 6048 RegParmMax = 0; // Disallow regparm | |
| 6049 | |
| 6050 // Set the native integer widths set to just i32, since that's currently the | |
| 6051 // only integer type we can do arithmetic on without masking or splitting. | |
| 6052 // | |
| 6053 // Set the required alignment for 128-bit vectors to just 4 bytes, based on | |
| 6054 // the direction suggested here: | |
| 6055 // https://bugzilla.mozilla.org/show_bug.cgi?id=904913#c21 | |
| 6056 // We can still set the preferred alignment to 16 bytes though. | |
| 6057 // | |
| 6058 // Set the natural stack alignment to 16 bytes to accomodate 128-bit aligned | |
| 6059 // vectors. | |
| 6060 DescriptionString = "e-p:32:32-i64:64-v128:32:128-n32-S128"; | |
|
jvoung (off chromium)
2015/03/20 17:07:07
Also test this in test/CodeGen/target-data.c
JF
2015/03/20 18:49:38
Done.
| |
| 6061 } | |
| 6062 | |
| 6063 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {} | |
| 6064 void getTargetDefines(const LangOptions &Opts, | |
| 6065 MacroBuilder &Builder) const override { | |
| 6066 defineCPUMacros(Builder, "__asmjs__", /*Tuning=*/false); | |
| 6067 } | |
| 6068 void getTargetBuiltins(const Builtin::Info *&Records, | |
| 6069 unsigned &NumRecords) const override {} | |
| 6070 BuiltinVaListKind getBuiltinVaListKind() const override { | |
| 6071 // Reuse PNaCl's va_list lowering. | |
| 6072 return TargetInfo::PNaClABIBuiltinVaList; | |
| 6073 } | |
| 6074 void getGCCRegNames(const char *const *&Names, | |
| 6075 unsigned &NumNames) const override { | |
| 6076 Names = nullptr; | |
| 6077 NumNames = 0; | |
| 6078 } | |
| 6079 void getGCCRegAliases(const GCCRegAlias *&Aliases, | |
| 6080 unsigned &NumAliases) const override { | |
| 6081 Aliases = nullptr; | |
| 6082 NumAliases = 0; | |
| 6083 } | |
| 6084 bool validateAsmConstraint(const char *&Name, | |
| 6085 TargetInfo::ConstraintInfo &Info) const override { | |
| 6086 return false; | |
| 6087 } | |
| 6088 const char *getClobbers() const override { return ""; } | |
| 6089 bool isCLZForZeroUndef() const override { | |
| 6090 // Today we do clz in software, so we just do the right thing. With ES6, | |
| 6091 // we'll get Math.clz32, which is to be defined to do the right thing: | |
| 6092 // http://esdiscuss.org/topic/rename-number-prototype-clz-to-math-clz#conten t-36 | |
| 6093 return false; | |
| 6094 } | |
| 6095 }; | |
| 6096 } // end anonymous namespace. | |
| 6097 // @LOCALMOD-END Emscripten | |
| 6098 | |
| 5991 namespace { | 6099 namespace { |
| 5992 class PNaClTargetInfo : public TargetInfo { | 6100 class PNaClTargetInfo : public TargetInfo { |
| 5993 public: | 6101 public: |
| 5994 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { | 6102 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { |
| 5995 BigEndian = false; | 6103 BigEndian = false; |
| 5996 this->UserLabelPrefix = ""; | 6104 this->UserLabelPrefix = ""; |
| 5997 this->LongAlign = 32; | 6105 this->LongAlign = 32; |
| 5998 this->LongWidth = 32; | 6106 this->LongWidth = 32; |
| 5999 this->PointerAlign = 32; | 6107 this->PointerAlign = 32; |
| 6000 this->PointerWidth = 32; | 6108 this->PointerWidth = 32; |
| (...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6421 case llvm::Triple::FreeBSD: | 6529 case llvm::Triple::FreeBSD: |
| 6422 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple); | 6530 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple); |
| 6423 case llvm::Triple::NetBSD: | 6531 case llvm::Triple::NetBSD: |
| 6424 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple); | 6532 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple); |
| 6425 case llvm::Triple::OpenBSD: | 6533 case llvm::Triple::OpenBSD: |
| 6426 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple); | 6534 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple); |
| 6427 default: | 6535 default: |
| 6428 return new Mips64ELTargetInfo(Triple); | 6536 return new Mips64ELTargetInfo(Triple); |
| 6429 } | 6537 } |
| 6430 | 6538 |
| 6539 // @LOCALMOD-START Emscripten | |
| 6540 case llvm::Triple::asmjs: | |
| 6541 switch (os) { | |
| 6542 case llvm::Triple::Emscripten: | |
| 6543 return new EmscriptenTargetInfo<AsmJSTargetInfo>(Triple); | |
| 6544 default: | |
| 6545 return nullptr; | |
| 6546 } | |
| 6547 // @LOCALMOD-END Emscripten | |
| 6548 | |
| 6431 case llvm::Triple::le32: | 6549 case llvm::Triple::le32: |
| 6432 switch (os) { | 6550 switch (os) { |
| 6433 case llvm::Triple::NaCl: | 6551 case llvm::Triple::NaCl: |
| 6434 return new NaClTargetInfo<PNaClTargetInfo>(Triple); | 6552 return new NaClTargetInfo<PNaClTargetInfo>(Triple); |
| 6435 default: | 6553 default: |
| 6436 return nullptr; | 6554 return nullptr; |
| 6437 } | 6555 } |
| 6438 | 6556 |
| 6439 case llvm::Triple::le64: | 6557 case llvm::Triple::le64: |
| 6440 return new Le64TargetInfo(Triple); | 6558 return new Le64TargetInfo(Triple); |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6683 // need to pass the minuses. | 6801 // need to pass the minuses. |
| 6684 Opts->Features.clear(); | 6802 Opts->Features.clear(); |
| 6685 for (llvm::StringMap<bool>::const_iterator it = Features.begin(), | 6803 for (llvm::StringMap<bool>::const_iterator it = Features.begin(), |
| 6686 ie = Features.end(); it != ie; ++it) | 6804 ie = Features.end(); it != ie; ++it) |
| 6687 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str()); | 6805 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str()); |
| 6688 if (!Target->handleTargetFeatures(Opts->Features, Diags)) | 6806 if (!Target->handleTargetFeatures(Opts->Features, Diags)) |
| 6689 return nullptr; | 6807 return nullptr; |
| 6690 | 6808 |
| 6691 return Target.release(); | 6809 return Target.release(); |
| 6692 } | 6810 } |
| OLD | NEW |