The Swift Runtime

This document describes the ABI interface to the Swift runtime, which provides the following core functionality for Swift programs:

  • memory management, including allocation and reference counting;
  • the runtime type system, including dynamic casting, generic instantiation, and protocol conformance registration;

It is intended to describe only the runtime interface that compiler-generated code should conform to, not details of how things are implemented.

The final runtime interface is currently a work-in-progress; it is a goal of Swift 3 to stabilize it. This document attempts to describe both the current state of the runtime and the intended endpoint of the stable interface. Changes that are intended to be made before stabilization are marked with ABI TODO. Entry points that only exist on Darwin platforms with ObjC interop, and information that only pertains to ObjC interop, are marked ObjC-only.

Deprecated entry points

Entry points in this section are intended to be removed or internalized before ABI stabilization.

Exported C++ symbols

ABI TODO: Any exported C++ symbols are implementation details that are not intended to be part of the stable runtime interface.

swift_ClassMirror_count

swift_ClassMirror_quickLookObject

swift_ClassMirror_subscript

swift_EnumMirror_caseName

swift_EnumMirror_count

swift_EnumMirror_subscript

swift_MagicMirrorData_objcValue

swift_MagicMirrorData_objcValueType

swift_MagicMirrorData_summary

swift_MagicMirrorData_value

swift_MagicMirrorData_valueType

swift_ObjCMirror_count

swift_ObjCMirror_subscript

swift_StructMirror_count

swift_StructMirror_subscript

swift_TupleMirror_count

swift_TupleMirror_subscript

swift_reflectAny

ABI TODO: These functions are implementation details of the standard library reflect interface. They will be superseded by a low-level runtime reflection API.

swift_stdlib_demangleName

@convention(thin) (string: UnsafePointer<UInt8>,
                   length: UInt,
                   @out String) -> ()

Given a pointer to a Swift mangled symbol name as a byte string of length characters, returns the demangled name as a Swift.String.

ABI TODO: Decouple from the standard library Swift.String implementation. Rename with a non-stdlib naming scheme.

Memory allocation

TODO

000000000001cb30 T _swift_allocBox
000000000001cb30 T _swift_allocEmptyBox
000000000001c990 T _swift_allocObject
000000000001ca60 T _swift_bufferAllocate
000000000001ca90 T _swift_bufferHeaderSize
000000000001cd30 T _swift_deallocBox
000000000001d490 T _swift_deallocClassInstance
000000000001cd60 T _swift_deallocObject
000000000001cd60 T _swift_deallocUninitializedObject
000000000001d4c0 T _swift_deallocPartialClassInstance
000000000001d400 T _swift_rootObjCDealloc
000000000001c960 T _swift_slowAlloc
000000000001c980 T _swift_slowDealloc
000000000001ce10 T _swift_projectBox
000000000001ca00 T _swift_initStackObject

Reference counting

swift_retainCount

@convention(c) (@unowned NativeObject) -> UInt

Returns a random number. Only used by allocation profiling tools.

TODO

0000000000027ba0 T _swift_bridgeObjectRelease
0000000000027c50 T _swift_bridgeObjectRelease_n
0000000000027b50 T _swift_bridgeObjectRetain
0000000000027be0 T _swift_bridgeObjectRetain_n
000000000001ce70 T _swift_release
000000000001cee0 T _swift_release_n
000000000001ce30 T _swift_retain
000000000001ce50 T _swift_retain_n
000000000001d240 T _swift_tryRetain
0000000000027b10 T _swift_unknownObjectRelease
0000000000027a70 T _swift_unknownObjectRelease_n
0000000000027ad0 T _swift_unknownObjectRetain
0000000000027a10 T _swift_unknownObjectRetain_n
0000000000027d50 T _swift_unknownObjectUnownedAssign
00000000000280a0 T _swift_unknownObjectUnownedCopyAssign
0000000000027fd0 T _swift_unknownObjectUnownedCopyInit
0000000000027ed0 T _swift_unknownObjectUnownedDestroy
0000000000027cb0 T _swift_unknownObjectUnownedInit
0000000000027f20 T _swift_unknownObjectUnownedLoadStrong
00000000000281f0 T _swift_unknownObjectUnownedTakeAssign
0000000000028070 T _swift_unknownObjectUnownedTakeInit
0000000000027f70 T _swift_unknownObjectUnownedTakeStrong
00000000000282b0 T _swift_unknownObjectWeakAssign
0000000000028560 T _swift_unknownObjectWeakCopyAssign
00000000000284e0 T _swift_unknownObjectWeakCopyInit
00000000000283e0 T _swift_unknownObjectWeakDestroy
0000000000028270 T _swift_unknownObjectWeakInit
0000000000028420 T _swift_unknownObjectWeakLoadStrong
0000000000028610 T _swift_unknownObjectWeakTakeAssign
0000000000028520 T _swift_unknownObjectWeakTakeInit
0000000000028470 T _swift_unknownObjectWeakTakeStrong
000000000001d3c0 T _swift_unownedCheck
000000000001cfb0 T _swift_unownedRelease
000000000001d0a0 T _swift_unownedRelease_n
000000000001cf70 T _swift_unownedRetain
000000000001cf60 T _swift_unownedRetainCount
000000000001d2b0 T _swift_unownedRetainStrong
000000000001d310 T _swift_unownedRetainStrongAndRelease
000000000001d060 T _swift_unownedRetain_n
000000000001ca20 T _swift_verifyEndOfLifetime
000000000001d680 T _swift_weakAssign
000000000001d830 T _swift_weakCopyAssign
000000000001d790 T _swift_weakCopyInit
000000000001d770 T _swift_weakDestroy
000000000001d640 T _swift_weakInit
000000000001d6d0 T _swift_weakLoadStrong
000000000001d8b0 T _swift_weakTakeAssign
000000000001d800 T _swift_weakTakeInit
000000000001d710 T _swift_weakTakeStrong
000000000002afe0 T _swift_isUniquelyReferencedNonObjC
000000000002af50 T _swift_isUniquelyReferencedNonObjC_nonNull
000000000002b060 T _swift_isUniquelyReferencedNonObjC_nonNull_bridgeObject
000000000002af00 T _swift_isUniquelyReferenced_native
000000000002aea0 T _swift_isUniquelyReferenced_nonNull_native
00000000000????? T _swift_setDeallocating
000000000001d280 T _swift_isDeallocating

ABI TODO: _unsynchronized r/r entry points

Error objects

The ErrorType existential type uses a special single-word, reference- counted representation.

ObjC-only: The representation is internal to the runtime in order to provide efficient bridging with the platform NSError and CFError implementations. On non-ObjC platforms this bridging is unnecessary, and the error object interface could be made more fragile.

To preserve the encapsulation of the ErrorType representation, and allow for future representation optimizations, the runtime provides special entry points for allocating, projecting, and reference counting error values.

00000000000268e0 T _swift_allocError
0000000000026d50 T _swift_bridgeErrorTypeToNSError
0000000000026900 T _swift_deallocError
0000000000027120 T _swift_errorRelease
0000000000027100 T _swift_errorRetain
0000000000026b80 T _swift_getErrorValue

ABI TODO: _unsynchronized r/r entry points

ABI TODO: _n r/r entry points

Initialization

swift_once

@convention(thin) (Builtin.RawPointer, @convention(thin) () -> ()) -> ()

Used to lazily initialize global variables. The first parameter must point to a word-sized memory location that was initialized to zero at process start. It is undefined behavior to reference memory that has been initialized to something other than zero or written to by anything other than swift_once in the current process's lifetime. The function referenced by the second parameter will have been run exactly once in the time between process start and the function returns.

Dynamic casting

0000000000001470 T _swift_dynamicCast
0000000000000a60 T _swift_dynamicCastClass
0000000000000ae0 T _swift_dynamicCastClassUnconditional
0000000000028750 T _swift_dynamicCastForeignClass
000000000002ae20 T _swift_dynamicCastForeignClassMetatype
000000000002ae30 T _swift_dynamicCastForeignClassMetatypeUnconditional
0000000000028760 T _swift_dynamicCastForeignClassUnconditional
00000000000011c0 T _swift_dynamicCastMetatype
0000000000000cf0 T _swift_dynamicCastMetatypeToObjectConditional
0000000000000d20 T _swift_dynamicCastMetatypeToObjectUnconditional
00000000000012e0 T _swift_dynamicCastMetatypeUnconditional
00000000000286c0 T _swift_dynamicCastObjCClass
0000000000028bd0 T _swift_dynamicCastObjCClassMetatype
0000000000028c00 T _swift_dynamicCastObjCClassMetatypeUnconditional
0000000000028700 T _swift_dynamicCastObjCClassUnconditional
0000000000028af0 T _swift_dynamicCastObjCProtocolConditional
0000000000028a50 T _swift_dynamicCastObjCProtocolUnconditional
0000000000028960 T _swift_dynamicCastTypeToObjCProtocolConditional
00000000000287d0 T _swift_dynamicCastTypeToObjCProtocolUnconditional
0000000000000de0 T _swift_dynamicCastUnknownClass
0000000000000fd0 T _swift_dynamicCastUnknownClassUnconditional

Debugging

0000000000027140 T _swift_willThrow

Objective-C Bridging

ObjC-only.

ABI TODO: Decouple from the runtime as much as possible. Much of this should be implementable in the standard library now.

0000000000003c80 T _swift_bridgeNonVerbatimFromObjectiveCConditional
00000000000037e0 T _swift_bridgeNonVerbatimToObjectiveC
00000000000039c0 T _swift_getBridgedNonVerbatimObjectiveCType
0000000000003d90 T _swift_isBridgedNonVerbatimToObjectiveC

Code generation

Certain common code paths are implemented in the runtime as a code size optimization.

0000000000023a40 T _swift_assignExistentialWithCopy
000000000001dbf0 T _swift_copyPOD
000000000001c560 T _swift_getEnumCaseMultiPayload
000000000001c400 T _swift_storeEnumTagMultiPayload

Type metadata lookup

These functions look up metadata for types that potentially require runtime instantiation or initialization, including structural types, generics, classes, and metadata for imported C and Objective-C types.

ABI TODO: Instantiation APIs under flux as part of resilience work. For nominal types, getGenericMetadata is likely to become an implementation detail used to implement resilient per-type metadata accessor functions.

0000000000023230 T _swift_getExistentialMetatypeMetadata
0000000000023630 T _swift_getExistentialTypeMetadata
0000000000023b90 T _swift_getForeignTypeMetadata
000000000001ef30 T _swift_getFunctionTypeMetadata
000000000001eed0 T _swift_getFunctionTypeMetadata1
000000000001f1f0 T _swift_getFunctionTypeMetadata2
000000000001f250 T _swift_getFunctionTypeMetadata3
000000000001e940 T _swift_getGenericMetadata
0000000000022fd0 T _swift_getMetatypeMetadata
000000000001ec50 T _swift_getObjCClassMetadata
000000000001e6b0 T _swift_getResilientMetadata
0000000000022260 T _swift_getTupleTypeMetadata
00000000000225a0 T _swift_getTupleTypeMetadata2
00000000000225d0 T _swift_getTupleTypeMetadata3
0000000000028bc0 T _swift_getInitializedObjCClass

ABI TODO: Fast entry points for getExistential*TypeMetadata1-3. Static metadata for Any and AnyObject is probably worth considering too.

Type metadata initialization

Calls to these entry points are emitted when instantiating type metadata at runtime.

ABI TODO: Initialization APIs under flux as part of resilience work.

000000000001e3e0 T _swift_allocateGenericClassMetadata
000000000001e620 T _swift_allocateGenericValueMetadata
0000000000022be0 T _swift_initClassMetadata_UniversalStrategy
000000000001c100 T _swift_initEnumMetadataMultiPayload
000000000001bd60 T _swift_initEnumMetadataSingleCase
000000000001bd60 T _swift_initEnumMetadataSinglePayload
0000000000022a20 T _swift_initStructMetadata
0000000000024230 T _swift_initializeSuperclass
0000000000028b60 T _swift_instantiateObjCClass

Metatypes

0000000000000b60 T _swift_getDynamicType
0000000000022fb0 T _swift_getObjectType
00000000000006f0 T _swift_getTypeName
00000000000040c0 T _swift_isClassType
0000000000003f50 T _swift_isClassOrObjCExistentialType
0000000000004130 T _swift_isOptionalType
00000000000279f0 T _swift_objc_class_usesNativeSwiftReferenceCounting
000000000002b340 T _swift_objc_class_unknownGetInstanceExtents
000000000002b350 T _swift_class_getInstanceExtents
0000000000004080 T _swift_class_getSuperclass

ABI TODO: getTypeByName entry point.

ABI TODO: Should have a getTypeKind entry point with well-defined enum constants to supersede swift_is*Type.

ABI TODO: Rename class metadata queries with a consistent naming scheme.

Protocol conformance lookup

0000000000002ef0 T _swift_registerProtocolConformances
0000000000003060 T _swift_conformsToProtocol

Error reporting

000000000001c7d0 T _swift_reportError
000000000001c940 T _swift_deletedMethodError

Standard metadata

The Swift runtime exports standard metadata objects for Builtin types as well as standard value witness tables that can be freely adopted by types with common layout attributes. Note that, unlike public-facing types, the runtime does not guarantee a 1:1 mapping of Builtin types to metadata objects, and will reuse metadata objects to represent builtins with the same layout characteristics.

000000000004faa8 S __TMBB
000000000004fab8 S __TMBO
000000000004f9f8 S __TMBb
000000000004f9c8 S __TMBi128_
000000000004f998 S __TMBi16_
000000000004f9d8 S __TMBi256_
000000000004f9a8 S __TMBi32_
000000000004f9b8 S __TMBi64_
000000000004f988 S __TMBi8_
000000000004f9e8 S __TMBo
000000000004fac8 S __TMT_
000000000004f568 S __TWVBO
000000000004f4b0 S __TWVBb
000000000004f0a8 S __TWVBi128_
000000000004eec8 S __TWVBi16_
000000000004f148 S __TWVBi256_
000000000004ef68 S __TWVBi32_
000000000004f008 S __TWVBi64_
000000000004ee28 S __TWVBi8_
000000000004f1e8 S __TWVBo
000000000004f778 S __TWVFT_T_
000000000004f3f8 S __TWVMBo
000000000004f8e8 S __TWVT_
000000000004f830 S __TWVXfT_T_
000000000004f620 S __TWVXoBO
000000000004f2a0 S __TWVXoBo
000000000004f6d8 S __TWVXwGSqBO_
000000000004f358 S __TWVXwGSqBo_

Tasks

  • Moving to per-type instantiation functions instead of using getGenericMetadata directly

  • swift_objc_ naming convention for ObjC

  • Alternative ABIs for retain/release

  • Unsynchronized retain/release

  • Nonnull retain/release

  • Decouple dynamic casting, bridging, and reflection from the standard library