From 9edd2cf001825d89431885268327228d1be03bec Mon Sep 17 00:00:00 2001 From: Manman Ren Date: Sun, 17 Nov 2013 18:42:37 +0000 Subject: [PATCH] Debug Info Verifier: enable public functions of Finder to update the type map. We used to depend on running processModule before the other public functions such as processDeclare, processValue and processLocation. We are now relaxing the constraint by adding a module argument to the three functions and letting the three functions to initialize the type map. This will be used in a follow-on patch that collects nodes reachable from a Function. llvm-svn: 194973 --- include/llvm/DebugInfo.h | 11 ++++++++--- lib/IR/DebugInfo.cpp | 23 ++++++++++++++++++----- lib/IR/Verifier.cpp | 6 +++--- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/include/llvm/DebugInfo.h b/include/llvm/DebugInfo.h index 0a070fe5305..e73fda87059 100644 --- a/include/llvm/DebugInfo.h +++ b/include/llvm/DebugInfo.h @@ -766,16 +766,19 @@ public: void processModule(const Module &M); /// processDeclare - Process DbgDeclareInst. - void processDeclare(const DbgDeclareInst *DDI); + void processDeclare(const Module &M, const DbgDeclareInst *DDI); /// Process DbgValueInst. - void processValue(const DbgValueInst *DVI); + void processValue(const Module &M, const DbgValueInst *DVI); /// processLocation - Process DILocation. - void processLocation(DILocation Loc); + void processLocation(const Module &M, DILocation Loc); /// Clear all lists. void reset(); private: + /// Initialize TypeIdentifierMap. + void IntializeTypeMap(const Module &M); + /// processType - Process DIType. void processType(DIType DT); @@ -828,6 +831,8 @@ private: SmallVector Scopes; // Scopes SmallPtrSet NodesSeen; DITypeIdentifierMap TypeIdentifierMap; + /// Specify if TypeIdentifierMap is initialized. + bool TypeMapInitialized; }; } // end namespace llvm diff --git a/lib/IR/DebugInfo.cpp b/lib/IR/DebugInfo.cpp index bb6d5d28919..c9e19456a84 100644 --- a/lib/IR/DebugInfo.cpp +++ b/lib/IR/DebugInfo.cpp @@ -951,12 +951,21 @@ void DebugInfoFinder::reset() { Scopes.clear(); NodesSeen.clear(); TypeIdentifierMap.clear(); + TypeMapInitialized = false; +} + +void DebugInfoFinder::IntializeTypeMap(const Module &M) { + if (!TypeMapInitialized) + if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) { + TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes); + TypeMapInitialized = true; + } } /// processModule - Process entire module and collect debug info. void DebugInfoFinder::processModule(const Module &M) { + IntializeTypeMap(M); if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) { - TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes); for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) { DICompileUnit CU(CU_Nodes->getOperand(i)); addCompileUnit(CU); @@ -993,11 +1002,12 @@ void DebugInfoFinder::processModule(const Module &M) { } /// processLocation - Process DILocation. -void DebugInfoFinder::processLocation(DILocation Loc) { +void DebugInfoFinder::processLocation(const Module &M, DILocation Loc) { if (!Loc) return; + IntializeTypeMap(M); processScope(Loc.getScope()); - processLocation(Loc.getOrigLocation()); + processLocation(M, Loc.getOrigLocation()); } /// processType - Process DIType. @@ -1084,10 +1094,12 @@ void DebugInfoFinder::processSubprogram(DISubprogram SP) { } /// processDeclare - Process DbgDeclareInst. -void DebugInfoFinder::processDeclare(const DbgDeclareInst *DDI) { +void DebugInfoFinder::processDeclare(const Module &M, + const DbgDeclareInst *DDI) { MDNode *N = dyn_cast(DDI->getVariable()); if (!N) return; + IntializeTypeMap(M); DIDescriptor DV(N); if (!DV.isVariable()) @@ -1099,10 +1111,11 @@ void DebugInfoFinder::processDeclare(const DbgDeclareInst *DDI) { processType(DIVariable(N).getType()); } -void DebugInfoFinder::processValue(const DbgValueInst *DVI) { +void DebugInfoFinder::processValue(const Module &M, const DbgValueInst *DVI) { MDNode *N = dyn_cast(DVI->getVariable()); if (!N) return; + IntializeTypeMap(M); DIDescriptor DV(N); if (!DV.isVariable()) diff --git a/lib/IR/Verifier.cpp b/lib/IR/Verifier.cpp index 8ce48bed28f..32acfbd9ccc 100644 --- a/lib/IR/Verifier.cpp +++ b/lib/IR/Verifier.cpp @@ -2125,7 +2125,7 @@ void Verifier::visitInstruction(Instruction &I) { if (!DisableDebugInfoVerifier) { MD = I.getMetadata(LLVMContext::MD_dbg); - Finder.processLocation(DILocation(MD)); + Finder.processLocation(*Mod, DILocation(MD)); } InstsInThisBlock.insert(&I); @@ -2303,13 +2303,13 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) { Assert1(MD->getNumOperands() == 1, "invalid llvm.dbg.declare intrinsic call 2", &CI); if (!DisableDebugInfoVerifier) - Finder.processDeclare(cast(&CI)); + Finder.processDeclare(*Mod, cast(&CI)); } break; case Intrinsic::dbg_value: { //llvm.dbg.value if (!DisableDebugInfoVerifier) { Assert1(CI.getArgOperand(0) && isa(CI.getArgOperand(0)), "invalid llvm.dbg.value intrinsic call 1", &CI); - Finder.processValue(cast(&CI)); + Finder.processValue(*Mod, cast(&CI)); } break; }