Skip to content

Commit cbdf6e5

Browse files
authored
Merge pull request #63323 from meg-gupta/ptrauthaddrdiversified4
Changes to support imported structs with ptruath qualified field function pointers
2 parents e4cc22f + 082750c commit cbdf6e5

File tree

4 files changed

+27
-3
lines changed

4 files changed

+27
-3
lines changed

lib/SIL/IR/TypeLowering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2292,7 +2292,7 @@ namespace {
22922292
// Classify the type according to its stored properties.
22932293
for (auto field : D->getStoredProperties()) {
22942294
auto pointerAuthQual = field->getPointerAuthQualifier();
2295-
if (pointerAuthQual && pointerAuthQual.isAddressDiscriminated()) {
2295+
if (pointerAuthQual.isPresent()) {
22962296
properties.setAddressOnly();
22972297
}
22982298
auto substFieldType =

lib/SIL/Verifier/SILVerifier.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3286,6 +3286,10 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
32863286
EI->getForwardingOwnershipKind() == OwnershipKind::Guaranteed,
32873287
"invalid forwarding ownership kind on tuple_extract instruction");
32883288

3289+
require(!EI->getStructDecl()->isNonTrivialPtrAuth(),
3290+
"Imported structs with ptrauth qualified fields should not be "
3291+
"promoted to a value");
3292+
32893293
if (EI->getModule().getStage() != SILStage::Lowered) {
32903294
SILType loweredFieldTy = operandTy.getFieldType(
32913295
EI->getField(), F.getModule(), F.getTypeExpansionContext());
@@ -3333,6 +3337,14 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
33333337
require(EI->getField()->getDeclContext() == sd,
33343338
"struct_element_addr field is not a member of the struct");
33353339

3340+
if (EI->getStructDecl()->isNonTrivialPtrAuth()) {
3341+
for (auto *use : EI->getUses()) {
3342+
auto *bai = dyn_cast<BeginAccessInst>(use->getUser());
3343+
require(bai && bai->getEnforcement() == SILAccessEnforcement::Signed,
3344+
"Access to ptrauth qualified fields should be scoped with "
3345+
"begin_access [signed]/end_access");
3346+
}
3347+
}
33363348
if (EI->getModule().getStage() != SILStage::Lowered) {
33373349
SILType loweredFieldTy = operandTy.getFieldType(
33383350
EI->getField(), F.getModule(), F.getTypeExpansionContext());

lib/SILOptimizer/Mandatory/AccessMarkerElimination.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,10 @@ bool AccessMarkerElimination::shouldPreserveAccess(
7777
switch (enforcement) {
7878
case SILAccessEnforcement::Static:
7979
case SILAccessEnforcement::Unsafe:
80-
case SILAccessEnforcement::Signed:
8180
return false;
81+
// Signed access should be preserved until IRGen
82+
case SILAccessEnforcement::Signed:
83+
return true;
8284
case SILAccessEnforcement::Unknown:
8385
case SILAccessEnforcement::Dynamic:
8486
return Mod->getOptions().EnforceExclusivityDynamic;
@@ -100,7 +102,7 @@ AccessMarkerElimination::checkAndEliminateMarker(SILInstruction *inst) {
100102
if (beginAccess->isFromBuiltin())
101103
return inst->getIterator();
102104

103-
// Leave dynamic accesses in place, but delete all others.
105+
// Leave dynamic and signed accesses in place, but delete all others.
104106
if (shouldPreserveAccess(beginAccess->getEnforcement()))
105107
return inst->getIterator();
106108

test/SILGen/ptrauth_field_fptr_import.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,16 @@ func test_field_fn_ptr_swap() {
4848
ptr_to_secure_struct!.pointee.secure_func_ptr2 = t
4949
}
5050

51+
// CHECK-LABEL: sil hidden [ossa] @$s25ptrauth_field_fptr_import05test_B12_fn_ptr_temps5Int32VyF :
52+
// CHECK: [[STK:%.*]] = alloc_stack $SecureStruct, let, name "struct_with_signed_val"
53+
// CHECK: [[FLD:%.*]] = struct_element_addr [[STK]] : $*SecureStruct, #SecureStruct.secure_func_ptr1
54+
// CHECK: [[SIGNED:%.*]] = begin_access [read] [signed] [[FLD]] : $*Optional<@convention(c) () -> Int32>
55+
// CHECK-LABEL: } // end sil function '$s25ptrauth_field_fptr_import05test_B12_fn_ptr_temps5Int32VyF'
56+
func test_field_fn_ptr_temp() -> Int32 {
57+
let struct_with_signed_val = ptr_to_secure_struct.pointee
58+
return struct_with_signed_val.secure_func_ptr1()
59+
}
60+
5161
// CHECK-LABEL: sil hidden [ossa] @$s25ptrauth_field_fptr_import024test_addr_discriminated_B8_fn_reads5Int32VyF :
5262
// CHECK: [[GLOB:%.*]] = global_addr @ptr_to_addr_discriminated_secure_struct : $*Optional<UnsafeMutablePointer<AddressDiscriminatedSecureStruct>>
5363
// CHECK: [[A1:%.*]] = begin_access [read] [dynamic] [[GLOB]] : $*Optional<UnsafeMutablePointer<AddressDiscriminatedSecureStruct>>

0 commit comments

Comments
 (0)