Skip to content

Instantly share code, notes, and snippets.

@koher
Last active August 3, 2018 11:25
Show Gist options
  • Save koher/2e253fb22e61d191366669ad01b87053 to your computer and use it in GitHub Desktop.
Save koher/2e253fb22e61d191366669ad01b87053 to your computer and use it in GitHub Desktop.
protocol Animal {
func foo() -> Int
}
struct Cat: Animal {
var value: Int = 42
func foo() -> Int { return value }
}
func useAnimal(_ animal: Animal) -> Int {
return animal.foo()
}
func useCat(_ cat: Cat) -> Int {
return useAnimal(cat)
}
print(useCat(Cat()))
; ModuleID = '-'
source_filename = "-"
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.13.0"
%swift.type = type { i64 }
%swift.protocol_conformance_descriptor = type { i32, i32, i32, i32 }
%swift.protocol_requirement = type { i32, i32, i32 }
%swift.protocol = type { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i32, i32, i32, i32, i32, i32 }
%swift.protocolref = type { i32 }
%swift.type_metadata_record = type { i32 }
%swift.bridge = type opaque
%Any = type { [24 x i8], %swift.type* }
%TSi = type <{ i64 }>
%T4main3CatV = type <{ %TSi }>
%T4main6AnimalP = type { [24 x i8], %swift.type*, i8** }
%swift.opaque = type opaque
%swift.refcounted = type { %swift.type*, i64 }
%swift.metadata_response = type { %swift.type*, i64 }
@"$SSiN" = external global %swift.type, align 8
@"$S4main3CatVAA6AnimalAAMc" = hidden constant %swift.protocol_conformance_descriptor { i32 trunc (i64 sub (i64 ptrtoint (%swift.protocol* @"$S4main6AnimalMp" to i64), i64 ptrtoint (%swift.protocol_conformance_descriptor* @"$S4main3CatVAA6AnimalAAMc" to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (<{ i32, i32, i32, i32, i32, i32 }>* @"$S4main3CatVMn" to i64), i64 ptrtoint (i32* getelementptr inbounds (%swift.protocol_conformance_descriptor, %swift.protocol_conformance_descriptor* @"$S4main3CatVAA6AnimalAAMc", i32 0, i32 1) to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([2 x i8*]* @"$S4main3CatVAA6AnimalAAWP" to i64), i64 ptrtoint (i32* getelementptr inbounds (%swift.protocol_conformance_descriptor, %swift.protocol_conformance_descriptor* @"$S4main3CatVAA6AnimalAAMc", i32 0, i32 2) to i64)) to i32), i32 0 }, align 8
@"$S4main3CatVAA6AnimalAAWP" = hidden constant [2 x i8*] [i8* bitcast (%swift.protocol_conformance_descriptor* @"$S4main3CatVAA6AnimalAAMc" to i8*), i8* bitcast (i64 (%T4main3CatV*, %swift.type*, i8**)* @"$S4main3CatVAA6AnimalA2aDP3fooSiyFTW" to i8*)], align 8
@"symbolic $S4main6AnimalP" = linkonce_odr hidden constant <{ [15 x i8], i8 }> <{ [15 x i8] c"$S4main6AnimalP", i8 0 }>, section "__TEXT,__swift4_typeref, regular, no_dead_strip", align 1
@"$S4main6Animal_pMF" = internal constant { i32, i32, i16, i16, i32 } { i32 trunc (i64 sub (i64 ptrtoint (<{ [15 x i8], i8 }>* @"symbolic $S4main6AnimalP" to i64), i64 ptrtoint ({ i32, i32, i16, i16, i32 }* @"$S4main6Animal_pMF" to i64)) to i32), i32 0, i16 4, i16 12, i32 0 }, section "__TEXT,__swift4_fieldmd, regular, no_dead_strip", align 4
@0 = private unnamed_addr constant [16 x i8] c"$S4main6AnimalP\00"
@"$S4main6AnimalWR" = internal constant [1 x %swift.protocol_requirement] [%swift.protocol_requirement { i32 17, i32 0, i32 0 }], section "__TEXT,__const", align 4
@"$S4main6AnimalMp" = hidden constant %swift.protocol { i8* null, i8* getelementptr inbounds ([16 x i8], [16 x i8]* @0, i64 0, i64 0), i8* null, i8* null, i8* null, i8* null, i8* null, i8* null, i32 72, i32 7, i32 1, i32 trunc (i64 sub (i64 ptrtoint ([1 x %swift.protocol_requirement]* @"$S4main6AnimalWR" to i64), i64 ptrtoint (i32* getelementptr inbounds (%swift.protocol, %swift.protocol* @"$S4main6AnimalMp", i32 0, i32 11) to i64)) to i32), i32 0, i32 0 }, align 8
@"$SBi64_WV" = external global i8*, align 8
@1 = private constant [5 x i8] c"main\00"
@"$S4mainMXM" = linkonce_odr hidden constant <{ i32, i32, i32 }> <{ i32 0, i32 0, i32 trunc (i64 sub (i64 ptrtoint ([5 x i8]* @1 to i64), i64 ptrtoint (i32* getelementptr inbounds (<{ i32, i32, i32 }>, <{ i32, i32, i32 }>* @"$S4mainMXM", i32 0, i32 2) to i64)) to i32) }>, section "__TEXT,__const", align 4
@2 = private constant [4 x i8] c"Cat\00"
@"$S4main3CatVMn" = hidden constant <{ i32, i32, i32, i32, i32, i32 }> <{ i32 262225, i32 trunc (i64 sub (i64 ptrtoint (<{ i32, i32, i32 }>* @"$S4mainMXM" to i64), i64 ptrtoint (i32* getelementptr inbounds (<{ i32, i32, i32, i32, i32, i32 }>, <{ i32, i32, i32, i32, i32, i32 }>* @"$S4main3CatVMn", i32 0, i32 1) to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([4 x i8]* @2 to i64), i64 ptrtoint (i32* getelementptr inbounds (<{ i32, i32, i32, i32, i32, i32 }>, <{ i32, i32, i32, i32, i32, i32 }>* @"$S4main3CatVMn", i32 0, i32 2) to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (%swift.metadata_response (i64)* @"$S4main3CatVMa" to i64), i64 ptrtoint (i32* getelementptr inbounds (<{ i32, i32, i32, i32, i32, i32 }>, <{ i32, i32, i32, i32, i32, i32 }>* @"$S4main3CatVMn", i32 0, i32 3) to i64)) to i32), i32 1, i32 2 }>, section "__TEXT,__const", align 4
@"$S4main3CatVMf" = internal constant <{ i8**, i64, <{ i32, i32, i32, i32, i32, i32 }>*, i32, [4 x i8] }> <{ i8** @"$SBi64_WV", i64 1, <{ i32, i32, i32, i32, i32, i32 }>* @"$S4main3CatVMn", i32 0, [4 x i8] zeroinitializer }>, align 8
@"symbolic \01____ 4main3CatV" = linkonce_odr hidden constant <{ [1 x i8], i32, i8 }> <{ [1 x i8] c"\01", i32 trunc (i64 sub (i64 ptrtoint (<{ i32, i32, i32, i32, i32, i32 }>* @"$S4main3CatVMn" to i64), i64 ptrtoint (i32* getelementptr inbounds (<{ [1 x i8], i32, i8 }>, <{ [1 x i8], i32, i8 }>* @"symbolic \01____ 4main3CatV", i32 0, i32 1) to i64)) to i32), i8 0 }>, section "__TEXT,__swift4_typeref, regular, no_dead_strip", align 1
@"symbolic Si" = linkonce_odr hidden constant <{ [2 x i8], i8 }> <{ [2 x i8] c"Si", i8 0 }>, section "__TEXT,__swift4_typeref, regular, no_dead_strip", align 1
@3 = private constant [6 x i8] c"value\00", section "__TEXT,__swift4_reflstr, regular, no_dead_strip"
@"$S4main3CatVMF" = internal constant { i32, i32, i16, i16, i32, i32, i32, i32 } { i32 trunc (i64 sub (i64 ptrtoint (<{ [1 x i8], i32, i8 }>* @"symbolic \01____ 4main3CatV" to i64), i64 ptrtoint ({ i32, i32, i16, i16, i32, i32, i32, i32 }* @"$S4main3CatVMF" to i64)) to i32), i32 0, i16 0, i16 12, i32 1, i32 2, i32 trunc (i64 sub (i64 ptrtoint (<{ [2 x i8], i8 }>* @"symbolic Si" to i64), i64 ptrtoint (i32* getelementptr inbounds ({ i32, i32, i16, i16, i32, i32, i32, i32 }, { i32, i32, i16, i16, i32, i32, i32, i32 }* @"$S4main3CatVMF", i32 0, i32 6) to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([6 x i8]* @3 to i64), i64 ptrtoint (i32* getelementptr inbounds ({ i32, i32, i16, i16, i32, i32, i32, i32 }, { i32, i32, i16, i16, i32, i32, i32, i32 }* @"$S4main3CatVMF", i32 0, i32 7) to i64)) to i32) }, section "__TEXT,__swift4_fieldmd, regular, no_dead_strip", align 4
@"\01l_protocols" = private constant [1 x %swift.protocolref] [%swift.protocolref { i32 trunc (i64 sub (i64 ptrtoint (%swift.protocol* @"$S4main6AnimalMp" to i64), i64 ptrtoint ([1 x %swift.protocolref]* @"\01l_protocols" to i64)) to i32) }], section "__TEXT, __swift4_protos, regular, no_dead_strip", align 4
@"\01l_protocol_conformances" = private constant [1 x i32] [i32 trunc (i64 sub (i64 ptrtoint (%swift.protocol_conformance_descriptor* @"$S4main3CatVAA6AnimalAAMc" to i64), i64 ptrtoint ([1 x i32]* @"\01l_protocol_conformances" to i64)) to i32)], section "__TEXT, __swift4_proto, regular, no_dead_strip", align 4
@"\01l_type_metadata_table" = private constant [1 x %swift.type_metadata_record] [%swift.type_metadata_record { i32 trunc (i64 sub (i64 ptrtoint (<{ i32, i32, i32, i32, i32, i32 }>* @"$S4main3CatVMn" to i64), i64 ptrtoint ([1 x %swift.type_metadata_record]* @"\01l_type_metadata_table" to i64)) to i32) }], section "__TEXT, __swift4_types, regular, no_dead_strip", align 4
@__swift_reflection_version = linkonce_odr hidden constant i16 3
@llvm.used = appending global [6 x i8*] [i8* bitcast ({ i32, i32, i16, i16, i32 }* @"$S4main6Animal_pMF" to i8*), i8* bitcast ({ i32, i32, i16, i16, i32, i32, i32, i32 }* @"$S4main3CatVMF" to i8*), i8* bitcast ([1 x %swift.protocolref]* @"\01l_protocols" to i8*), i8* bitcast ([1 x i32]* @"\01l_protocol_conformances" to i8*), i8* bitcast ([1 x %swift.type_metadata_record]* @"\01l_type_metadata_table" to i8*), i8* bitcast (i16* @__swift_reflection_version to i8*)], section "llvm.metadata", align 8
@"$S4main3CatVN" = hidden alias %swift.type, bitcast (i64* getelementptr inbounds (<{ i8**, i64, <{ i32, i32, i32, i32, i32, i32 }>*, i32, [4 x i8] }>, <{ i8**, i64, <{ i32, i32, i32, i32, i32, i32 }>*, i32, [4 x i8] }>* @"$S4main3CatVMf", i32 0, i32 1) to %swift.type*)
define i32 @main(i32, i8**) #0 {
entry:
%2 = bitcast i8** %1 to i8*
%3 = call swiftcc { %swift.bridge*, i8* } @"$Ss27_allocateUninitializedArrayySayxG_BptBwlFyp_Tg5"(i64 1)
%4 = extractvalue { %swift.bridge*, i8* } %3, 0
%5 = extractvalue { %swift.bridge*, i8* } %3, 1
%6 = call %swift.bridge* @swift_bridgeObjectRetain(%swift.bridge* %4) #1
call void @swift_bridgeObjectRelease(%swift.bridge* %4) #1
%7 = bitcast i8* %5 to %Any*
%8 = getelementptr inbounds %Any, %Any* %7, i32 0, i32 1
store %swift.type* @"$SSiN", %swift.type** %8, align 8
%9 = getelementptr inbounds %Any, %Any* %7, i32 0, i32 0
%10 = getelementptr inbounds %Any, %Any* %7, i32 0, i32 0
%11 = bitcast [24 x i8]* %10 to %TSi*
%12 = call swiftcc i64 @"$S4main3CatVACycfC"()
%13 = call swiftcc i64 @"$S4main6useCatySiAA0C0VF"(i64 %12)
%._value = getelementptr inbounds %TSi, %TSi* %11, i32 0, i32 0
store i64 %13, i64* %._value, align 8
%14 = call swiftcc { %swift.bridge*, i64 } @"$Ss5print_9separator10terminatoryypd_S2StFfA0_"()
%15 = extractvalue { %swift.bridge*, i64 } %14, 0
%16 = extractvalue { %swift.bridge*, i64 } %14, 1
%17 = call swiftcc { %swift.bridge*, i64 } @"$Ss5print_9separator10terminatoryypd_S2StFfA1_"()
%18 = extractvalue { %swift.bridge*, i64 } %17, 0
%19 = extractvalue { %swift.bridge*, i64 } %17, 1
call swiftcc void @"$Ss5print_9separator10terminatoryypd_S2StF"(%swift.bridge* %4, %swift.bridge* %15, i64 %16, %swift.bridge* %18, i64 %19)
call void @swift_bridgeObjectRelease(%swift.bridge* %18) #1
call void @swift_bridgeObjectRelease(%swift.bridge* %15) #1
call void @swift_bridgeObjectRelease(%swift.bridge* %4) #1
ret i32 0
}
declare swiftcc { %swift.bridge*, i8* } @"$Ss27_allocateUninitializedArrayySayxG_BptBwlFyp_Tg5"(i64) #0
; Function Attrs: nounwind
declare %swift.bridge* @swift_bridgeObjectRetain(%swift.bridge*) #1
; Function Attrs: nounwind
declare void @swift_bridgeObjectRelease(%swift.bridge*) #1
define hidden swiftcc i64 @"$S4main3CatV5valueSivpfi"() #0 {
entry:
ret i64 42
}
define hidden swiftcc i64 @"$S4main3CatV5valueSivg"(i64) #0 {
entry:
ret i64 %0
}
define hidden swiftcc void @"$S4main3CatV5valueSivs"(i64, %T4main3CatV* nocapture swiftself dereferenceable(8)) #0 {
entry:
%.value = getelementptr inbounds %T4main3CatV, %T4main3CatV* %1, i32 0, i32 0
%.value._value = getelementptr inbounds %TSi, %TSi* %.value, i32 0, i32 0
store i64 %0, i64* %.value._value, align 8
ret void
}
define hidden swiftcc { i8*, i64 } @"$S4main3CatV5valueSivm"(i8*, [24 x i8]* nocapture dereferenceable(24), %T4main3CatV* nocapture swiftself dereferenceable(8)) #0 {
entry:
%.value = getelementptr inbounds %T4main3CatV, %T4main3CatV* %2, i32 0, i32 0
%3 = bitcast %TSi* %.value to i8*
%4 = insertvalue { i8*, i64 } undef, i8* %3, 0
%5 = insertvalue { i8*, i64 } %4, i64 0, 1
ret { i8*, i64 } %5
}
define hidden swiftcc i64 @"$S4main3CatV3fooSiyF"(i64) #0 {
entry:
ret i64 %0
}
define hidden swiftcc i64 @"$S4main3CatV5valueACSi_tcfC"(i64) #0 {
entry:
ret i64 %0
}
define hidden swiftcc i64 @"$S4main3CatVACycfC"() #0 {
entry:
%0 = alloca %T4main3CatV, align 8
%1 = bitcast %T4main3CatV* %0 to i8*
call void @llvm.lifetime.start.p0i8(i64 8, i8* %1)
%.value = getelementptr inbounds %T4main3CatV, %T4main3CatV* %0, i32 0, i32 0
%.value._value = getelementptr inbounds %TSi, %TSi* %.value, i32 0, i32 0
store i64 42, i64* %.value._value, align 8
%2 = bitcast %T4main3CatV* %0 to i8*
call void @llvm.lifetime.end.p0i8(i64 8, i8* %2)
ret i64 42
}
define internal swiftcc i64 @"$S4main3CatVAA6AnimalA2aDP3fooSiyFTW"(%T4main3CatV* noalias nocapture swiftself dereferenceable(8), %swift.type* %Self, i8** %SelfWitnessTable) #0 {
entry:
%.value = getelementptr inbounds %T4main3CatV, %T4main3CatV* %0, i32 0, i32 0
%.value._value = getelementptr inbounds %TSi, %TSi* %.value, i32 0, i32 0
%1 = load i64, i64* %.value._value, align 8
%2 = call swiftcc i64 @"$S4main3CatV3fooSiyF"(i64 %1) #6
ret i64 %2
}
define hidden swiftcc i64 @"$S4main9useAnimalySiAA0C0_pF"(%T4main6AnimalP* noalias nocapture dereferenceable(40)) #0 {
entry:
%1 = getelementptr inbounds %T4main6AnimalP, %T4main6AnimalP* %0, i32 0, i32 1
%2 = load %swift.type*, %swift.type** %1, align 8
%3 = getelementptr inbounds %T4main6AnimalP, %T4main6AnimalP* %0, i32 0, i32 2
%4 = load i8**, i8*** %3, align 8
%5 = getelementptr inbounds %T4main6AnimalP, %T4main6AnimalP* %0, i32 0, i32 0
%6 = call %swift.opaque* @__swift_project_boxed_opaque_existential_1([24 x i8]* %5, %swift.type* %2) #1
%7 = getelementptr inbounds i8*, i8** %4, i32 1
%8 = load i8*, i8** %7, align 8, !invariant.load !25
%9 = bitcast i8* %8 to i64 (%swift.opaque*, %swift.type*, i8**)*
%10 = call swiftcc i64 %9(%swift.opaque* noalias nocapture swiftself %6, %swift.type* %2, i8** %4)
ret i64 %10
}
define hidden swiftcc i64 @"$S4main6useCatySiAA0C0VF"(i64) #0 {
entry:
%1 = alloca %T4main6AnimalP, align 8
%2 = bitcast %T4main6AnimalP* %1 to i8*
call void @llvm.lifetime.start.p0i8(i64 40, i8* %2)
%3 = getelementptr inbounds %T4main6AnimalP, %T4main6AnimalP* %1, i32 0, i32 1
store %swift.type* bitcast (i64* getelementptr inbounds (<{ i8**, i64, <{ i32, i32, i32, i32, i32, i32 }>*, i32, [4 x i8] }>, <{ i8**, i64, <{ i32, i32, i32, i32, i32, i32 }>*, i32, [4 x i8] }>* @"$S4main3CatVMf", i32 0, i32 1) to %swift.type*), %swift.type** %3, align 8
%4 = getelementptr inbounds %T4main6AnimalP, %T4main6AnimalP* %1, i32 0, i32 2
store i8** getelementptr inbounds ([2 x i8*], [2 x i8*]* @"$S4main3CatVAA6AnimalAAWP", i32 0, i32 0), i8*** %4, align 8
%5 = getelementptr inbounds %T4main6AnimalP, %T4main6AnimalP* %1, i32 0, i32 0
%6 = getelementptr inbounds %T4main6AnimalP, %T4main6AnimalP* %1, i32 0, i32 0
%7 = bitcast [24 x i8]* %6 to %T4main3CatV*
%.value = getelementptr inbounds %T4main3CatV, %T4main3CatV* %7, i32 0, i32 0
%.value._value = getelementptr inbounds %TSi, %TSi* %.value, i32 0, i32 0
store i64 %0, i64* %.value._value, align 8
%8 = call swiftcc i64 @"$S4main9useAnimalySiAA0C0_pF"(%T4main6AnimalP* noalias nocapture dereferenceable(40) %1)
call void @__swift_destroy_boxed_opaque_existential_1(%T4main6AnimalP* %1) #1
%9 = bitcast %T4main6AnimalP* %1 to i8*
call void @llvm.lifetime.end.p0i8(i64 40, i8* %9)
ret i64 %8
}
; Function Attrs: noinline
declare swiftcc { %swift.bridge*, i64 } @"$Ss5print_9separator10terminatoryypd_S2StFfA0_"() #2
; Function Attrs: noinline
declare swiftcc { %swift.bridge*, i64 } @"$Ss5print_9separator10terminatoryypd_S2StFfA1_"() #2
; Function Attrs: noinline
declare swiftcc void @"$Ss5print_9separator10terminatoryypd_S2StF"(%swift.bridge*, %swift.bridge*, i64, %swift.bridge*, i64) #2
; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #3
; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #3
; Function Attrs: noinline nounwind
define linkonce_odr hidden %swift.opaque* @__swift_project_boxed_opaque_existential_1([24 x i8]*, %swift.type*) #4 {
entry:
%2 = bitcast %swift.type* %1 to i8***
%3 = getelementptr inbounds i8**, i8*** %2, i64 -1
%.valueWitnesses = load i8**, i8*** %3, align 8, !invariant.load !25, !dereferenceable !26
%4 = getelementptr inbounds i8*, i8** %.valueWitnesses, i32 10
%5 = load i8*, i8** %4, align 8, !invariant.load !25
%flags = ptrtoint i8* %5 to i64
%6 = and i64 %flags, 131072
%flags.isInline = icmp eq i64 %6, 0
%7 = bitcast [24 x i8]* %0 to %swift.opaque*
br i1 %flags.isInline, label %done, label %boxed
done: ; preds = %entry
ret %swift.opaque* %7
boxed: ; preds = %entry
%8 = bitcast [24 x i8]* %0 to %swift.refcounted**
%9 = load %swift.refcounted*, %swift.refcounted** %8, align 8
%flags.alignmentMask = and i64 %flags, 65535
%10 = add i64 16, %flags.alignmentMask
%11 = xor i64 %flags.alignmentMask, -1
%12 = and i64 %10, %11
%13 = bitcast %swift.refcounted* %9 to i8*
%14 = getelementptr inbounds i8, i8* %13, i64 %12
%15 = bitcast i8* %14 to %swift.opaque*
ret %swift.opaque* %15
}
; Function Attrs: noinline nounwind
define linkonce_odr hidden void @__swift_destroy_boxed_opaque_existential_1(%T4main6AnimalP*) #4 {
entry:
%1 = getelementptr inbounds %T4main6AnimalP, %T4main6AnimalP* %0, i32 0, i32 1
%2 = load %swift.type*, %swift.type** %1, align 8
%3 = getelementptr inbounds %T4main6AnimalP, %T4main6AnimalP* %0, i32 0, i32 0
%4 = bitcast %swift.type* %2 to i8***
%5 = getelementptr inbounds i8**, i8*** %4, i64 -1
%.valueWitnesses = load i8**, i8*** %5, align 8, !invariant.load !25, !dereferenceable !26
%6 = getelementptr inbounds i8*, i8** %.valueWitnesses, i32 10
%7 = load i8*, i8** %6, align 8, !invariant.load !25
%flags = ptrtoint i8* %7 to i64
%8 = and i64 %flags, 131072
%flags.isInline = icmp eq i64 %8, 0
br i1 %flags.isInline, label %inline, label %outline
inline: ; preds = %entry
%9 = bitcast [24 x i8]* %3 to %swift.opaque*
%10 = bitcast %swift.type* %2 to i8***
%11 = getelementptr inbounds i8**, i8*** %10, i64 -1
%.valueWitnesses1 = load i8**, i8*** %11, align 8, !invariant.load !25, !dereferenceable !26
%12 = getelementptr inbounds i8*, i8** %.valueWitnesses1, i32 1
%13 = load i8*, i8** %12, align 8, !invariant.load !25
%destroy = bitcast i8* %13 to void (%swift.opaque*, %swift.type*)*
call void %destroy(%swift.opaque* noalias %9, %swift.type* %2) #1
ret void
outline: ; preds = %entry
%14 = bitcast [24 x i8]* %3 to %swift.refcounted**
%15 = load %swift.refcounted*, %swift.refcounted** %14, align 8
call void @swift_release(%swift.refcounted* %15) #1
ret void
}
; Function Attrs: nounwind
declare void @swift_release(%swift.refcounted*) #1
define hidden i8** @"$S4main3CatVAA6AnimalAAWa"() #0 {
entry:
ret i8** getelementptr inbounds ([2 x i8*], [2 x i8*]* @"$S4main3CatVAA6AnimalAAWP", i32 0, i32 0)
}
; Function Attrs: nounwind readnone
define hidden swiftcc %swift.metadata_response @"$S4main3CatVMa"(i64) #5 {
entry:
ret %swift.metadata_response { %swift.type* bitcast (i64* getelementptr inbounds (<{ i8**, i64, <{ i32, i32, i32, i32, i32, i32 }>*, i32, [4 x i8] }>, <{ i8**, i64, <{ i32, i32, i32, i32, i32, i32 }>*, i32, [4 x i8] }>* @"$S4main3CatVMf", i32 0, i32 1) to %swift.type*), i64 0 }
}
declare swiftcc %swift.metadata_response @"$SSiMa"(i64) #0
attributes #0 = { "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "target-cpu"="penryn" "target-features"="+cx16,+fxsr,+mmx,+sse,+sse2,+sse3,+sse4.1,+ssse3,+x87" }
attributes #1 = { nounwind }
attributes #2 = { noinline "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "target-cpu"="penryn" "target-features"="+cx16,+fxsr,+mmx,+sse,+sse2,+sse3,+sse4.1,+ssse3,+x87" }
attributes #3 = { argmemonly nounwind }
attributes #4 = { noinline nounwind }
attributes #5 = { nounwind readnone "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "target-cpu"="penryn" "target-features"="+cx16,+fxsr,+mmx,+sse,+sse2,+sse3,+sse4.1,+ssse3,+x87" }
attributes #6 = { noinline }
!llvm.asan.globals = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9, !10, !11, !12, !13}
!llvm.module.flags = !{!14, !15, !16, !17, !18, !19, !20, !21}
!llvm.linker.options = !{!22, !23, !24}
!0 = !{<{ [15 x i8], i8 }>* @"symbolic $S4main6AnimalP", null, null, i1 false, i1 true}
!1 = !{{ i32, i32, i16, i16, i32 }* @"$S4main6Animal_pMF", null, null, i1 false, i1 true}
!2 = !{[1 x %swift.protocol_requirement]* @"$S4main6AnimalWR", null, null, i1 false, i1 true}
!3 = !{%swift.protocol* @"$S4main6AnimalMp", null, null, i1 false, i1 true}
!4 = !{<{ i32, i32, i32 }>* @"$S4mainMXM", null, null, i1 false, i1 true}
!5 = !{<{ i32, i32, i32, i32, i32, i32 }>* @"$S4main3CatVMn", null, null, i1 false, i1 true}
!6 = !{<{ [1 x i8], i32, i8 }>* @"symbolic \01____ 4main3CatV", null, null, i1 false, i1 true}
!7 = !{<{ [2 x i8], i8 }>* @"symbolic Si", null, null, i1 false, i1 true}
!8 = !{[6 x i8]* @3, null, null, i1 false, i1 true}
!9 = !{{ i32, i32, i16, i16, i32, i32, i32, i32 }* @"$S4main3CatVMF", null, null, i1 false, i1 true}
!10 = !{[1 x %swift.protocolref]* @"\01l_protocols", null, null, i1 false, i1 true}
!11 = !{[1 x i32]* @"\01l_protocol_conformances", null, null, i1 false, i1 true}
!12 = !{[1 x %swift.type_metadata_record]* @"\01l_type_metadata_table", null, null, i1 false, i1 true}
!13 = !{[6 x i8*]* @llvm.used, null, null, i1 false, i1 true}
!14 = !{i32 1, !"Objective-C Version", i32 2}
!15 = !{i32 1, !"Objective-C Image Info Version", i32 0}
!16 = !{i32 1, !"Objective-C Image Info Section", !"__DATA,__objc_imageinfo,regular,no_dead_strip"}
!17 = !{i32 4, !"Objective-C Garbage Collection", i32 1536}
!18 = !{i32 1, !"Objective-C Class Properties", i32 64}
!19 = !{i32 1, !"wchar_size", i32 4}
!20 = !{i32 7, !"PIC Level", i32 2}
!21 = !{i32 1, !"Swift Version", i32 6}
!22 = !{!"-lswiftSwiftOnoneSupport"}
!23 = !{!"-lswiftCore"}
!24 = !{!"-lobjc"}
!25 = !{}
!26 = !{i64 96}
protocol Animal {
associatedtype Value
func foo() -> Value
}
struct Cat: Animal {
var value: Int = 42
func foo() -> Int { return value }
}
func useAnimal<A: Animal>(_ animal: A) -> Int where A.Value == Int {
return animal.foo()
}
func useCat(_ cat: Cat) -> Int {
return useAnimal(cat)
}
print(useCat(Cat()))
; ModuleID = '-'
source_filename = "-"
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.13.0"
%swift.type = type { i64 }
%swift.protocol_conformance_descriptor = type { i32, i32, i32, i32 }
%swift.protocol_requirement = type { i32, i32, i32 }
%swift.protocol = type { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i32, i32, i32, i32, i32, i32 }
%swift.protocolref = type { i32 }
%swift.type_metadata_record = type { i32 }
%swift.bridge = type opaque
%Any = type { [24 x i8], %swift.type* }
%TSi = type <{ i64 }>
%T4main3CatV = type <{ %TSi }>
%swift.opaque = type opaque
%swift.metadata_response = type { %swift.type*, i64 }
@"$SSiN" = external global %swift.type, align 8
@"$S4main3CatVAA6AnimalAAMc" = hidden constant %swift.protocol_conformance_descriptor { i32 trunc (i64 sub (i64 ptrtoint (%swift.protocol* @"$S4main6AnimalMp" to i64), i64 ptrtoint (%swift.protocol_conformance_descriptor* @"$S4main3CatVAA6AnimalAAMc" to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (<{ i32, i32, i32, i32, i32, i32 }>* @"$S4main3CatVMn" to i64), i64 ptrtoint (i32* getelementptr inbounds (%swift.protocol_conformance_descriptor, %swift.protocol_conformance_descriptor* @"$S4main3CatVAA6AnimalAAMc", i32 0, i32 1) to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([3 x i8*]* @"$S4main3CatVAA6AnimalAAWP" to i64), i64 ptrtoint (i32* getelementptr inbounds (%swift.protocol_conformance_descriptor, %swift.protocol_conformance_descriptor* @"$S4main3CatVAA6AnimalAAMc", i32 0, i32 2) to i64)) to i32), i32 0 }, align 8
@"$S4main3CatVAA6AnimalAAWP" = hidden constant [3 x i8*] [i8* bitcast (%swift.protocol_conformance_descriptor* @"$S4main3CatVAA6AnimalAAMc" to i8*), i8* bitcast (%swift.metadata_response (i64)* @"$SSiMa" to i8*), i8* bitcast (void (%TSi*, %T4main3CatV*, %swift.type*, i8**)* @"$S4main3CatVAA6AnimalA2aDP3foo5ValueQzyFTW" to i8*)], align 8
@"symbolic $S4main6AnimalP" = linkonce_odr hidden constant <{ [15 x i8], i8 }> <{ [15 x i8] c"$S4main6AnimalP", i8 0 }>, section "__TEXT,__swift4_typeref, regular, no_dead_strip", align 1
@"$S4main6Animal_pMF" = internal constant { i32, i32, i16, i16, i32 } { i32 trunc (i64 sub (i64 ptrtoint (<{ [15 x i8], i8 }>* @"symbolic $S4main6AnimalP" to i64), i64 ptrtoint ({ i32, i32, i16, i16, i32 }* @"$S4main6Animal_pMF" to i64)) to i32), i32 0, i16 4, i16 12, i32 0 }, section "__TEXT,__swift4_fieldmd, regular, no_dead_strip", align 4
@0 = private unnamed_addr constant [16 x i8] c"$S4main6AnimalP\00"
@"$S4main6AnimalWR" = internal constant [2 x %swift.protocol_requirement] [%swift.protocol_requirement { i32 6, i32 0, i32 0 }, %swift.protocol_requirement { i32 17, i32 0, i32 0 }], section "__TEXT,__const", align 4
@1 = private constant [6 x i8] c"Value\00"
@"$S4main6AnimalMp" = hidden constant %swift.protocol { i8* null, i8* getelementptr inbounds ([16 x i8], [16 x i8]* @0, i64 0, i64 0), i8* null, i8* null, i8* null, i8* null, i8* null, i8* null, i32 72, i32 7, i32 2, i32 trunc (i64 sub (i64 ptrtoint ([2 x %swift.protocol_requirement]* @"$S4main6AnimalWR" to i64), i64 ptrtoint (i32* getelementptr inbounds (%swift.protocol, %swift.protocol* @"$S4main6AnimalMp", i32 0, i32 11) to i64)) to i32), i32 0, i32 trunc (i64 sub (i64 ptrtoint ([6 x i8]* @1 to i64), i64 ptrtoint (i32* getelementptr inbounds (%swift.protocol, %swift.protocol* @"$S4main6AnimalMp", i32 0, i32 13) to i64)) to i32) }, align 8
@"$SBi64_WV" = external global i8*, align 8
@2 = private constant [5 x i8] c"main\00"
@"$S4mainMXM" = linkonce_odr hidden constant <{ i32, i32, i32 }> <{ i32 0, i32 0, i32 trunc (i64 sub (i64 ptrtoint ([5 x i8]* @2 to i64), i64 ptrtoint (i32* getelementptr inbounds (<{ i32, i32, i32 }>, <{ i32, i32, i32 }>* @"$S4mainMXM", i32 0, i32 2) to i64)) to i32) }>, section "__TEXT,__const", align 4
@3 = private constant [4 x i8] c"Cat\00"
@"$S4main3CatVMn" = hidden constant <{ i32, i32, i32, i32, i32, i32 }> <{ i32 262225, i32 trunc (i64 sub (i64 ptrtoint (<{ i32, i32, i32 }>* @"$S4mainMXM" to i64), i64 ptrtoint (i32* getelementptr inbounds (<{ i32, i32, i32, i32, i32, i32 }>, <{ i32, i32, i32, i32, i32, i32 }>* @"$S4main3CatVMn", i32 0, i32 1) to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([4 x i8]* @3 to i64), i64 ptrtoint (i32* getelementptr inbounds (<{ i32, i32, i32, i32, i32, i32 }>, <{ i32, i32, i32, i32, i32, i32 }>* @"$S4main3CatVMn", i32 0, i32 2) to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (%swift.metadata_response (i64)* @"$S4main3CatVMa" to i64), i64 ptrtoint (i32* getelementptr inbounds (<{ i32, i32, i32, i32, i32, i32 }>, <{ i32, i32, i32, i32, i32, i32 }>* @"$S4main3CatVMn", i32 0, i32 3) to i64)) to i32), i32 1, i32 2 }>, section "__TEXT,__const", align 4
@"$S4main3CatVMf" = internal constant <{ i8**, i64, <{ i32, i32, i32, i32, i32, i32 }>*, i32, [4 x i8] }> <{ i8** @"$SBi64_WV", i64 1, <{ i32, i32, i32, i32, i32, i32 }>* @"$S4main3CatVMn", i32 0, [4 x i8] zeroinitializer }>, align 8
@"symbolic \01____ 4main3CatV" = linkonce_odr hidden constant <{ [1 x i8], i32, i8 }> <{ [1 x i8] c"\01", i32 trunc (i64 sub (i64 ptrtoint (<{ i32, i32, i32, i32, i32, i32 }>* @"$S4main3CatVMn" to i64), i64 ptrtoint (i32* getelementptr inbounds (<{ [1 x i8], i32, i8 }>, <{ [1 x i8], i32, i8 }>* @"symbolic \01____ 4main3CatV", i32 0, i32 1) to i64)) to i32), i8 0 }>, section "__TEXT,__swift4_typeref, regular, no_dead_strip", align 1
@"symbolic Si" = linkonce_odr hidden constant <{ [2 x i8], i8 }> <{ [2 x i8] c"Si", i8 0 }>, section "__TEXT,__swift4_typeref, regular, no_dead_strip", align 1
@4 = private constant [6 x i8] c"value\00", section "__TEXT,__swift4_reflstr, regular, no_dead_strip"
@"$S4main3CatVMF" = internal constant { i32, i32, i16, i16, i32, i32, i32, i32 } { i32 trunc (i64 sub (i64 ptrtoint (<{ [1 x i8], i32, i8 }>* @"symbolic \01____ 4main3CatV" to i64), i64 ptrtoint ({ i32, i32, i16, i16, i32, i32, i32, i32 }* @"$S4main3CatVMF" to i64)) to i32), i32 0, i16 0, i16 12, i32 1, i32 2, i32 trunc (i64 sub (i64 ptrtoint (<{ [2 x i8], i8 }>* @"symbolic Si" to i64), i64 ptrtoint (i32* getelementptr inbounds ({ i32, i32, i16, i16, i32, i32, i32, i32 }, { i32, i32, i16, i16, i32, i32, i32, i32 }* @"$S4main3CatVMF", i32 0, i32 6) to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint ([6 x i8]* @4 to i64), i64 ptrtoint (i32* getelementptr inbounds ({ i32, i32, i16, i16, i32, i32, i32, i32 }, { i32, i32, i16, i16, i32, i32, i32, i32 }* @"$S4main3CatVMF", i32 0, i32 7) to i64)) to i32) }, section "__TEXT,__swift4_fieldmd, regular, no_dead_strip", align 4
@"\01l_protocols" = private constant [1 x %swift.protocolref] [%swift.protocolref { i32 trunc (i64 sub (i64 ptrtoint (%swift.protocol* @"$S4main6AnimalMp" to i64), i64 ptrtoint ([1 x %swift.protocolref]* @"\01l_protocols" to i64)) to i32) }], section "__TEXT, __swift4_protos, regular, no_dead_strip", align 4
@"symbolic 4main3CatV" = linkonce_odr hidden constant <{ [10 x i8], i8 }> <{ [10 x i8] c"4main3CatV", i8 0 }>, section "__TEXT,__swift4_typeref, regular, no_dead_strip", align 1
@5 = private constant [6 x i8] c"Value\00", section "__TEXT,__swift4_reflstr, regular, no_dead_strip"
@"$S4main3CatVAA6AnimalAAMA" = internal constant { i32, i32, i32, i32, i32, i32 } { i32 trunc (i64 sub (i64 ptrtoint (<{ [10 x i8], i8 }>* @"symbolic 4main3CatV" to i64), i64 ptrtoint ({ i32, i32, i32, i32, i32, i32 }* @"$S4main3CatVAA6AnimalAAMA" to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (<{ [15 x i8], i8 }>* @"symbolic $S4main6AnimalP" to i64), i64 ptrtoint (i32* getelementptr inbounds ({ i32, i32, i32, i32, i32, i32 }, { i32, i32, i32, i32, i32, i32 }* @"$S4main3CatVAA6AnimalAAMA", i32 0, i32 1) to i64)) to i32), i32 1, i32 8, i32 trunc (i64 sub (i64 ptrtoint ([6 x i8]* @5 to i64), i64 ptrtoint (i32* getelementptr inbounds ({ i32, i32, i32, i32, i32, i32 }, { i32, i32, i32, i32, i32, i32 }* @"$S4main3CatVAA6AnimalAAMA", i32 0, i32 4) to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (<{ [2 x i8], i8 }>* @"symbolic Si" to i64), i64 ptrtoint (i32* getelementptr inbounds ({ i32, i32, i32, i32, i32, i32 }, { i32, i32, i32, i32, i32, i32 }* @"$S4main3CatVAA6AnimalAAMA", i32 0, i32 5) to i64)) to i32) }, section "__TEXT,__swift4_assocty, regular, no_dead_strip", align 4
@"\01l_protocol_conformances" = private constant [1 x i32] [i32 trunc (i64 sub (i64 ptrtoint (%swift.protocol_conformance_descriptor* @"$S4main3CatVAA6AnimalAAMc" to i64), i64 ptrtoint ([1 x i32]* @"\01l_protocol_conformances" to i64)) to i32)], section "__TEXT, __swift4_proto, regular, no_dead_strip", align 4
@"\01l_type_metadata_table" = private constant [1 x %swift.type_metadata_record] [%swift.type_metadata_record { i32 trunc (i64 sub (i64 ptrtoint (<{ i32, i32, i32, i32, i32, i32 }>* @"$S4main3CatVMn" to i64), i64 ptrtoint ([1 x %swift.type_metadata_record]* @"\01l_type_metadata_table" to i64)) to i32) }], section "__TEXT, __swift4_types, regular, no_dead_strip", align 4
@__swift_reflection_version = linkonce_odr hidden constant i16 3
@llvm.used = appending global [7 x i8*] [i8* bitcast ({ i32, i32, i16, i16, i32 }* @"$S4main6Animal_pMF" to i8*), i8* bitcast ({ i32, i32, i16, i16, i32, i32, i32, i32 }* @"$S4main3CatVMF" to i8*), i8* bitcast ([1 x %swift.protocolref]* @"\01l_protocols" to i8*), i8* bitcast ({ i32, i32, i32, i32, i32, i32 }* @"$S4main3CatVAA6AnimalAAMA" to i8*), i8* bitcast ([1 x i32]* @"\01l_protocol_conformances" to i8*), i8* bitcast ([1 x %swift.type_metadata_record]* @"\01l_type_metadata_table" to i8*), i8* bitcast (i16* @__swift_reflection_version to i8*)], section "llvm.metadata", align 8
@"$S4main3CatVN" = hidden alias %swift.type, bitcast (i64* getelementptr inbounds (<{ i8**, i64, <{ i32, i32, i32, i32, i32, i32 }>*, i32, [4 x i8] }>, <{ i8**, i64, <{ i32, i32, i32, i32, i32, i32 }>*, i32, [4 x i8] }>* @"$S4main3CatVMf", i32 0, i32 1) to %swift.type*)
define i32 @main(i32, i8**) #0 {
entry:
%2 = bitcast i8** %1 to i8*
%3 = call swiftcc { %swift.bridge*, i8* } @"$Ss27_allocateUninitializedArrayySayxG_BptBwlFyp_Tg5"(i64 1)
%4 = extractvalue { %swift.bridge*, i8* } %3, 0
%5 = extractvalue { %swift.bridge*, i8* } %3, 1
%6 = call %swift.bridge* @swift_bridgeObjectRetain(%swift.bridge* %4) #1
call void @swift_bridgeObjectRelease(%swift.bridge* %4) #1
%7 = bitcast i8* %5 to %Any*
%8 = getelementptr inbounds %Any, %Any* %7, i32 0, i32 1
store %swift.type* @"$SSiN", %swift.type** %8, align 8
%9 = getelementptr inbounds %Any, %Any* %7, i32 0, i32 0
%10 = getelementptr inbounds %Any, %Any* %7, i32 0, i32 0
%11 = bitcast [24 x i8]* %10 to %TSi*
%12 = call swiftcc i64 @"$S4main3CatVACycfC"()
%13 = call swiftcc i64 @"$S4main6useCatySiAA0C0VF"(i64 %12)
%._value = getelementptr inbounds %TSi, %TSi* %11, i32 0, i32 0
store i64 %13, i64* %._value, align 8
%14 = call swiftcc { %swift.bridge*, i64 } @"$Ss5print_9separator10terminatoryypd_S2StFfA0_"()
%15 = extractvalue { %swift.bridge*, i64 } %14, 0
%16 = extractvalue { %swift.bridge*, i64 } %14, 1
%17 = call swiftcc { %swift.bridge*, i64 } @"$Ss5print_9separator10terminatoryypd_S2StFfA1_"()
%18 = extractvalue { %swift.bridge*, i64 } %17, 0
%19 = extractvalue { %swift.bridge*, i64 } %17, 1
call swiftcc void @"$Ss5print_9separator10terminatoryypd_S2StF"(%swift.bridge* %4, %swift.bridge* %15, i64 %16, %swift.bridge* %18, i64 %19)
call void @swift_bridgeObjectRelease(%swift.bridge* %18) #1
call void @swift_bridgeObjectRelease(%swift.bridge* %15) #1
call void @swift_bridgeObjectRelease(%swift.bridge* %4) #1
ret i32 0
}
declare swiftcc { %swift.bridge*, i8* } @"$Ss27_allocateUninitializedArrayySayxG_BptBwlFyp_Tg5"(i64) #0
; Function Attrs: nounwind
declare %swift.bridge* @swift_bridgeObjectRetain(%swift.bridge*) #1
; Function Attrs: nounwind
declare void @swift_bridgeObjectRelease(%swift.bridge*) #1
define hidden swiftcc i64 @"$S4main3CatV5valueSivpfi"() #0 {
entry:
ret i64 42
}
define hidden swiftcc i64 @"$S4main3CatV5valueSivg"(i64) #0 {
entry:
ret i64 %0
}
define hidden swiftcc void @"$S4main3CatV5valueSivs"(i64, %T4main3CatV* nocapture swiftself dereferenceable(8)) #0 {
entry:
%.value = getelementptr inbounds %T4main3CatV, %T4main3CatV* %1, i32 0, i32 0
%.value._value = getelementptr inbounds %TSi, %TSi* %.value, i32 0, i32 0
store i64 %0, i64* %.value._value, align 8
ret void
}
define hidden swiftcc { i8*, i64 } @"$S4main3CatV5valueSivm"(i8*, [24 x i8]* nocapture dereferenceable(24), %T4main3CatV* nocapture swiftself dereferenceable(8)) #0 {
entry:
%.value = getelementptr inbounds %T4main3CatV, %T4main3CatV* %2, i32 0, i32 0
%3 = bitcast %TSi* %.value to i8*
%4 = insertvalue { i8*, i64 } undef, i8* %3, 0
%5 = insertvalue { i8*, i64 } %4, i64 0, 1
ret { i8*, i64 } %5
}
define hidden swiftcc i64 @"$S4main3CatV3fooSiyF"(i64) #0 {
entry:
ret i64 %0
}
define hidden swiftcc i64 @"$S4main3CatV5valueACSi_tcfC"(i64) #0 {
entry:
ret i64 %0
}
define hidden swiftcc i64 @"$S4main3CatVACycfC"() #0 {
entry:
%0 = alloca %T4main3CatV, align 8
%1 = bitcast %T4main3CatV* %0 to i8*
call void @llvm.lifetime.start.p0i8(i64 8, i8* %1)
%.value = getelementptr inbounds %T4main3CatV, %T4main3CatV* %0, i32 0, i32 0
%.value._value = getelementptr inbounds %TSi, %TSi* %.value, i32 0, i32 0
store i64 42, i64* %.value._value, align 8
%2 = bitcast %T4main3CatV* %0 to i8*
call void @llvm.lifetime.end.p0i8(i64 8, i8* %2)
ret i64 42
}
define internal swiftcc void @"$S4main3CatVAA6AnimalA2aDP3foo5ValueQzyFTW"(%TSi* noalias nocapture sret, %T4main3CatV* noalias nocapture swiftself dereferenceable(8), %swift.type* %Self, i8** %SelfWitnessTable) #0 {
entry:
%.value = getelementptr inbounds %T4main3CatV, %T4main3CatV* %1, i32 0, i32 0
%.value._value = getelementptr inbounds %TSi, %TSi* %.value, i32 0, i32 0
%2 = load i64, i64* %.value._value, align 8
%3 = call swiftcc i64 @"$S4main3CatV3fooSiyF"(i64 %2) #5
%._value = getelementptr inbounds %TSi, %TSi* %0, i32 0, i32 0
store i64 %3, i64* %._value, align 8
ret void
}
define hidden swiftcc i64 @"$S4main9useAnimalySixAA0C0RzSi5ValueRtzlF"(%swift.opaque* noalias nocapture, %swift.type* %A, i8** %A.Animal) #0 {
entry:
%1 = alloca %TSi, align 8
%2 = bitcast %TSi* %1 to i8*
call void @llvm.lifetime.start.p0i8(i64 8, i8* %2)
%3 = getelementptr inbounds i8*, i8** %A.Animal, i32 2
%4 = load i8*, i8** %3, align 8, !invariant.load !28
%5 = bitcast i8* %4 to void (%swift.opaque*, %swift.opaque*, %swift.type*, i8**)*
%6 = bitcast %TSi* %1 to %swift.opaque*
call swiftcc void %5(%swift.opaque* noalias nocapture sret %6, %swift.opaque* noalias nocapture swiftself %0, %swift.type* %A, i8** %A.Animal)
%._value = getelementptr inbounds %TSi, %TSi* %1, i32 0, i32 0
%7 = load i64, i64* %._value, align 8
%8 = bitcast %TSi* %1 to i8*
call void @llvm.lifetime.end.p0i8(i64 8, i8* %8)
ret i64 %7
}
define hidden swiftcc i64 @"$S4main6useCatySiAA0C0VF"(i64) #0 {
entry:
%1 = alloca %T4main3CatV, align 8
%2 = bitcast %T4main3CatV* %1 to i8*
call void @llvm.lifetime.start.p0i8(i64 8, i8* %2)
%.value = getelementptr inbounds %T4main3CatV, %T4main3CatV* %1, i32 0, i32 0
%.value._value = getelementptr inbounds %TSi, %TSi* %.value, i32 0, i32 0
store i64 %0, i64* %.value._value, align 8
%3 = bitcast %T4main3CatV* %1 to %swift.opaque*
%4 = call swiftcc i64 @"$S4main9useAnimalySixAA0C0RzSi5ValueRtzlF"(%swift.opaque* noalias nocapture %3, %swift.type* bitcast (i64* getelementptr inbounds (<{ i8**, i64, <{ i32, i32, i32, i32, i32, i32 }>*, i32, [4 x i8] }>, <{ i8**, i64, <{ i32, i32, i32, i32, i32, i32 }>*, i32, [4 x i8] }>* @"$S4main3CatVMf", i32 0, i32 1) to %swift.type*), i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @"$S4main3CatVAA6AnimalAAWP", i32 0, i32 0))
%5 = bitcast %T4main3CatV* %1 to i8*
call void @llvm.lifetime.end.p0i8(i64 8, i8* %5)
ret i64 %4
}
; Function Attrs: noinline
declare swiftcc { %swift.bridge*, i64 } @"$Ss5print_9separator10terminatoryypd_S2StFfA0_"() #2
; Function Attrs: noinline
declare swiftcc { %swift.bridge*, i64 } @"$Ss5print_9separator10terminatoryypd_S2StFfA1_"() #2
; Function Attrs: noinline
declare swiftcc void @"$Ss5print_9separator10terminatoryypd_S2StF"(%swift.bridge*, %swift.bridge*, i64, %swift.bridge*, i64) #2
; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #3
; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #3
declare swiftcc %swift.metadata_response @"$SSiMa"(i64) #0
define hidden i8** @"$S4main3CatVAA6AnimalAAWa"() #0 {
entry:
ret i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @"$S4main3CatVAA6AnimalAAWP", i32 0, i32 0)
}
; Function Attrs: nounwind readnone
define hidden swiftcc %swift.metadata_response @"$S4main3CatVMa"(i64) #4 {
entry:
ret %swift.metadata_response { %swift.type* bitcast (i64* getelementptr inbounds (<{ i8**, i64, <{ i32, i32, i32, i32, i32, i32 }>*, i32, [4 x i8] }>, <{ i8**, i64, <{ i32, i32, i32, i32, i32, i32 }>*, i32, [4 x i8] }>* @"$S4main3CatVMf", i32 0, i32 1) to %swift.type*), i64 0 }
}
attributes #0 = { "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "target-cpu"="penryn" "target-features"="+cx16,+fxsr,+mmx,+sse,+sse2,+sse3,+sse4.1,+ssse3,+x87" }
attributes #1 = { nounwind }
attributes #2 = { noinline "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "target-cpu"="penryn" "target-features"="+cx16,+fxsr,+mmx,+sse,+sse2,+sse3,+sse4.1,+ssse3,+x87" }
attributes #3 = { argmemonly nounwind }
attributes #4 = { nounwind readnone "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "target-cpu"="penryn" "target-features"="+cx16,+fxsr,+mmx,+sse,+sse2,+sse3,+sse4.1,+ssse3,+x87" }
attributes #5 = { noinline }
!llvm.asan.globals = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9, !10, !11, !12, !13, !14, !15, !16}
!llvm.module.flags = !{!17, !18, !19, !20, !21, !22, !23, !24}
!llvm.linker.options = !{!25, !26, !27}
!0 = !{<{ [15 x i8], i8 }>* @"symbolic $S4main6AnimalP", null, null, i1 false, i1 true}
!1 = !{{ i32, i32, i16, i16, i32 }* @"$S4main6Animal_pMF", null, null, i1 false, i1 true}
!2 = !{[2 x %swift.protocol_requirement]* @"$S4main6AnimalWR", null, null, i1 false, i1 true}
!3 = !{%swift.protocol* @"$S4main6AnimalMp", null, null, i1 false, i1 true}
!4 = !{<{ i32, i32, i32 }>* @"$S4mainMXM", null, null, i1 false, i1 true}
!5 = !{<{ i32, i32, i32, i32, i32, i32 }>* @"$S4main3CatVMn", null, null, i1 false, i1 true}
!6 = !{<{ [1 x i8], i32, i8 }>* @"symbolic \01____ 4main3CatV", null, null, i1 false, i1 true}
!7 = !{<{ [2 x i8], i8 }>* @"symbolic Si", null, null, i1 false, i1 true}
!8 = !{[6 x i8]* @4, null, null, i1 false, i1 true}
!9 = !{{ i32, i32, i16, i16, i32, i32, i32, i32 }* @"$S4main3CatVMF", null, null, i1 false, i1 true}
!10 = !{[1 x %swift.protocolref]* @"\01l_protocols", null, null, i1 false, i1 true}
!11 = !{<{ [10 x i8], i8 }>* @"symbolic 4main3CatV", null, null, i1 false, i1 true}
!12 = !{[6 x i8]* @5, null, null, i1 false, i1 true}
!13 = !{{ i32, i32, i32, i32, i32, i32 }* @"$S4main3CatVAA6AnimalAAMA", null, null, i1 false, i1 true}
!14 = !{[1 x i32]* @"\01l_protocol_conformances", null, null, i1 false, i1 true}
!15 = !{[1 x %swift.type_metadata_record]* @"\01l_type_metadata_table", null, null, i1 false, i1 true}
!16 = !{[7 x i8*]* @llvm.used, null, null, i1 false, i1 true}
!17 = !{i32 1, !"Objective-C Version", i32 2}
!18 = !{i32 1, !"Objective-C Image Info Version", i32 0}
!19 = !{i32 1, !"Objective-C Image Info Section", !"__DATA,__objc_imageinfo,regular,no_dead_strip"}
!20 = !{i32 4, !"Objective-C Garbage Collection", i32 1536}
!21 = !{i32 1, !"Objective-C Class Properties", i32 64}
!22 = !{i32 1, !"wchar_size", i32 4}
!23 = !{i32 7, !"PIC Level", i32 2}
!24 = !{i32 1, !"Swift Version", i32 6}
!25 = !{!"-lswiftSwiftOnoneSupport"}
!26 = !{!"-lswiftCore"}
!27 = !{!"-lobjc"}
!28 = !{}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment