Skip to content

Commit 3550fb2

Browse files
authored
Merge pull request #15146 from gottesmm/pr-b7bf5369b2cbe4f928e33307184710d91decec65
[+0-all-args] Update plus zero tests.
2 parents 5eff528 + 7add2fd commit 3550fb2

File tree

211 files changed

+45341
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

211 files changed

+45341
-0
lines changed

test/ClangImporter/plus_zero_objc_ir.swift

Lines changed: 349 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// REQUIRES: plus_zero_runtime
2+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -I %S/Inputs/custom-modules -enable-sil-ownership -emit-silgen -o - %s | %FileCheck %s
3+
4+
// REQUIRES: objc_interop
5+
6+
import ObjectiveC
7+
import Foundation
8+
import objc_ext
9+
import TestProtocols
10+
11+
class A {
12+
@objc func foo() -> String? {
13+
return ""
14+
}
15+
// CHECK-LABEL: sil hidden [thunk] @$S8optional1AC3fooSSSgyFTo : $@convention(objc_method) (A) -> @autoreleased Optional<NSString>
16+
// CHECK: bb0([[SELF:%.*]] : @unowned $A):
17+
// CHECK: [[SELF_COPY:%.*]] = copy_value [[SELF]]
18+
// CHECK: [[BORROWED_SELF_COPY:%.*]] = begin_borrow [[SELF_COPY]]
19+
// CHECK: [[T0:%.*]] = function_ref @$S8optional1AC3fooSSSgyF
20+
// CHECK-NEXT: [[T1:%.*]] = apply [[T0]]([[BORROWED_SELF_COPY]])
21+
// CHECK-NEXT: end_borrow [[BORROWED_SELF_COPY]] from [[SELF_COPY]]
22+
// CHECK-NEXT: destroy_value [[SELF_COPY]]
23+
// CHECK-NEXT: switch_enum [[T1]] : $Optional<String>, case #Optional.some!enumelt.1: [[SOME_BB:bb[0-9]+]], case #Optional.none!enumelt: [[NONE_BB:bb[0-9]+]]
24+
//
25+
// Something branch: project value, translate, inject into result.
26+
// CHECK: [[SOME_BB]]([[STR:%.*]] : @owned $String):
27+
// CHECK: [[T0:%.*]] = function_ref @$SSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF
28+
// CHECK-NEXT: [[BORROWED_STR:%.*]] = begin_borrow [[STR]]
29+
// CHECK-NEXT: [[T1:%.*]] = apply [[T0]]([[BORROWED_STR]])
30+
// CHECK-NEXT: enum $Optional<NSString>, #Optional.some!enumelt.1, [[T1]]
31+
// CHECK-NEXT: end_borrow [[BORROWED_STR:%.*]] from [[STR]]
32+
// CHECK-NEXT: destroy_value [[STR]]
33+
// CHECK-NEXT: br
34+
// Nothing branch: inject nothing into result.
35+
//
36+
// CHECK: [[NONE_BB]]:
37+
// CHECK-NEXT: enum $Optional<NSString>, #Optional.none!enumelt
38+
// CHECK-NEXT: br
39+
// Continuation.
40+
// CHECK: bb3([[T0:%.*]] : @owned $Optional<NSString>):
41+
// CHECK-NEXT: return [[T0]]
42+
43+
@objc func bar(x x : String?) {}
44+
// CHECK-LABEL: sil hidden [thunk] @$S8optional1AC3bar1xySSSg_tFTo : $@convention(objc_method) (Optional<NSString>, A) -> ()
45+
// CHECK: bb0([[ARG:%.*]] : @unowned $Optional<NSString>, [[SELF:%.*]] : @unowned $A):
46+
// CHECK: [[ARG_COPY:%.*]] = copy_value [[ARG]]
47+
// CHECK: [[SELF_COPY:%.*]] = copy_value [[SELF]]
48+
// CHECK: switch_enum [[ARG_COPY]] : $Optional<NSString>, case #Optional.some!enumelt.1: [[SOME_BB:bb[0-9]+]], case #Optional.none!enumelt: [[NONE_BB:bb[0-9]+]]
49+
//
50+
// Something branch: project value, translate, inject into result.
51+
// CHECK: [[SOME_BB]]([[NSSTR:%.*]] : @owned $NSString):
52+
// CHECK: [[T0:%.*]] = function_ref @$SSS10FoundationE36_unconditionallyBridgeFromObjectiveCySSSo8NSStringCSgFZ
53+
// Make a temporary initialized string that we're going to clobber as part of the conversion process (?).
54+
// CHECK-NEXT: [[NSSTR_BOX:%.*]] = enum $Optional<NSString>, #Optional.some!enumelt.1, [[NSSTR]] : $NSString
55+
// CHECK-NEXT: [[STRING_META:%.*]] = metatype $@thin String.Type
56+
// CHECK-NEXT: [[T1:%.*]] = apply [[T0]]([[NSSTR_BOX]], [[STRING_META]])
57+
// CHECK-NEXT: enum $Optional<String>, #Optional.some!enumelt.1, [[T1]]
58+
// CHECK-NEXT: destroy_value [[NSSTR_BOX]]
59+
// CHECK-NEXT: br
60+
//
61+
// Nothing branch: inject nothing into result.
62+
// CHECK: [[NONE_BB]]:
63+
// CHECK: enum $Optional<String>, #Optional.none!enumelt
64+
// CHECK-NEXT: br
65+
// Continuation.
66+
// CHECK: bb3([[T0:%.*]] : @owned $Optional<String>):
67+
// CHECK: [[BORROWED_T0:%.*]] = begin_borrow [[T0]]
68+
// CHECK: [[BORROWED_SELF_COPY:%.*]] = begin_borrow [[SELF_COPY]]
69+
// CHECK: [[T1:%.*]] = function_ref @$S8optional1AC3bar1xySSSg_tF
70+
// CHECK-NEXT: [[T2:%.*]] = apply [[T1]]([[BORROWED_T0]], [[BORROWED_SELF_COPY]])
71+
// CHECK-NEXT: end_borrow [[BORROWED_SELF_COPY]] from [[SELF_COPY]]
72+
// CHECK-NEXT: end_borrow [[BORROWED_T0]] from [[T0]]
73+
// CHECK-NEXT: destroy_value [[T0]]
74+
// CHECK-NEXT: destroy_value [[SELF_COPY]]
75+
// CHECK-NEXT: return [[T2]] : $()
76+
}
77+
78+
79+
// rdar://15144951
80+
class TestWeak : NSObject {
81+
weak var b : WeakObject? = nil
82+
}
83+
class WeakObject : NSObject {}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// REQUIRES: plus_zero_runtime
2+
// RUN: %empty-directory(%t)
3+
// RUN: %target-swift-frontend -emit-module-path %t/Test.swiftmodule -emit-sil -o /dev/null -module-name Test %s -sdk "" -import-objc-header %S/Inputs/serialization-sil.h -enable-sil-ownership
4+
// RUN: %target-sil-func-extractor %t/Test.swiftmodule -sil-print-debuginfo -func='$S4Test16testPartialApplyyySoAA_pF' -o - | %FileCheck %s
5+
6+
// REQUIRES: objc_interop
7+
8+
// @_transparent to force serialization.
9+
@_transparent
10+
public func testPartialApply(_ obj: Test) {
11+
// CHECK-LABEL: @$S4Test16testPartialApplyyySoAA_pF : $@convention(thin) (@guaranteed Test) -> () {
12+
if let curried1 = obj.normalObject {
13+
// CHECK: dynamic_method_br [[CURRIED1_OBJ:%.+]] : $@opened([[CURRIED1_EXISTENTIAL:.+]]) Test, #Test.normalObject!1.foreign, [[CURRIED1_TRUE:[^,]+]], [[CURRIED1_FALSE:[^,]+]]
14+
// CHECK: [[CURRIED1_FALSE]]:
15+
// CHECK: [[CURRIED1_TRUE]]([[CURRIED1_METHOD:%.+]] : $@convention(objc_method) (@opened([[CURRIED1_EXISTENTIAL]]) Test) -> @autoreleased AnyObject):
16+
// CHECK: [[CURRIED1_PARTIAL:%.+]] = partial_apply [callee_guaranteed] [[CURRIED1_METHOD]]([[CURRIED1_OBJ]]) : $@convention(objc_method) (@opened([[CURRIED1_EXISTENTIAL]]) Test) -> @autoreleased AnyObject
17+
// CHECK: [[CURRIED1_THUNK:%.+]] = function_ref @$SyXlIego_ypIegr_TR : $@convention(thin) (@guaranteed @callee_guaranteed () -> @owned AnyObject) -> @out Any
18+
// CHECK: = partial_apply [callee_guaranteed] [[CURRIED1_THUNK]]([[CURRIED1_PARTIAL]])
19+
curried1()
20+
}
21+
if let curried2 = obj.innerPointer {
22+
// CHECK: dynamic_method_br [[CURRIED2_OBJ:%.+]] : $@opened([[CURRIED2_EXISTENTIAL:.+]]) Test, #Test.innerPointer!1.foreign, [[CURRIED2_TRUE:[^,]+]], [[CURRIED2_FALSE:[^,]+]]
23+
// CHECK: [[CURRIED2_FALSE]]:
24+
// CHECK: [[CURRIED2_TRUE]]([[CURRIED2_METHOD:%.+]] : $@convention(objc_method) (@opened([[CURRIED2_EXISTENTIAL]]) Test) -> @unowned_inner_pointer UnsafeMutableRawPointer):
25+
// CHECK: [[CURRIED2_PARTIAL:%.+]] = partial_apply [callee_guaranteed] [[CURRIED2_METHOD]]([[CURRIED2_OBJ]]) : $@convention(objc_method) (@opened([[CURRIED2_EXISTENTIAL]]) Test) -> @unowned_inner_pointer UnsafeMutableRawPointer
26+
curried2()
27+
}
28+
if let prop1 = obj.normalObjectProp {
29+
// CHECK: dynamic_method_br [[PROP1_OBJ:%.+]] : $@opened([[PROP1_EXISTENTIAL:.+]]) Test, #Test.normalObjectProp!getter.1.foreign, [[PROP1_TRUE:[^,]+]], [[PROP1_FALSE:[^,]+]]
30+
// CHECK: [[PROP1_FALSE]]:
31+
// CHECK: [[PROP1_TRUE]]([[PROP1_METHOD:%.+]] : $@convention(objc_method) (@opened([[PROP1_EXISTENTIAL]]) Test) -> @autoreleased AnyObject):
32+
// CHECK: [[PROP1_PARTIAL:%.+]] = partial_apply [callee_guaranteed] [[PROP1_METHOD]]([[PROP1_OBJ]]) : $@convention(objc_method) (@opened([[PROP1_EXISTENTIAL]]) Test) -> @autoreleased AnyObject
33+
// CHECK: = apply [[PROP1_PARTIAL]]() : $@callee_guaranteed () -> @owned AnyObject
34+
_ = prop1
35+
}
36+
if let prop2 = obj.innerPointerProp {
37+
// CHECK: dynamic_method_br [[PROP2_OBJ:%.+]] : $@opened([[PROP2_EXISTENTIAL:.+]]) Test, #Test.innerPointerProp!getter.1.foreign, [[PROP2_TRUE:[^,]+]], [[PROP2_FALSE:[^,]+]]
38+
// CHECK: [[PROP2_FALSE]]:
39+
// CHECK: [[PROP2_TRUE]]([[PROP2_METHOD:%.+]] : $@convention(objc_method) (@opened([[PROP2_EXISTENTIAL]]) Test) -> @unowned_inner_pointer UnsafeMutableRawPointer):
40+
// CHECK: [[PROP2_PARTIAL:%.+]] = partial_apply [callee_guaranteed] [[PROP2_METHOD]]([[PROP2_OBJ]]) : $@convention(objc_method) (@opened([[PROP2_EXISTENTIAL]]) Test) -> @unowned_inner_pointer UnsafeMutableRawPointer
41+
// CHECK: = apply [[PROP2_PARTIAL]]() : $@callee_guaranteed () -> UnsafeMutableRawPointer
42+
_ = prop2
43+
}
44+
} // CHECK: // end sil function '$S4Test16testPartialApplyyySoAA_pF'
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// REQUIRES: plus_zero_runtime
2+
// rdar://problem/23727705:
3+
// RUN-DISABLED: %target-swift-frontend -O %s -disable-llvm-optzns -emit-ir -g -o - | %FileCheck %s
4+
import StdlibUnittest
5+
6+
// CHECK: define {{.*}}i1 {{.*}}4main4sort
7+
// CHECK: call void @llvm.dbg.value(metadata i8*{{.*}}, metadata ![[A:.*]], metadata ![[P1:.*]])
8+
// CHECK: call void @llvm.dbg.value(metadata i{{[0-9]+}} {{.*}}, metadata ![[A]], metadata ![[P2:.*]])
9+
// CHECK: call void @llvm.dbg.value(metadata i{{[0-9]+}} {{.*}}, metadata ![[A]], metadata ![[P3:.*]])
10+
// CHECK: call void @llvm.dbg.value(metadata i8*{{.*}}, metadata ![[B:.*]], metadata ![[P1]])
11+
// CHECK: call void @llvm.dbg.value(metadata i{{[0-9]+}} {{.*}}, metadata ![[B]], metadata ![[P2]])
12+
// CHECK: call void @llvm.dbg.value(metadata i{{[0-9]+}} {{.*}}, metadata ![[B]], metadata ![[P3]])
13+
// CHECK-DAG: ![[A]] = !DILocalVariable(name: "a",{{.*}} line: 17
14+
// CHECK-DAG: ![[B]] = !DILocalVariable(name: "b",{{.*}} line: 17
15+
// CHECK-DAG: ![[P1]] = !DIExpression(DW_OP_bit_piece, 0, {{(32|64)}})
16+
// CHECK-DAG: ![[P2]] = !DIExpression(DW_OP_bit_piece, {{(32, 32|64, 64)}})
17+
// CHECK-DAG: ![[P3]] = !DIExpression(DW_OP_bit_piece, {{(64, 32|128, 64)}})
18+
public func sort(_ a: String, b: String) -> Bool {
19+
_blackHole("Sorting..\(a) & \(b)")
20+
return (a < b)
21+
}
22+
23+
public func demo() {
24+
let names = ["Sean", "Barry", "Kate"]
25+
let sortedNames = names.sorted(by: sort)
26+
var sortedNamesAsString : String = String()
27+
for name in sortedNames {
28+
sortedNamesAsString += ("\(name), ")
29+
}
30+
_blackHole(sortedNamesAsString)
31+
}
32+
demo()
33+
34+
// At -O0, we should have a single aggregate argument.
35+
// RUN: %target-swift-frontend %s -emit-ir -g -o - | %FileCheck %s --check-prefix=CHECK-O0
36+
// Verify that a reabstraction thunk does not have a line number.
37+
// CHECK-O0-NOT: DW_OP_bit_piece
38+
// CHECK-O0-NOT: DW_OP_bit_piece
39+
// CHECK-O0: !DILocalVariable(name: "a", arg: 1{{.*}} line: 17,
40+
// CHECK-O0-NOT: DW_OP_bit_piece
41+
// CHECK-O0: !DILocalVariable(name: "b", arg: 2{{.*}} line: 17,
42+
// CHECK-O0-NOT: DW_OP_bit_piece
43+
// CHECK-O0: !DISubprogram(linkageName: "$SS2SSbs5Error_pIgggdzo_S2SSbsAA_pIegnndzo_TR",
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// REQUIRES: plus_zero_runtime
2+
// RUN: %target-swift-frontend -primary-file %s -emit-ir -verify -g -o - | %FileCheck %s
3+
4+
func markUsed<T>(_ t: T) {}
5+
6+
protocol AProtocol {
7+
func f() -> String
8+
}
9+
class AClass : AProtocol {
10+
func f() -> String { return "A" }
11+
}
12+
class AnotherClass : AProtocol {
13+
func f() -> String { return "B" }
14+
}
15+
16+
// CHECK-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "$S12generic_args9aFunction{{.*}}D",{{.*}} elements: ![[PROTOS:[0-9]+]]
17+
// CHECK-DAG: ![[PROTOS]] = !{![[INHERIT:.*]]}
18+
// CHECK-DAG: ![[INHERIT]] = !DIDerivedType(tag: DW_TAG_inheritance,{{.*}} baseType: ![[PROTOCOL:[0-9]+]]
19+
// CHECK-DAG: ![[PROTOCOL]] = !DICompositeType(tag: DW_TAG_structure_type, name: "$S12generic_args9AProtocol_pmD",
20+
// CHECK-DAG: !DILocalVariable(name: "x", arg: 1,{{.*}} type: ![[T:.*]])
21+
// CHECK-DAG: ![[T]] = !DICompositeType(tag: DW_TAG_structure_type, name: "$S12generic_args9aFunction
22+
// CHECK-DAG: !DILocalVariable(name: "y", arg: 2,{{.*}} type: ![[Q:.*]])
23+
// CHECK-DAG: ![[Q]] = !DICompositeType(tag: DW_TAG_structure_type, name: "$S12generic_args9aFunction
24+
func aFunction<T : AProtocol, Q : AProtocol>(_ x: T, _ y: Q, _ z: String) {
25+
markUsed("I am in \(z): \(x.f()) \(y.f())")
26+
}
27+
28+
aFunction(AClass(),AnotherClass(),"aFunction")
29+
30+
struct Wrapper<T: AProtocol> {
31+
32+
init<U>(from : Wrapper<U>) {
33+
// CHECK-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "Wrapper",{{.*}} identifier: "$S12generic_args7WrapperVyAC4fromACyxGACyqd__G_tcAA9AProtocolRd__lufcQq_GD")
34+
var wrapped = from
35+
wrapped = from
36+
_ = wrapped
37+
}
38+
39+
func passthrough(_ t: T) -> T {
40+
// The type of local should have the context Wrapper<T>.
41+
// CHECK-DAG: ![[WRAPPER:.*]] = !DICompositeType({{.*}}identifier: "$S12generic_args7WrapperVQq_D")
42+
// CHECK-DAG: !DILocalVariable(name: "local",{{.*}} line: [[@LINE+1]],{{.*}} type: ![[WRAPPER]]
43+
var local = t
44+
local = t
45+
return local
46+
}
47+
}
48+
49+
// CHECK-DAG: ![[FNTY:.*]] = !DICompositeType({{.*}}identifier: "$S12generic_args5apply_1fq_x_q_xXEtr0_lFQq_AaB_ACq_x_q_xXEtr0_lFQq0_Ignr_D"
50+
// CHECK-DAG: !DILocalVariable(name: "f", {{.*}}, line: [[@LINE+1]], type: ![[FNTY]])
51+
func apply<T, U> (_ x: T, f: (T) -> (U)) -> U {
52+
return f(x)
53+
}
54+
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// REQUIRES: plus_zero_runtime
2+
// RUN: %empty-directory(%t)
3+
//
4+
// Compile the external swift module.
5+
// RUN: %target-swift-frontend -g -emit-module -enable-resilience \
6+
// RUN: -emit-module-path=%t/resilient_struct.swiftmodule \
7+
// RUN: -module-name=resilient_struct %S/../Inputs/resilient_struct.swift
8+
//
9+
// RUN: %target-swift-frontend -g -I %t -emit-ir -enable-resilience %s -o - \
10+
// RUN: | %FileCheck %s
11+
//
12+
// RUN: %target-swift-frontend -g -I %t -emit-sil -enable-resilience %s -o - \
13+
// RUN: | %FileCheck %s --check-prefix=CHECK-SIL
14+
// RUN: %target-swift-frontend -g -I %t -emit-sil -enable-resilience %s -o - \
15+
// RUN: -debugger-support | %FileCheck %s --check-prefix=CHECK-LLDB
16+
import resilient_struct
17+
18+
func use<T>(_ t: T) {}
19+
20+
public func f() {
21+
let s1 = Size(w: 1, h: 2)
22+
use(s1)
23+
// CHECK: %[[ADDR:.*]] = alloca i8*
24+
// CHECK: call void @llvm.dbg.declare(metadata i8** %[[ADDR]],
25+
// CHECK-SAME: metadata ![[V1:[0-9]+]],
26+
// CHECK-SAME: metadata !DIExpression(DW_OP_deref))
27+
// CHECK: %[[S1:.*]] = alloca i8,
28+
// CHECK: store i8* %[[S1]], i8** %[[ADDR]]
29+
// CHECK: ![[V1]] = !DILocalVariable(name: "s1", {{.*}}type: ![[TY:[0-9]+]])
30+
// CHECK: ![[TY]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Size",
31+
// FIXME-NOT: size:
32+
// CHECK: =
33+
}
34+
35+
// CHECK-SIL: // f()
36+
// CHECK-LLDB: // f()
37+
// CHECK-SIL: %0 = alloc_stack $Size, let, name "s1"
38+
// CHECK-LLDB: %0 = metatype $@thin Size.Type
39+
// CHECK-LLDB: debug_value %{{.*}} : $Size, let, name "s1"

0 commit comments

Comments
 (0)