Skip to content

Commit 07ba7a6

Browse files
committed
[runtime] Exported multi payload enum witnesses.
When witness tables for enums are instantiated at runtime via swift::swift_initEnumMetadataMultiPayload the witnesses getEnumTagSinglePayload storeEnumTagSinglePayload are filled with swift_getMultiPayloadEnumTagSinglePayload (previously getMultiPayloadEnumTagSinglePayload) and swift_storeMultiPayloadEnumTagSinglePayload (previously storeMultiPayloadEnumTagSinglePayload). Concretely, that occurs when instantiating the value witness table for a generic enum which has more than one case with a payload, like Result<T>. To enable the compiler to do the same work, those functions need to be visible to it. Here, those functions are made visible to the compiler. Doing so requires changing the way they are declared and adding them to RuntimeFunctions.def which in turn requires the definition of some functions to describe the availability of those functions.
1 parent 95aeaf7 commit 07ba7a6

File tree

6 files changed

+75
-17
lines changed

6 files changed

+75
-17
lines changed

include/swift/AST/ASTContext.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,10 @@ class ASTContext final {
733733
/// Get the runtime availability of support for differentiation.
734734
AvailabilityContext getDifferentiationAvailability();
735735

736+
/// Get the runtime availability of getters and setters of multi payload enum
737+
/// tag single payloads.
738+
AvailabilityContext getMultiPayloadEnumTagSinglePayload();
739+
736740
/// Get the runtime availability of features introduced in the Swift 5.2
737741
/// compiler for the target platform.
738742
AvailabilityContext getSwift52Availability();
@@ -749,6 +753,10 @@ class ASTContext final {
749753
/// compiler for the target platform.
750754
AvailabilityContext getSwift55Availability();
751755

756+
/// Get the runtime availability of features introduced in the Swift 5.6
757+
/// compiler for the target platform.
758+
AvailabilityContext getSwift56Availability();
759+
752760
/// Get the runtime availability of features that have been introduced in the
753761
/// Swift compiler for future versions of the target platform.
754762
AvailabilityContext getSwiftFutureAvailability();

include/swift/Runtime/Enum.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,24 @@ void swift_storeEnumTagMultiPayload(OpaqueValue *value,
129129
const EnumMetadata *enumType,
130130
unsigned whichCase);
131131

132+
/// The unspecialized getEnumTagSinglePayload value witness to be used by the
133+
/// VWTs for for specialized generic enums that are multi-payload.
134+
///
135+
/// Runtime availability: Swift 5.6
136+
SWIFT_RUNTIME_EXPORT
137+
unsigned swift_getMultiPayloadEnumTagSinglePayload(const OpaqueValue *value,
138+
uint32_t numExtraCases,
139+
const Metadata *enumType);
140+
141+
/// The unspecialized storeEnumTagSinglePayload value witness to be used by the
142+
/// VWTs for for specialized generic enums that are multi-payload.
143+
///
144+
/// Runtime availability: Swift 5.6
145+
SWIFT_RUNTIME_EXPORT
146+
void swift_storeMultiPayloadEnumTagSinglePayload(OpaqueValue *value,
147+
uint32_t index,
148+
uint32_t numExtraCases,
149+
const Metadata *enumType);
132150
}
133151

134152
#endif

include/swift/Runtime/RuntimeFunctions.def

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1743,6 +1743,29 @@ FUNCTION(AutoDiffAllocateSubcontext,
17431743
ARGS(RefCountedPtrTy, SizeTy),
17441744
ATTRS(NoUnwind, ArgMemOnly))
17451745

1746+
// SWIFT_RUNTIME_EXPORT
1747+
// unsigned swift_getMultiPayloadEnumTagSinglePayload(const OpaqueValue *value,
1748+
// uint32_t numExtraCases,
1749+
// const Metadata *enumType)
1750+
FUNCTION(GetMultiPayloadEnumTagSinglePayload,
1751+
swift_getMultiPayloadEnumTagSinglePayload, C_CC,
1752+
MultiPayloadEnumTagSinglePayloadAvailability,
1753+
RETURNS(Int32Ty),
1754+
ARGS(OpaquePtrTy, Int32Ty, TypeMetadataPtrTy),
1755+
ATTRS(NoUnwind))
1756+
1757+
// SWIFT_RUNTIME_EXPORT
1758+
// void swift_storeMultiPayloadEnumTagSinglePayload(OpaqueValue *value,
1759+
// uint32_t index,
1760+
// uint32_t numExtraCases,
1761+
// const Metadata *enumType);
1762+
FUNCTION(StoreMultiPayloadEnumTagSinglePayload,
1763+
swift_storeMultiPayloadEnumTagSinglePayload, C_CC,
1764+
MultiPayloadEnumTagSinglePayloadAvailability,
1765+
RETURNS(VoidTy),
1766+
ARGS(OpaquePtrTy, Int32Ty, Int32Ty, TypeMetadataPtrTy),
1767+
ATTRS(NoUnwind))
1768+
17461769
#undef RETURNS
17471770
#undef ARGS
17481771
#undef ATTRS

lib/AST/Availability.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,10 @@ AvailabilityContext ASTContext::getDifferentiationAvailability() {
334334
return getSwiftFutureAvailability();
335335
}
336336

337+
AvailabilityContext ASTContext::getMultiPayloadEnumTagSinglePayload() {
338+
return getSwift56Availability();
339+
}
340+
337341
AvailabilityContext ASTContext::getSwift52Availability() {
338342
auto target = LangOpts.Target;
339343

@@ -416,6 +420,9 @@ AvailabilityContext ASTContext::getSwift55Availability() {
416420
return getSwiftFutureAvailability();
417421
}
418422

423+
AvailabilityContext ASTContext::getSwift56Availability() {
424+
return getSwiftFutureAvailability();
425+
}
419426

420427
AvailabilityContext ASTContext::getSwiftFutureAvailability() {
421428
auto target = LangOpts.Target;

lib/IRGen/IRGenModule.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -781,6 +781,15 @@ namespace RuntimeConstants {
781781
}
782782
return RuntimeAvailability::AlwaysAvailable;
783783
}
784+
785+
RuntimeAvailability
786+
MultiPayloadEnumTagSinglePayloadAvailability(ASTContext &context) {
787+
auto featureAvailability = context.getMultiPayloadEnumTagSinglePayload();
788+
if (!isDeploymentAvailabilityContainedIn(context, featureAvailability)) {
789+
return RuntimeAvailability::ConditionallyAvailable;
790+
}
791+
return RuntimeAvailability::AlwaysAvailable;
792+
}
784793
} // namespace RuntimeConstants
785794

786795
// We don't use enough attributes to justify generalizing the

stdlib/public/runtime/Enum.cpp

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -148,14 +148,6 @@ void swift::swift_storeEnumTagSinglePayloadGeneric(OpaqueValue *value,
148148
numExtraInhabitants, storeExtraInhabitantTag);
149149
}
150150

151-
static uint32_t getMultiPayloadEnumTagSinglePayload(const OpaqueValue *value,
152-
uint32_t numExtraCases,
153-
const Metadata *enumType);
154-
static void storeMultiPayloadEnumTagSinglePayload(OpaqueValue *value,
155-
uint32_t index,
156-
uint32_t numExtraCases,
157-
const Metadata *enumType);
158-
159151
void
160152
swift::swift_initEnumMetadataMultiPayload(EnumMetadata *enumType,
161153
EnumLayoutFlags layoutFlags,
@@ -209,8 +201,9 @@ swift::swift_initEnumMetadataMultiPayload(EnumMetadata *enumType,
209201
// Unconditionally overwrite the enum-tag witnesses.
210202
// The compiler does not generate meaningful enum-tag witnesses for
211203
// enums in this state.
212-
vwtable->getEnumTagSinglePayload = getMultiPayloadEnumTagSinglePayload;
213-
vwtable->storeEnumTagSinglePayload = storeMultiPayloadEnumTagSinglePayload;
204+
vwtable->getEnumTagSinglePayload = swift_getMultiPayloadEnumTagSinglePayload;
205+
vwtable->storeEnumTagSinglePayload =
206+
swift_storeMultiPayloadEnumTagSinglePayload;
214207

215208
vwtable->publishLayout(layout);
216209
}
@@ -287,19 +280,19 @@ static void storeMultiPayloadExtraInhabitantTag(OpaqueValue *value,
287280
storeMultiPayloadTag(value, layout, ~(tag - 1));
288281
}
289282

290-
static uint32_t getMultiPayloadEnumTagSinglePayload(const OpaqueValue *value,
291-
uint32_t numExtraCases,
292-
const Metadata *enumType) {
283+
uint32_t
284+
swift::swift_getMultiPayloadEnumTagSinglePayload(const OpaqueValue *value,
285+
uint32_t numExtraCases,
286+
const Metadata *enumType) {
293287
return getEnumTagSinglePayloadImpl(value, numExtraCases, enumType,
294288
enumType->vw_size(),
295289
enumType->vw_getNumExtraInhabitants(),
296290
getMultiPayloadExtraInhabitantTag);
297291
}
298292

299-
static void storeMultiPayloadEnumTagSinglePayload(OpaqueValue *value,
300-
uint32_t index,
301-
uint32_t numExtraCases,
302-
const Metadata *enumType) {
293+
void swift::swift_storeMultiPayloadEnumTagSinglePayload(
294+
OpaqueValue *value, uint32_t index, uint32_t numExtraCases,
295+
const Metadata *enumType) {
303296
storeEnumTagSinglePayloadImpl(value, index, numExtraCases, enumType,
304297
enumType->vw_size(),
305298
enumType->vw_getNumExtraInhabitants(),

0 commit comments

Comments
 (0)