Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 1 commit into from
Nov 11, 2020

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