Skip to content

Commit 752558c

Browse files
committed
IRGen: fix the LLVM struct definition of AsyncTask.
The object header was missing.
1 parent 3d91d7f commit 752558c

File tree

3 files changed

+8
-4
lines changed

3 files changed

+8
-4
lines changed

lib/IRGen/IRGenFunction.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,7 @@ void IRGenFunction::emitGetAsyncContinuation(SILType unsafeContinuationTy,
634634
// information.
635635
// currTask->ResumeTask = @llvm.coro.async.resume();
636636
assert(currTask->getType() == IGM.SwiftTaskPtrTy);
637-
auto currTaskResumeTaskAddr = Builder.CreateStructGEP(currTask,3);
637+
auto currTaskResumeTaskAddr = Builder.CreateStructGEP(currTask, 4);
638638
auto coroResume =
639639
Builder.CreateIntrinsicCall(llvm::Intrinsic::coro_async_resume, {});
640640

@@ -645,7 +645,7 @@ void IRGenFunction::emitGetAsyncContinuation(SILType unsafeContinuationTy,
645645
Builder.CreateBitOrPointerCast(coroResume, IGM.FunctionPtrTy),
646646
Address(currTaskResumeTaskAddr, pointerAlignment));
647647
// currTask->ResumeContext = &continuation_context;
648-
auto currTaskResumeCtxtAddr = Builder.CreateStructGEP(currTask, 4);
648+
auto currTaskResumeCtxtAddr = Builder.CreateStructGEP(currTask, 5);
649649
Builder.CreateStore(
650650
Builder.CreateBitOrPointerCast(continuationContext.getAddress(),
651651
IGM.SwiftContextPtrTy),

lib/IRGen/IRGenModule.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,13 +594,17 @@ IRGenModule::IRGenModule(IRGenerator &irgen,
594594
{RelativeAddressTy, Int32Ty}, true);
595595
SwiftContextTy = createStructType(*this, "swift.context", {});
596596
auto *ContextPtrTy = llvm::PointerType::getUnqual(SwiftContextTy);
597+
598+
// This must match the definition of class AsyncTask in swift/ABI/Task.h.
597599
SwiftTaskTy = createStructType(*this, "swift.task", {
600+
RefCountedStructTy, // object header
598601
Int8PtrTy, Int8PtrTy, // Job.SchedulerPrivate
599602
Int64Ty, // Job.Flags
600603
FunctionPtrTy, // Job.RunJob/Job.ResumeTask
601604
ContextPtrTy, // Task.ResumeContext
602605
Int64Ty // Task.Status
603606
});
607+
604608
SwiftExecutorTy = createStructType(*this, "swift.executor", {});
605609
AsyncFunctionPointerPtrTy = AsyncFunctionPointerTy->getPointerTo(DefaultAS);
606610
SwiftContextPtrTy = SwiftContextTy->getPointerTo(DefaultAS);

test/IRGen/async/get_async_continuation.sil

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ bb0:
3939
// CHECK: [[exe:%.*]] = load %swift.executor*, %swift.executor** [[exe_addr]]
4040
// CHECK: store %swift.executor* [[exe]], %swift.executor** [[exectuor_addr]]
4141
// Initialize the async task with the continuation function and async continuation context.
42-
// CHECK: [[task_continuation_fn_addr:%.*]] = getelementptr inbounds %swift.task, %swift.task* [[tsk]], i32 0, i32 3
42+
// CHECK: [[task_continuation_fn_addr:%.*]] = getelementptr inbounds %swift.task, %swift.task* [[tsk]], i32 0, i32 4
4343
// CHECK: [[continuation_fn:%.*]] = call i8* @llvm.coro.async.resume()
4444
// CHECK: store i8* [[continuation_fn]], i8** [[task_continuation_fn_addr]]
45-
// CHECK: [[task_resume_context_addr:%.*]] = getelementptr inbounds %swift.task, %swift.task* [[tsk]], i32 0, i32 4
45+
// CHECK: [[task_resume_context_addr:%.*]] = getelementptr inbounds %swift.task, %swift.task* [[tsk]], i32 0, i32 5
4646
// CHECK: [[cont_context2:%.*]] = bitcast %swift.async_continuation_context* [[cont_context]] to %swift.context*
4747
// CHECK: store %swift.context* [[cont_context2]], %swift.context** [[task_resume_context_addr]]
4848
// Initialize the synchronization variable.

0 commit comments

Comments
 (0)