@@ -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
809821void 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
905916void 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
954965void 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
975986void 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;
0 commit comments