Skip to content

Commit 505a6ee

Browse files
committed
Also store the current executor in the async_continuation_context at the time of
1 parent cca2425 commit 505a6ee

File tree

3 files changed

+16
-4
lines changed

3 files changed

+16
-4
lines changed

lib/IRGen/IRGenFunction.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,11 +567,13 @@ void IRGenFunction::emitGetAsyncContinuation(SILType unsafeContinuationTy,
567567
// IndirectResult *result;
568568
// DirectResult *result;
569569
// };
570+
// ExecutorRef *resumeExecutor;
570571
// } continuation_context; // local variable of current_sil_function
571572
//
572573
// continuation_context.resumeCtxt = currCtxt;
573574
// continuation_context.errResult = nulllptr;
574575
// continuation_context.result = ... // local alloca.
576+
// continuation_context.resumeExecutor = .. // current executor
575577

576578
auto currTask = getAsyncTask();
577579
auto unsafeContinuation =
@@ -621,6 +623,14 @@ void IRGenFunction::emitGetAsyncContinuation(SILType unsafeContinuationTy,
621623
contResultAddr->getType()->getPointerElementType()),
622624
Address(contResultAddr, pointerAlignment));
623625
}
626+
// continuation_context.resumeExecutor = // current executor
627+
auto contExecutorRefAddr =
628+
Builder.CreateStructGEP(continuationContext.getAddress(), 4);
629+
Builder.CreateStore(
630+
Builder.CreateBitOrPointerCast(
631+
getAsyncExecutor(),
632+
contExecutorRefAddr->getType()->getPointerElementType()),
633+
Address(contExecutorRefAddr, pointerAlignment));
624634

625635
// Fill the current task (i.e the continuation) with the continuation
626636
// information.

lib/IRGen/IRGenModule.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -619,9 +619,9 @@ IRGenModule::IRGenModule(IRGenerator &irgen,
619619
*this, "swift.async_task_and_context",
620620
{ SwiftTaskPtrTy, SwiftContextPtrTy });
621621

622-
AsyncContinuationContextTy =
623-
createStructType(*this, "swift.async_continuation_context",
624-
{SwiftContextPtrTy, SizeTy, ErrorPtrTy, OpaquePtrTy});
622+
AsyncContinuationContextTy = createStructType(
623+
*this, "swift.async_continuation_context",
624+
{SwiftContextPtrTy, SizeTy, ErrorPtrTy, OpaquePtrTy, SwiftExecutorPtrTy});
625625
AsyncContinuationContextPtrTy = AsyncContinuationContextTy->getPointerTo();
626626

627627
DifferentiabilityWitnessTy = createStructType(

test/IRGen/async/get_async_continuation.sil

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ bb0:
3030
// CHECK: [[result_addr:%.*]] = getelementptr inbounds %swift.async_continuation_context, %swift.async_continuation_context* [[cont_context]], i32 0, i32 3
3131
// CHECK: [[result_storage_as_opaque:%.*]] = bitcast i32* [[result_storage]] to %swift.opaque*
3232
// CHECK: store %swift.opaque* [[result_storage_as_opaque]], %swift.opaque** [[result_addr]]
33+
// CHECK: [[exectuor_addr:%.*]] = getelementptr inbounds %swift.async_continuation_context, %swift.async_continuation_context* [[cont_context]], i32 0, i32 4
34+
// CHECK: store %swift.executor* %1, %swift.executor** [[exectuor_addr]]
3335
// Initialize the async task with the continuation function and async continuation context.
3436
// CHECK: [[task_continuation_fn_addr:%.*]] = getelementptr inbounds %swift.task, %swift.task* %0, i32 0, i32 3
3537
// CHECK: [[continuation_fn:%.*]] = call i8* @llvm.coro.async.resume()
@@ -73,7 +75,7 @@ bb0:
7375
// CHECK: [[result_addr:%.*]] = load %swift.opaque*, %swift.opaque** [[result_addr_addr]]
7476
// CHECK: [[typed_result_addr:%.*]] = bitcast %swift.opaque* [[result_addr]] to i32*
7577
// CHECK: [[result_value:%.*]] = load i32, i32* [[typed_result_addr]]
76-
// CHECK: br label [[result_bb:[0-9]+]]
78+
// CHECK: br label %[[result_bb:[0-9]+]]
7779

7880
// CHECK: [[result_bb]]:
7981
// CHECK: phi i32 [ [[result_value]], %await.async.normal ]

0 commit comments

Comments
 (0)