Skip to content

Win64 ABI: Pass/return delegates like slices - in (up to) 2 GP registers#3609

Merged
kinke merged 1 commit intoldc-developers:masterfrom
kinke:win64_delegates
Nov 11, 2020
Merged

Win64 ABI: Pass/return delegates like slices - in (up to) 2 GP registers#3609
kinke merged 1 commit intoldc-developers:masterfrom
kinke:win64_delegates

Conversation

@kinke
Copy link
Member

@kinke kinke commented Nov 7, 2020

I expect this to be slightly more performant than the previous behavior, where a delegate was treated like a corresponding struct, passed via hidden pointer and returned via sret.

The primary motivation is a smooth preparation for PR #3578 - in order to allow people to experiment with -preview=in without recompiling druntime and Phobos, in slices and delegates must not be passed by-ref with -preview=in (see dlang/dmd#11828). This would have required a special case for delegates on Win64, which is IMO better handled this way.

// LDC-specific exceptions: slices and delegates are left alone (as non-
// rewritten IR structs) and passed/returned as 2 separate args => passed in
// up to 2 GP registers and returned in RAX & RDX.
return isAggregate(t) && !canRewriteAsInt(t) && t->ty != Tarray &&
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[isAggregate(t) already excludes Tarray, so no change for slices. - That's a general limitation, as we cannot ABI-rewrite slices because we don't ABI-rewrite the druntime hooks.]

I expect this to be slightly more performant than the previous behavior,
where a delegate was treated like a corresponding struct, passed via
hidden pointer and returned via sret.

The primary motivation is a smooth preparation for PR ldc-developers#3578 - in order
to allow people to experiment with `-preview=in` without recompiling
druntime and Phobos, `in` slices and delegates must not be passed by-ref
with `-preview=in` (see dlang/dmd#11828). This would have required a
special case for delegates on Win64, which is IMO better handled this
way.
@kinke kinke merged commit 246b783 into ldc-developers:master Nov 11, 2020
@kinke kinke deleted the win64_delegates branch November 11, 2020 20:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant