From 923cccf1ea51c7c2b1d7fdf6a5b7875a83df787b Mon Sep 17 00:00:00 2001 From: Dario Rexin Date: Wed, 29 Jan 2025 15:59:38 -0800 Subject: [PATCH] [Runtime] Add specialized CVW entry points for multi payload enums rdar://143852239 Adding these specialized entry points reduces the overhead of the witness functions by removing the first indirection. --- include/swift/Runtime/RuntimeFunctions.def | 62 +++++++++ lib/IRGen/GenValueWitness.cpp | 91 +++++++++----- .../CompatibilityOverrideRuntime.def | 36 ++++++ stdlib/public/runtime/BytecodeLayouts.cpp | 119 +++++++++++++++++- stdlib/public/runtime/BytecodeLayouts.h | 31 +++++ .../layout_string_witnesses_types.swift | 2 +- test/abi/macOS/arm64/stdlib.swift | 6 + test/abi/macOS/x86_64/stdlib.swift | 6 + 8 files changed, 318 insertions(+), 35 deletions(-) diff --git a/include/swift/Runtime/RuntimeFunctions.def b/include/swift/Runtime/RuntimeFunctions.def index c6d5d17d2f6..1a71d7c3e64 100644 --- a/include/swift/Runtime/RuntimeFunctions.def +++ b/include/swift/Runtime/RuntimeFunctions.def @@ -2747,6 +2747,68 @@ FUNCTION(GenericInitializeBufferWithCopyOfBuffer, EFFECT(RefCounting), UNKNOWN_MEMEFFECTS) +// void swift_cvw_destroyMultiPayloadEnumFN(opaque*, const Metadata* type); +FUNCTION(GenericDestroyMultiPayloadEnumFN, + Swift, swift_cvw_destroyMultiPayloadEnumFN, + C_CC, AlwaysAvailable, + RETURNS(VoidTy), + ARGS(Int8PtrTy, TypeMetadataPtrTy), + ATTRS(NoUnwind), + EFFECT(Deallocating), + UNKNOWN_MEMEFFECTS) + +// void *swift_cvw_assignWithCopyMultiPayloadEnumFN(opaque* dest, opaque* src, const Metadata* type); +FUNCTION(GenericAssignWithCopyMultiPayloadEnumFN, + Swift, swift_cvw_assignWithCopyMultiPayloadEnumFN, + C_CC, AlwaysAvailable, + RETURNS(Int8PtrTy), + ARGS(Int8PtrTy, Int8PtrTy, TypeMetadataPtrTy), + ATTRS(NoUnwind), + EFFECT(RefCounting, Deallocating), + UNKNOWN_MEMEFFECTS) + +// void *swift_cvw_assignWithTakeMultiPayloadEnumFN(opaque* dest, opaque* src, const Metadata* type); +FUNCTION(GenericAssignWithTakeMultiPayloadEnumFN, + Swift, swift_cvw_assignWithTakeMultiPayloadEnumFN, + C_CC, AlwaysAvailable, + RETURNS(Int8PtrTy), + ARGS(Int8PtrTy, Int8PtrTy, TypeMetadataPtrTy), + ATTRS(NoUnwind), + EFFECT(RefCounting, Deallocating), + UNKNOWN_MEMEFFECTS) + +// void *swift_cvw_initWithCopyMultiPayloadEnumFN(opaque* dest, opaque* src, const Metadata* type); +FUNCTION(GenericInitWithCopyMultiPayloadEnumFN, + Swift, swift_cvw_initWithCopyMultiPayloadEnumFN, + C_CC, AlwaysAvailable, + RETURNS(Int8PtrTy), + ARGS(Int8PtrTy, Int8PtrTy, TypeMetadataPtrTy), + ATTRS(NoUnwind), + EFFECT(RefCounting), + UNKNOWN_MEMEFFECTS) + +// void *swift_cvw_initWithTakeMultiPayloadEnumFN(opaque* dest, opaque* src, const Metadata* type); +FUNCTION(GenericInitWithTakeMultiPayloadEnumFN, + Swift, swift_cvw_initWithTakeMultiPayloadEnumFN, + C_CC, AlwaysAvailable, + RETURNS(Int8PtrTy), + ARGS(Int8PtrTy, Int8PtrTy, TypeMetadataPtrTy), + ATTRS(NoUnwind), + EFFECT(RefCounting), + UNKNOWN_MEMEFFECTS) + +// void *swift_cvw_initializeBufferWithCopyOfBufferMultiPayloadEnumFN(ValueBuffer* dest, ValueBuffer* src, const Metadata* type); +FUNCTION(GenericInitializeBufferWithCopyOfBufferMultiPayloadEnumFN, + Swift, swift_cvw_initializeBufferWithCopyOfBufferMultiPayloadEnumFN, + C_CC, AlwaysAvailable, + RETURNS(Int8PtrTy), + ARGS(getFixedBufferTy()->getPointerTo(), + getFixedBufferTy()->getPointerTo(), + TypeMetadataPtrTy), + ATTRS(NoUnwind), + EFFECT(RefCounting), + UNKNOWN_MEMEFFECTS) + // unsigned swift_cvw_singletonEnum_getEnumTag(swift::OpaqueValue *address, // const Metadata *metadata); FUNCTION(SingletonEnumGetEnumTag, diff --git a/lib/IRGen/GenValueWitness.cpp b/lib/IRGen/GenValueWitness.cpp index 78616d16895..ecd9a77f9de 100644 --- a/lib/IRGen/GenValueWitness.cpp +++ b/lib/IRGen/GenValueWitness.cpp @@ -933,6 +933,21 @@ static bool isRuntimeInstatiatedLayoutString(IRGenModule &IGM, return false; } +static bool +useMultiPayloadEnumFNSpecialization(IRGenModule &IGM, + const TypeLayoutEntry *typeLayoutEntry, + GenericSignature genericSig) { + // if (!typeLayoutEntry->layoutString(IGM, genericSig)) { + // return false; + // } + // auto *enumTLE = typeLayoutEntry->getAsEnum(); + // return enumTLE && enumTLE->isFixedSize(IGM) && + // enumTLE->isMultiPayloadEnum(); + + // Disabled for now + return false; +} + static llvm::Constant *getEnumTagFunction(IRGenModule &IGM, const EnumTypeLayoutEntry *typeLayoutEntry, GenericSignature genericSig) { @@ -953,19 +968,7 @@ static llvm::Constant *getEnumTagFunction(IRGenModule &IGM, } else if (typeLayoutEntry->isMultiPayloadEnum()) { return IGM.getEnumFnGetEnumTagFn(); } else { - auto &payloadTI = **(typeLayoutEntry->cases[0]->getFixedTypeInfo()); - auto mask = payloadTI.getFixedExtraInhabitantMask(IGM); - auto tzCount = mask.countTrailingZeros(); - auto shiftedMask = mask.lshr(tzCount); - // auto toCount = shiftedMask.countTrailingOnes(); - // if (payloadTI.mayHaveExtraInhabitants(IGM) && - // (mask.popcount() > 64 || - // toCount != mask.popcount() || - // (tzCount % toCount != 0))) { - return IGM.getEnumFnGetEnumTagFn(); - // } else { - // return IGM.getEnumSimpleGetEnumTagFn(); - // } + return IGM.getEnumFnGetEnumTagFn(); } } @@ -990,18 +993,7 @@ getDestructiveInjectEnumTagFunction(IRGenModule &IGM, } else if (typeLayoutEntry->isMultiPayloadEnum()) { return nullptr; } else { - auto &payloadTI = **(typeLayoutEntry->cases[0]->getFixedTypeInfo()); - auto mask = payloadTI.getFixedExtraInhabitantMask(IGM); - auto tzCount = mask.countTrailingZeros(); - auto shiftedMask = mask.lshr(tzCount); - // auto toCount = shiftedMask.countTrailingOnes(); - // if (payloadTI.mayHaveExtraInhabitants(IGM) && - // (mask.popcount() > 64 || toCount != mask.popcount() || - // (tzCount % toCount != 0))) { - return nullptr; - // } else { - // return IGM.getEnumSimpleDestructiveInjectEnumTagFn(); - // } + return nullptr; } } @@ -1072,7 +1064,12 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B, ->getGenericSignature(); if (typeLayoutEntry->layoutString(IGM, genericSig) || isRuntimeInstatiatedLayoutString(IGM, typeLayoutEntry)) { - return addFunction(IGM.getGenericDestroyFn()); + if (useMultiPayloadEnumFNSpecialization(IGM, typeLayoutEntry, + genericSig)) { + return addFunction(IGM.getGenericDestroyMultiPayloadEnumFNFn()); + } else { + return addFunction(IGM.getGenericDestroyFn()); + } } } } @@ -1101,8 +1098,14 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B, ->getGenericSignature(); if (typeLayoutEntry->layoutString(IGM, genericSig) || isRuntimeInstatiatedLayoutString(IGM, typeLayoutEntry)) { - return addFunction( - IGM.getGenericInitializeBufferWithCopyOfBufferFn()); + if (useMultiPayloadEnumFNSpecialization(IGM, typeLayoutEntry, + genericSig)) { + return addFunction( + IGM.getGenericInitializeBufferWithCopyOfBufferMultiPayloadEnumFNFn()); + } else { + return addFunction( + IGM.getGenericInitializeBufferWithCopyOfBufferFn()); + } } } } @@ -1121,7 +1124,13 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B, ->getGenericSignature(); if (typeLayoutEntry->layoutString(IGM, genericSig) || isRuntimeInstatiatedLayoutString(IGM, typeLayoutEntry)) { - return addFunction(IGM.getGenericInitWithTakeFn()); + if (useMultiPayloadEnumFNSpecialization(IGM, typeLayoutEntry, + genericSig)) { + return addFunction( + IGM.getGenericInitWithTakeMultiPayloadEnumFNFn()); + } else { + return addFunction(IGM.getGenericInitWithTakeFn()); + } } } } @@ -1142,7 +1151,13 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B, ->getGenericSignature(); if (typeLayoutEntry->layoutString(IGM, genericSig) || isRuntimeInstatiatedLayoutString(IGM, typeLayoutEntry)) { - return addFunction(IGM.getGenericAssignWithCopyFn()); + if (useMultiPayloadEnumFNSpecialization(IGM, typeLayoutEntry, + genericSig)) { + return addFunction( + IGM.getGenericAssignWithCopyMultiPayloadEnumFNFn()); + } else { + return addFunction(IGM.getGenericAssignWithCopyFn()); + } } } } @@ -1163,7 +1178,13 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B, ->getGenericSignature(); if (typeLayoutEntry->layoutString(IGM, genericSig) || isRuntimeInstatiatedLayoutString(IGM, typeLayoutEntry)) { - return addFunction(IGM.getGenericAssignWithTakeFn()); + if (useMultiPayloadEnumFNSpecialization(IGM, typeLayoutEntry, + genericSig)) { + return addFunction( + IGM.getGenericAssignWithTakeMultiPayloadEnumFNFn()); + } else { + return addFunction(IGM.getGenericAssignWithTakeFn()); + } } } } @@ -1184,7 +1205,13 @@ static void addValueWitness(IRGenModule &IGM, ConstantStructBuilder &B, ->getGenericSignature(); if (typeLayoutEntry->layoutString(IGM, genericSig) || isRuntimeInstatiatedLayoutString(IGM, typeLayoutEntry)) { - return addFunction(IGM.getGenericInitWithCopyFn()); + if (useMultiPayloadEnumFNSpecialization(IGM, typeLayoutEntry, + genericSig)) { + return addFunction( + IGM.getGenericInitWithCopyMultiPayloadEnumFNFn()); + } else { + return addFunction(IGM.getGenericInitWithCopyFn()); + } } } } diff --git a/stdlib/public/CompatibilityOverride/CompatibilityOverrideRuntime.def b/stdlib/public/CompatibilityOverride/CompatibilityOverrideRuntime.def index 1ba6aeda98d..d197674f75d 100644 --- a/stdlib/public/CompatibilityOverride/CompatibilityOverrideRuntime.def +++ b/stdlib/public/CompatibilityOverride/CompatibilityOverrideRuntime.def @@ -310,6 +310,42 @@ OVERRIDE_CVW(cvw_initializeBufferWithCopyOfBuffer, swift::OpaqueValue *, const Metadata *metadata), (dest, src, metadata)) +OVERRIDE_CVW(cvw_destroyMultiPayloadEnumFN, void, SWIFT_RUNTIME_EXPORT, + , swift::, (swift::OpaqueValue *address, + const Metadata *metadata), + (address, metadata)) + +OVERRIDE_CVW(cvw_assignWithCopyMultiPayloadEnumFN, swift::OpaqueValue *, SWIFT_RUNTIME_EXPORT, + , swift::, (swift::OpaqueValue *dest, + swift::OpaqueValue *src, + const Metadata *metadata), + (dest, src, metadata)) + +OVERRIDE_CVW(cvw_assignWithTakeMultiPayloadEnumFN, swift::OpaqueValue *, SWIFT_RUNTIME_EXPORT, + , swift::, (swift::OpaqueValue *dest, + swift::OpaqueValue *src, + const Metadata *metadata), + (dest, src, metadata)) + +OVERRIDE_CVW(cvw_initWithCopyMultiPayloadEnumFN, swift::OpaqueValue *, SWIFT_RUNTIME_EXPORT, + , swift::, (swift::OpaqueValue *dest, + swift::OpaqueValue *src, + const Metadata *metadata), + (dest, src, metadata)) + +OVERRIDE_CVW(cvw_initWithTakeMultiPayloadEnumFN, swift::OpaqueValue *, SWIFT_RUNTIME_EXPORT, + , swift::, (swift::OpaqueValue *dest, + swift::OpaqueValue *src, + const Metadata *metadata), + (dest, src, metadata)) + +OVERRIDE_CVW(cvw_initializeBufferWithCopyOfBufferMultiPayloadEnumFN, swift::OpaqueValue *, + SWIFT_RUNTIME_EXPORT, + , swift::, (swift::ValueBuffer *dest, + swift::ValueBuffer *src, + const Metadata *metadata), + (dest, src, metadata)) + OVERRIDE_CVW(cvw_enumSimple_getEnumTag, unsigned, SWIFT_RUNTIME_EXPORT, , swift::, (swift::OpaqueValue *address, const Metadata *metadata), diff --git a/stdlib/public/runtime/BytecodeLayouts.cpp b/stdlib/public/runtime/BytecodeLayouts.cpp index 5a11d323427..6e56657eb20 100644 --- a/stdlib/public/runtime/BytecodeLayouts.cpp +++ b/stdlib/public/runtime/BytecodeLayouts.cpp @@ -1147,7 +1147,7 @@ static void handleRefCountsInitWithCopy(const Metadata *metadata, uintptr_t _addrOffset = addrOffset; auto tag = reader.readBytes(); auto offset = (tag & ~(0xFFULL << 56)); - if (SWIFT_UNLIKELY(offset)) { + if (offset) { memcpy(dest + _addrOffset, src + _addrOffset, offset); } addrOffset = _addrOffset + offset; @@ -1305,7 +1305,7 @@ static void handleRefCountsInitWithTake(const Metadata *metadata, uintptr_t _addrOffset = addrOffset; auto tag = reader.readBytes(); auto offset = (tag & ~(0xFFULL << 56)); - if (SWIFT_UNLIKELY(offset)) { + if (offset) { memcpy(dest + _addrOffset, src + _addrOffset, offset); } addrOffset += offset; @@ -2589,6 +2589,121 @@ void swift::swift_cvw_resolve_resilientAccessors(uint8_t *layoutStr, } } +static void swift_cvw_destroyMultiPayloadEnumFNImpl(swift::OpaqueValue *address, + const Metadata *metadata) { + const uint8_t *layoutStr = metadata->getLayoutString(); + LayoutStringReader1 reader{layoutStr + layoutStringHeaderSize}; + uintptr_t addrOffset = 0; + uint8_t *addr = (uint8_t *)address; + +#ifndef NDEBUG + assert(reader.readBytes() == + ((uint64_t)RefCountingKind::MultiPayloadEnumFN) << 56 && + "Invalid tag, expected MultiPayloadEnumFN"); +#else + reader.skip(sizeof(uint64_t)); +#endif + + multiPayloadEnumFN(metadata, reader, addrOffset, + addr); +} + +static swift::OpaqueValue * +swift_cvw_assignWithCopyMultiPayloadEnumFNImpl(swift::OpaqueValue *_dest, + swift::OpaqueValue *_src, + const Metadata *metadata) { + const uint8_t *layoutStr = metadata->getLayoutString(); + LayoutStringReader1 reader{layoutStr + layoutStringHeaderSize}; + uintptr_t addrOffset = 0; + uint8_t *dest = (uint8_t *)_dest; + uint8_t *src = (uint8_t *)_src; + +#ifndef NDEBUG + assert(reader.readBytes() == + ((uint64_t)RefCountingKind::MultiPayloadEnumFN) << 56 && + "Invalid tag, expected MultiPayloadEnumFN"); +#else + reader.skip(sizeof(uint64_t)); +#endif + + multiPayloadEnumFNAssignWithCopy(metadata, reader, addrOffset, dest, src); + return _dest; +} + +static swift::OpaqueValue * +swift_cvw_assignWithTakeMultiPayloadEnumFNImpl(swift::OpaqueValue *dest, + swift::OpaqueValue *src, + const Metadata *metadata) { + swift_cvw_destroyMultiPayloadEnumFN(dest, metadata); + return swift_cvw_initWithTake(dest, src, metadata); +} + +static swift::OpaqueValue * +swift_cvw_initWithCopyMultiPayloadEnumFNImpl(swift::OpaqueValue *_dest, + swift::OpaqueValue *_src, + const Metadata *metadata) { + const uint8_t *layoutStr = metadata->getLayoutString(); + LayoutStringReader1 reader{layoutStr + layoutStringHeaderSize}; + uintptr_t addrOffset = 0; + uint8_t *dest = (uint8_t *)_dest; + uint8_t *src = (uint8_t *)_src; + +#ifndef NDEBUG + assert(reader.readBytes() == + ((uint64_t)RefCountingKind::MultiPayloadEnumFN) << 56 && + "Invalid tag, expected MultiPayloadEnumFN"); +#else + reader.skip(sizeof(uint64_t)); +#endif + + multiPayloadEnumFN(metadata, reader, addrOffset, + dest, src); + return _dest; +} + +static swift::OpaqueValue * +swift_cvw_initWithTakeMultiPayloadEnumFNImpl(swift::OpaqueValue *_dest, + swift::OpaqueValue *_src, + const Metadata *metadata) { + if (SWIFT_LIKELY(metadata->getValueWitnesses()->isBitwiseTakable())) { + size_t size = metadata->vw_size(); + memcpy(_dest, _src, size); + return _dest; + } + + const uint8_t *layoutStr = metadata->getLayoutString(); + LayoutStringReader1 reader{layoutStr + layoutStringHeaderSize}; + uintptr_t addrOffset = 0; + uint8_t *dest = (uint8_t *)_dest; + uint8_t *src = (uint8_t *)_src; + +#ifndef NDEBUG + assert(reader.readBytes() == + ((uint64_t)RefCountingKind::MultiPayloadEnumFN) << 56 && + "Invalid tag, expected MultiPayloadEnumFN"); +#else + reader.skip(sizeof(uint64_t)); +#endif + + multiPayloadEnumFN(metadata, reader, addrOffset, + dest, src); + return _dest; +} + +static swift::OpaqueValue * +swift_cvw_initializeBufferWithCopyOfBufferMultiPayloadEnumFNImpl( + swift::ValueBuffer *dest, swift::ValueBuffer *src, + const Metadata *metadata) { + if (metadata->getValueWitnesses()->isValueInline()) { + return swift_cvw_initWithCopyMultiPayloadEnumFN( + (swift::OpaqueValue *)dest, (swift::OpaqueValue *)src, metadata); + } else { + memcpy(dest, src, sizeof(swift::HeapObject *)); + swift_retain(*(swift::HeapObject **)src); + return (swift::OpaqueValue *)&(*(swift::HeapObject **)dest)[1]; + } +} + extern "C" void swift_cvw_instantiateLayoutString(const uint8_t *layoutStr, Metadata *type) { type->setLayoutString(layoutStr); diff --git a/stdlib/public/runtime/BytecodeLayouts.h b/stdlib/public/runtime/BytecodeLayouts.h index 51dbb3ed220..f95fa5df426 100644 --- a/stdlib/public/runtime/BytecodeLayouts.h +++ b/stdlib/public/runtime/BytecodeLayouts.h @@ -195,6 +195,36 @@ swift::OpaqueValue * swift_cvw_initializeBufferWithCopyOfBuffer(swift::ValueBuffer *dest, swift::ValueBuffer *src, const Metadata *metadata); + +SWIFT_RUNTIME_EXPORT +void swift_cvw_destroyMultiPayloadEnumFN(swift::OpaqueValue *address, + const Metadata *metadata); +SWIFT_RUNTIME_EXPORT +swift::OpaqueValue * +swift_cvw_assignWithCopyMultiPayloadEnumFN(swift::OpaqueValue *dest, + swift::OpaqueValue *src, + const Metadata *metadata); +SWIFT_RUNTIME_EXPORT +swift::OpaqueValue * +swift_cvw_assignWithTakeMultiPayloadEnumFN(swift::OpaqueValue *dest, + swift::OpaqueValue *src, + const Metadata *metadata); +SWIFT_RUNTIME_EXPORT +swift::OpaqueValue * +swift_cvw_initWithCopyMultiPayloadEnumFN(swift::OpaqueValue *dest, + swift::OpaqueValue *src, + const Metadata *metadata); +SWIFT_RUNTIME_EXPORT +swift::OpaqueValue * +swift_cvw_initWithTakeMultiPayloadEnumFN(swift::OpaqueValue *dest, + swift::OpaqueValue *src, + const Metadata *metadata); +SWIFT_RUNTIME_EXPORT +swift::OpaqueValue * +swift_cvw_initializeBufferWithCopyOfBufferMultiPayloadEnumFN( + swift::ValueBuffer *dest, swift::ValueBuffer *src, + const Metadata *metadata); + SWIFT_RUNTIME_EXPORT unsigned swift_cvw_singletonEnum_getEnumTag(swift::OpaqueValue *address, const Metadata *metadata); @@ -271,6 +301,7 @@ swift::OpaqueValue * swift_generic_initializeBufferWithCopyOfBuffer(swift::ValueBuffer *dest, swift::ValueBuffer *src, const Metadata *metadata); + SWIFT_RUNTIME_EXPORT unsigned swift_singletonEnum_getEnumTag(swift::OpaqueValue *address, const Metadata *metadata); diff --git a/test/Interpreter/Inputs/layout_string_witnesses_types.swift b/test/Interpreter/Inputs/layout_string_witnesses_types.swift index f46b2bf04ca..65060bfb66c 100644 --- a/test/Interpreter/Inputs/layout_string_witnesses_types.swift +++ b/test/Interpreter/Inputs/layout_string_witnesses_types.swift @@ -717,7 +717,7 @@ public func testInitTake(_ ptr: UnsafeMutablePointer, to x: consuming T) { @inline(never) public func testDestroy(_ ptr: UnsafeMutablePointer) { - ptr.deinitialize(count: 1) + _ = ptr.move() } @inline(never) diff --git a/test/abi/macOS/arm64/stdlib.swift b/test/abi/macOS/arm64/stdlib.swift index db1fcb8d301..9f248d0b8f9 100644 --- a/test/abi/macOS/arm64/stdlib.swift +++ b/test/abi/macOS/arm64/stdlib.swift @@ -870,3 +870,9 @@ Added: _swift_cvw_singlePayloadEnumGeneric_destructiveInjectEnumTag Added: _swift_cvw_singlePayloadEnumGeneric_getEnumTag Added: _swift_cvw_singletonEnum_destructiveInjectEnumTag Added: _swift_cvw_singletonEnum_getEnumTag +Added: _swift_cvw_assignWithCopyMultiPayloadEnumFN +Added: _swift_cvw_assignWithTakeMultiPayloadEnumFN +Added: _swift_cvw_destroyMultiPayloadEnumFN +Added: _swift_cvw_initWithCopyMultiPayloadEnumFN +Added: _swift_cvw_initWithTakeMultiPayloadEnumFN +Added: _swift_cvw_initializeBufferWithCopyOfBufferMultiPayloadEnumFN diff --git a/test/abi/macOS/x86_64/stdlib.swift b/test/abi/macOS/x86_64/stdlib.swift index a078d4caa7b..193b54630ef 100644 --- a/test/abi/macOS/x86_64/stdlib.swift +++ b/test/abi/macOS/x86_64/stdlib.swift @@ -871,3 +871,9 @@ Added: _swift_cvw_singlePayloadEnumGeneric_destructiveInjectEnumTag Added: _swift_cvw_singlePayloadEnumGeneric_getEnumTag Added: _swift_cvw_singletonEnum_destructiveInjectEnumTag Added: _swift_cvw_singletonEnum_getEnumTag +Added: _swift_cvw_assignWithCopyMultiPayloadEnumFN +Added: _swift_cvw_assignWithTakeMultiPayloadEnumFN +Added: _swift_cvw_destroyMultiPayloadEnumFN +Added: _swift_cvw_initWithCopyMultiPayloadEnumFN +Added: _swift_cvw_initWithTakeMultiPayloadEnumFN +Added: _swift_cvw_initializeBufferWithCopyOfBufferMultiPayloadEnumFN