aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-05-08 22:26:44 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-05-08 22:26:44 +0000
commit8236bf1800641d1c296579e25218f68f74c5caac (patch)
treef6fcb4a5caaf01ecb467e7862c87948c48d63b58
parent2e0011650fe149bf55916c6f25558bf9bfebf537 (diff)
x86_64 ABI: Ignore padding bit-fields during classification.
- {return-types,single-args}-{32,64} pass the first 1k ABI tests with bit-fields enabled. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71272 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/CGCall.cpp7
-rw-r--r--test/CodeGen/x86_64-arguments.c11
2 files changed, 15 insertions, 3 deletions
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp
index 49c6f0e3a6..265bb7893b 100644
--- a/lib/CodeGen/CGCall.cpp
+++ b/lib/CodeGen/CGCall.cpp
@@ -205,8 +205,7 @@ static const Type *isSingleElementStruct(QualType T, ASTContext &Context) {
FT = AT->getElementType();
// Ignore empty records and padding bit-fields.
- if (isEmptyRecord(Context, FT) ||
- (FD->isBitField() && !FD->getIdentifier()))
+ if (isEmptyRecord(Context, FT) || FD->isUnnamedBitfield())
continue;
if (Found)
@@ -803,6 +802,10 @@ void X86_64ABIInfo::classify(QualType Ty,
// structure to be passed in memory even if unaligned, and
// therefore they can straddle an eightbyte.
if (BitField) {
+ // Ignore padding bit-fields.
+ if (i->isUnnamedBitfield())
+ continue;
+
uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx);
uint64_t Size = i->getBitWidth()->EvaluateAsInt(Context).getZExtValue();
diff --git a/test/CodeGen/x86_64-arguments.c b/test/CodeGen/x86_64-arguments.c
index 860caff7de..fa73f7de67 100644
--- a/test/CodeGen/x86_64-arguments.c
+++ b/test/CodeGen/x86_64-arguments.c
@@ -9,7 +9,7 @@
// RUN: grep 'define void @f7(i32 %a0)' %t &&
// RUN: grep 'type { i64, double }.*type .0' %t &&
// RUN: grep 'define .0 @f8_1()' %t &&
-// RUN: grep 'define void @f8_2(.0)' %t
+// RUN: grep 'define void @f8_2(.0)' %t &&
char f0(void) {
}
@@ -44,3 +44,12 @@ union u8 {
};
union u8 f8_1() {}
void f8_2(union u8 a0) {}
+
+// RUN: grep 'define i64 @f9()' %t &&
+struct s9 { int a; int b; int : 0; } f9(void) {}
+
+// RUN: grep 'define void @f10(i64)' %t &&
+struct s10 { int a; int b; int : 0; };
+void f10(struct s10 a0) {}
+
+// RUN: true