Skip to content

Commit 5261c31

Browse files
committed
[IRGen] Sign TaskResumeFunction.
1 parent c31cb54 commit 5261c31

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

lib/IRGen/IRGenFunction.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -608,9 +608,15 @@ void IRGenFunction::emitGetAsyncContinuation(SILType resumeTy,
608608
assert(AsyncCoroutineCurrentResume == nullptr &&
609609
"Don't support nested get_async_continuation");
610610
AsyncCoroutineCurrentResume = coroResume;
611-
Builder.CreateStore(
612-
Builder.CreateBitOrPointerCast(coroResume, IGM.FunctionPtrTy),
613-
Address(currTaskResumeTaskAddr, pointerAlignment));
611+
llvm::Value *coroResumeValue =
612+
Builder.CreateBitOrPointerCast(coroResume, IGM.FunctionPtrTy);
613+
if (auto schema = IGM.getOptions().PointerAuth.TaskResumeFunction) {
614+
auto authInfo = PointerAuthInfo::emit(*this, schema, currTaskResumeTaskAddr,
615+
PointerAuthEntity());
616+
coroResumeValue = emitPointerAuthSign(*this, coroResumeValue, authInfo);
617+
}
618+
Builder.CreateStore(coroResumeValue,
619+
Address(currTaskResumeTaskAddr, pointerAlignment));
614620
// currTask->ResumeContext = &continuation_context;
615621
auto currTaskResumeCtxtAddr = Builder.CreateStructGEP(currTask, 5);
616622
llvm::Value *continuationContextValue = Builder.CreateBitOrPointerCast(

test/IRGen/async/get_async_continuation.sil

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,17 @@ bb0:
3737
// CHECK: [[exe:%.*]] = load %swift.executor*, %swift.executor** [[exe_addr]]
3838
// CHECK: store %swift.executor* [[exe]], %swift.executor** [[exectuor_addr]]
3939
// Initialize the async task with the continuation function and async continuation context.
40-
// CHECK: [[task_continuation_fn_addr:%.*]] = getelementptr inbounds %swift.task, %swift.task* [[tsk]], i32 0, i32 4
40+
// CHECK: [[continuation_fn_addr:%.*]] = getelementptr inbounds %swift.task, %swift.task* [[tsk]], i32 0, i32 4
4141
// CHECK: [[continuation_fn:%.*]] = call i8* @llvm.coro.async.resume()
42-
// CHECK: store i8* [[continuation_fn]], i8** [[task_continuation_fn_addr]]
42+
43+
// CHECK-arm64e: [[continuation_fn_addr_int:%[0-9]+]] = ptrtoint i8** [[continuation_fn_addr]] to i64
44+
// CHECK-arm64e: [[ptrauth_blend:%[0-9]+]] = call i64 @llvm.ptrauth.blend.i64(i64 [[continuation_fn_addr_int]], i64 11330)
45+
// CHECK-arm64e: [[continuation_fn_int:%[0-9]+]] = ptrtoint i8* [[continuation_fn]] to i64
46+
// CHECK-arm64e: [[signed_int:%[0-9]+]] = call i64 @llvm.ptrauth.sign.i64(i64 [[continuation_fn_int]], i32 0, i64 [[ptrauth_blend]])
47+
// CHECK-arm64e: [[signed_continuation_fn:%[0-9]+]] = inttoptr i64 [[signed_int]] to i8*
48+
// CHECK-arm64e: store i8* [[signed_continuation_fn]], i8** [[continuation_fn_addr]]
49+
// CHECK-x86_64: store i8* [[continuation_fn]], i8** [[continuation_fn_addr]]
50+
4351
// CHECK: [[task_resume_context_addr:%.*]] = getelementptr inbounds %swift.task, %swift.task* [[tsk]], i32 0, i32 5
4452
// CHECK: [[task_resume_context:%.*]] = bitcast %swift.async_continuation_context* [[cont_context]] to %swift.context*
4553

0 commit comments

Comments
 (0)