Skip to content

Commit 0a2989a

Browse files
committed
[Distributed] pointer auth protocol pointers as we use conformsToProtocol
1 parent 1dda72d commit 0a2989a

File tree

1 file changed

+20
-2
lines changed

1 file changed

+20
-2
lines changed

lib/IRGen/GenDistributed.cpp

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "GenDecl.h"
2727
#include "GenMeta.h"
2828
#include "GenOpaque.h"
29+
#include "GenPointerAuth.h"
2930
#include "GenProto.h"
3031
#include "GenType.h"
3132
#include "IRGenDebugInfo.h"
@@ -589,9 +590,26 @@ static llvm::Value *lookupWitnessTable(IRGenFunction &IGF, llvm::Value *witness,
589590
assert(Lowering::TypeConverter::protocolRequiresWitnessTable(protocol));
590591

591592
auto &IGM = IGF.IGM;
592-
auto *protocolDescriptor = IGM.getAddrOfProtocolDescriptor(protocol);
593+
llvm::Value *protocolDescriptor = IGM.getAddrOfProtocolDescriptor(protocol);
594+
595+
bool signedProtocolDescriptor = IGM.getAvailabilityRange().isContainedIn(
596+
IGM.Context.getSignedConformsToProtocolAvailability());
597+
598+
auto conformsToProtocolFunctionPointer = signedProtocolDescriptor ?
599+
IGM.getConformsToProtocol2FunctionPointer() :
600+
IGM.getConformsToProtocolFunctionPointer();
601+
602+
// Sign the protocol descriptor.
603+
auto schema = IGF.IGM.getOptions().PointerAuth.ProtocolDescriptorsAsArguments;
604+
if (schema && signedProtocolDescriptor) {
605+
auto authInfo = PointerAuthInfo::emit(
606+
IGF, schema, nullptr,
607+
PointerAuthEntity::Special::ProtocolDescriptorAsArgument);
608+
protocolDescriptor = emitPointerAuthSign(IGF, protocolDescriptor, authInfo);
609+
}
610+
593611
auto *witnessTable = IGF.Builder.CreateCall(
594-
IGM.getConformsToProtocolFunctionPointer(), {witness, protocolDescriptor});
612+
conformsToProtocolFunctionPointer, {witness, protocolDescriptor});
595613

596614
auto failBB = IGF.createBasicBlock("missing-witness");
597615
auto contBB = IGF.createBasicBlock("");

0 commit comments

Comments
 (0)