r220153 - CodeGen: ConstStructBuilder must verify packed constraints after padding

Chandler Carruth chandlerc at google.com
Sun Oct 19 12:54:41 PDT 2014


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!


> 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/f14f09ad/attachment.html>


More information about the cfe-commits mailing list