llvm-gcc is currently miscompiling the following code: ---- typedef union { int A; long long L; } X; typedef struct { X x; int B; } Y; Y* foo(Y *l) { return l+1; } --- In this case, the X union should have 8-byte alignment due to funny darwin rules (even though long long's are normally only 4-byte aligned). When X is the first element of a struct, that increases its alignment requirements to 8-bytes, which increases the size of Y from 12 to 16 bytes. llvm-gcc currently compiles this to: --- %struct.Y = type { %union.X, int } %union.X = type { long } %struct.Y* %_Z3fooP1Y(%struct.Y* %l) { %tmp.2 = getelementptr %struct.Y* %l, int 1 ; <%struct.Y*> [#uses=1] ret %struct.Y* %tmp.2 } --- ... which is incorrect: Y is only 12 bytes in size. This causes us to emit the following PPC code: __Z3fooP1Y: addi r3, r3, 12 blr ... instead of the correct code: __Z3fooP1Y: addi r3, r3, 16 blr This problem was reduced from Bug 449. -Chris
geeze, here's another simpler case: typedef struct { double X; int B; } Y; Y* foo(Y *l) { return l+1; } Darwin only makes "Y" 8-byte aligned if the double is first in the struct. -Chris
Fixed. Patch here: http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20050725/027198.html Testcase here: Regression/C++/ofstream_ctor.cpp This also fixes PR449. -Chris
*** Bug 449 has been marked as a duplicate of this bug. ***