Skip to content

Commit

Permalink
Fixed an assertion failure related to bitfield lowering.
Browse files Browse the repository at this point in the history
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.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@202562 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
spiderofmean committed Mar 1, 2014
1 parent 03f900e commit 30577e6
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 2 deletions.
7 changes: 5 additions & 2 deletions lib/CodeGen/CGRecordLayoutBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()))
Expand All @@ -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);
Expand All @@ -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);
Expand Down
13 changes: 13 additions & 0 deletions test/CodeGen/union.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

0 comments on commit 30577e6

Please sign in to comment.