Skip to content

Commit a9ac679

Browse files
committed
Additional sil verifier changes for importing structs with ptrauth qualified fields
Make sure we don't generate struct_extract for ptrauth qualified field
1 parent 75a9137 commit a9ac679

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

lib/SIL/Verifier/SILVerifier.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2342,8 +2342,11 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
23422342
switch (BAI->getAccessKind()) {
23432343
case SILAccessKind::Init:
23442344
case SILAccessKind::Deinit:
2345-
require(BAI->getEnforcement() == SILAccessEnforcement::Static,
2346-
"init/deinit accesses cannot use non-static enforcement");
2345+
// A signed access preserves the access marker until IRGen
2346+
require(
2347+
BAI->getEnforcement() == SILAccessEnforcement::Static ||
2348+
BAI->getEnforcement() == SILAccessEnforcement::Signed,
2349+
"init/deinit accesses cannot use non-static/non-signed enforcement");
23472350
break;
23482351

23492352
case SILAccessKind::Read:
@@ -3286,7 +3289,10 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
32863289
EI->getForwardingOwnershipKind() == OwnershipKind::Guaranteed,
32873290
"invalid forwarding ownership kind on tuple_extract instruction");
32883291

3289-
require(!EI->getStructDecl()->isNonTrivialPtrAuth(),
3292+
require(!EI->getModule()
3293+
.getOptions()
3294+
.EnableImportPtrauthFieldFunctionPointers ||
3295+
!EI->getField()->getPointerAuthQualifier().isPresent(),
32903296
"Imported structs with ptrauth qualified fields should not be "
32913297
"promoted to a value");
32923298

@@ -3337,7 +3343,8 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
33373343
require(EI->getField()->getDeclContext() == sd,
33383344
"struct_element_addr field is not a member of the struct");
33393345

3340-
if (EI->getStructDecl()->isNonTrivialPtrAuth()) {
3346+
if (EI->getModule().getOptions().EnableImportPtrauthFieldFunctionPointers &&
3347+
EI->getField()->getPointerAuthQualifier().isPresent()) {
33413348
for (auto *use : EI->getUses()) {
33423349
auto *bai = dyn_cast<BeginAccessInst>(use->getUser());
33433350
require(bai && bai->getEnforcement() == SILAccessEnforcement::Signed,

0 commit comments

Comments
 (0)