CodeGen: ConstStructBuilder must verify packed constraints after padding
Before, ConstStructBuilder::AppendBytes would check packed constraints prior to padding being added before the field's offset. However, adding this padding might force our struct to be packed. Because we wouldn't check *after* adding padding, ConstStructBuilder would be in an inconsistent state leading to a crash. This fixes PR21300. llvm-svn: 220153
This commit is contained in:
@@ -106,15 +106,6 @@ AppendBytes(CharUnits FieldOffsetInChars, llvm::Constant *InitCst) {
|
||||
CharUnits AlignedNextFieldOffsetInChars =
|
||||
NextFieldOffsetInChars.RoundUpToAlignment(FieldAlignment);
|
||||
|
||||
if (AlignedNextFieldOffsetInChars > FieldOffsetInChars) {
|
||||
assert(!Packed && "Alignment is wrong even with a packed struct!");
|
||||
|
||||
// Convert the struct to a packed struct.
|
||||
ConvertStructToPacked();
|
||||
|
||||
AlignedNextFieldOffsetInChars = NextFieldOffsetInChars;
|
||||
}
|
||||
|
||||
if (AlignedNextFieldOffsetInChars < FieldOffsetInChars) {
|
||||
// We need to append padding.
|
||||
AppendPadding(FieldOffsetInChars - NextFieldOffsetInChars);
|
||||
@@ -122,6 +113,16 @@ AppendBytes(CharUnits FieldOffsetInChars, llvm::Constant *InitCst) {
|
||||
assert(NextFieldOffsetInChars == FieldOffsetInChars &&
|
||||
"Did not add enough padding!");
|
||||
|
||||
AlignedNextFieldOffsetInChars =
|
||||
NextFieldOffsetInChars.RoundUpToAlignment(FieldAlignment);
|
||||
}
|
||||
|
||||
if (AlignedNextFieldOffsetInChars > FieldOffsetInChars) {
|
||||
assert(!Packed && "Alignment is wrong even with a packed struct!");
|
||||
|
||||
// Convert the struct to a packed struct.
|
||||
ConvertStructToPacked();
|
||||
|
||||
AlignedNextFieldOffsetInChars = NextFieldOffsetInChars;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user