Skip to content

Commit 92bebee

Browse files
committed
[Runtime] Add compatibility override support for CVW runtime functions
rdar://143429827
1 parent 82d7260 commit 92bebee

File tree

4 files changed

+190
-50
lines changed

4 files changed

+190
-50
lines changed

stdlib/public/CompatibilityOverride/CompatibilityOverrideRuntime.def

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@
7979
# define OVERRIDE_PROTOCOLCONFORMANCE OVERRIDE
8080
# define OVERRIDE_KEYPATH OVERRIDE
8181
# define OVERRIDE_WITNESSTABLE OVERRIDE
82+
# define OVERRIDE_CVW OVERRIDE
83+
# define OVERRIDE_CVW_METADATA OVERRIDE
84+
# define OVERRIDE_CVW_METADATA_ENUM OVERRIDE
8285
#else
8386
# ifndef OVERRIDE_METADATALOOKUP
8487
# define OVERRIDE_METADATALOOKUP(...)
@@ -104,6 +107,15 @@
104107
# ifndef OVERRIDE_WITNESSTABLE
105108
# define OVERRIDE_WITNESSTABLE(...)
106109
# endif
110+
# ifndef OVERRIDE_CVW
111+
# define OVERRIDE_CVW(...)
112+
# endif
113+
# ifndef OVERRIDE_CVW_METADATA
114+
# define OVERRIDE_CVW_METADATA(...)
115+
# endif
116+
# ifndef OVERRIDE_CVW_METADATA_ENUM
117+
# define OVERRIDE_CVW_METADATA_ENUM(...)
118+
# endif
107119
#endif
108120

109121
OVERRIDE_DYNAMICCASTING(dynamicCast, bool, , , swift::,
@@ -217,6 +229,125 @@ OVERRIDE_WITNESSTABLE(getAssociatedConformanceWitnessSlow, const WitnessTable *,
217229
const ProtocolRequirement *assocConformance),
218230
(wtable, conformingType, assocType, reqBase,
219231
assocConformance))
232+
233+
OVERRIDE_CVW_METADATA(allocateGenericValueMetadataWithLayoutString, ValueMetadata *,
234+
SWIFT_RUNTIME_EXPORT, , swift::,
235+
(const ValueTypeDescriptor *description,
236+
const void *arguments,
237+
const GenericValueMetadataPattern *pattern,
238+
size_t extraDataSize),
239+
(description, arguments, pattern, extraDataSize))
240+
241+
OVERRIDE_CVW_METADATA(initStructMetadataWithLayoutString, void, SWIFT_RUNTIME_EXPORT,
242+
, swift::, (StructMetadata *structType,
243+
StructLayoutFlags layoutFlags,
244+
size_t numFields,
245+
const uint8_t *const *fieldTypes,
246+
const uint8_t *fieldTags,
247+
uint32_t *fieldOffsets),
248+
(structType, layoutFlags, numFields, fieldTypes,
249+
fieldTags, fieldOffsets))
250+
251+
OVERRIDE_CVW_METADATA(allocateGenericClassMetadataWithLayoutString, ClassMetadata *,
252+
SWIFT_RUNTIME_EXPORT, , swift::,
253+
(const ClassDescriptor *description,
254+
const void *arguments,
255+
const GenericClassMetadataPattern *pattern),
256+
(description, arguments, pattern))
257+
258+
OVERRIDE_CVW_METADATA_ENUM(initEnumMetadataSingleCaseWithLayoutString, void,
259+
SWIFT_RUNTIME_EXPORT, , swift::,
260+
(EnumMetadata *self, EnumLayoutFlags layoutFlags,
261+
const Metadata *payloadType),
262+
(self, layoutFlags, payloadType))
263+
264+
OVERRIDE_CVW_METADATA_ENUM(initEnumMetadataSinglePayloadWithLayoutString, void,
265+
SWIFT_RUNTIME_EXPORT, , swift::,
266+
(EnumMetadata *self, EnumLayoutFlags layoutFlags,
267+
const Metadata *payloadType, unsigned emptyCases),
268+
(self, layoutFlags, payloadType, emptyCases))
269+
270+
OVERRIDE_CVW_METADATA_ENUM(initEnumMetadataMultiPayloadWithLayoutString, void,
271+
SWIFT_RUNTIME_EXPORT, , swift::,
272+
(EnumMetadata *self, EnumLayoutFlags layoutFlags,
273+
unsigned numPayloads,
274+
const Metadata * const *payloadLayouts),
275+
(self, layoutFlags, numPayloads, payloadLayouts))
276+
277+
OVERRIDE_CVW(generic_destroy, void, SWIFT_RUNTIME_EXPORT,
278+
, swift::, (swift::OpaqueValue *address,
279+
const Metadata *metadata),
280+
(address, metadata))
281+
282+
OVERRIDE_CVW(generic_assignWithCopy, swift::OpaqueValue *, SWIFT_RUNTIME_EXPORT,
283+
, swift::, (swift::OpaqueValue *dest,
284+
swift::OpaqueValue *src,
285+
const Metadata *metadata),
286+
(dest, src, metadata))
287+
288+
OVERRIDE_CVW(generic_assignWithTake, swift::OpaqueValue *, SWIFT_RUNTIME_EXPORT,
289+
, swift::, (swift::OpaqueValue *dest,
290+
swift::OpaqueValue *src,
291+
const Metadata *metadata),
292+
(dest, src, metadata))
293+
294+
OVERRIDE_CVW(generic_initWithCopy, swift::OpaqueValue *, SWIFT_RUNTIME_EXPORT,
295+
, swift::, (swift::OpaqueValue *dest,
296+
swift::OpaqueValue *src,
297+
const Metadata *metadata),
298+
(dest, src, metadata))
299+
300+
OVERRIDE_CVW(generic_initWithTake, swift::OpaqueValue *, SWIFT_RUNTIME_EXPORT,
301+
, swift::, (swift::OpaqueValue *dest,
302+
swift::OpaqueValue *src,
303+
const Metadata *metadata),
304+
(dest, src, metadata))
305+
306+
OVERRIDE_CVW(generic_initializeBufferWithCopyOfBuffer, swift::OpaqueValue *,
307+
SWIFT_RUNTIME_EXPORT,
308+
, swift::, (swift::ValueBuffer *dest,
309+
swift::ValueBuffer *src,
310+
const Metadata *metadata),
311+
(dest, src, metadata))
312+
313+
OVERRIDE_CVW(enumSimple_getEnumTag, unsigned, SWIFT_RUNTIME_EXPORT,
314+
, swift::, (swift::OpaqueValue *address,
315+
const Metadata *metadata),
316+
(address, metadata))
317+
318+
OVERRIDE_CVW(enumSimple_destructiveInjectEnumTag, void, SWIFT_RUNTIME_EXPORT,
319+
, swift::, (swift::OpaqueValue *address,
320+
unsigned tag,
321+
const Metadata *metadata),
322+
(address, tag, metadata))
323+
324+
OVERRIDE_CVW(enumFn_getEnumTag, unsigned, SWIFT_RUNTIME_EXPORT,
325+
, swift::, (swift::OpaqueValue *address,
326+
const Metadata *metadata),
327+
(address, metadata))
328+
329+
OVERRIDE_CVW(multiPayloadEnumGeneric_getEnumTag, unsigned, SWIFT_RUNTIME_EXPORT,
330+
, swift::, (swift::OpaqueValue *address,
331+
const Metadata *metadata),
332+
(address, metadata))
333+
334+
OVERRIDE_CVW(multiPayloadEnumGeneric_destructiveInjectEnumTag, void, SWIFT_RUNTIME_EXPORT,
335+
, swift::, (swift::OpaqueValue *address,
336+
unsigned tag,
337+
const Metadata *metadata),
338+
(address, tag, metadata))
339+
340+
OVERRIDE_CVW(singlePayloadEnumGeneric_getEnumTag, unsigned, SWIFT_RUNTIME_EXPORT,
341+
, swift::, (swift::OpaqueValue *address,
342+
const Metadata *metadata),
343+
(address, metadata))
344+
345+
OVERRIDE_CVW(singlePayloadEnumGeneric_destructiveInjectEnumTag, void, SWIFT_RUNTIME_EXPORT,
346+
, swift::, (swift::OpaqueValue *address,
347+
unsigned tag,
348+
const Metadata *metadata),
349+
(address, tag, metadata))
350+
220351
#if SWIFT_OBJC_INTEROP
221352

222353
OVERRIDE_OBJC(dynamicCastObjCClass, const void *, , , swift::,
@@ -265,3 +396,6 @@ OVERRIDE_FOREIGN(dynamicCastForeignClassUnconditional, const void *, , , swift::
265396
#undef OVERRIDE_PROTOCOLCONFORMANCE
266397
#undef OVERRIDE_KEYPATH
267398
#undef OVERRIDE_WITNESSTABLE
399+
#undef OVERRIDE_CVW
400+
#undef OVERRIDE_CVW_METADATA
401+
#undef OVERRIDE_CVW_METADATA_ENUM

stdlib/public/runtime/BytecodeLayouts.cpp

Lines changed: 39 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
#include <ptrauth.h>
3939
#endif
4040

41+
#include "../CompatibilityOverride/CompatibilityOverride.h"
42+
4143
using namespace swift;
4244

4345
static Metadata *getExistentialTypeMetadata(OpaqueValue *object) {
@@ -897,8 +899,8 @@ static void handleRefCountsDestroy(const Metadata *metadata,
897899
}
898900
}
899901

900-
extern "C" void
901-
swift_generic_destroy(swift::OpaqueValue *address, const Metadata *metadata) {
902+
static void swift_generic_destroyImpl(swift::OpaqueValue *address,
903+
const Metadata *metadata) {
902904
const uint8_t *layoutStr = metadata->getLayoutString();
903905
LayoutStringReader1 reader{layoutStr + layoutStringHeaderSize};
904906
uintptr_t addrOffset = 0;
@@ -1157,9 +1159,10 @@ static void handleRefCountsInitWithCopy(const Metadata *metadata,
11571159
}
11581160
}
11591161

1160-
extern "C" swift::OpaqueValue *
1161-
swift_generic_initWithCopy(swift::OpaqueValue *_dest, swift::OpaqueValue *_src,
1162-
const Metadata *metadata) {
1162+
static swift::OpaqueValue *
1163+
swift_generic_initWithCopyImpl(swift::OpaqueValue *_dest,
1164+
swift::OpaqueValue *_src,
1165+
const Metadata *metadata) {
11631166
const uint8_t *layoutStr = metadata->getLayoutString();
11641167
LayoutStringReader1 reader{layoutStr + layoutStringHeaderSize};
11651168
uintptr_t addrOffset = 0;
@@ -1315,9 +1318,10 @@ static void handleRefCountsInitWithTake(const Metadata *metadata,
13151318
}
13161319
}
13171320

1318-
extern "C" swift::OpaqueValue *
1319-
swift_generic_initWithTake(swift::OpaqueValue *_dest, swift::OpaqueValue *_src,
1320-
const Metadata *metadata) {
1321+
static swift::OpaqueValue *
1322+
swift_generic_initWithTakeImpl(swift::OpaqueValue *_dest,
1323+
swift::OpaqueValue *_src,
1324+
const Metadata *metadata) {
13211325
if (SWIFT_LIKELY(metadata->getValueWitnesses()->isBitwiseTakable())) {
13221326
size_t size = metadata->vw_size();
13231327
memcpy(_dest, _src, size);
@@ -2067,10 +2071,10 @@ static void multiPayloadEnumFNAssignWithCopy(const Metadata *metadata,
20672071
addrOffset += enumSize;
20682072
}
20692073

2070-
extern "C" swift::OpaqueValue *
2071-
swift_generic_assignWithCopy(swift::OpaqueValue *_dest,
2072-
swift::OpaqueValue *_src,
2073-
const Metadata *metadata) {
2074+
static swift::OpaqueValue *
2075+
swift_generic_assignWithCopyImpl(swift::OpaqueValue *_dest,
2076+
swift::OpaqueValue *_src,
2077+
const Metadata *metadata) {
20742078
uint8_t *dest = (uint8_t *)_dest;
20752079
uint8_t *src = (uint8_t *)_src;
20762080
const uint8_t *layoutStr = metadata->getLayoutString();
@@ -2109,9 +2113,10 @@ void swift::swift_generic_arrayAssignWithCopy(swift::OpaqueValue *_dest,
21092113
}
21102114
}
21112115

2112-
extern "C" swift::OpaqueValue *
2113-
swift_generic_assignWithTake(swift::OpaqueValue *dest, swift::OpaqueValue *src,
2114-
const Metadata *metadata) {
2116+
static swift::OpaqueValue *
2117+
swift_generic_assignWithTakeImpl(swift::OpaqueValue *dest,
2118+
swift::OpaqueValue *src,
2119+
const Metadata *metadata) {
21152120
swift_generic_destroy(dest, metadata);
21162121
return swift_generic_initWithTake(dest, src, metadata);
21172122
}
@@ -2154,7 +2159,7 @@ static inline T handleSinglePayloadEnumSimpleTag(
21542159
xiTagBytesOffset, payloadSize, numExtraTagBytes);
21552160
}
21562161

2157-
extern "C" unsigned swift_enumSimple_getEnumTag(swift::OpaqueValue *address,
2162+
static unsigned swift_enumSimple_getEnumTagImpl(swift::OpaqueValue *address,
21582163
const Metadata *metadata) {
21592164
auto addr = reinterpret_cast<uint8_t *>(address);
21602165
LayoutStringReader reader{metadata->getLayoutString(),
@@ -2197,7 +2202,7 @@ extern "C" unsigned swift_enumSimple_getEnumTag(swift::OpaqueValue *address,
21972202
reader, addr, extraTagBytesHandler, xihandler);
21982203
}
21992204

2200-
extern "C" void swift_enumSimple_destructiveInjectEnumTag(
2205+
static void swift_enumSimple_destructiveInjectEnumTagImpl(
22012206
swift::OpaqueValue *address, unsigned tag, const Metadata *metadata) {
22022207
auto addr = reinterpret_cast<uint8_t *>(address);
22032208
LayoutStringReader reader{metadata->getLayoutString(),
@@ -2255,9 +2260,8 @@ extern "C" void swift_enumSimple_destructiveInjectEnumTag(
22552260
xihandler);
22562261
}
22572262

2258-
extern "C"
2259-
unsigned swift_enumFn_getEnumTag(swift::OpaqueValue *address,
2260-
const Metadata *metadata) {
2263+
static unsigned swift_enumFn_getEnumTagImpl(swift::OpaqueValue *address,
2264+
const Metadata *metadata) {
22612265
auto addr = reinterpret_cast<const uint8_t *>(address);
22622266
LayoutStringReader reader{metadata->getLayoutString(),
22632267
layoutStringHeaderSize + sizeof(uint64_t)};
@@ -2266,9 +2270,9 @@ unsigned swift_enumFn_getEnumTag(swift::OpaqueValue *address,
22662270
return getEnumTag(addr);
22672271
}
22682272

2269-
extern "C" unsigned
2270-
swift_multiPayloadEnumGeneric_getEnumTag(swift::OpaqueValue *address,
2271-
const Metadata *metadata) {
2273+
static unsigned
2274+
swift_multiPayloadEnumGeneric_getEnumTagImpl(swift::OpaqueValue *address,
2275+
const Metadata *metadata) {
22722276
auto addr = reinterpret_cast<const uint8_t *>(address);
22732277
LayoutStringReader1 reader{metadata->getLayoutString() +
22742278
layoutStringHeaderSize + sizeof(uint64_t)};
@@ -2295,7 +2299,7 @@ swift_multiPayloadEnumGeneric_getEnumTag(swift::OpaqueValue *address,
22952299
}
22962300
}
22972301

2298-
extern "C" void swift_multiPayloadEnumGeneric_destructiveInjectEnumTag(
2302+
static void swift_multiPayloadEnumGeneric_destructiveInjectEnumTagImpl(
22992303
swift::OpaqueValue *address, unsigned tag, const Metadata *metadata) {
23002304
auto addr = reinterpret_cast<uint8_t *>(address);
23012305
LayoutStringReader reader{metadata->getLayoutString(),
@@ -2358,9 +2362,9 @@ static inline T handleSinglePayloadEnumGenericTag(
23582362
numExtraTagBytes);
23592363
}
23602364

2361-
extern "C" unsigned
2362-
swift_singlePayloadEnumGeneric_getEnumTag(swift::OpaqueValue *address,
2363-
const Metadata *metadata) {
2365+
static unsigned
2366+
swift_singlePayloadEnumGeneric_getEnumTagImpl(swift::OpaqueValue *address,
2367+
const Metadata *metadata) {
23642368
auto addr = reinterpret_cast<uint8_t *>(address);
23652369
LayoutStringReader reader{metadata->getLayoutString(),
23662370
layoutStringHeaderSize + sizeof(uint64_t)};
@@ -2400,7 +2404,7 @@ swift_singlePayloadEnumGeneric_getEnumTag(swift::OpaqueValue *address,
24002404
reader, addr, extraTagBytesHandler, xihandler);
24012405
}
24022406

2403-
extern "C" void swift_singlePayloadEnumGeneric_destructiveInjectEnumTag(
2407+
static void swift_singlePayloadEnumGeneric_destructiveInjectEnumTagImpl(
24042408
swift::OpaqueValue *address, unsigned tag, const Metadata *metadata) {
24052409
auto addr = reinterpret_cast<uint8_t *>(address);
24062410
LayoutStringReader reader{metadata->getLayoutString(),
@@ -2458,10 +2462,10 @@ extern "C" void swift_singlePayloadEnumGeneric_destructiveInjectEnumTag(
24582462
xihandler);
24592463
}
24602464

2461-
extern "C" swift::OpaqueValue *
2462-
swift_generic_initializeBufferWithCopyOfBuffer(swift::ValueBuffer *dest,
2463-
swift::ValueBuffer *src,
2464-
const Metadata *metadata) {
2465+
static swift::OpaqueValue *
2466+
swift_generic_initializeBufferWithCopyOfBufferImpl(swift::ValueBuffer *dest,
2467+
swift::ValueBuffer *src,
2468+
const Metadata *metadata) {
24652469
if (metadata->getValueWitnesses()->isValueInline()) {
24662470
return swift_generic_initWithCopy((swift::OpaqueValue *)dest,
24672471
(swift::OpaqueValue *)src, metadata);
@@ -2591,3 +2595,6 @@ void swift_generic_instantiateLayoutString(const uint8_t* layoutStr,
25912595
Metadata* type) {
25922596
type->setLayoutString(layoutStr);
25932597
}
2598+
2599+
#define OVERRIDE_CVW COMPATIBILITY_OVERRIDE
2600+
#include "../CompatibilityOverride/CompatibilityOverrideIncludePath.h"

stdlib/public/runtime/Enum.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
#include <cstring>
2525
#include <algorithm>
2626

27+
#include "../CompatibilityOverride/CompatibilityOverride.h"
28+
2729
using namespace swift;
2830

2931
// So remote inspection/debugging tools can obtain
@@ -65,7 +67,7 @@ swift::swift_initEnumMetadataSingleCase(EnumMetadata *self,
6567
vwtable->publishLayout(layout);
6668
}
6769

68-
void swift::swift_initEnumMetadataSingleCaseWithLayoutString(
70+
static void swift_initEnumMetadataSingleCaseWithLayoutStringImpl(
6971
EnumMetadata *self, EnumLayoutFlags layoutFlags,
7072
const Metadata *payloadType) {
7173
assert(self->hasLayoutString());
@@ -218,7 +220,7 @@ XIElement findXIElement(const Metadata *type) {
218220
}
219221
} // namespace
220222

221-
void swift::swift_initEnumMetadataSinglePayloadWithLayoutString(
223+
static void swift_initEnumMetadataSinglePayloadWithLayoutStringImpl(
222224
EnumMetadata *self, EnumLayoutFlags layoutFlags,
223225
const Metadata *payloadType, unsigned emptyCases) {
224226
assert(self->hasLayoutString());
@@ -437,11 +439,9 @@ swift::swift_initEnumMetadataMultiPayload(EnumMetadata *enumType,
437439
vwtable->publishLayout(layout);
438440
}
439441

440-
void swift::swift_initEnumMetadataMultiPayloadWithLayoutString(
441-
EnumMetadata *enumType,
442-
EnumLayoutFlags layoutFlags,
443-
unsigned numPayloads,
444-
const Metadata * const *payloadLayouts) {
442+
static void swift_initEnumMetadataMultiPayloadWithLayoutStringImpl(
443+
EnumMetadata *enumType, EnumLayoutFlags layoutFlags, unsigned numPayloads,
444+
const Metadata *const *payloadLayouts) {
445445
assert(enumType->hasLayoutString());
446446

447447
// Accumulate the layout requirements of the payloads.
@@ -719,3 +719,6 @@ swift::swift_getEnumCaseMultiPayload(const OpaqueValue *value,
719719
}
720720
}
721721
}
722+
723+
#define OVERRIDE_CVW_METADATA_ENUM COMPATIBILITY_OVERRIDE
724+
#include "../CompatibilityOverride/CompatibilityOverrideIncludePath.h"

0 commit comments

Comments
 (0)