[llvm-commits] [llvm-gcc-4.2] r51866 - /llvm-gcc-4.2/trunk/gcc/llvm-types.cpp

Dale Johannesen dalej at apple.com
Tue Jun 3 10:57:17 PDT 2008


This patch breaks FrontendC/2008-01-28-UnionSize.c and FrontendC/ 
2007-09-28-PackedUnionMember.c on Darwin x86-32.

FAIL: /Volumes/MacOS9/gcc/llvm/test/FrontendC/2007-09-28- 
PackedUnionMember.c
Failed with exit(1) at line 1
while running: /usr/local/bin/llvm-gcc  -emit-llvm /Volumes/MacOS9/gcc/ 
llvm/test/FrontendC/2007-09-28-PackedUnionMember.c -S -o -
Assertion failed: ((!TYPE_SIZE(Tr) || !Ty->isSized() || ! 
isInt64(TYPE_SIZE(Tr), true) || getInt64(TYPE_SIZE(Tr), true) ==  
getTargetData().getABITypeSizeInBits(Ty)) && "LLVM type size doesn't  
match GCC type size!"), function llvm_set_type, file ../../llvm- 
gcc-4.2/gcc/llvm-types.cpp, line 84.
/Volumes/MacOS9/gcc/llvm/test/FrontendC/2007-09-28- 
PackedUnionMember.c: In function ‘hndlr’:

It's odd that the nightly testers aren't showing this.  I suspect they  
aren't rebuilding llvm-gcc every night.

On Jun 2, 2008, at 8:56 AM, Duncan Sands wrote:

> Author: baldrick
> Date: Mon Jun  2 10:56:49 2008
> New Revision: 51866
>
> URL: http://llvm.org/viewvc/llvm-project?rev=51866&view=rev
> Log:
> Fix 2003-10-09-UnionInitializerBug.c on x86-64.
> The problem was that in ConvertUNION if the
> new field was less aligned than a previous one
> but was also the biggest field seen so far then
> it was selected.  But the most aligned field is
> supposed to always be selected.  This caused a
> crash in ConvertStructFieldInitializerToType
> which relies on initializers not being more
> aligned than the LLVM type.  In the long run
> I think ConvertStructFieldInitializerToType
> should be modified to not care about the
> alignment.
>
> Modified:
>    llvm-gcc-4.2/trunk/gcc/llvm-types.cpp
>
> Modified: llvm-gcc-4.2/trunk/gcc/llvm-types.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-types.cpp?rev=51866&r1=51865&r2=51866&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm-gcc-4.2/trunk/gcc/llvm-types.cpp (original)
> +++ llvm-gcc-4.2/trunk/gcc/llvm-types.cpp Mon Jun  2 10:56:49 2008
> @@ -2179,7 +2179,7 @@
>   const TargetData &TD = getTargetData();
>   const Type *UnionTy = 0;
>   tree GccUnionTy = 0;
> -  unsigned MaxSize = 0, MaxAlign = 0;
> +  unsigned MaxAlignSize = 0, MaxAlign = 0;
>   for (tree Field = TYPE_FIELDS(type); Field; Field =  
> TREE_CHAIN(Field)) {
>     if (TREE_CODE(Field) != FIELD_DECL) continue;
> //    assert(getFieldOffsetInBits(Field) == 0 && "Union with non- 
> zero offset?");
> @@ -2233,29 +2233,27 @@
>     const Type *TheTy = ConvertType(TheGccTy);
>     unsigned Size  = TD.getABITypeSize(TheTy);
>     unsigned Align = TD.getABITypeAlignment(TheTy);
> -
> +
>     adjustPaddingElement(GccUnionTy, TheGccTy);
>
> -    // Select TheTy as union type if it meets one of the following  
> criteria
> -    // 1) UnionTy is 0
> -    // 2) TheTy alignment is more then UnionTy
> -    // 3) TheTy size is greater than UnionTy size and TheTy  
> alignment is
> -    //    equal to UnionTy
> -    // 4) TheTy size is greater then UnionTy size and TheTy is packed
> -    bool useTheTy = false;
> +    // Select TheTy as union type if it is more aligned than any  
> other.  If more
> +    // than one field achieves the maximum alignment then choose  
> the biggest.
> +    bool useTheTy;
>     if (UnionTy == 0)
>       useTheTy = true;
> +    else if (Align < MaxAlign)
> +      useTheTy = false;
>     else if (Align > MaxAlign)
>       useTheTy = true;
> -    else if (MaxAlign == Align && Size > MaxSize)
> -      useTheTy = true;
> -    else if (Size > MaxSize)
> +    else if (Size > MaxAlignSize)
>       useTheTy = true;
> +    else
> +      useTheTy = false;
>
>     if (useTheTy) {
>       UnionTy = TheTy;
>       GccUnionTy = TheGccTy;
> -      MaxSize = MAX(MaxSize, Size);
> +      MaxAlignSize = Size;
>       MaxAlign = Align;
>     }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list