Slide 32
Slide 32 text
KeyPath Pattern in LLVM IR (Gettable Subscript)
\Foo.[0xdeadbeef]
@keypath = private global <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }> <{
; oncePtr (0 if not cacheable, otherwise a relative pointer to the cache space)
i32 0,
; --- KeyPathComponentHeader ---
; genericEnvironment
i32 0,
; rootMetadataRef
i32 cast_relptr (i64 symbolic_ref @$s4main3FooVMn), ; nominal type descriptor for main.Foo
; leafMetadataRef
i32 cast_relptr (i64 symbolic_ref @$sSi), ; mangled name for Swift.Int ("Si\0")
; kvcString
i32 0,
; KeyPathBuffer.Header
i32 0b00000000000000000000000000011000, ; (size: 24, hasReferencePrefix: false, trivial: false)
; --- RawKeyPathComponent ---
; RawKeyPathComponent.Header
i32 0b00000010000010000000000000000000, ; (hasComputedArguments: true, discriminator: computedTag(2))
; RawKeyPathComponent.idValue
i32 cast_relptr (i64 (i64)* @"$s4main3FooVyS2icig" to i64), ; main.Foo.subscript.getter : (Swift.Int) -> Swift.Int
; RawKeyPathComponent.getter
i32 cast_relptr (i64 (i64)* @"$s4main3FooVyS2icipACTK" to i64), ; key path getter for main.Foo.subscript(Swift.Int) -> Swift.Int : main.Foo
; --- KeyPathPatternComputedArguments ---
; KeyPathPatternComputedArguments.getLayout
i32 cast_relptr ({ i64, i64 } (i8*)* @keypath_get_arg_layout to i64),
; KeyPathPatternComputedArguments.witnesses
i32 cast_relptr ({ i8*, void (i8*, i8*, i64)*, i1 (i8*, i8*)*, i64 (i8*)* }* @keypath_witnesses to i64),
; KeyPathPatternComputedArguments.initializer
i32 cast_relptr (void (i8*, i8*)* @keypath_arg_init to i64),
}>, section ".rodata", align 8
32