Skip to content

[llvm-gcc] CFE does not lay out structures correctly when funny darwin rules apply #975

@lattner

Description

@lattner
Bugzilla Link 603
Resolution FIXED
Resolved on Feb 22, 2010 12:41
Version 1.0
OS MacOS X
Blocks #821

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 = 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

Metadata

Metadata

Assignees

Labels

bugzillaIssues migrated from bugzillallvm-toolsAll llvm tools that do not have corresponding tagmiscompilation

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions