Skip to content

Commit 69ff5be

Browse files
Merge pull request #32791 from nate-chandler/generic-metadata-prespecialization-components/consider-conformances-ptrauth
[metadata prespecialization] Ptrauth for compared protocol conformances.
2 parents 7dd220f + 2701a08 commit 69ff5be

File tree

7 files changed

+51
-1
lines changed

7 files changed

+51
-1
lines changed

include/swift/ABI/MetadataValues.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,6 +1118,9 @@ namespace SpecialPointerAuthDiscriminators {
11181118
/// Runtime function variables exported by the runtime.
11191119
const uint16_t RuntimeFunctionEntry = 0x625b;
11201120

1121+
/// Protocol conformance descriptors.
1122+
const uint16_t ProtocolConformanceDescriptor = 0xc6eb;
1123+
11211124
/// Value witness functions.
11221125
const uint16_t InitializeBufferWithCopyOfBuffer = 0xda4a;
11231126
const uint16_t Destroy = 0x04f8;

include/swift/AST/IRGenOptions.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,12 @@ struct PointerAuthOptions : clang::PointerAuthOptions {
123123
/// Type descriptor data pointers when passed as arguments.
124124
PointerAuthSchema TypeDescriptorsAsArguments;
125125

126+
/// Protocol conformance descriptors.
127+
PointerAuthSchema ProtocolConformanceDescriptors;
128+
129+
/// Protocol conformance descriptors when passed as arguments.
130+
PointerAuthSchema ProtocolConformanceDescriptorsAsArguments;
131+
126132
/// Resumption functions from yield-once coroutines.
127133
PointerAuthSchema YieldOnceResumeFunctions;
128134

lib/IRGen/GenPointerAuth.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,9 @@ PointerAuthEntity::getDeclDiscriminator(IRGenModule &IGM) const {
309309
case Special::TypeDescriptor:
310310
case Special::TypeDescriptorAsArgument:
311311
return SpecialPointerAuthDiscriminators::TypeDescriptor;
312+
case Special::ProtocolConformanceDescriptor:
313+
case Special::ProtocolConformanceDescriptorAsArgument:
314+
return SpecialPointerAuthDiscriminators::ProtocolConformanceDescriptor;
312315
case Special::PartialApplyCapture:
313316
return PointerAuthDiscriminator_PartialApplyCapture;
314317
case Special::KeyPathDestroy:

lib/IRGen/GenPointerAuth.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ class PointerAuthEntity {
6262
KeyPathInitializer,
6363
KeyPathMetadataAccessor,
6464
DynamicReplacementKey,
65+
ProtocolConformanceDescriptor,
66+
ProtocolConformanceDescriptorAsArgument,
6567
};
6668

6769
private:

lib/IRGen/IRGen.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,11 @@ static void setPointerAuthOptions(PointerAuthOptions &opts,
656656
opts.SwiftDynamicReplacementKeys =
657657
PointerAuthSchema(dataKey, /*address*/ true, Discrimination::Decl);
658658

659+
opts.ProtocolConformanceDescriptors =
660+
PointerAuthSchema(dataKey, /*address*/ true, Discrimination::Decl);
661+
opts.ProtocolConformanceDescriptorsAsArguments =
662+
PointerAuthSchema(dataKey, /*address*/ false, Discrimination::Decl);
663+
659664
// Coroutine resumption functions are never stored globally in the ABI,
660665
// so we can do some things that aren't normally okay to do. However,
661666
// we can't use ASIB because that would break ARM64 interoperation.

lib/IRGen/MetadataRequest.cpp

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1971,7 +1971,7 @@ static void emitCanonicalSpecializationsForGenericTypeMetadataAccessFunction(
19711971
} else {
19721972
RootProtocolConformance *rootConformance =
19731973
concreteConformance->getRootConformance();
1974-
auto *expectedDescriptor =
1974+
llvm::Value *expectedDescriptor =
19751975
IGF.IGM.getAddrOfProtocolConformanceDescriptor(rootConformance);
19761976
auto *witnessTable = valueAtIndex(requirementIndex);
19771977
auto *witnessBuffer =
@@ -1982,6 +1982,32 @@ static void emitCanonicalSpecializationsForGenericTypeMetadataAccessFunction(
19821982
uncastProvidedDescriptor,
19831983
IGM.ProtocolConformanceDescriptorPtrTy);
19841984

1985+
// Auth the stored descriptor.
1986+
auto storedScheme =
1987+
IGF.IGM.getOptions().PointerAuth.ProtocolConformanceDescriptors;
1988+
if (storedScheme) {
1989+
auto authInfo = PointerAuthInfo::emit(
1990+
IGF, storedScheme, witnessTable,
1991+
PointerAuthEntity::Special::ProtocolConformanceDescriptor);
1992+
providedDescriptor =
1993+
emitPointerAuthAuth(IGF, providedDescriptor, authInfo);
1994+
}
1995+
1996+
// Sign the descriptors.
1997+
auto argScheme =
1998+
IGF.IGM.getOptions()
1999+
.PointerAuth.ProtocolConformanceDescriptorsAsArguments;
2000+
if (argScheme) {
2001+
auto authInfo = PointerAuthInfo::emit(
2002+
IGF, argScheme, nullptr,
2003+
PointerAuthEntity::Special::
2004+
ProtocolConformanceDescriptorAsArgument);
2005+
expectedDescriptor =
2006+
emitPointerAuthSign(IGF, expectedDescriptor, authInfo);
2007+
providedDescriptor =
2008+
emitPointerAuthSign(IGF, providedDescriptor, authInfo);
2009+
}
2010+
19852011
auto *call = IGF.Builder.CreateCall(
19862012
IGF.IGM.getCompareProtocolConformanceDescriptorsFn(),
19872013
{providedDescriptor, expectedDescriptor});

stdlib/public/runtime/Metadata.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4996,6 +4996,11 @@ const WitnessTable *swift::swift_getAssociatedConformanceWitness(
49964996
bool swift::swift_compareProtocolConformanceDescriptors(
49974997
const ProtocolConformanceDescriptor *lhs,
49984998
const ProtocolConformanceDescriptor *rhs) {
4999+
lhs = swift_auth_data_non_address(
5000+
lhs, SpecialPointerAuthDiscriminators::ProtocolConformanceDescriptor);
5001+
rhs = swift_auth_data_non_address(
5002+
rhs, SpecialPointerAuthDiscriminators::ProtocolConformanceDescriptor);
5003+
49995004
return MetadataCacheKey::compareProtocolConformanceDescriptors(lhs, rhs) == 0;
50005005
}
50015006

0 commit comments

Comments
 (0)