Skip to content

Commit c31cb54

Browse files
committed
[IRGen] Sign TaskResumeContext.
1 parent a25e2cd commit c31cb54

File tree

4 files changed

+29
-7
lines changed

4 files changed

+29
-7
lines changed

include/swift/AST/IRGenOptions.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ struct PointerAuthOptions : clang::PointerAuthOptions {
147147
/// The resume function stored in AsyncTask.
148148
PointerAuthSchema TaskResumeFunction;
149149

150+
/// The async context stored in AsyncTask.
151+
PointerAuthSchema TaskResumeContext;
152+
150153
/// The swift async context entry in the extended frame info.
151154
PointerAuthSchema AsyncContextExtendedFrameEntry;
152155
};

lib/IRGen/IRGen.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,10 @@ static void setPointerAuthOptions(PointerAuthOptions &opts,
703703
PointerAuthSchema(codeKey, /*address*/ true, Discrimination::Constant,
704704
SpecialPointerAuthDiscriminators::TaskResumeFunction);
705705

706+
opts.TaskResumeContext =
707+
PointerAuthSchema(dataKey, /*address*/ true, Discrimination::Constant,
708+
SpecialPointerAuthDiscriminators::TaskResumeContext);
709+
706710
opts.AsyncContextExtendedFrameEntry = PointerAuthSchema(
707711
dataKey, /*address*/ true, Discrimination::Constant,
708712
SpecialPointerAuthDiscriminators::SwiftAsyncContextExtendedFrameEntry);

lib/IRGen/IRGenFunction.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
#include "Callee.h"
2727
#include "Explosion.h"
28+
#include "GenPointerAuth.h"
2829
#include "IRGenDebugInfo.h"
2930
#include "IRGenFunction.h"
3031
#include "IRGenModule.h"
@@ -612,10 +613,16 @@ void IRGenFunction::emitGetAsyncContinuation(SILType resumeTy,
612613
Address(currTaskResumeTaskAddr, pointerAlignment));
613614
// currTask->ResumeContext = &continuation_context;
614615
auto currTaskResumeCtxtAddr = Builder.CreateStructGEP(currTask, 5);
615-
Builder.CreateStore(
616-
Builder.CreateBitOrPointerCast(continuationContext.getAddress(),
617-
IGM.SwiftContextPtrTy),
618-
Address(currTaskResumeCtxtAddr, pointerAlignment));
616+
llvm::Value *continuationContextValue = Builder.CreateBitOrPointerCast(
617+
continuationContext.getAddress(), IGM.SwiftContextPtrTy);
618+
if (auto schema = IGM.getOptions().PointerAuth.TaskResumeContext) {
619+
auto authInfo = PointerAuthInfo::emit(*this, schema, currTaskResumeCtxtAddr,
620+
PointerAuthEntity());
621+
continuationContextValue =
622+
emitPointerAuthSign(*this, continuationContextValue, authInfo);
623+
}
624+
Builder.CreateStore(continuationContextValue,
625+
Address(currTaskResumeCtxtAddr, pointerAlignment));
619626

620627
// Publish all the writes.
621628
// continuation_context.awaitSynchronization =(atomic release) nullptr;

test/IRGen/async/get_async_continuation.sil

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %target-swift-frontend -enable-experimental-concurrency -enable-objc-interop -primary-file %s -emit-ir -sil-verify-all -disable-llvm-optzns -disable-swift-specific-llvm-optzns | %FileCheck %s
1+
// RUN: %target-swift-frontend -enable-experimental-concurrency -enable-objc-interop -primary-file %s -emit-ir -sil-verify-all -disable-llvm-optzns -disable-swift-specific-llvm-optzns | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-cpu
22
// RUN: %target-swift-frontend -enable-experimental-concurrency -enable-objc-interop -primary-file %s -emit-ir -sil-verify-all
33

44
// REQUIRES: concurrency
@@ -41,8 +41,16 @@ bb0:
4141
// CHECK: [[continuation_fn:%.*]] = call i8* @llvm.coro.async.resume()
4242
// CHECK: store i8* [[continuation_fn]], i8** [[task_continuation_fn_addr]]
4343
// CHECK: [[task_resume_context_addr:%.*]] = getelementptr inbounds %swift.task, %swift.task* [[tsk]], i32 0, i32 5
44-
// CHECK: [[cont_context2:%.*]] = bitcast %swift.async_continuation_context* [[cont_context]] to %swift.context*
45-
// CHECK: store %swift.context* [[cont_context2]], %swift.context** [[task_resume_context_addr]]
44+
// CHECK: [[task_resume_context:%.*]] = bitcast %swift.async_continuation_context* [[cont_context]] to %swift.context*
45+
46+
// CHECK-arm64e: [[task_resume_context_addr_int:%[0-9]+]] = ptrtoint %swift.context** [[task_resume_context_addr]] to i64
47+
// CHECK-arm64e: [[ptrauth_blend:%[0-9]+]] = call i64 @llvm.ptrauth.blend.i64(i64 [[task_resume_context_addr_int]], i64 30010)
48+
// CHECK-arm64e: [[task_resume_context_int:%[0-9]+]] = ptrtoint %swift.context* [[task_resume_context]] to i64
49+
// CHECK-arm64e: [[signed_int:%[0-9]+]] = call i64 @llvm.ptrauth.sign.i64(i64 [[task_resume_context_int]], i32 2, i64 [[ptrauth_blend]])
50+
// CHECK-arm64e: [[signed_task_resume_context:%[0-9]+]] = inttoptr i64 [[signed_int]] to %swift.context*
51+
// CHECK-arm64e: store %swift.context* [[signed_task_resume_context]], %swift.context** [[task_resume_context_addr]]
52+
// CHECK-x86_64: store %swift.context* [[task_resume_context]], %swift.context** [[task_resume_context_addr]]
53+
4654
// Initialize the synchronization variable.
4755
// CHECK: [[synchronization_addr:%.*]] = getelementptr inbounds %swift.async_continuation_context, %swift.async_continuation_context* [[cont_context]], i32 0, i32 1
4856
// CHECK: store atomic {{(i64|i32)}} 0, {{(i64|i32)}}* [[synchronization_addr]] release

0 commit comments

Comments
 (0)