summaryrefslogtreecommitdiffstats
path: root/clang/lib/Basic
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-12-18 20:24:51 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-12-18 20:24:51 +0000
commitafa854c15e35644c63018d397575906a5dc56c18 (patch)
treed86266e3ba57e6a99161817797dfd90afe26946f /clang/lib/Basic
parentd6c2b720aea59c0aa7e8cc0c10979fb8529dd91c (diff)
downloadbcm5719-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.cpp64
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);
OpenPOWER on IntegriCloud