Skip to content

Commit 8f66bf1

Browse files
authored
Merge pull request #77270 from kubamracek/embedded-concurrency-arm64e
[Concurrency] Fix arm64e ptrauth violations in Embedded Swift Concurrency
2 parents 432c9d4 + cf7ea30 commit 8f66bf1

File tree

3 files changed

+66
-16
lines changed

3 files changed

+66
-16
lines changed

include/swift/ABI/TaskOptions.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,9 +194,17 @@ class ResultTypeInfoTaskOptionRecord : public TaskOptionRecord {
194194
public:
195195
size_t size;
196196
size_t alignMask;
197-
void (*initializeWithCopy)(OpaqueValue *, OpaqueValue *);
198-
void (*storeEnumTagSinglePayload)(OpaqueValue *, unsigned, unsigned);
199-
void (*destroy)(OpaqueValue *);
197+
198+
void (*__ptrauth_swift_value_witness_function_pointer(
199+
SpecialPointerAuthDiscriminators::InitializeWithCopy)
200+
initializeWithCopy)(OpaqueValue *, OpaqueValue *);
201+
202+
void (*__ptrauth_swift_value_witness_function_pointer(
203+
SpecialPointerAuthDiscriminators::StoreEnumTagSinglePayload)
204+
storeEnumTagSinglePayload)(OpaqueValue *, unsigned, unsigned);
205+
206+
void (*__ptrauth_swift_value_witness_function_pointer(
207+
SpecialPointerAuthDiscriminators::Destroy) destroy)(OpaqueValue *);
200208

201209
static bool classof(const TaskOptionRecord *record) {
202210
return record->getKind() == TaskOptionRecordKind::ResultTypeInfo;

lib/IRGen/GenConcurrency.cpp

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "BitPatternBuilder.h"
2121
#include "ExtraInhabitants.h"
2222
#include "GenCall.h"
23+
#include "GenPointerAuth.h"
2324
#include "GenProto.h"
2425
#include "GenType.h"
2526
#include "IRGenDebugInfo.h"
@@ -584,22 +585,50 @@ struct EmbeddedSwiftResultTypeOptionRecordTraits {
584585
IGF.Builder.CreateStore(
585586
TI.getStaticAlignmentMask(IGF.IGM),
586587
IGF.Builder.CreateStructGEP(optionsRecord, 2, Size()));
588+
589+
auto schema = IGF.getOptions().PointerAuth.ValueWitnesses;
587590
// initializeWithCopy witness
588-
IGF.Builder.CreateStore(
589-
IGF.IGM.getOrCreateValueWitnessFunction(
590-
ValueWitness::InitializeWithCopy, packing, canType, lowered, TI),
591-
IGF.Builder.CreateStructGEP(optionsRecord, 3, Size()));
591+
{
592+
auto gep = IGF.Builder.CreateStructGEP(optionsRecord, 3, Size());
593+
llvm::Value *witness = IGF.IGM.getOrCreateValueWitnessFunction(
594+
ValueWitness::InitializeWithCopy, packing, canType, lowered, TI);
595+
auto discriminator = llvm::ConstantInt::get(
596+
IGF.IGM.Int64Ty,
597+
SpecialPointerAuthDiscriminators::InitializeWithCopy);
598+
auto storageAddress = gep.getAddress();
599+
auto info =
600+
PointerAuthInfo::emit(IGF, schema, storageAddress, discriminator);
601+
if (schema) witness = emitPointerAuthSign(IGF, witness, info);
602+
IGF.Builder.CreateStore(witness, gep);
603+
}
592604
// storeEnumTagSinglePayload witness
593-
IGF.Builder.CreateStore(
594-
IGF.IGM.getOrCreateValueWitnessFunction(
595-
ValueWitness::StoreEnumTagSinglePayload, packing, canType, lowered,
596-
TI),
597-
IGF.Builder.CreateStructGEP(optionsRecord, 4, Size()));
605+
{
606+
auto gep = IGF.Builder.CreateStructGEP(optionsRecord, 4, Size());
607+
llvm::Value *witness = IGF.IGM.getOrCreateValueWitnessFunction(
608+
ValueWitness::StoreEnumTagSinglePayload, packing, canType, lowered,
609+
TI);
610+
auto discriminator = llvm::ConstantInt::get(
611+
IGF.IGM.Int64Ty,
612+
SpecialPointerAuthDiscriminators::StoreEnumTagSinglePayload);
613+
auto storageAddress = gep.getAddress();
614+
auto info =
615+
PointerAuthInfo::emit(IGF, schema, storageAddress, discriminator);
616+
if (schema) witness = emitPointerAuthSign(IGF, witness, info);
617+
IGF.Builder.CreateStore(witness, gep);
618+
}
598619
// destroy witness
599-
IGF.Builder.CreateStore(
600-
IGF.IGM.getOrCreateValueWitnessFunction(ValueWitness::Destroy, packing,
601-
canType, lowered, TI),
602-
IGF.Builder.CreateStructGEP(optionsRecord, 5, Size()));
620+
{
621+
auto gep = IGF.Builder.CreateStructGEP(optionsRecord, 5, Size());
622+
llvm::Value *witness = IGF.IGM.getOrCreateValueWitnessFunction(
623+
ValueWitness::Destroy, packing, canType, lowered, TI);
624+
auto discriminator = llvm::ConstantInt::get(
625+
IGF.IGM.Int64Ty, SpecialPointerAuthDiscriminators::Destroy);
626+
auto storageAddress = gep.getAddress();
627+
auto info =
628+
PointerAuthInfo::emit(IGF, schema, storageAddress, discriminator);
629+
if (schema) witness = emitPointerAuthSign(IGF, witness, info);
630+
IGF.Builder.CreateStore(witness, gep);
631+
}
603632
}
604633
};
605634
} // end anonymous namespace

stdlib/public/Concurrency/Actor.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1782,9 +1782,14 @@ void DefaultActorImpl::deallocate() {
17821782
void DefaultActorImpl::deallocateUnconditional() {
17831783
concurrency::trace::actor_deallocate(this);
17841784

1785+
#if !SWIFT_CONCURRENCY_EMBEDDED
17851786
auto metadata = cast<ClassMetadata>(this->metadata);
17861787
swift_deallocClassInstance(this, metadata->getInstanceSize(),
17871788
metadata->getInstanceAlignMask());
1789+
#else
1790+
// Embedded Swift's runtime doesn't actually use the size/mask values.
1791+
swift_deallocClassInstance(this, 0, 0);
1792+
#endif
17881793
}
17891794

17901795
bool DefaultActorImpl::tryLock(bool asDrainer) {
@@ -2107,12 +2112,16 @@ static bool isDefaultActorClass(const ClassMetadata *metadata) {
21072112
}
21082113

21092114
void swift::swift_defaultActor_deallocateResilient(HeapObject *actor) {
2115+
#if !SWIFT_CONCURRENCY_EMBEDDED
21102116
auto metadata = cast<ClassMetadata>(actor->metadata);
21112117
if (isDefaultActorClass(metadata))
21122118
return swift_defaultActor_deallocate(static_cast<DefaultActor*>(actor));
21132119

21142120
swift_deallocObject(actor, metadata->getInstanceSize(),
21152121
metadata->getInstanceAlignMask());
2122+
#else
2123+
return swift_defaultActor_deallocate(static_cast<DefaultActor*>(actor));
2124+
#endif
21162125
}
21172126

21182127
/// FIXME: only exists for the quick-and-dirty MainActor implementation.
@@ -2550,12 +2559,16 @@ swift::swift_distributedActor_remote_initialize(const Metadata *actorType) {
25502559
}
25512560

25522561
bool swift::swift_distributed_actor_is_remote(HeapObject *_actor) {
2562+
#if !SWIFT_CONCURRENCY_EMBEDDED
25532563
const ClassMetadata *metadata = cast<ClassMetadata>(_actor->metadata);
25542564
if (isDefaultActorClass(metadata)) {
25552565
return asImpl(reinterpret_cast<DefaultActor *>(_actor))->isDistributedRemote();
25562566
} else {
25572567
return asImpl(reinterpret_cast<NonDefaultDistributedActor *>(_actor))->isDistributedRemote();
25582568
}
2569+
#else
2570+
return false;
2571+
#endif
25592572
}
25602573

25612574
bool DefaultActorImpl::isDistributedRemote() {

0 commit comments

Comments
 (0)