Skip to content

Commit a0ef942

Browse files
committed
IRGen: Use the clang type descriminator for TaskContinuationFunction*
rdar://98992498
1 parent 18a211c commit a0ef942

File tree

5 files changed

+15
-2
lines changed

5 files changed

+15
-2
lines changed

include/swift/ABI/MetadataValues.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1428,6 +1428,9 @@ namespace SpecialPointerAuthDiscriminators {
14281428
/// Swift async context parameter stored in the extended frame info.
14291429
const uint16_t SwiftAsyncContextExtendedFrameEntry = 0xc31a; // = 49946
14301430

1431+
// C type TaskContinuationFunction* descriminator.
1432+
const uint16_t ClangTypeTaskContinuationFunction = 0x2abe; // = 10942
1433+
14311434
/// Dispatch integration.
14321435
const uint16_t DispatchInvokeFunction = 0xf493; // = 62611
14331436

include/swift/AST/IRGenOptions.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,9 @@ struct PointerAuthOptions : clang::PointerAuthOptions {
195195
/// Extended existential type shapes in flight.
196196
PointerAuthSchema ExtendedExistentialTypeShape;
197197

198+
// The c type descriminator for TaskContinuationFunction*.
199+
PointerAuthSchema ClangTypeTaskContinuationFunction;
200+
198201
/// Non-unique extended existential type shapes in flight.
199202
PointerAuthSchema NonUniqueExtendedExistentialTypeShape;
200203
};

lib/IRGen/GenCall.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2730,8 +2730,10 @@ class AsyncCallEmission final : public CallEmission {
27302730
auto signedResumeFn = currentResumeFn;
27312731
// Sign the task resume function with the C function pointer schema.
27322732
if (auto schema = IGF.IGM.getOptions().PointerAuth.FunctionPointers) {
2733-
// TODO: use the Clang type for TaskContinuationFunction*
2733+
// Use the Clang type for TaskContinuationFunction*
27342734
// to make this work with type diversity.
2735+
schema =
2736+
IGF.IGM.getOptions().PointerAuth.ClangTypeTaskContinuationFunction;
27352737
auto authInfo =
27362738
PointerAuthInfo::emit(IGF, schema, nullptr, PointerAuthEntity());
27372739
signedResumeFn = emitPointerAuthSign(IGF, signedResumeFn, authInfo);

lib/IRGen/GenFunc.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2469,8 +2469,9 @@ llvm::Function *IRGenFunction::createAsyncSuspendFn() {
24692469

24702470
// Sign the task resume function with the C function pointer schema.
24712471
if (auto schema = IGM.getOptions().PointerAuth.FunctionPointers) {
2472-
// TODO: use the Clang type for TaskContinuationFunction*
2472+
// Use the Clang type for TaskContinuationFunction*
24732473
// to make this work with type diversity.
2474+
schema = IGM.getOptions().PointerAuth.ClangTypeTaskContinuationFunction;
24742475
auto authInfo = PointerAuthInfo::emit(suspendIGF, schema, nullptr,
24752476
PointerAuthEntity());
24762477
resumeFunction = emitPointerAuthSign(suspendIGF, resumeFunction, authInfo);

lib/IRGen/IRGen.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,10 @@ static void setPointerAuthOptions(PointerAuthOptions &opts,
994994
Discrimination::Constant,
995995
SpecialPointerAuthDiscriminators
996996
::NonUniqueExtendedExistentialTypeShape);
997+
998+
opts.ClangTypeTaskContinuationFunction = PointerAuthSchema(
999+
codeKey, /*address*/ false, Discrimination::Constant,
1000+
SpecialPointerAuthDiscriminators::ClangTypeTaskContinuationFunction);
9971001
}
9981002

9991003
std::unique_ptr<llvm::TargetMachine>

0 commit comments

Comments
 (0)