Files
swift-mirror/test/IRGen/protocol_accessor_multifile.swift
Slava Pestov dcb6a8bc55 IRGen: Clean up types of outlined existential buffer operations
The uniquing key for these was just the number of witness tables,
but the function itself referenced the specific existential type
it was instantiated with.

Everything still worked because getOrCreateHelperFunction() would
bitcast an existing function to the correct type, and in practice
the layout of an existential type only depends on the number of
witness tables.

However on master-next, other changes were made that stripped
off the bitcasts. This would result in assertions or LLVM
verifier failures when multiple existential types were used in
a single translation unit.

Fixes <rdar://problem/54780404>.
2019-09-10 16:14:45 -04:00

38 lines
2.0 KiB
Swift

// RUN: %target-swift-frontend -emit-ir -primary-file %s %S/Inputs/protocol_accessor_multifile_other.swift > %t.ll
// RUN: %FileCheck %s -check-prefix CHECK -check-prefix CHECK-%target-runtime < %t.ll
// RUN: %FileCheck -check-prefix NEGATIVE %s < %t.ll
// CHECK: @"$s27protocol_accessor_multifile5ProtoMp" = external{{( dllimport)?}} global
// NEGATIVE-NOT: @"$s27protocol_accessor_multifile10ClassProtoMp" =
// CHECK-LABEL: define{{.*}} void @"$s27protocol_accessor_multifile14useExistentialyyF"()
func useExistential() {
// CHECK: [[BOX:%.+]] = alloca %T27protocol_accessor_multifile5ProtoP,
// CHECK: call swiftcc void @"$s27protocol_accessor_multifile17globalExistentialAA5Proto_pvg"(%T27protocol_accessor_multifile5ProtoP* noalias nocapture sret [[BOX]])
// CHECK: call swiftcc void @"$s27protocol_accessor_multifile5ProtoPAAE6methodyyF"
globalExistential.method()
// CHECK: [[BITCAST:%.*]] = bitcast %T27protocol_accessor_multifile5ProtoP* [[BOX]] to %__opaque_existential_type_1*
// CHECK: call void @__swift_destroy_boxed_opaque_existential_1(%__opaque_existential_type_1* [[BITCAST]])
// CHECK: ret void
}
class GenericContext<T: Proto> {
// CHECK-LABEL: define{{.*}} void @"$s27protocol_accessor_multifile14GenericContextC04testdE0yyFZ
static func testGenericContext() {
// CHECK: [[SELF:%.+]] = bitcast %swift.type* %0 to %swift.type**
// CHECK: [[WITNESS_TABLE:%.+]] = getelementptr inbounds %swift.type*, %swift.type** [[SELF]],
// CHECK: = load %swift.type*, %swift.type** [[WITNESS_TABLE]]
// CHECK: ret void
}
}
// CHECK-LABEL: define{{.*}} void @"$s27protocol_accessor_multifile19useClassExistentialyyF"()
func useClassExistential() {
let g = getClassExistential()
// CHECK-objc: [[G_TYPE:%.+]] = call %swift.type* @swift_getObjectType({{%.+}} {{%.+}})
// CHECK-native: [[G_TYPE:%.+]] = load %swift.type*
// CHECK: call swiftcc void {{%.+}}(i{{32|64}} 1, {{%.+}} {{%.+}}, %swift.type* [[G_TYPE]], i8** {{%.+}})
g?.baseProp = 1
// CHECK: ret void
}