Skip to content

Commit 50aa910

Browse files
committed
Verifier: Mark orphaned DICompileUnits as a debug info failure.
This is a follow-up to r268778 that adds a couple of missing cases, most notably orphaned compile units. rdar://problem/28193346 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281508 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent b1a710d commit 50aa910

File tree

2 files changed

+63
-30
lines changed

2 files changed

+63
-30
lines changed

lib/IR/Verifier.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2109,9 +2109,9 @@ void Verifier::visitFunction(const Function &F) {
21092109
continue;
21102110

21112111
// FIXME: Once N is canonical, check "SP == &N".
2112-
Assert(SP->describes(&F),
2113-
"!dbg attachment points at wrong subprogram for function", N, &F,
2114-
&I, DL, Scope, SP);
2112+
AssertDI(SP->describes(&F),
2113+
"!dbg attachment points at wrong subprogram for function", N, &F,
2114+
&I, DL, Scope, SP);
21152115
}
21162116
}
21172117

@@ -4261,10 +4261,10 @@ void Verifier::visitDbgIntrinsic(StringRef Kind, DbgIntrinsicTy &DII) {
42614261
if (!VarSP || !LocSP)
42624262
return; // Broken scope chains are checked elsewhere.
42634263

4264-
Assert(VarSP == LocSP, "mismatched subprogram between llvm.dbg." + Kind +
4265-
" variable and !dbg attachment",
4266-
&DII, BB, F, Var, Var->getScope()->getSubprogram(), Loc,
4267-
Loc->getScope()->getSubprogram());
4264+
AssertDI(VarSP == LocSP, "mismatched subprogram between llvm.dbg." + Kind +
4265+
" variable and !dbg attachment",
4266+
&DII, BB, F, Var, Var->getScope()->getSubprogram(), Loc,
4267+
Loc->getScope()->getSubprogram());
42684268
}
42694269

42704270
static uint64_t getVariableSize(const DILocalVariable &V) {
@@ -4327,17 +4327,17 @@ void Verifier::verifyBitPieceExpression(const DbgInfoIntrinsic &I) {
43274327

43284328
unsigned PieceSize = E->getBitPieceSize();
43294329
unsigned PieceOffset = E->getBitPieceOffset();
4330-
Assert(PieceSize + PieceOffset <= VarSize,
4330+
AssertDI(PieceSize + PieceOffset <= VarSize,
43314331
"piece is larger than or outside of variable", &I, V, E);
4332-
Assert(PieceSize != VarSize, "piece covers entire variable", &I, V, E);
4332+
AssertDI(PieceSize != VarSize, "piece covers entire variable", &I, V, E);
43334333
}
43344334

43354335
void Verifier::verifyCompileUnits() {
43364336
auto *CUs = M.getNamedMetadata("llvm.dbg.cu");
43374337
SmallPtrSet<const Metadata *, 2> Listed;
43384338
if (CUs)
43394339
Listed.insert(CUs->op_begin(), CUs->op_end());
4340-
Assert(
4340+
AssertDI(
43414341
all_of(CUVisited,
43424342
[&Listed](const Metadata *CU) { return Listed.count(CU); }),
43434343
"All DICompileUnits must be listed in llvm.dbg.cu");

unittests/IR/VerifierTest.cpp

Lines changed: 53 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "llvm/IR/GlobalAlias.h"
1515
#include "llvm/IR/GlobalVariable.h"
1616
#include "llvm/IR/Instructions.h"
17+
#include "llvm/IR/IRBuilder.h"
1718
#include "llvm/IR/LLVMContext.h"
1819
#include "llvm/IR/LegacyPassManager.h"
1920
#include "llvm/IR/Module.h"
@@ -151,26 +152,58 @@ TEST(VerifierTest, InvalidFunctionLinkage) {
151152
#ifndef _MSC_VER
152153
// FIXME: This test causes an ICE in MSVC 2013.
153154
TEST(VerifierTest, StripInvalidDebugInfo) {
154-
LLVMContext C;
155-
Module M("M", C);
156-
DIBuilder DIB(M);
157-
DIB.createCompileUnit(dwarf::DW_LANG_C89, "broken.c", "/",
158-
"unittest", false, "", 0);
159-
DIB.finalize();
160-
EXPECT_FALSE(verifyModule(M));
161-
162-
// Now break it.
163-
auto *File = DIB.createFile("not-a-CU.f", ".");
164-
NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
165-
NMD->addOperand(File);
166-
EXPECT_TRUE(verifyModule(M));
167-
168-
ModulePassManager MPM(true);
169-
MPM.addPass(VerifierPass(false));
170-
ModuleAnalysisManager MAM(true);
171-
MAM.registerPass([&] { return VerifierAnalysis(); });
172-
MPM.run(M, MAM);
173-
EXPECT_FALSE(verifyModule(M));
155+
{
156+
LLVMContext C;
157+
Module M("M", C);
158+
DIBuilder DIB(M);
159+
DIB.createCompileUnit(dwarf::DW_LANG_C89, "broken.c", "/", "unittest",
160+
false, "", 0);
161+
DIB.finalize();
162+
EXPECT_FALSE(verifyModule(M));
163+
164+
// Now break it by inserting non-CU node to the list of CUs.
165+
auto *File = DIB.createFile("not-a-CU.f", ".");
166+
NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
167+
NMD->addOperand(File);
168+
EXPECT_TRUE(verifyModule(M));
169+
170+
ModulePassManager MPM(true);
171+
MPM.addPass(VerifierPass(false));
172+
ModuleAnalysisManager MAM(true);
173+
MAM.registerPass([&] { return VerifierAnalysis(); });
174+
MPM.run(M, MAM);
175+
EXPECT_FALSE(verifyModule(M));
176+
}
177+
{
178+
LLVMContext C;
179+
Module M("M", C);
180+
DIBuilder DIB(M);
181+
auto *CU = DIB.createCompileUnit(dwarf::DW_LANG_C89, "broken.c", "/",
182+
"unittest", false, "", 0);
183+
new GlobalVariable(M, Type::getInt8Ty(C), false,
184+
GlobalValue::ExternalLinkage, nullptr, "g");
185+
186+
auto *F = cast<Function>(M.getOrInsertFunction(
187+
"f", FunctionType::get(Type::getVoidTy(C), false)));
188+
IRBuilder<> Builder(BasicBlock::Create(C, "", F));
189+
Builder.CreateUnreachable();
190+
F->setSubprogram(DIB.createFunction(CU, "f", "f",
191+
DIB.createFile("broken.c", "/"), 1,
192+
nullptr, true, true, 1));
193+
DIB.finalize();
194+
EXPECT_FALSE(verifyModule(M));
195+
196+
// Now break it by not listing the CU at all.
197+
M.eraseNamedMetadata(M.getOrInsertNamedMetadata("llvm.dbg.cu"));
198+
EXPECT_TRUE(verifyModule(M));
199+
200+
ModulePassManager MPM(true);
201+
MPM.addPass(VerifierPass(false));
202+
ModuleAnalysisManager MAM(true);
203+
MAM.registerPass([&] { return VerifierAnalysis(); });
204+
MPM.run(M, MAM);
205+
EXPECT_FALSE(verifyModule(M));
206+
}
174207
}
175208
#endif
176209

0 commit comments

Comments
 (0)