diff options
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; |