diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-12-18 20:24:51 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-12-18 20:24:51 +0000 |
commit | afa854c15e35644c63018d397575906a5dc56c18 (patch) | |
tree | d86266e3ba57e6a99161817797dfd90afe26946f /clang/lib/Basic | |
parent | d6c2b720aea59c0aa7e8cc0c10979fb8529dd91c (diff) | |
download | bcm5719-llvm-afa854c15e35644c63018d397575906a5dc56c18.tar.gz bcm5719-llvm-afa854c15e35644c63018d397575906a5dc56c18.zip |
Make setABIAPCS and setABIAAPCS easier to reason about.
These functions now always set the same variables in the same order and they
don't overlap with thep constructor.
llvm-svn: 197604
Diffstat (limited to 'clang/lib/Basic')
-rw-r--r-- | clang/lib/Basic/Targets.cpp | 64 |
1 files changed, 39 insertions, 25 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 778f90a57ea..b69b0dba543 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -3678,18 +3678,48 @@ class ARMTargetInfo : public TargetInfo { } void setABIAAPCS() { - // FIXME: Enumerated types are variable width in straight AAPCS. + IsAAPCS = true; + + DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64; - // size_t is unsigned long on Darwin. - if (getTriple().isOSDarwin()) + // size_t is unsigned long on Darwin and netbsd. + if (getTriple().isOSDarwin() || getTriple().getOS() == llvm::Triple::NetBSD) SizeType = UnsignedLong; - IsAAPCS = true; + else + SizeType = UnsignedInt; + + if (getTriple().getOS() == llvm::Triple::NetBSD) { + WCharType = SignedInt; + } else { + // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int. + WCharType = UnsignedInt; + } + + UseBitFieldTypeAlignment = true; + + ZeroLengthBitfieldBoundary = 0; + + if (IsThumb) { + // Thumb1 add sp, #imm requires the immediate value be multiple of 4, + // so set preferred for small types to 32. + DescriptionString = ("e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-" + "v128:64:128-a:0:32-n32-S64"); + } else { + DescriptionString = ("e-p:32:32-i64:64-v128:64:128-n32-S64"); + } + + // FIXME: Enumerated types are variable width in straight AAPCS. } void setABIAPCS() { + IsAAPCS = false; + DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32; + // size_t is unsigned int on FreeBSD. - if (getTriple().getOS() != llvm::Triple::FreeBSD) + if (getTriple().getOS() == llvm::Triple::FreeBSD) + SizeType = UnsignedInt; + else SizeType = UnsignedLong; // Revert to using SignedInt on apcs-gnu to comply with existing behaviour. @@ -3704,8 +3734,6 @@ class ARMTargetInfo : public TargetInfo { /// gcc. ZeroLengthBitfieldBoundary = 32; - IsAAPCS = false; - if (IsThumb) { // Thumb1 add sp, #imm requires the immediate value be multiple of 4, // so set preferred for small types to 32. @@ -3721,19 +3749,14 @@ class ARMTargetInfo : public TargetInfo { public: ARMTargetInfo(const llvm::Triple &Triple) - : TargetInfo(Triple), ABI("aapcs-linux"), CPU("arm1136j-s"), - FPMath(FP_Default), IsAAPCS(true) { + : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default), + IsAAPCS(true) { BigEndian = false; switch (getTriple().getOS()) { case llvm::Triple::NetBSD: - SizeType = UnsignedLong; PtrDiffType = SignedLong; - WCharType = SignedInt; break; default: - // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int. - WCharType = UnsignedInt; - SizeType = UnsignedInt; PtrDiffType = SignedInt; break; } @@ -3744,17 +3767,8 @@ public: // FIXME: Should we just treat this as a feature? IsThumb = getTriple().getArchName().startswith("thumb"); - if (IsThumb) { - // Thumb1 add sp, #imm requires the immediate value be multiple of 4, - // so set preferred for small types to 32. - DescriptionString = ("e-p:32:32-i1:8:32-i8:8:32-i16:16:32-" - "i64:64-" - "v128:64:128-a:0:32-n32-S64"); - } else { - DescriptionString = ("e-p:32:32-" - "i64:64-" - "v128:64:128-n32-S64"); - } + + setABI("aapcs-linux"); // ARM targets default to using the ARM C++ ABI. TheCXXABI.set(TargetCXXABI::GenericARM); |