[Distributed] pointer auth protocol pointers as we use conformsToProtocol

This commit is contained in:
Konrad 'ktoso' Malawski
2025-05-08 13:05:53 +09:00
parent 88de66523c
commit d7152c789d

View File

@@ -26,6 +26,7 @@
#include "GenDecl.h"
#include "GenMeta.h"
#include "GenOpaque.h"
#include "GenPointerAuth.h"
#include "GenProto.h"
#include "GenType.h"
#include "IRGenDebugInfo.h"
@@ -588,9 +589,26 @@ static llvm::Value *lookupWitnessTable(IRGenFunction &IGF, llvm::Value *witness,
assert(Lowering::TypeConverter::protocolRequiresWitnessTable(protocol));
auto &IGM = IGF.IGM;
auto *protocolDescriptor = IGM.getAddrOfProtocolDescriptor(protocol);
llvm::Value *protocolDescriptor = IGM.getAddrOfProtocolDescriptor(protocol);
bool signedProtocolDescriptor = IGM.getAvailabilityRange().isContainedIn(
IGM.Context.getSignedConformsToProtocolAvailability());
auto conformsToProtocolFunctionPointer = signedProtocolDescriptor ?
IGM.getConformsToProtocol2FunctionPointer() :
IGM.getConformsToProtocolFunctionPointer();
// Sign the protocol descriptor.
auto schema = IGF.IGM.getOptions().PointerAuth.ProtocolDescriptorsAsArguments;
if (schema && protocolDescriptor) {
auto authInfo = PointerAuthInfo::emit(
IGF, schema, nullptr,
PointerAuthEntity::Special::ProtocolDescriptorAsArgument);
protocolDescriptor = emitPointerAuthSign(IGF, protocolDescriptor, authInfo);
}
auto *witnessTable = IGF.Builder.CreateCall(
IGM.getConformsToProtocolFunctionPointer(), {witness, protocolDescriptor});
conformsToProtocolFunctionPointer, {witness, protocolDescriptor});
auto failBB = IGF.createBasicBlock("missing-witness");
auto contBB = IGF.createBasicBlock("");