diff options
author | Akira Hatanaka <ahatanaka@apple.com> | 2018-02-01 03:04:15 +0000 |
---|---|---|
committer | Akira Hatanaka <ahatanaka@apple.com> | 2018-02-01 03:04:15 +0000 |
commit | fc681efde49d2c3e5c4f55d95776beccfc5ac1eb (patch) | |
tree | 426b3221d08a09e2df2bbbcb2256ef92ebda0036 /clang/lib/CodeGen/CGRecordLayoutBuilder.cpp | |
parent | 3b8b4eb64da8979a306a549ec09b88dfd20c0c0b (diff) | |
download | bcm5719-llvm-fc681efde49d2c3e5c4f55d95776beccfc5ac1eb.tar.gz bcm5719-llvm-fc681efde49d2c3e5c4f55d95776beccfc5ac1eb.zip |
[CodeGen] Fix an assertion failure in CGRecordLowering.
This patch fixes a bug in CGRecordLowering::accumulateBitFields where it
unconditionally starts a new run and emits a storage field when it sees
a zero-sized bitfield, which causes an assertion in insertPadding to
fail when -fno-bitfield-type-align is used.
It shouldn't emit new storage if UseZeroLengthBitfieldAlignment and
UseBitFieldTypeAlignment are both false.
rdar://problem/36762205
llvm-svn: 323943
Diffstat (limited to 'clang/lib/CodeGen/CGRecordLayoutBuilder.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGRecordLayoutBuilder.cpp | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp index 1644ab4c072..d794b12b3d3 100644 --- a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp +++ b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp @@ -443,14 +443,18 @@ CGRecordLowering::accumulateBitFields(RecordDecl::field_iterator Field, // If the start field of a new run is better as a single run, or // if current field is better as a single run, or - // if current field has zero width bitfield, or + // if current field has zero width bitfield and either + // UseZeroLengthBitfieldAlignment or UseBitFieldTypeAlignment is set to + // true, or // if the offset of current field is inconsistent with the offset of // previous field plus its offset, // skip the block below and go ahead to emit the storage. // Otherwise, try to add bitfields to the run. if (!StartFieldAsSingleRun && Field != FieldEnd && !IsBetterAsSingleFieldRun(Field) && - Field->getBitWidthValue(Context) != 0 && + (Field->getBitWidthValue(Context) != 0 || + (!Context.getTargetInfo().useZeroLengthBitfieldAlignment() && + !Context.getTargetInfo().useBitFieldTypeAlignment())) && Tail == getFieldBitOffset(*Field)) { Tail += Field->getBitWidthValue(Context); ++Field; |