@@ -802,15 +802,24 @@ bool SILValueOwnershipChecker::checkUses() {
802
802
return true ;
803
803
}
804
804
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
+
805
817
// ===----------------------------------------------------------------------===//
806
818
// Top Level Entrypoints
807
819
// ===----------------------------------------------------------------------===//
808
820
809
821
void SILInstruction::verifyOperandOwnership (
810
822
SILModuleConventions *silConv) const {
811
- if (DisableOwnershipVerification)
812
- return ;
813
-
814
823
if (isStaticInitializerInst ())
815
824
return ;
816
825
@@ -831,11 +840,13 @@ void SILInstruction::verifyOperandOwnership(
831
840
!getFunction ()->shouldVerifyOwnership ())
832
841
return ;
833
842
843
+ if (disableOwnershipVerification (getModule ()))
844
+ return ;
845
+
834
846
// If we are testing the verifier, bail so we only print errors once when
835
847
// performing a full verification, instead of additionally in the SILBuilder.
836
848
if (IsSILOwnershipVerifierTestingEnabled)
837
849
return ;
838
-
839
850
// If this is a terminator instruction, do not verify in SILBuilder. This is
840
851
// because when building a new function, one must create the destination block
841
852
// first which is an unnatural pattern and pretty brittle.
@@ -903,9 +914,6 @@ verifySILValueHelper(const SILFunction *f, SILValue value,
903
914
}
904
915
905
916
void SILValue::verifyOwnership (DeadEndBlocks *deadEndBlocks) const {
906
- if (DisableOwnershipVerification)
907
- return ;
908
-
909
917
// Do not validate SILUndef values.
910
918
if (isa<SILUndef>(*this ))
911
919
return ;
@@ -918,18 +926,21 @@ void SILValue::verifyOwnership(DeadEndBlocks *deadEndBlocks) const {
918
926
}
919
927
}
920
928
929
+ // Since we do not have SILUndef, we now know that getFunction() should return
930
+ // a real function. Assert in case this assumption is no longer true.
931
+ auto *f = (*this )->getFunction ();
932
+ assert (f && " Instructions and arguments should have a function" );
933
+
934
+ if (disableOwnershipVerification (f->getModule ()))
935
+ return ;
936
+
921
937
// If we are testing the verifier, bail so we only print errors once when
922
938
// performing a full verification a function at a time by the
923
939
// OwnershipVerifierStateDumper pass, instead of additionally in the
924
940
// SILBuilder and in the actual SIL verifier that may be run by sil-opt.
925
941
if (IsSILOwnershipVerifierTestingEnabled)
926
942
return ;
927
943
928
- // Since we do not have SILUndef, we now know that getFunction() should return
929
- // a real function. Assert in case this assumption is no longer true.
930
- auto *f = (*this )->getFunction ();
931
- assert (f && " Instructions and arguments should have a function" );
932
-
933
944
using BehaviorKind = LinearLifetimeChecker::ErrorBehaviorKind;
934
945
LinearLifetimeChecker::ErrorBuilder errorBuilder (
935
946
*f, BehaviorKind::PrintMessageAndAssert);
@@ -939,7 +950,7 @@ void SILValue::verifyOwnership(DeadEndBlocks *deadEndBlocks) const {
939
950
}
940
951
941
952
void SILModule::verifyOwnership () const {
942
- if (DisableOwnershipVerification )
953
+ if (disableOwnershipVerification (* this ) )
943
954
return ;
944
955
945
956
for (const SILFunction &function : *this ) {
@@ -953,8 +964,6 @@ void SILModule::verifyOwnership() const {
953
964
}
954
965
955
966
void SILFunction::verifyOwnership (DeadEndBlocks *deadEndBlocks) const {
956
- if (DisableOwnershipVerification)
957
- return ;
958
967
if (!getModule ().getOptions ().VerifySILOwnership )
959
968
return ;
960
969
@@ -963,6 +972,9 @@ void SILFunction::verifyOwnership(DeadEndBlocks *deadEndBlocks) const {
963
972
if (!hasOwnership () || !shouldVerifyOwnership ())
964
973
return ;
965
974
975
+ if (disableOwnershipVerification (getModule ()))
976
+ return ;
977
+
966
978
using BehaviorKind = LinearLifetimeChecker::ErrorBehaviorKind;
967
979
unsigned errorCounter = 0 ;
968
980
std::optional<LinearLifetimeChecker::ErrorBuilder> errorBuilder;
0 commit comments