[llvm-gcc] CFE does not lay out structures correctly when funny darwin rules apply #975
Labels
bugzilla
Issues migrated from bugzilla
llvm-tools
All llvm tools that do not have corresponding tag
miscompilation
Extended Description
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* %_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
The text was updated successfully, but these errors were encountered: