Author: dpatel Date: Mon Jan 21 13:29:51 2008 New Revision: 46210 URL: http://llvm.org/viewvc/llvm-project?rev=46210&view=rev Log: Used packed struct for
typedef double Al1Double __attribute__((aligned(1))); struct x { int a:23; Al1Double v; }; test case : http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20080121/057396.html 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=46210&r1=46209&r2=46210&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-types.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-types.cpp Mon Jan 21 13:29:51 2008 @@ -1260,6 +1260,8 @@ ExtraBitsAvailable = E; } + bool isPacked() { return Packed; } + void markAsPacked() { Packed = true; } @@ -1793,7 +1795,15 @@ // ordering. Therefore convert to a packed struct and try again. Info.convertToPacked(); DecodeStructFields(Field, Info); - } else + } + else if (TYPE_USER_ALIGN(TREE_TYPE(Field)) + && DECL_ALIGN_UNIT(Field) != Info.getTypeAlignment(Ty) + && !Info.isPacked()) { + // If Field has user defined alignment and it does not match Ty alignment + // then convert to a packed struct and try again. + Info.convertToPacked(); + DecodeStructFields(Field, Info); + } else // At this point, we know that adding the element will happen at the right // offset. Add it. Info.addElement(Ty, StartOffsetInBytes, Info.getTypeSize(Ty)); _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits