Fixed an assertion failure related to bitfield lowering.

When lowering a bitfield, CGRecordLowering would assign the wrong 
storage type to a bitfield in some cases and trigger an assertion.  In 
these cases the layout was still correct, just the bitfield info was 
wrong.

llvm-svn: 202562
This commit is contained in:
Warren Hunt 2014-03-01 00:38:40 +00:00
parent 36a02e0655
commit fed55979b1
2 changed files with 18 additions and 2 deletions

View File

@ -277,6 +277,7 @@ void CGRecordLowering::lower(bool NVBaseType) {
}
void CGRecordLowering::lowerUnion() {
CharUnits LayoutSize = Layout.getSize();
llvm::Type *StorageType = 0;
// Compute zero-initializable status.
if (!D->field_empty() && !isZeroInitializable(*D->field_begin()))
@ -293,7 +294,10 @@ void CGRecordLowering::lowerUnion() {
// Skip 0 sized bitfields.
if (Field->getBitWidthValue(Context) == 0)
continue;
setBitFieldInfo(*Field, CharUnits::Zero(), getStorageType(*Field));
llvm::Type *FieldType = getStorageType(*Field);
if (LayoutSize < getSize(FieldType))
FieldType = getByteArrayType(LayoutSize);
setBitFieldInfo(*Field, CharUnits::Zero(), FieldType);
}
Fields[*Field] = 0;
llvm::Type *FieldType = getStorageType(*Field);
@ -304,7 +308,6 @@ void CGRecordLowering::lowerUnion() {
getSize(FieldType) > getSize(StorageType)))
StorageType = FieldType;
}
CharUnits LayoutSize = Layout.getSize();
// If we have no storage type just pad to the appropriate size and return.
if (!StorageType)
return appendPaddingBytes(LayoutSize);

View File

@ -44,3 +44,16 @@ typedef union T0 { unsigned int : 0; } T0;
T0 t0;
union { int large_bitfield: 31; char c } u2;
struct dt_t_s {
union {
long long u : 56;
} __attribute__((packed));
};
struct {
struct {
struct {
struct dt_t_s t;
};
};
} a;