[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