Page MenuHomePhabricator

SwiftCC: Perform physical layout when computing coercion types
Needs ReviewPublic

Authored by aschwaighofer on Jun 21 2017, 8:32 AM.

Details

Reviewers
rjmccall
Summary

We need to take type alignment padding into account whe computing physical
layouts.

The layout must be compatible with the input layout, offsets are defined in
terms of offsets within a packed struct which are computed in terms of the alloc
size of a type.

Using the store size we would insert padding for the following type for example:

struct {

int3 v;
long long l;

} __attribute((packed))

On x86-64 int3 is padded to int4 alignment. The swiftcc type would be
<{ <3 x float>, [4 x i8], i64 }> which is not compatible with <{ <3 x float>,
i64 }>.

The latter has i64 at offset 16 and the former at offset 20.

rdar://32618125

Diff Detail

Event Timeline

aschwaighofer created this revision.Jun 21 2017, 8:32 AM
aschwaighofer retitled this revision from SwiftAggregateLowering: Use type alloc size to determine the size of types to SwiftCC: Perform physical layout when computing coercion types.
aschwaighofer edited the summary of this revision. (Show Details)
aschwaighofer removed a reviewer: cfe-commits.
aschwaighofer added a subscriber: cfe-commits.

Based on email conversation with John. He pointed out we purposely don't want to use the allocation size for the algorithm and that we can just use LLVM's layout when we compute the coercion types.

Same patch bug with added diff context.

rjmccall edited edge metadata.Jun 21 2017, 2:31 PM

Looks great, thanks!