Add calls to doInitialization() and doFinalization() in verifyFunction()

The function verifyFunction() in lib/IR/Verifier.cpp misses some
calls. It creates a temporary FunctionPassManager that will run a
single Verifier pass. Unfortunately, FunctionPassManager is no
PassManager and does not call doInitialization() and doFinalization()
by itself. Verifier does important tasks in doInitialization() such as
collecting type information used to check DebugInfo metadata and
doFinalization() does some additional checks. Therefore these checks
were missed and debug info couldn't be verified at all, it just
crashed if the function had some.

verifyFunction() is currently not used in llvm unless -debug option is
enabled, and in unittests/IR/VerifierTest.cpp

VerifierTest had to be changed to create the function in a module from
which the type debug info can be collected.

Patch by Michael Kruse.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193719 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2013-10-30 22:37:51 +00:00
parent 2cc546db18
commit 415b33f161
2 changed files with 6 additions and 3 deletions

View File

@ -2364,7 +2364,9 @@ bool llvm::verifyFunction(const Function &f, VerifierFailureAction action) {
FunctionPassManager FPM(F.getParent()); FunctionPassManager FPM(F.getParent());
Verifier *V = new Verifier(action); Verifier *V = new Verifier(action);
FPM.add(V); FPM.add(V);
FPM.doInitialization();
FPM.run(F); FPM.run(F);
FPM.doFinalization();
return V->Broken; return V->Broken;
} }

View File

@ -24,10 +24,11 @@ namespace {
TEST(VerifierTest, Branch_i1) { TEST(VerifierTest, Branch_i1) {
LLVMContext &C = getGlobalContext(); LLVMContext &C = getGlobalContext();
Module M("M", C);
FunctionType *FTy = FunctionType::get(Type::getVoidTy(C), /*isVarArg=*/false); FunctionType *FTy = FunctionType::get(Type::getVoidTy(C), /*isVarArg=*/false);
OwningPtr<Function> F(Function::Create(FTy, GlobalValue::ExternalLinkage)); Function *F = cast<Function>(M.getOrInsertFunction("foo", FTy));
BasicBlock *Entry = BasicBlock::Create(C, "entry", F.get()); BasicBlock *Entry = BasicBlock::Create(C, "entry", F);
BasicBlock *Exit = BasicBlock::Create(C, "exit", F.get()); BasicBlock *Exit = BasicBlock::Create(C, "exit", F);
ReturnInst::Create(C, Exit); ReturnInst::Create(C, Exit);
// To avoid triggering an assertion in BranchInst::Create, we first create // To avoid triggering an assertion in BranchInst::Create, we first create