Skip to content

Commit 05fccb1

Browse files
asavonicasl
authored andcommitted
Emit unnamed coroutine continuations functions
1 parent 5fd4f1b commit 05fccb1

File tree

8 files changed

+93
-30
lines changed

8 files changed

+93
-30
lines changed

lib/IRGen/IRGenMangler.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -498,10 +498,6 @@ class IRGenMangler : public Mangle::ASTMangler {
498498
CanType shapeType,
499499
bool isUnique);
500500

501-
std::string mangleCoroutineContinuationPrototype(CanSILFunctionType type) {
502-
return mangleTypeSymbol(type, "TC");
503-
}
504-
505501
std::string mangleReflectionBuiltinDescriptor(Type type) {
506502
const char * const reflectionDescriptorOp = "MB";
507503
if (type->isAnyObject()) {

lib/IRGen/Linking.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -376,8 +376,10 @@ std::string LinkEntity::mangleAsString() const {
376376
}
377377

378378
case Kind::CoroutineContinuationPrototype:
379-
return mangler.mangleCoroutineContinuationPrototype(
380-
cast<SILFunctionType>(getType()));
379+
// Emit unnamed functions for coroutine continuation
380+
// prototypes. These are supposed to be replaced by the LLVM
381+
// coroutine lowering pass.
382+
return std::string();
381383

382384
// An Objective-C class reference reference. The symbol is private, so
383385
// the mangling is unimportant; it should just be readable in LLVM IR.

test/IRGen/partial_apply_coro.sil

Lines changed: 60 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1429,12 +1429,66 @@ bb0(%x : $*T):
14291429
return %p : $@yield_once @callee_guaranteed @substituted <T where T: Copyable, T: Escapable> () -> (@out T, @yields @in T) for <T>
14301430
}
14311431

1432-
// FIXME: Cannot mangle free-standing archetypes
1433-
// sil @partial_apply_dynamic_with_out_param : $@convention(thin) <T> (Int32, @owned @yield_once @callee_guaranteed (Int32) -> (@out T, @yields @in T)) -> @yield_once @callee_guaranteed () -> (@out T, @yields @in T) {
1434-
// bb0(%x : $Int32, %f : $@yield_once @callee_guaranteed (Int32) -> (@out T, @yields @in T)):
1435-
// %p = partial_apply [callee_guaranteed] %f(%x) : $@yield_once @callee_guaranteed (Int32) -> (@out T, @yields @in T)
1436-
// return %p : $@yield_once @callee_guaranteed () -> (@out T, @yields @in T)
1437-
// }
1432+
// CHECK: define {{.*}} { ptr, ptr } @partial_apply_dynamic_with_out_param
1433+
// CHECK-SAME: (i32 %[[ARG1:.*]], ptr %[[ARG_FUNC:.*]], ptr %[[ARG_FUNC_SELF:.*]], ptr %[[TY:.*]])
1434+
// CHECK: entry:
1435+
// CHECK: %[[PA_CTX_BOX:.*]] = call noalias ptr @swift_allocObject(ptr getelementptr inbounds (%swift.full_boxmetadata
1436+
// CHECK: %[[PA_ARG1:.*]] = getelementptr inbounds <{ %swift.refcounted, %Ts5Int32V, [4 x i8], ptr, ptr }>, ptr %[[PA_CTX_BOX]], i32 0, i32 1
1437+
// CHECK: %[[PA_ARG1_INT:.*]] = getelementptr inbounds %Ts5Int32V, ptr %[[PA_ARG1]], i32 0, i32 0
1438+
// CHECK: store i32 %[[ARG1]], ptr %[[PA_ARG1_INT]]
1439+
// CHECK: %[[PA_ARG_FUNC_SELF:.*]] = getelementptr inbounds <{ %swift.refcounted, %Ts5Int32V, [4 x i8], ptr, ptr }>, ptr %[[PA_CTX_BOX]], i32 0, i32 3
1440+
// CHECK: store ptr %[[ARG_FUNC_SELF]], ptr %[[PA_ARG_FUNC_SELF]]
1441+
// CHECK: %[[PA_ARG_FUNC:.*]] = getelementptr inbounds <{ %swift.refcounted, %Ts5Int32V, [4 x i8], ptr, ptr }>, ptr %[[PA_CTX_BOX]], i32 0, i32 4
1442+
// CHECK: store ptr %[[ARG_FUNC]], ptr %[[PA_ARG_FUNC]]
1443+
// CHECK: %[[RET:.*]] = insertvalue { ptr, ptr } { ptr @"$sTA", ptr undef }, ptr %[[PA_CTX_BOX]], 1
1444+
// CHECK: ret { ptr, ptr } %[[RET]]
1445+
// CHECK: }
1446+
1447+
// CHECK: define {{.*}} { ptr, ptr } @"$sTA"
1448+
// CHECK-SAME: (ptr noalias {{.*}} %[[CTX:.*]], ptr %[[INDIRECT_RET:.*]], ptr swiftself %[[PA_CTX_BOX:.*]])
1449+
// CHECK: entry:
1450+
// CHECK: %[[SPILL:.*]] = call ptr @malloc(i64 40)
1451+
// CHECK: store ptr %[[SPILL]], ptr %[[CTX]]
1452+
// CHECK: %[[FRAME:.*]] = getelementptr inbounds %"$sTA.Frame", ptr %[[SPILL]], i32 0, i32 0
1453+
// CHECK: %[[PA_ARG1:.*]] = getelementptr inbounds <{ %swift.refcounted, %Ts5Int32V, [4 x i8], ptr, ptr }>, ptr %[[PA_CTX_BOX]], i32 0, i32 1
1454+
// CHECK: %[[PA_ARG1_INT:.*]] = getelementptr inbounds %Ts5Int32V, ptr %[[PA_ARG1]], i32 0, i32 0
1455+
// CHECK: %[[ARG1:.*]] = load i32, ptr %[[PA_ARG1_INT]]
1456+
// CHECK: %[[PA_ARG_FUNC_SELF:.*]] = getelementptr inbounds <{ %swift.refcounted, %Ts5Int32V, [4 x i8], ptr, ptr }>, ptr %[[PA_CTX_BOX]], i32 0, i32 3
1457+
// CHECK: %[[ARG_FUNC_SELF:.*]] = load ptr, ptr %[[PA_ARG_FUNC_SELF]]
1458+
// CHECK: %[[PA_ARG_FUNC:.*]] = getelementptr inbounds <{ %swift.refcounted, %Ts5Int32V, [4 x i8], ptr, ptr }>, ptr %[[PA_CTX_BOX]], i32 0, i32 4
1459+
// CHECK: %[[ARG_FUNC:.*]] = load ptr, ptr %[[PA_ARG_FUNC]]
1460+
// CHECK: %[[FRAMEPTR:.*]] = getelementptr inbounds [32 x i8], ptr %[[FRAME]], i32 0, i32 0
1461+
// CHECK: call void @llvm.lifetime.start.p0(i64 32, ptr %[[FRAMEPTR]])
1462+
// CHECK: %[[YIELD_PAIR:.*]] = call swiftcc { ptr, ptr } %[[ARG_FUNC]](ptr noalias {{.*}} %[[FRAMEPTR]], ptr %[[INDIRECT_RET]], i32 %[[ARG1]], ptr swiftself %[[ARG_FUNC_SELF]])
1463+
// CHECK: %[[RESUME:.*]] = extractvalue { ptr, ptr } %[[YIELD_PAIR]], 0
1464+
// CHECK: %[[SPILL1:.*]] = getelementptr inbounds %"$sTA.Frame", ptr %[[SPILL]], i32 0, i32 1
1465+
// CHECK: store ptr %[[RESUME]], ptr %[[SPILL1]]
1466+
// CHECK: %[[YIELD:.*]] = extractvalue { ptr, ptr } %[[YIELD_PAIR]], 1
1467+
// CHECK: %[[RET0:.*]] = insertvalue { ptr, ptr } poison, ptr @"$sTA.resume.0", 0
1468+
// CHECK: %[[RET1:.*]] = insertvalue { ptr, ptr } %[[RET0]], ptr %[[YIELD]], 1
1469+
// CHECK: ret { ptr, ptr } %[[RET1]]
1470+
// CHECK: }
1471+
1472+
sil @partial_apply_dynamic_with_out_param : $@convention(thin) <T> (Int32, @owned @yield_once @callee_guaranteed (Int32) -> (@out T, @yields @in T)) -> @yield_once @callee_guaranteed () -> (@out T, @yields @in T) {
1473+
bb0(%x : $Int32, %f : $@yield_once @callee_guaranteed (Int32) -> (@out T, @yields @in T)):
1474+
%p = partial_apply [callee_guaranteed] %f(%x) : $@yield_once @callee_guaranteed (Int32) -> (@out T, @yields @in T)
1475+
return %p : $@yield_once @callee_guaranteed () -> (@out T, @yields @in T)
1476+
}
1477+
1478+
// Verify that the partial apply function is unique (even if it is not uniquely mangled)
1479+
//
1480+
// CHECK: define {{.*}} { ptr, ptr } @partial_apply_dynamic_with_out_param_another
1481+
// CHECK: entry:
1482+
// CHECK: %[[PA_CTX_BOX:.*]] = call noalias ptr @swift_allocObject(ptr getelementptr inbounds (%swift.full_boxmetadata
1483+
// CHECK: %[[RET:.*]] = insertvalue { ptr, ptr } { ptr @"$sTA.{{.*}}", ptr undef }, ptr %[[PA_CTX_BOX]], 1
1484+
// CHECK: ret { ptr, ptr } %[[RET]]
1485+
// CHECK: }
1486+
1487+
sil @partial_apply_dynamic_with_out_param_another : $@convention(thin) <T> (Int64, @owned @yield_once @callee_guaranteed (Int64) -> (@out T, @yields @in T)) -> @yield_once @callee_guaranteed () -> (@out T, @yields @in T) {
1488+
bb0(%x : $Int64, %f : $@yield_once @callee_guaranteed (Int64) -> (@out T, @yields @in T)):
1489+
%p = partial_apply [callee_guaranteed] %f(%x) : $@yield_once @callee_guaranteed (Int64) -> (@out T, @yields @in T)
1490+
return %p : $@yield_once @callee_guaranteed () -> (@out T, @yields @in T)
1491+
}
14381492

14391493
class Base {
14401494
}

test/IRGen/yield_once.sil

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ sil @marker : $(Builtin.Int32) -> ()
1010
// CHECK-SAME: [[CORO_ATTRIBUTES:#[0-9]+]]
1111
sil @test_simple : $@yield_once () -> () {
1212
entry:
13-
// CHECK-32: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:4]], ptr %0, ptr @"$sIetA_TC", ptr @malloc, ptr @free)
14-
// CHECK-64: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:8]], ptr %0, ptr @"$sIetA_TC", ptr @malloc, ptr @free)
13+
// CHECK-32: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:4]], ptr %0, ptr @[[CONT_FN:[0-9]+]], ptr @malloc, ptr @free)
14+
// CHECK-64: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:8]], ptr %0, ptr @[[CONT_FN:[0-9]+]], ptr @malloc, ptr @free)
1515
// CHECK-NEXT: [[BEGIN:%.*]] = call ptr @llvm.coro.begin(token [[ID]], ptr null)
1616

1717
// CHECK-NEXT: call swiftcc void @marker(i32 1000)
@@ -43,7 +43,8 @@ unwind:
4343
// CHECK-NEXT: unreachable
4444
}
4545

46-
// CHECK-LABEL: declare{{( dllimport)?}}{{( protected)?}} swiftcc void @"$sIetA_TC"
46+
// CHECK-LABEL: declare{{( dllimport)?}}{{( protected)?}} swiftcc
47+
// CHECK-SAME: void @[[CONT_FN]]
4748
// CHECK-SAME: (ptr noalias dereferenceable([[BUFFER_SIZE]]), i1)
4849

4950
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @test_simple_call(i1 %0)

test/IRGen/yield_once_big.sil

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ entry:
4444
// CHECK-64-SAME: , align 8
4545

4646
// Coroutine setup.
47-
// CHECK-32-NEXT: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:4]], ptr %0, ptr @"$s14yield_once_big3BigVyxGAA9SomeClassCRbzlIetAYi_TC", ptr @malloc, ptr @free)
48-
// CHECK-64-NEXT: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:8]], ptr %0, ptr @"$s14yield_once_big3BigVyxGAA9SomeClassCRbzlIetAYi_TC", ptr @malloc, ptr @free)
47+
// CHECK-32-NEXT: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:4]], ptr %0, ptr @[[CONT_FN:[0-9]+]], ptr @malloc, ptr @free)
48+
// CHECK-64-NEXT: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:8]], ptr %0, ptr @[[CONT_FN:[0-9]+]], ptr @malloc, ptr @free)
4949
// CHECK-NEXT: [[BEGIN:%.*]] = call ptr @llvm.coro.begin(token [[ID]], ptr null)
5050
// CHECK-NEXT: store ptr
5151

@@ -89,7 +89,8 @@ unwind:
8989
// CHECK-NEXT: unreachable
9090
}
9191

92-
// CHECK-LABEL: declare{{( dllimport)?}}{{( protected)?}} swiftcc void @"$s14yield_once_big3BigVyxGAA9SomeClassCRbzlIetAYi_TC"
92+
// CHECK-LABEL: declare{{( dllimport)?}}{{( protected)?}}
93+
// CHECK-SAME: swiftcc void @[[CONT_FN]]
9394
// CHECK-SAME: (ptr noalias dereferenceable([[BUFFER_SIZE]]), i1)
9495

9596
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @test_simple_call(i1 %0)
@@ -181,8 +182,8 @@ entry(%arg : $*BigWrapper<C>):
181182
// CHECK-64-SAME: , align 8
182183

183184
// Coroutine setup.
184-
// CHECK-32-NEXT: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:4]], ptr %0, ptr @"$s14yield_once_big10BigWrapperVyxGAA0D0VyxGAA9SomeClassCRbzlIetAnYn_TC", ptr @malloc, ptr @free)
185-
// CHECK-64-NEXT: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:8]], ptr %0, ptr @"$s14yield_once_big10BigWrapperVyxGAA0D0VyxGAA9SomeClassCRbzlIetAnYn_TC", ptr @malloc, ptr @free)
185+
// CHECK-32-NEXT: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:4]], ptr %0, ptr @[[CONT_FN:[0-9]+]], ptr @malloc, ptr @free)
186+
// CHECK-64-NEXT: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:8]], ptr %0, ptr @[[CONT_FN:[0-9]+]], ptr @malloc, ptr @free)
186187
// CHECK-NEXT: [[BEGIN:%.*]] = call ptr @llvm.coro.begin(token [[ID]], ptr null)
187188
// CHECK-NEXT: store ptr
188189

@@ -236,3 +237,7 @@ unwind:
236237
// CHECK: call i1 @llvm.coro.end(ptr [[BEGIN]], i1 false, token none)
237238
// CHECK-NEXT: unreachable
238239
}
240+
241+
// CHECK-LABEL: declare{{( dllimport)?}}{{( protected)?}}
242+
// CHECK-SAME: swiftcc void @[[CONT_FN]]
243+
// CHECK-SAME: (ptr noalias dereferenceable([[BUFFER_SIZE]]), i1)

test/IRGen/yield_once_biggish.sil

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ entry:
4040
// CHECK-64-SAME: , align 8
4141

4242
// Coroutine setup.
43-
// CHECK-32-NEXT: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:4]], ptr %0, ptr @"$s18yield_once_biggish7BiggishVyxGAA9SomeClassCRbzlIetAYx_TC", ptr @malloc, ptr @free)
44-
// CHECK-64-NEXT: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:8]], ptr %0, ptr @"$s18yield_once_biggish7BiggishVyxGAA9SomeClassCRbzlIetAYx_TC", ptr @malloc, ptr @free)
43+
// CHECK-32-NEXT: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:4]], ptr %0, ptr @[[CONT_FN:[0-9]+]], ptr @malloc, ptr @free)
44+
// CHECK-64-NEXT: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:8]], ptr %0, ptr @[[CONT_FN:[0-9]+]], ptr @malloc, ptr @free)
4545
// CHECK-NEXT: [[BEGIN:%.*]] = call ptr @llvm.coro.begin(token [[ID]], ptr null)
4646
// CHECK-NEXT: store ptr
4747
// CHECK-NEXT: call swiftcc void @marker(i32 1000)
@@ -93,7 +93,8 @@ unwind:
9393
// CHECK-NEXT: unreachable
9494
}
9595

96-
// CHECK-LABEL: declare{{( dllimport)?}}{{( protected)?}} swiftcc void @"$s18yield_once_biggish7BiggishVyxGAA9SomeClassCRbzlIetAYx_TC"
96+
// CHECK-LABEL: declare{{( dllimport)?}}{{( protected)?}}
97+
// CHECK-SAME: swiftcc void @[[CONT_FN:[0-9]+]]
9798
// CHECK-SAME: (ptr noalias dereferenceable([[BUFFER_SIZE]]), i1)
9899

99100
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @test_simple_call(i1 %0)

test/IRGen/yield_once_indirect.sil

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ entry:
3030
// CHECK-64-SAME: , align 8
3131

3232
// Coroutine setup.
33-
// CHECK-32-NEXT: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:4]], ptr %0, ptr @"$s19yield_once_indirect8IndirectVyxGAA9SomeClassCRbzlIetAYi_TC", ptr @malloc, ptr @free)
34-
// CHECK-64-NEXT: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:8]], ptr %0, ptr @"$s19yield_once_indirect8IndirectVyxGAA9SomeClassCRbzlIetAYi_TC", ptr @malloc, ptr @free)
33+
// CHECK-32-NEXT: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:4]], ptr %0, ptr @[[CONT_FN:[0-9]+]], ptr @malloc, ptr @free)
34+
// CHECK-64-NEXT: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:8]], ptr %0, ptr @[[CONT_FN:[0-9]+]], ptr @malloc, ptr @free)
3535
// CHECK-NEXT: [[BEGIN:%.*]] = call ptr @llvm.coro.begin(token [[ID]], ptr null)
3636
// CHECK-NEXT: store ptr
3737
// CHECK-NEXT: call swiftcc void @marker(i32 1000)
@@ -80,7 +80,8 @@ unwind:
8080
// CHECK-NEXT: unreachable
8181
}
8282

83-
// CHECK-LABEL: declare{{( dllimport)?}}{{( protected)?}} swiftcc void @"$s19yield_once_indirect8IndirectVyxGAA9SomeClassCRbzlIetAYi_TC"
83+
// CHECK-LABEL: declare{{( dllimport)?}}{{( protected)?}}
84+
// CHECK-SAME: swiftcc void @[[CONT_FN]]
8485
// CHECK-SAME: (ptr noalias dereferenceable([[BUFFER_SIZE]]), i1)
8586

8687
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @test_simple_call(i1 %0)

test/IRGen/yield_result.sil

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ sil @coro_ret_pair : $@yield_once @convention(thin) () -> (@yields Builtin.Int64
1313
// CHECK-SAME: [[CORO_ATTRIBUTES:#[0-9]+]]
1414
sil @test_simple : $@yield_once () -> (Builtin.Int64) {
1515
entry:
16-
// CHECK-32: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:4]], ptr %0, ptr @"$sBi64_IetAd_TC{{(.ptrauth)?}}", ptr @malloc, ptr @free)
17-
// CHECK-64: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:8]], ptr %0, ptr @"$sBi64_IetAd_TC{{(.ptrauth)?}}", ptr @malloc, ptr @free)
16+
// CHECK-32: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:4]], ptr %0, ptr @[[CONT_FN:[0-9]+]], ptr @malloc, ptr @free)
17+
// CHECK-64: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:8]], ptr %0, ptr @[[CONT_FN:[0-9]+]], ptr @malloc, ptr @free)
1818
// CHECK-NEXT: [[BEGIN:%.*]] = call ptr @llvm.coro.begin(token [[ID]], ptr null)
1919

2020
// CHECK-NEXT: call swiftcc void @marker(i64 1000)
@@ -47,6 +47,9 @@ unwind:
4747
// CHECK-NEXT: unreachable
4848
}
4949

50+
// CHECK-LABEL: declare{{( dllimport)?}}{{( protected)?}}
51+
// CHECK-SAME: swiftcc i64 @[[CONT_FN]]
52+
// CHECK-SAME: (ptr noalias dereferenceable([[BUFFER_SIZE]]), i1)
5053

5154
// CHECK-LABEL: test_coro_ret
5255
sil @test_coro_ret : $() -> (Builtin.Int64, Builtin.Int64, Builtin.Int64) {
@@ -96,8 +99,8 @@ entry:
9699
// CHECK-SAME: ptr{{.*}} [[CTX:%.*]], ptr{{.*}} [[INDIRECT_RET:%.*]], ptr{{.*}} [[ARG:%.*]], ptr{{.*}} [[TYPE:%.*]])
97100
sil @coro_ret_indirect : $@yield_once @convention(thin) <T> (@in T) -> (@yields @in T, @out T) {
98101
bb0(%outt : $*T, %t : $*T):
99-
// CHECK-32: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:4]], ptr [[CTX]], ptr @"$sxxxlIetAirYi_TC{{(.ptrauth)?}}", ptr @malloc, ptr @free)
100-
// CHECK-64: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:8]], ptr [[CTX]], ptr @"$sxxxlIetAirYi_TC{{(.ptrauth)?}}", ptr @malloc, ptr @free)
102+
// CHECK-32: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:4]], ptr [[CTX]], ptr @[[CONT_FN:[0-9]+]], ptr @malloc, ptr @free)
103+
// CHECK-64: [[ID:%.*]] = call token @llvm.coro.id.retcon.once(i32 [[BUFFER_SIZE]], i32 [[BUFFER_ALIGN:8]], ptr [[CTX]], ptr @[[CONT_FN:[0-9]+]], ptr @malloc, ptr @free)
101104

102105
// CHECK: [[IS_UNWIND:%.*]] = call i1 (...) @llvm.coro.suspend.retcon.i1(ptr [[ARG]])
103106
// CHECK: br i1 [[IS_UNWIND]], label %[[UNWIND_BB:.*]], label %[[RESUME_BB:.*]]

0 commit comments

Comments
 (0)