Skip to content

GenericSpecializer: use an alternative mangling if the function has re-abstracted resilient type parameters. #34986

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

Merged
merged 3 commits into from
Dec 8, 2020

Conversation

eeckstein
Copy link
Contributor

If the specialized function has re-abstracted (= converted from indirect to direct) resilient argument or return types, use an alternative mangling: "TB" instead of "Tg".
Resilient parameters/returns can be converted from indirect to direct if the specialization is created within the type's resilience domain, i.e. in its module (where the type is loadable).
In this case we need to generate a different mangled name for the specialized function to distinguish it from specializations in other modules, which cannot re-abstract this resilient type.

This fixes a miscompile resulting from ODR-linking specializations from different modules, which in fact have different function signatures.

https://bugs.swift.org/browse/SR-13900
rdar://71914016

"TB" is used instead of "Tg" in case the specialized function has a resilient argument type and this argument is re-abstracted (from indirect to direct passing).
It can be re-abstracted in case the specialization is compiled in the type's resilience domain (i.e. in it's module).
We need a separate mangling for this to distinguish from specializations - with the same type - but in different resilience domains.

Note that this change does not affect the ABI: it's only used for generated module-internal specializations.
…e-abstracted resilient type parameters.

If the specialized function has a re-abstracted (= converted from indirect to direct) resilient argument or return types, use an alternative mangling: "TB" instead of "Tg".
Resilient parameters/returns can be converted from indirect to direct if the specialization is created within the type's resilience domain, i.e. in its module (where the type is loadable).
In this case we need to generate a different mangled name for the specialized function to distinguish it from specializations in other modules, which cannot re-abstract this resilient type.

This fixes a miscompile resulting from ODR-linking specializations from different modules, which in fact have different function signatures.

https://bugs.swift.org/browse/SR-13900
rdar://71914016
@eeckstein
Copy link
Contributor Author

@swift-ci test

1 similar comment
@eeckstein
Copy link
Contributor Author

@swift-ci test

@eeckstein
Copy link
Contributor Author

@swift-ci smoke test

@eeckstein
Copy link
Contributor Author

@swift-ci smoke test linux

3 similar comments
@shahmishal
Copy link
Member

@swift-ci smoke test linux

@shahmishal
Copy link
Member

@swift-ci smoke test linux

@shahmishal
Copy link
Member

@swift-ci smoke test linux

@shahmishal
Copy link
Member

@swift-ci smoke test Linux

3 similar comments
@shahmishal
Copy link
Member

@swift-ci smoke test Linux

@shahmishal
Copy link
Member

@swift-ci smoke test Linux

@eeckstein
Copy link
Contributor Author

@swift-ci smoke test Linux

@eeckstein eeckstein merged commit daa85e1 into swiftlang:main Dec 8, 2020
@eeckstein eeckstein deleted the fix-generic-spec branch December 8, 2020 10:05
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.

2 participants