Skip to content

Commit b470ac4

Browse files
authored
[DebugInfo] Delete debug-intrinsic verifier checks (llvm#149066)
We no longer produce debug-intrinsics, and whenever they're spotted in bitcode or textual IR they get autoupgraded. We could quite reasonably reject them out of hand as a construct that shouldn't be present. However, the DXIL folks are likely to be converting records back to intrinsics for years to come, and there's no need to make that an error. There's no value in verifying them IMO.
1 parent e8dc96d commit b470ac4

File tree

1 file changed

+8
-189
lines changed

1 file changed

+8
-189
lines changed

llvm/lib/IR/Verifier.cpp

Lines changed: 8 additions & 189 deletions
Original file line numberDiff line numberDiff line change
@@ -597,7 +597,6 @@ 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);
601600
void visitDbgLabelIntrinsic(StringRef Kind, DbgLabelInst &DLI);
602601
void visitAtomicCmpXchgInst(AtomicCmpXchgInst &CXI);
603602
void visitAtomicRMWInst(AtomicRMWInst &RMWI);
@@ -636,15 +635,12 @@ class Verifier : public InstVisitor<Verifier>, VerifierSupport {
636635
void verifyFrameRecoverIndices();
637636
void verifySiblingFuncletUnwinds();
638637

639-
void verifyFragmentExpression(const DbgVariableIntrinsic &I);
640638
void verifyFragmentExpression(const DbgVariableRecord &I);
641639
template <typename ValueOrMetadata>
642640
void verifyFragmentExpression(const DIVariable &V,
643641
DIExpression::FragmentInfo Fragment,
644642
ValueOrMetadata *Desc);
645-
void verifyFnArgs(const DbgVariableIntrinsic &I);
646643
void verifyFnArgs(const DbgVariableRecord &DVR);
647-
void verifyNotEntryValue(const DbgVariableIntrinsic &I);
648644
void verifyNotEntryValue(const DbgVariableRecord &I);
649645

650646
/// Module-level debug info verification...
@@ -5497,11 +5493,6 @@ void Verifier::visitInstruction(Instruction &I) {
54975493
}
54985494
}
54995495

5500-
if (auto *DII = dyn_cast<DbgVariableIntrinsic>(&I)) {
5501-
verifyFragmentExpression(*DII);
5502-
verifyNotEntryValue(*DII);
5503-
}
5504-
55055496
SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;
55065497
I.getAllMetadata(MDs);
55075498
for (auto Attachment : MDs) {
@@ -5706,18 +5697,14 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
57065697
visitConstrainedFPIntrinsic(cast<ConstrainedFPIntrinsic>(Call));
57075698
break;
57085699
case Intrinsic::dbg_declare: // llvm.dbg.declare
5709-
Check(isa<MetadataAsValue>(Call.getArgOperand(0)),
5710-
"invalid llvm.dbg.declare intrinsic call 1", Call);
5711-
visitDbgIntrinsic("declare", cast<DbgVariableIntrinsic>(Call));
5712-
break;
5713-
case Intrinsic::dbg_value: // llvm.dbg.value
5714-
visitDbgIntrinsic("value", cast<DbgVariableIntrinsic>(Call));
5715-
break;
5716-
case Intrinsic::dbg_assign: // llvm.dbg.assign
5717-
visitDbgIntrinsic("assign", cast<DbgVariableIntrinsic>(Call));
5718-
break;
5719-
case Intrinsic::dbg_label: // llvm.dbg.label
5720-
visitDbgLabelIntrinsic("label", cast<DbgLabelInst>(Call));
5700+
case Intrinsic::dbg_value: // llvm.dbg.value
5701+
case Intrinsic::dbg_assign: // llvm.dbg.assign
5702+
case Intrinsic::dbg_label: // llvm.dbg.label
5703+
// We no longer interpret debug intrinsics (the old variable-location
5704+
// design). They're meaningless as far as LLVM is concerned we could make
5705+
// it an error for them to appear, but it's possible we'll have users
5706+
// converting back to intrinsics for the forseeable future (such as DXIL),
5707+
// so tolerate their existance.
57215708
break;
57225709
case Intrinsic::memcpy:
57235710
case Intrinsic::memcpy_inline:
@@ -7126,123 +7113,6 @@ void Verifier::visitConstrainedFPIntrinsic(ConstrainedFPIntrinsic &FPI) {
71267113
}
71277114
}
71287115

7129-
void Verifier::visitDbgIntrinsic(StringRef Kind, DbgVariableIntrinsic &DII) {
7130-
auto *MD = DII.getRawLocation();
7131-
CheckDI(isa<ValueAsMetadata>(MD) || isa<DIArgList>(MD) ||
7132-
(isa<MDNode>(MD) && !cast<MDNode>(MD)->getNumOperands()),
7133-
"invalid llvm.dbg." + Kind + " intrinsic address/value", &DII, MD);
7134-
CheckDI(isa<DILocalVariable>(DII.getRawVariable()),
7135-
"invalid llvm.dbg." + Kind + " intrinsic variable", &DII,
7136-
DII.getRawVariable());
7137-
CheckDI(isa<DIExpression>(DII.getRawExpression()),
7138-
"invalid llvm.dbg." + Kind + " intrinsic expression", &DII,
7139-
DII.getRawExpression());
7140-
7141-
if (auto *DAI = dyn_cast<DbgAssignIntrinsic>(&DII)) {
7142-
CheckDI(isa<DIAssignID>(DAI->getRawAssignID()),
7143-
"invalid llvm.dbg.assign intrinsic DIAssignID", &DII,
7144-
DAI->getRawAssignID());
7145-
const auto *RawAddr = DAI->getRawAddress();
7146-
CheckDI(
7147-
isa<ValueAsMetadata>(RawAddr) ||
7148-
(isa<MDNode>(RawAddr) && !cast<MDNode>(RawAddr)->getNumOperands()),
7149-
"invalid llvm.dbg.assign intrinsic address", &DII,
7150-
DAI->getRawAddress());
7151-
CheckDI(isa<DIExpression>(DAI->getRawAddressExpression()),
7152-
"invalid llvm.dbg.assign intrinsic address expression", &DII,
7153-
DAI->getRawAddressExpression());
7154-
// All of the linked instructions should be in the same function as DII.
7155-
for (Instruction *I : at::getAssignmentInsts(DAI))
7156-
CheckDI(DAI->getFunction() == I->getFunction(),
7157-
"inst not in same function as dbg.assign", I, DAI);
7158-
}
7159-
7160-
// Ignore broken !dbg attachments; they're checked elsewhere.
7161-
if (MDNode *N = DII.getDebugLoc().getAsMDNode())
7162-
if (!isa<DILocation>(N))
7163-
return;
7164-
7165-
BasicBlock *BB = DII.getParent();
7166-
Function *F = BB ? BB->getParent() : nullptr;
7167-
7168-
// The scopes for variables and !dbg attachments must agree.
7169-
DILocalVariable *Var = DII.getVariable();
7170-
DILocation *Loc = DII.getDebugLoc();
7171-
CheckDI(Loc, "llvm.dbg." + Kind + " intrinsic requires a !dbg attachment",
7172-
&DII, BB, F);
7173-
7174-
DISubprogram *VarSP = getSubprogram(Var->getRawScope());
7175-
DISubprogram *LocSP = getSubprogram(Loc->getRawScope());
7176-
if (!VarSP || !LocSP)
7177-
return; // Broken scope chains are checked elsewhere.
7178-
7179-
CheckDI(VarSP == LocSP,
7180-
"mismatched subprogram between llvm.dbg." + Kind +
7181-
" variable and !dbg attachment",
7182-
&DII, BB, F, Var, Var->getScope()->getSubprogram(), Loc,
7183-
Loc->getScope()->getSubprogram());
7184-
7185-
// This check is redundant with one in visitLocalVariable().
7186-
CheckDI(isType(Var->getRawType()), "invalid type ref", Var,
7187-
Var->getRawType());
7188-
verifyFnArgs(DII);
7189-
}
7190-
7191-
void Verifier::visitDbgLabelIntrinsic(StringRef Kind, DbgLabelInst &DLI) {
7192-
CheckDI(isa<DILabel>(DLI.getRawLabel()),
7193-
"invalid llvm.dbg." + Kind + " intrinsic variable", &DLI,
7194-
DLI.getRawLabel());
7195-
7196-
// Ignore broken !dbg attachments; they're checked elsewhere.
7197-
if (MDNode *N = DLI.getDebugLoc().getAsMDNode())
7198-
if (!isa<DILocation>(N))
7199-
return;
7200-
7201-
BasicBlock *BB = DLI.getParent();
7202-
Function *F = BB ? BB->getParent() : nullptr;
7203-
7204-
// The scopes for variables and !dbg attachments must agree.
7205-
DILabel *Label = DLI.getLabel();
7206-
DILocation *Loc = DLI.getDebugLoc();
7207-
Check(Loc, "llvm.dbg." + Kind + " intrinsic requires a !dbg attachment", &DLI,
7208-
BB, F);
7209-
7210-
DISubprogram *LabelSP = getSubprogram(Label->getRawScope());
7211-
DISubprogram *LocSP = getSubprogram(Loc->getRawScope());
7212-
if (!LabelSP || !LocSP)
7213-
return;
7214-
7215-
CheckDI(LabelSP == LocSP,
7216-
"mismatched subprogram between llvm.dbg." + Kind +
7217-
" label and !dbg attachment",
7218-
&DLI, BB, F, Label, Label->getScope()->getSubprogram(), Loc,
7219-
Loc->getScope()->getSubprogram());
7220-
}
7221-
7222-
void Verifier::verifyFragmentExpression(const DbgVariableIntrinsic &I) {
7223-
DILocalVariable *V = dyn_cast_or_null<DILocalVariable>(I.getRawVariable());
7224-
DIExpression *E = dyn_cast_or_null<DIExpression>(I.getRawExpression());
7225-
7226-
// We don't know whether this intrinsic verified correctly.
7227-
if (!V || !E || !E->isValid())
7228-
return;
7229-
7230-
// Nothing to do if this isn't a DW_OP_LLVM_fragment expression.
7231-
auto Fragment = E->getFragmentInfo();
7232-
if (!Fragment)
7233-
return;
7234-
7235-
// The frontend helps out GDB by emitting the members of local anonymous
7236-
// unions as artificial local variables with shared storage. When SROA splits
7237-
// the storage for artificial local variables that are smaller than the entire
7238-
// union, the overhang piece will be outside of the allotted space for the
7239-
// variable and this check fails.
7240-
// FIXME: Remove this check as soon as clang stops doing this; it hides bugs.
7241-
if (V->isArtificial())
7242-
return;
7243-
7244-
verifyFragmentExpression(*V, *Fragment, &I);
7245-
}
72467116
void Verifier::verifyFragmentExpression(const DbgVariableRecord &DVR) {
72477117
DILocalVariable *V = dyn_cast_or_null<DILocalVariable>(DVR.getRawVariable());
72487118
DIExpression *E = dyn_cast_or_null<DIExpression>(DVR.getRawExpression());
@@ -7285,34 +7155,6 @@ void Verifier::verifyFragmentExpression(const DIVariable &V,
72857155
CheckDI(FragSize != *VarSize, "fragment covers entire variable", Desc, &V);
72867156
}
72877157

7288-
void Verifier::verifyFnArgs(const DbgVariableIntrinsic &I) {
7289-
// This function does not take the scope of noninlined function arguments into
7290-
// account. Don't run it if current function is nodebug, because it may
7291-
// contain inlined debug intrinsics.
7292-
if (!HasDebugInfo)
7293-
return;
7294-
7295-
// For performance reasons only check non-inlined ones.
7296-
if (I.getDebugLoc()->getInlinedAt())
7297-
return;
7298-
7299-
DILocalVariable *Var = I.getVariable();
7300-
CheckDI(Var, "dbg intrinsic without variable");
7301-
7302-
unsigned ArgNo = Var->getArg();
7303-
if (!ArgNo)
7304-
return;
7305-
7306-
// Verify there are no duplicate function argument debug info entries.
7307-
// These will cause hard-to-debug assertions in the DWARF backend.
7308-
if (DebugFnArgs.size() < ArgNo)
7309-
DebugFnArgs.resize(ArgNo, nullptr);
7310-
7311-
auto *Prev = DebugFnArgs[ArgNo - 1];
7312-
DebugFnArgs[ArgNo - 1] = Var;
7313-
CheckDI(!Prev || (Prev == Var), "conflicting debug info for argument", &I,
7314-
Prev, Var);
7315-
}
73167158
void Verifier::verifyFnArgs(const DbgVariableRecord &DVR) {
73177159
// This function does not take the scope of noninlined function arguments into
73187160
// account. Don't run it if current function is nodebug, because it may
@@ -7342,29 +7184,6 @@ void Verifier::verifyFnArgs(const DbgVariableRecord &DVR) {
73427184
Prev, Var);
73437185
}
73447186

7345-
void Verifier::verifyNotEntryValue(const DbgVariableIntrinsic &I) {
7346-
DIExpression *E = dyn_cast_or_null<DIExpression>(I.getRawExpression());
7347-
7348-
// We don't know whether this intrinsic verified correctly.
7349-
if (!E || !E->isValid())
7350-
return;
7351-
7352-
if (isa<ValueAsMetadata>(I.getRawLocation())) {
7353-
Value *VarValue = I.getVariableLocationOp(0);
7354-
if (isa<UndefValue>(VarValue) || isa<PoisonValue>(VarValue))
7355-
return;
7356-
// We allow EntryValues for swift async arguments, as they have an
7357-
// ABI-guarantee to be turned into a specific register.
7358-
if (auto *ArgLoc = dyn_cast_or_null<Argument>(VarValue);
7359-
ArgLoc && ArgLoc->hasAttribute(Attribute::SwiftAsync))
7360-
return;
7361-
}
7362-
7363-
CheckDI(!E->isEntryValue(),
7364-
"Entry values are only allowed in MIR unless they target a "
7365-
"swiftasync Argument",
7366-
&I);
7367-
}
73687187
void Verifier::verifyNotEntryValue(const DbgVariableRecord &DVR) {
73697188
DIExpression *E = dyn_cast_or_null<DIExpression>(DVR.getRawExpression());
73707189

0 commit comments

Comments
 (0)