Skip to content

Commit bb68264

Browse files
committed
Allow disabling ownership verification via blocklists
1 parent fe00d20 commit bb68264

File tree

3 files changed

+48
-15
lines changed

3 files changed

+48
-15
lines changed

include/swift/Basic/BlockListAction.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@ BLOCKLIST_ACTION(ShouldUseBinaryModule)
2323
BLOCKLIST_ACTION(ShouldUseTextualModule)
2424
BLOCKLIST_ACTION(DowngradeInterfaceVerificationFailure)
2525
BLOCKLIST_ACTION(ShouldUseLayoutStringValueWitnesses)
26+
BLOCKLIST_ACTION(ShouldDisableOwnershipVerification)
2627

2728
#undef BLOCKLIST_ACTION

lib/SIL/Verifier/SILOwnershipVerifier.cpp

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -802,15 +802,24 @@ bool SILValueOwnershipChecker::checkUses() {
802802
return true;
803803
}
804804

805+
bool disableOwnershipVerification(const SILModule &mod) {
806+
if (DisableOwnershipVerification)
807+
return true;
808+
if (mod.getASTContext().blockListConfig.hasBlockListAction(
809+
mod.getSwiftModule()->getRealName().str(),
810+
BlockListKeyKind::ModuleName,
811+
BlockListAction::ShouldDisableOwnershipVerification)) {
812+
return true;
813+
}
814+
return false;
815+
}
816+
805817
//===----------------------------------------------------------------------===//
806818
// Top Level Entrypoints
807819
//===----------------------------------------------------------------------===//
808820

809821
void SILInstruction::verifyOperandOwnership(
810822
SILModuleConventions *silConv) const {
811-
if (DisableOwnershipVerification)
812-
return;
813-
814823
if (isStaticInitializerInst())
815824
return;
816825

@@ -831,11 +840,13 @@ void SILInstruction::verifyOperandOwnership(
831840
!getFunction()->shouldVerifyOwnership())
832841
return;
833842

843+
if (disableOwnershipVerification(getModule()))
844+
return;
845+
834846
// If we are testing the verifier, bail so we only print errors once when
835847
// performing a full verification, instead of additionally in the SILBuilder.
836848
if (IsSILOwnershipVerifierTestingEnabled)
837849
return;
838-
839850
// If this is a terminator instruction, do not verify in SILBuilder. This is
840851
// because when building a new function, one must create the destination block
841852
// first which is an unnatural pattern and pretty brittle.
@@ -903,9 +914,6 @@ verifySILValueHelper(const SILFunction *f, SILValue value,
903914
}
904915

905916
void SILValue::verifyOwnership(DeadEndBlocks *deadEndBlocks) const {
906-
if (DisableOwnershipVerification)
907-
return;
908-
909917
// Do not validate SILUndef values.
910918
if (isa<SILUndef>(*this))
911919
return;
@@ -931,18 +939,21 @@ void SILValue::verifyOwnership(DeadEndBlocks *deadEndBlocks) const {
931939
}
932940
}
933941

942+
// Since we do not have SILUndef, we now know that getFunction() should return
943+
// a real function. Assert in case this assumption is no longer true.
944+
auto *f = (*this)->getFunction();
945+
assert(f && "Instructions and arguments should have a function");
946+
947+
if (disableOwnershipVerification(f->getModule()))
948+
return;
949+
934950
// If we are testing the verifier, bail so we only print errors once when
935951
// performing a full verification a function at a time by the
936952
// OwnershipVerifierStateDumper pass, instead of additionally in the
937953
// SILBuilder and in the actual SIL verifier that may be run by sil-opt.
938954
if (IsSILOwnershipVerifierTestingEnabled)
939955
return;
940956

941-
// Since we do not have SILUndef, we now know that getFunction() should return
942-
// a real function. Assert in case this assumption is no longer true.
943-
auto *f = (*this)->getFunction();
944-
assert(f && "Instructions and arguments should have a function");
945-
946957
using BehaviorKind = LinearLifetimeChecker::ErrorBehaviorKind;
947958
LinearLifetimeChecker::ErrorBuilder errorBuilder(
948959
*f, BehaviorKind::PrintMessageAndAssert);
@@ -952,7 +963,7 @@ void SILValue::verifyOwnership(DeadEndBlocks *deadEndBlocks) const {
952963
}
953964

954965
void SILModule::verifyOwnership() const {
955-
if (DisableOwnershipVerification)
966+
if (disableOwnershipVerification(*this))
956967
return;
957968

958969
#ifdef NDEBUG
@@ -973,8 +984,6 @@ void SILModule::verifyOwnership() const {
973984
}
974985

975986
void SILFunction::verifyOwnership(DeadEndBlocks *deadEndBlocks) const {
976-
if (DisableOwnershipVerification)
977-
return;
978987
if (!getModule().getOptions().VerifySILOwnership)
979988
return;
980989

@@ -996,6 +1005,9 @@ void SILFunction::verifyOwnership(DeadEndBlocks *deadEndBlocks) const {
9961005
if (!hasOwnership() || !shouldVerifyOwnership())
9971006
return;
9981007

1008+
if (disableOwnershipVerification(getModule()))
1009+
return;
1010+
9991011
using BehaviorKind = LinearLifetimeChecker::ErrorBehaviorKind;
10001012
unsigned errorCounter = 0;
10011013
std::optional<LinearLifetimeChecker::ErrorBuilder> errorBuilder;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// RUN: %empty-directory(%t)
2+
3+
// RUN: echo "---" > %t/blocklist.yml
4+
// RUN: echo "ShouldDisableOwnershipVerification:" >> %t/blocklist.yml
5+
// RUN: echo " ModuleName:" >> %t/blocklist.yml
6+
// RUN: echo " - Foo" >> %t/blocklist.yml
7+
8+
// RUN: %target-swift-frontend -emit-sil -module-name Foo -blocklist-file %t/blocklist.yml %s | %FileCheck %s
9+
10+
class Klass {}
11+
12+
// CHECK-LABEL: sil @invalid_destroy
13+
// CHECK: strong_release
14+
sil [ossa] @invalid_destroy : $@convention(thin) (@guaranteed Klass) -> () {
15+
bb0(%0 : @guaranteed $Klass):
16+
destroy_value %0 : $Klass
17+
%t = tuple ()
18+
return %t : $()
19+
}
20+

0 commit comments

Comments
 (0)