Skip to content

Commit ba650b8

Browse files
committed
Revert "[DebugInfo] Delete debug-intrinsic verifier checks (llvm#149066)"
This reverts commit b470ac4.
1 parent 7654491 commit ba650b8

File tree

1 file changed

+72
-11
lines changed

1 file changed

+72
-11
lines changed

llvm/lib/IR/Verifier.cpp

Lines changed: 72 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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
71407152
void 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
72677277
void 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+
}
73127350
void 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+
}
73417402
void Verifier::verifyNotEntryValue(const DbgVariableRecord &DVR) {
73427403
DIExpression *E = dyn_cast_or_null<DIExpression>(DVR.getRawExpression());
73437404

0 commit comments

Comments
 (0)