r220153 - CodeGen: ConstStructBuilder must verify packed constraints after padding

David Majnemer david.majnemer at gmail.com
Sun Oct 19 16:51:57 PDT 2014


On Sun, Oct 19, 2014 at 12:54 PM, Chandler Carruth <chandlerc at google.com>
wrote:

> On Sat, Oct 18, 2014 at 5:03 PM, David Majnemer <david.majnemer at gmail.com>
> wrote:
>
>> Author: majnemer
>> Date: Sat Oct 18 19:03:10 2014
>> New Revision: 220153
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=220153&view=rev
>> Log:
>> 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.
>>
>
> Much to my surprise, this commit introduces a miscompile that is causing
> all the LNT bots to go red.
>
> You can reproduce this super easily though:
>
> ./bin/clang -m64
> .../your/path/to/the/test/suite/SingleSource/UnitTests/2006-01-23-UnionInit.c
> -w -o unioninit
> ./unioninit
>
> The last line should read:
> rdar://6828787: 23122, -12312731, -312
>
> But with your patch it reads:
> rdar://6828787: 23122, -188, -312
>
> Lemme know if you have trouble reproducing, I can send you preprocessed
> source, whatever.
>
> I've reverted the patch for now to get our bots back in r220169. Sorry for
> the trouble!
>

Should be fixed with r220175.


>
>
>> This fixes PR21300.
>>
>> Modified:
>>     cfe/trunk/lib/CodeGen/CGExprConstant.cpp
>>     cfe/trunk/test/CodeGen/const-init.c
>>
>> Modified: cfe/trunk/lib/CodeGen/CGExprConstant.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprConstant.cpp?rev=220153&r1=220152&r2=220153&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGExprConstant.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGExprConstant.cpp Sat Oct 18 19:03:10 2014
>> @@ -106,15 +106,6 @@ AppendBytes(CharUnits FieldOffsetInChars
>>    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
>>      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;
>>    }
>>
>>
>> Modified: cfe/trunk/test/CodeGen/const-init.c
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/const-init.c?rev=220153&r1=220152&r2=220153&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGen/const-init.c (original)
>> +++ cfe/trunk/test/CodeGen/const-init.c Sat Oct 18 19:03:10 2014
>> @@ -159,3 +159,14 @@ void g29() {
>>    static int b[1] = { "asdf" }; // expected-warning {{incompatible
>> pointer to integer conversion initializing 'int' with an expression of type
>> 'char [5]'}}
>>    static int c[1] = { L"a" };
>>  }
>> +
>> +// PR21300
>> +void g30() {
>> +#pragma pack(1)
>> +  static struct {
>> +    int : 1;
>> +    int x;
>> +  } a = {};
>> +  // CHECK: @g30.a = internal global %struct.anon.1 <{ i8 undef, i32 0
>> }>, align 1
>> +#pragma pack()
>> +}
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141019/ee6d0777/attachment.html>


More information about the cfe-commits mailing list