Store test content in a custom metadata section.#880
Merged
Conversation
e98f3bc to
bb2526a
Compare
compnerd
reviewed
Jan 3, 2025
Contributor
Author
|
@swift-ci test |
compnerd
reviewed
Jan 6, 2025
Contributor
Author
|
@swift-ci test |
Contributor
Author
|
@swift-ci test Linux |
Contributor
Author
|
@swift-ci test Windows |
1 similar comment
Contributor
Author
|
@swift-ci test Windows |
fe3dbab to
713b032
Compare
Contributor
Author
|
@swift-ci test |
Contributor
Author
|
@swift-ci test macOS |
Contributor
Author
|
@swift-ci test |
266b53b to
9a93f24
Compare
Contributor
Author
|
@swift-ci test |
9a93f24 to
e3e5cfe
Compare
Contributor
Author
|
@swift-ci test |
950c904 to
54a7db9
Compare
This PR uses the experimental symbol linkage margers feature in the Swift compiler to emit metadata about tests (and exit tests) into a dedicated section of the test executable being built. At runtime, we discover that section and read out the tests from it. This has several benefits over our current model, which involves walking Swift's type metadata table looking for types that conform to a protocol: 1. We don't need to define that protocol as public API in Swift Testing, 1. We don't need to emit type metadata (much larger than what we really need) for every test function, 1. We don't need to duplicate a large chunk of the Swift ABI sources in order to walk the type metadata table correctly, and 1. Almost all the new code is written in Swift, whereas the code it is intended to replace could not be fully represented in Swift and needed to be written in C++. The change also opens up the possibility of supporting generic types in the future because we can emit metadata without needing to emit a nested type (which is not always valid in a generic context.) That's a "future direction" and not covered by this PR specifically. I've defined a layout for entries in the new `swift5_tests` section that should be flexible enough for us in the short-to-medium term and which lets us define additional arbitrary test content record types. The layout of this section is covered in depth in the new [TestContent.md](Documentation/ABI/TestContent.md) article. This functionality is only available if a test target enables the experimental `"SymbolLinkageMarkers"` feature. We continue to emit protocol-conforming types for now—that code will be removed if and when the experimental feature is properly supported (modulo us adopting relevant changes to the feature's API.) #735 swiftlang/swift#76698 swiftlang/swift#78411
54a7db9 to
abc1825
Compare
Contributor
Author
|
@swift-ci test |
grynspan
commented
Mar 11, 2025
Contributor
Author
|
@swift-ci test |
Contributor
Author
|
@swift-ci test |
Contributor
Author
|
@swift-ci test |
Contributor
Author
|
@swift-ci test |
Contributor
Author
|
@swift-ci test macOS |
…ivate" This reverts commit 003f09f.
Contributor
Author
|
@swift-ci test |
Contributor
Author
|
@swift-ci test Linux |
Contributor
Author
|
@swift-ci test macOS |
Contributor
Author
|
@swift-ci test Windows |
Contributor
Author
|
@swift-ci test macOS |
stmontgomery
approved these changes
Mar 11, 2025
2 tasks
2 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR uses the experimental symbol linkage margers feature in the Swift compiler to emit metadata about tests (and exit tests) into a dedicated section of the test executable being built. At runtime, we discover that section and read out the tests from it.
This has several benefits over our current model, which involves walking Swift's type metadata table looking for types that conform to a protocol:
This change will be necessary to support Embedded Swift because there is no type metadata section emitted for embedded targets.
The change also opens up the possibility of supporting generic types in the future because we can emit metadata without needing to emit a nested type (which is not always valid in a generic context.) That's a "future direction" and not covered by this PR specifically.
I've defined a layout for entries in the new
swift5_testssection that should be flexible enough for us in the short-to-medium term and which lets us define additional arbitrary test content record types. The layout of this section is covered in depth in the new TestContent.md article.This functionality is only available if a test target enables the experimental
"SymbolLinkageMarkers"feature and only if Swift Testing is used as a package (not as a toolchain component.) We continue to emit protocol-conforming types for now—that code will be removed if and when the experimental feature is properly supported (modulo us adopting relevant changes to the feature's API.)See Also
#735
#764
swiftlang/swift#76698
swiftlang/swift#78411
Checklist: