Skip to content

Commit 13423d9

Browse files
authored
Merge pull request #2 from apple/swift-3.0-branch
Verifier: Mark orphaned DICompileUnits as a debug info failure.
2 parents 92455aa + 0e49d60 commit 13423d9

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
@@ -2035,9 +2035,9 @@ void Verifier::visitFunction(const Function &F) {
20352035
continue;
20362036

20372037
// FIXME: Once N is canonical, check "SP == &N".
2038-
Assert(SP->describes(&F),
2039-
"!dbg attachment points at wrong subprogram for function", N, &F,
2040-
&I, DL, Scope, SP);
2038+
AssertDI(SP->describes(&F),
2039+
"!dbg attachment points at wrong subprogram for function", N, &F,
2040+
&I, DL, Scope, SP);
20412041
}
20422042
}
20432043

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

4208-
Assert(VarSP == LocSP, "mismatched subprogram between llvm.dbg." + Kind +
4209-
" variable and !dbg attachment",
4210-
&DII, BB, F, Var, Var->getScope()->getSubprogram(), Loc,
4211-
Loc->getScope()->getSubprogram());
4208+
AssertDI(VarSP == LocSP, "mismatched subprogram between llvm.dbg." + Kind +
4209+
" variable and !dbg attachment",
4210+
&DII, BB, F, Var, Var->getScope()->getSubprogram(), Loc,
4211+
Loc->getScope()->getSubprogram());
42124212
}
42134213

42144214
static uint64_t getVariableSize(const DILocalVariable &V) {
@@ -4271,17 +4271,17 @@ void Verifier::verifyBitPieceExpression(const DbgInfoIntrinsic &I) {
42714271

42724272
unsigned PieceSize = E->getBitPieceSize();
42734273
unsigned PieceOffset = E->getBitPieceOffset();
4274-
Assert(PieceSize + PieceOffset <= VarSize,
4274+
AssertDI(PieceSize + PieceOffset <= VarSize,
42754275
"piece is larger than or outside of variable", &I, V, E);
4276-
Assert(PieceSize != VarSize, "piece covers entire variable", &I, V, E);
4276+
AssertDI(PieceSize != VarSize, "piece covers entire variable", &I, V, E);
42774277
}
42784278

42794279
void Verifier::verifyCompileUnits() {
42804280
auto *CUs = M->getNamedMetadata("llvm.dbg.cu");
42814281
SmallPtrSet<const Metadata *, 2> Listed;
42824282
if (CUs)
42834283
Listed.insert(CUs->op_begin(), CUs->op_end());
4284-
Assert(
4284+
AssertDI(
42854285
std::all_of(CUVisited.begin(), CUVisited.end(),
42864286
[&Listed](const Metadata *CU) { return Listed.count(CU); }),
42874287
"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"
@@ -146,26 +147,58 @@ TEST(VerifierTest, CrossModuleMetadataRef) {
146147
}
147148

148149
TEST(VerifierTest, StripInvalidDebugInfo) {
149-
LLVMContext C;
150-
Module M("M", C);
151-
DIBuilder DIB(M);
152-
DIB.createCompileUnit(dwarf::DW_LANG_C89, "broken.c", "/",
153-
"unittest", false, "", 0);
154-
DIB.finalize();
155-
EXPECT_FALSE(verifyModule(M));
156-
157-
// Now break it.
158-
auto *File = DIB.createFile("not-a-CU.f", ".");
159-
NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
160-
NMD->addOperand(File);
161-
EXPECT_TRUE(verifyModule(M));
162-
163-
ModulePassManager MPM(true);
164-
MPM.addPass(VerifierPass(false));
165-
ModuleAnalysisManager MAM(true);
166-
MAM.registerPass(VerifierAnalysis());
167-
MPM.run(M, &MAM);
168-
EXPECT_FALSE(verifyModule(M));
150+
{
151+
LLVMContext C;
152+
Module M("M", C);
153+
DIBuilder DIB(M);
154+
DIB.createCompileUnit(dwarf::DW_LANG_C89, "broken.c", "/", "unittest",
155+
false, "", 0);
156+
DIB.finalize();
157+
EXPECT_FALSE(verifyModule(M));
158+
159+
// Now break it by inserting non-CU node to the list of CUs.
160+
auto *File = DIB.createFile("not-a-CU.f", ".");
161+
NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
162+
NMD->addOperand(File);
163+
EXPECT_TRUE(verifyModule(M));
164+
165+
ModulePassManager MPM(true);
166+
MPM.addPass(VerifierPass(false));
167+
ModuleAnalysisManager MAM(true);
168+
MAM.registerPass(VerifierAnalysis());
169+
MPM.run(M, &MAM);
170+
EXPECT_FALSE(verifyModule(M));
171+
}
172+
{
173+
LLVMContext C;
174+
Module M("M", C);
175+
DIBuilder DIB(M);
176+
auto *CU = DIB.createCompileUnit(dwarf::DW_LANG_C89, "broken.c", "/",
177+
"unittest", false, "", 0);
178+
new GlobalVariable(M, Type::getInt8Ty(C), false,
179+
GlobalValue::ExternalLinkage, nullptr, "g");
180+
181+
auto *F = cast<Function>(M.getOrInsertFunction(
182+
"f", FunctionType::get(Type::getVoidTy(C), false)));
183+
IRBuilder<> Builder(BasicBlock::Create(C, "", F));
184+
Builder.CreateUnreachable();
185+
F->setSubprogram(DIB.createFunction(CU, "f", "f",
186+
DIB.createFile("broken.c", "/"), 1,
187+
nullptr, true, true, 1));
188+
DIB.finalize();
189+
EXPECT_FALSE(verifyModule(M));
190+
191+
// Now break it by not listing the CU at all.
192+
M.eraseNamedMetadata(M.getOrInsertNamedMetadata("llvm.dbg.cu"));
193+
EXPECT_TRUE(verifyModule(M));
194+
195+
ModulePassManager MPM(true);
196+
MPM.addPass(VerifierPass(false));
197+
ModuleAnalysisManager MAM(true);
198+
MAM.registerPass(VerifierAnalysis());
199+
MPM.run(M, &MAM);
200+
EXPECT_FALSE(verifyModule(M));
201+
}
169202
}
170203

171204

0 commit comments

Comments
 (0)