|
1 | 1 | // RUN: %target-swift-frontend -swift-version 6 -enable-experimental-feature GenerateForceToMainActorThunks -import-objc-header %S/Inputs/hoptomainactorifneeded.h -emit-silgen %s | %FileCheck %s |
2 | | -// RUN: %target-swift-frontend -swift-version 6 -enable-experimental-feature GenerateForceToMainActorThunks -import-objc-header %S/Inputs/hoptomainactorifneeded.h -emit-ir %s | %FileCheck -check-prefix=IR %s |
| 2 | +// RUN: %target-swift-frontend -swift-version 6 -enable-experimental-feature GenerateForceToMainActorThunks -import-objc-header %S/Inputs/hoptomainactorifneeded.h -emit-lowered-sil %s | %FileCheck -check-prefix=LOWERED %s |
3 | 3 |
|
4 | 4 | // READ THIS: This test validates that basic lowering of hop to main actor if |
5 | 5 | // needed works. For fuller tests that validate that things actually hop, see |
|
26 | 26 |
|
27 | 27 | // Check that we actually emit the thunk and call taskRunOnMainActor. |
28 | 28 | // |
29 | | -// IR-LABEL: define linkonce_odr hidden swiftcc void @"$s22hoptomainactorifneeded11testClosureyyYaFTTH"(ptr %0, ptr %1) |
30 | | -// IR-NEXT: entry: |
31 | | -// IR-NEXT: call swiftcc void @"$ss19_taskRunOnMainActor9operationyyyScMYcc_tF"(ptr %0, ptr %1) |
32 | | -// IR-NEXT: ret void |
33 | | -// IR-NEXT: } |
34 | | - |
35 | | -// Test Closure. We just hop onto the main actor. |
36 | | -// IR-LABEL: define hidden swifttailcc void @"$s22hoptomainactorifneeded11testClosureyyYaF"(ptr swiftasync %0) |
37 | | -// IR: musttail call swifttailcc void @swift_task_switch(ptr swiftasync {{%.*}}, ptr @"$s22hoptomainactorifneeded11testClosureyyYaFTY0_", |
38 | | - |
39 | | -// After we hop onto the main actor, we store the partial apply forwarder to the |
40 | | -// hop to main actor closure. |
41 | | -// |
42 | | -// IR: define internal swifttailcc void @"$s22hoptomainactorifneeded11testClosureyyYaFTY0_"(ptr swiftasync [[ASYNC_CONTEXT:%.*]]) |
43 | | -// IR: %async.ctx.frameptr = getelementptr inbounds i8, ptr [[ASYNC_CONTEXT]], i32 16 |
44 | | -// IR: [[FUNC1:%.*]] = getelementptr inbounds %"$s22hoptomainactorifneeded11testClosureyyYaF.Frame", ptr %async.ctx.frameptr, i32 0, i32 0 |
45 | | -// IR: [[FUNC2:%.*]] = getelementptr inbounds { %objc_block, %swift.function }, ptr [[FUNC1]], i32 0, i32 1 |
46 | | -// IR: [[FUNC3:%.*]] = getelementptr inbounds %swift.function, ptr [[FUNC2]], i32 0, i32 0 |
47 | | -// IR: store ptr @"$s22hoptomainactorifneeded11testClosureyyYaFTTHTA", ptr [[FUNC3]] |
48 | | - |
49 | | -// In the partial apply forwarder, we need to call the actual hop to main actor |
50 | | -// thunk. |
51 | | -// |
52 | | -// IR: define internal swiftcc void @"$s22hoptomainactorifneeded11testClosureyyYaFTTHTA"(ptr swiftself [[FRAME:%.*]]) |
53 | | -// IR-NEXT: entry: |
54 | | -// IR-NEXT: [[FRAME_GEP:%.*]] = getelementptr inbounds <{ %swift.refcounted, %swift.function }>, ptr [[FRAME]], i32 0, i32 1 |
55 | | -// IR-NEXT: [[FUNC2:%.*]] = getelementptr inbounds %swift.function, ptr [[FRAME_GEP]], i32 0, i32 0 |
56 | | -// IR-NEXT: [[FUNC2_LOADED:%.*]] = load ptr, ptr [[FUNC2]] |
57 | | -// IR-NEXT: [[DATA:%.*]] = getelementptr inbounds %swift.function, ptr [[FRAME_GEP]] |
58 | | -// IR-NEXT: [[DATA_LOADED:%.*]] = load ptr, ptr [[DATA]] |
59 | | -// IR-NEXT: tail call swiftcc void @"$s22hoptomainactorifneeded11testClosureyyYaFTTH"(ptr [[FUNC2_LOADED]], ptr [[DATA_LOADED]]) |
60 | | -// IR-NEXT: ret void |
61 | | -// IR-NEXT: } |
62 | | - |
| 29 | +// LOWERED-LABEL: sil shared [thunk] @$s22hoptomainactorifneeded11testClosureyyYaFTTH : $@convention(thin) (@guaranteed @callee_guaranteed () -> ()) -> () { |
| 30 | +// LOWERED: bb0([[ARG:%.*]] : $@callee_guaranteed () -> ()): |
| 31 | +// LOWERED: [[FUNC:%.*]] = function_ref @$ss19_taskRunOnMainActor9operationyyyScMYcc_tF : $@convention(thin) (@guaranteed @callee_guaranteed () -> ()) -> () |
| 32 | +// LOWERED: apply [[FUNC]]([[ARG]]) |
| 33 | +// LOWERED: } // end sil function '$s22hoptomainactorifneeded11testClosureyyYaFTTH |
| 34 | + |
| 35 | +// testClosure. |
| 36 | +// LOWERED-LABEL: sil hidden @$s22hoptomainactorifneeded11testClosureyyYaF : $@convention(thin) @async () -> () { |
| 37 | +// LOWERED: [[CLOSURE:%.*]] = function_ref @$s22hoptomainactorifneeded11testClosureyyYaFyyScMYccfU_ : $@convention(thin) () -> () |
| 38 | +// LOWERED: [[THICK_CLOSURE:%.*]] = thin_to_thick_function [[CLOSURE]] |
| 39 | +// LOWERED: [[THUNK:%.*]] = function_ref @$s22hoptomainactorifneeded11testClosureyyYaFTTH : $@convention(thin) (@guaranteed @callee_guaranteed () -> ()) -> () |
| 40 | +// LOWERED: [[THUNKED_CLOSURE:%.*]] = partial_apply [callee_guaranteed] [[THUNK]]([[THICK_CLOSURE]]) |
| 41 | +// LOWERED: [[BLOCK_STORAGE:%.*]] = alloc_stack $@block_storage |
| 42 | +// LOWERED: [[PROJECT_BLOCK_STORAGE:%.*]] = project_block_storage [[BLOCK_STORAGE]] |
| 43 | +// LOWERED: store [[THUNKED_CLOSURE]] to [[PROJECT_BLOCK_STORAGE]] |
| 44 | +// LOWERED: [[THUNK_THUNK_CALLEE:%.*]] = function_ref @$sIeg_IeyB_TR : $@convention(c) (@inout_aliasable @block_storage @callee_guaranteed () -> ()) -> () |
| 45 | +// LOWERED: [[BLOCK:%.*]] = init_block_storage_header [[BLOCK_STORAGE]] : $*@block_storage @callee_guaranteed () -> (), invoke [[THUNK_THUNK_CALLEE]] |
| 46 | +// LOWERED: [[FINISHED_BLOCK:%.*]] = copy_block [[BLOCK]] |
| 47 | +// LOWERED: [[OPT_BLOCK:%.*]] = enum $Optional<@convention(block) () -> ()>, #Optional.some!enumelt, [[FINISHED_BLOCK]] |
| 48 | +// LOWERED: [[USE_CLOSURE_CALLEE:%.*]] = function_ref @useClosure : $@convention(c) (Optional<@convention(block) () -> ()>) -> () |
| 49 | +// LOWERED: apply [[USE_CLOSURE_CALLEE]]([[OPT_BLOCK]]) |
| 50 | +// LOWERED: } // end sil function '$s22hoptomainactorifneeded11testClosureyyYaF' |
63 | 51 | @MainActor |
64 | 52 | func testClosure() async { |
65 | 53 | useClosure { |
|
0 commit comments