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 |