From: Daniel Dunbar Date: Fri, 8 May 2009 22:26:44 +0000 (+0000) Subject: x86_64 ABI: Ignore padding bit-fields during classification. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8236bf1800641d1c296579e25218f68f74c5caac;p=clang 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 --- 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