35
35
#include " swift/SIL/DebugUtils.h"
36
36
#include " swift/SIL/Dominance.h"
37
37
#include " swift/SIL/DynamicCasts.h"
38
+ #include " swift/SIL/InstructionUtils.h"
38
39
#include " swift/SIL/MemAccessUtils.h"
39
40
#include " swift/SIL/OwnershipLiveness.h"
40
41
#include " swift/SIL/OwnershipUtils.h"
@@ -572,6 +573,11 @@ void verifyKeyPathComponent(SILModule &M,
572
573
// / open_existential_addr. We should expand it as needed.
573
574
struct ImmutableAddressUseVerifier {
574
575
SmallVector<Operand *, 32 > worklist;
576
+ bool ignoreDestroys;
577
+ bool defaultIsMutating;
578
+
579
+ ImmutableAddressUseVerifier (bool ignoreDestroys = false , bool defaultIsMutating = false )
580
+ : ignoreDestroys(ignoreDestroys), defaultIsMutating(defaultIsMutating) {}
575
581
576
582
bool isConsumingOrMutatingArgumentConvention (SILArgumentConvention conv) {
577
583
switch (conv) {
@@ -704,10 +710,9 @@ struct ImmutableAddressUseVerifier {
704
710
}
705
711
}
706
712
707
- // Otherwise this is a builtin that we are not expecting to see, so bail
708
- // and assert.
709
- llvm::errs () << " Unhandled, unexpected builtin instruction: " << *inst;
710
- llvm_unreachable (" invoking standard assertion failure" );
713
+ // Otherwise this is a builtin that we are not expecting to see.
714
+ if (defaultIsMutating)
715
+ return true ;
711
716
break ;
712
717
}
713
718
case SILInstructionKind::MarkDependenceInst:
@@ -775,7 +780,9 @@ struct ImmutableAddressUseVerifier {
775
780
else
776
781
break ;
777
782
case SILInstructionKind::DestroyAddrInst:
778
- return true ;
783
+ if (!ignoreDestroys)
784
+ return true ;
785
+ break ;
779
786
case SILInstructionKind::UpcastInst:
780
787
case SILInstructionKind::UncheckedAddrCastInst: {
781
788
if (isAddrCastToNonConsuming (cast<SingleValueInstruction>(inst))) {
@@ -841,9 +848,7 @@ struct ImmutableAddressUseVerifier {
841
848
}
842
849
break ;
843
850
}
844
- llvm::errs () << " Unhandled, unexpected instruction: " << *inst;
845
- llvm_unreachable (" invoking standard assertion failure" );
846
- break ;
851
+ return true ;
847
852
}
848
853
case SILInstructionKind::TuplePackElementAddrInst: {
849
854
if (&cast<TuplePackElementAddrInst>(inst)->getOperandRef (
@@ -865,8 +870,8 @@ struct ImmutableAddressUseVerifier {
865
870
return false ;
866
871
}
867
872
default :
868
- llvm::errs () << " Unhandled, unexpected instruction: " << *inst;
869
- llvm_unreachable ( " invoking standard assertion failure " ) ;
873
+ if (defaultIsMutating)
874
+ return true ;
870
875
break ;
871
876
}
872
877
}
@@ -7385,6 +7390,11 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
7385
7390
#undef require
7386
7391
#undef requireObjectType
7387
7392
7393
+ bool swift::isIndirectArgumentMutated (SILFunctionArgument *arg, bool ignoreDestroys,
7394
+ bool defaultIsMutating) {
7395
+ return ImmutableAddressUseVerifier (ignoreDestroys, defaultIsMutating).isMutatingOrConsuming (arg);
7396
+ }
7397
+
7388
7398
// ===----------------------------------------------------------------------===//
7389
7399
// Out of Line Verifier Run Functions
7390
7400
// ===----------------------------------------------------------------------===//
0 commit comments