@@ -597,6 +597,7 @@ class Verifier : public InstVisitor<Verifier>, VerifierSupport {
597597 void visitIntrinsicCall (Intrinsic::ID ID, CallBase &Call);
598598 void visitConstrainedFPIntrinsic (ConstrainedFPIntrinsic &FPI);
599599 void visitVPIntrinsic (VPIntrinsic &VPI);
600+ void visitDbgIntrinsic (StringRef Kind, DbgVariableIntrinsic &DII);
600601 void visitDbgLabelIntrinsic (StringRef Kind, DbgLabelInst &DLI);
601602 void visitAtomicCmpXchgInst (AtomicCmpXchgInst &CXI);
602603 void visitAtomicRMWInst (AtomicRMWInst &RMWI);
@@ -635,12 +636,15 @@ class Verifier : public InstVisitor<Verifier>, VerifierSupport {
635636 void verifyFrameRecoverIndices ();
636637 void verifySiblingFuncletUnwinds ();
637638
639+ void verifyFragmentExpression (const DbgVariableIntrinsic &I);
638640 void verifyFragmentExpression (const DbgVariableRecord &I);
639641 template <typename ValueOrMetadata>
640642 void verifyFragmentExpression (const DIVariable &V,
641643 DIExpression::FragmentInfo Fragment,
642644 ValueOrMetadata *Desc);
645+ void verifyFnArgs (const DbgVariableIntrinsic &I);
643646 void verifyFnArgs (const DbgVariableRecord &DVR);
647+ void verifyNotEntryValue (const DbgVariableIntrinsic &I);
644648 void verifyNotEntryValue (const DbgVariableRecord &I);
645649
646650 // / Module-level debug info verification...
@@ -5509,6 +5513,11 @@ void Verifier::visitInstruction(Instruction &I) {
55095513 }
55105514 }
55115515
5516+ if (auto *DII = dyn_cast<DbgVariableIntrinsic>(&I)) {
5517+ verifyFragmentExpression (*DII);
5518+ verifyNotEntryValue (*DII);
5519+ }
5520+
55125521 SmallVector<std::pair<unsigned , MDNode *>, 4 > MDs;
55135522 I.getAllMetadata (MDs);
55145523 for (auto Attachment : MDs) {
@@ -5713,14 +5722,18 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
57135722 visitConstrainedFPIntrinsic (cast<ConstrainedFPIntrinsic>(Call));
57145723 break ;
57155724 case Intrinsic::dbg_declare: // llvm.dbg.declare
5716- case Intrinsic::dbg_value: // llvm.dbg.value
5717- case Intrinsic::dbg_assign: // llvm.dbg.assign
5718- case Intrinsic::dbg_label: // llvm.dbg.label
5719- // We no longer interpret debug intrinsics (the old variable-location
5720- // design). They're meaningless as far as LLVM is concerned we could make
5721- // it an error for them to appear, but it's possible we'll have users
5722- // converting back to intrinsics for the forseeable future (such as DXIL),
5723- // so tolerate their existance.
5725+ Check (isa<MetadataAsValue>(Call.getArgOperand (0 )),
5726+ " invalid llvm.dbg.declare intrinsic call 1" , Call);
5727+ visitDbgIntrinsic (" declare" , cast<DbgVariableIntrinsic>(Call));
5728+ break ;
5729+ case Intrinsic::dbg_value: // llvm.dbg.value
5730+ visitDbgIntrinsic (" value" , cast<DbgVariableIntrinsic>(Call));
5731+ break ;
5732+ case Intrinsic::dbg_assign: // llvm.dbg.assign
5733+ visitDbgIntrinsic (" assign" , cast<DbgVariableIntrinsic>(Call));
5734+ break ;
5735+ case Intrinsic::dbg_label: // llvm.dbg.label
5736+ visitDbgLabelIntrinsic (" label" , cast<DbgLabelInst>(Call));
57245737 break ;
57255738 case Intrinsic::memcpy:
57265739 case Intrinsic::memcpy_inline:
@@ -7136,7 +7149,6 @@ void Verifier::visitConstrainedFPIntrinsic(ConstrainedFPIntrinsic &FPI) {
71367149 }
71377150}
71387151
7139- <<<<<<< HEAD
71407152void Verifier::visitDbgIntrinsic (StringRef Kind, DbgVariableIntrinsic &DII) {
71417153 auto *MD = DII.getRawLocation ();
71427154 CheckDI (isa<ValueAsMetadata>(MD) || isa<DIArgList>(MD) ||
@@ -7262,8 +7274,6 @@ void Verifier::verifyFragmentExpression(const DbgVariableIntrinsic &I) {
72627274
72637275 verifyFragmentExpression (*V, *Fragment, &I);
72647276}
7265- =======
7266- >>>>>>> 7caa0c9a55b3
72677277void Verifier::verifyFragmentExpression (const DbgVariableRecord &DVR) {
72687278 DILocalVariable *V = dyn_cast_or_null<DILocalVariable>(DVR.getRawVariable ());
72697279 DIExpression *E = dyn_cast_or_null<DIExpression>(DVR.getRawExpression ());
@@ -7309,6 +7319,34 @@ void Verifier::verifyFragmentExpression(const DIVariable &V,
73097319 CheckDI (MSpace <= dwarf::DW_MSPACE_LLVM_hi_user, " invalid memory space" , &V);
73107320}
73117321
7322+ void Verifier::verifyFnArgs (const DbgVariableIntrinsic &I) {
7323+ // This function does not take the scope of noninlined function arguments into
7324+ // account. Don't run it if current function is nodebug, because it may
7325+ // contain inlined debug intrinsics.
7326+ if (!HasDebugInfo)
7327+ return ;
7328+
7329+ // For performance reasons only check non-inlined ones.
7330+ if (I.getDebugLoc ()->getInlinedAt ())
7331+ return ;
7332+
7333+ DILocalVariable *Var = I.getVariable ();
7334+ CheckDI (Var, " dbg intrinsic without variable" );
7335+
7336+ unsigned ArgNo = Var->getArg ();
7337+ if (!ArgNo)
7338+ return ;
7339+
7340+ // Verify there are no duplicate function argument debug info entries.
7341+ // These will cause hard-to-debug assertions in the DWARF backend.
7342+ if (DebugFnArgs.size () < ArgNo)
7343+ DebugFnArgs.resize (ArgNo, nullptr );
7344+
7345+ auto *Prev = DebugFnArgs[ArgNo - 1 ];
7346+ DebugFnArgs[ArgNo - 1 ] = Var;
7347+ CheckDI (!Prev || (Prev == Var), " conflicting debug info for argument" , &I,
7348+ Prev, Var);
7349+ }
73127350void Verifier::verifyFnArgs (const DbgVariableRecord &DVR) {
73137351 // This function does not take the scope of noninlined function arguments into
73147352 // account. Don't run it if current function is nodebug, because it may
@@ -7338,6 +7376,29 @@ void Verifier::verifyFnArgs(const DbgVariableRecord &DVR) {
73387376 Prev, Var);
73397377}
73407378
7379+ void Verifier::verifyNotEntryValue (const DbgVariableIntrinsic &I) {
7380+ DIExpression *E = dyn_cast_or_null<DIExpression>(I.getRawExpression ());
7381+
7382+ // We don't know whether this intrinsic verified correctly.
7383+ if (!E || !E->isValid ())
7384+ return ;
7385+
7386+ if (isa<ValueAsMetadata>(I.getRawLocation ())) {
7387+ Value *VarValue = I.getVariableLocationOp (0 );
7388+ if (isa<UndefValue>(VarValue) || isa<PoisonValue>(VarValue))
7389+ return ;
7390+ // We allow EntryValues for swift async arguments, as they have an
7391+ // ABI-guarantee to be turned into a specific register.
7392+ if (auto *ArgLoc = dyn_cast_or_null<Argument>(VarValue);
7393+ ArgLoc && ArgLoc->hasAttribute (Attribute::SwiftAsync))
7394+ return ;
7395+ }
7396+
7397+ CheckDI (!E->isEntryValue (),
7398+ " Entry values are only allowed in MIR unless they target a "
7399+ " swiftasync Argument" ,
7400+ &I);
7401+ }
73417402void Verifier::verifyNotEntryValue (const DbgVariableRecord &DVR) {
73427403 DIExpression *E = dyn_cast_or_null<DIExpression>(DVR.getRawExpression ());
73437404
0 commit comments