diff options
author | Tim Northover <tnorthover@apple.com> | 2015-10-30 16:30:45 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2015-10-30 16:30:45 +0000 |
commit | 5627d3935ad2313ad81f91a68b67dcf298613d65 (patch) | |
tree | 83ea1d247572cd8542181f05cb2c8eca279463b7 /clang/lib/Basic | |
parent | e931f9fc0dcfeb51421b9a0faa7039bb4f9f53a7 (diff) | |
download | bcm5719-llvm-5627d3935ad2313ad81f91a68b67dcf298613d65.tar.gz bcm5719-llvm-5627d3935ad2313ad81f91a68b67dcf298613d65.zip |
ARMv7k: implement ABI changes for watchOS from standard iOS.
llvm-svn: 251710
Diffstat (limited to 'clang/lib/Basic')
-rw-r--r-- | clang/lib/Basic/Targets.cpp | 50 |
1 files changed, 40 insertions, 10 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 52fa910b77f..2d41d7f3485 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -3702,6 +3702,11 @@ public: LongDoubleWidth = 128; LongDoubleAlign = 128; SuitableAlign = 128; + MaxVectorAlign = 256; + // The watchOS simulator uses the builtin bool type for Objective-C. + llvm::Triple T = llvm::Triple(Triple); + if (T.isWatchOS()) + UseSignedCharForObjCBool = false; SizeType = UnsignedLong; IntPtrType = SignedLong; DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128"; @@ -4243,12 +4248,15 @@ class ARMTargetInfo : public TargetInfo { // FIXME: Enumerated types are variable width in straight AAPCS. } - void setABIAPCS() { + void setABIAPCS(bool IsAAPCS16) { const llvm::Triple &T = getTriple(); IsAAPCS = false; - DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32; + if (IsAAPCS16) + DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64; + else + DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32; // size_t is unsigned int on FreeBSD. if (T.getOS() == llvm::Triple::FreeBSD) @@ -4268,7 +4276,10 @@ class ARMTargetInfo : public TargetInfo { /// gcc. ZeroLengthBitfieldBoundary = 32; - if (T.isOSBinFormatMachO()) + if (T.isOSBinFormatMachO() && IsAAPCS16) { + assert(!BigEndian && "AAPCS16 does not support big-endian"); + DataLayoutString = "e-m:o-p:32:32-i64:64-a:0:32-n32-S128"; + } else if (T.isOSBinFormatMachO()) DataLayoutString = BigEndian ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" @@ -4413,6 +4424,8 @@ public: Triple.getOS() == llvm::Triple::UnknownOS || StringRef(CPU).startswith("cortex-m")) { setABI("aapcs"); + } else if (Triple.isWatchOS()) { + setABI("aapcs16"); } else { setABI("apcs-gnu"); } @@ -4465,10 +4478,8 @@ public: // // FIXME: We need support for -meabi... we could just mangle it into the // name. - // FIXME: aapcs16 isn't really the same as APCS, this allows tests to pass - // until the real ABI is committed. if (Name == "apcs-gnu" || Name == "aapcs16") { - setABIAPCS(); + setABIAPCS(Name == "aapcs16"); return true; } if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") { @@ -4625,6 +4636,12 @@ public: // Target properties. Builder.defineMacro("__REGISTER_PREFIX__", ""); + + // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU + // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__. + if (getTriple().isWatchOS()) + Builder.defineMacro("__ARM_ARCH_7K__", "2"); + if (!CPUAttr.empty()) Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__"); @@ -4806,7 +4823,10 @@ public: } bool isCLZForZeroUndef() const override { return false; } BuiltinVaListKind getBuiltinVaListKind() const override { - return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList; + return IsAAPCS + ? AAPCSABIBuiltinVaList + : (getTriple().isWatchOS() ? TargetInfo::CharPtrBuiltinVaList + : TargetInfo::VoidPtrBuiltinVaList); } ArrayRef<const char *> getGCCRegNames() const override; ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override; @@ -5147,8 +5167,18 @@ public: // ARMleTargetInfo. MaxAtomicInlineWidth = 64; - // Darwin on iOS uses a variant of the ARM C++ ABI. - TheCXXABI.set(TargetCXXABI::iOS); + if (Triple.isWatchOS()) { + // Darwin on iOS uses a variant of the ARM C++ ABI. + TheCXXABI.set(TargetCXXABI::WatchOS); + + // The 32-bit ABI is silent on what ptrdiff_t should be, but given that + // size_t is long, it's a bit weird for it to be int. + PtrDiffType = SignedLong; + + // BOOL should be a real boolean on the new ABI + UseSignedCharForObjCBool = false; + } else + TheCXXABI.set(TargetCXXABI::iOS); } }; @@ -5204,7 +5234,7 @@ public: // contributes to the alignment of the containing aggregate in the same way // a plain (non bit-field) member of that type would, without exception for // zero-sized or anonymous bit-fields." - UseBitFieldTypeAlignment = true; + assert(UseBitFieldTypeAlignment && "bitfields affect type alignment"); UseZeroLengthBitfieldAlignment = true; // AArch64 targets default to using the ARM C++ ABI. |