forked from OSchip/llvm-project
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
This commit is contained in:
parent
02413d88f1
commit
2085cccf99
|
@ -766,16 +766,19 @@ public:
|
||||||
void processModule(const Module &M);
|
void processModule(const Module &M);
|
||||||
|
|
||||||
/// processDeclare - Process DbgDeclareInst.
|
/// processDeclare - Process DbgDeclareInst.
|
||||||
void processDeclare(const DbgDeclareInst *DDI);
|
void processDeclare(const Module &M, const DbgDeclareInst *DDI);
|
||||||
/// Process DbgValueInst.
|
/// Process DbgValueInst.
|
||||||
void processValue(const DbgValueInst *DVI);
|
void processValue(const Module &M, const DbgValueInst *DVI);
|
||||||
/// processLocation - Process DILocation.
|
/// processLocation - Process DILocation.
|
||||||
void processLocation(DILocation Loc);
|
void processLocation(const Module &M, DILocation Loc);
|
||||||
|
|
||||||
/// Clear all lists.
|
/// Clear all lists.
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/// Initialize TypeIdentifierMap.
|
||||||
|
void IntializeTypeMap(const Module &M);
|
||||||
|
|
||||||
/// processType - Process DIType.
|
/// processType - Process DIType.
|
||||||
void processType(DIType DT);
|
void processType(DIType DT);
|
||||||
|
|
||||||
|
@ -828,6 +831,8 @@ private:
|
||||||
SmallVector<MDNode *, 8> Scopes; // Scopes
|
SmallVector<MDNode *, 8> Scopes; // Scopes
|
||||||
SmallPtrSet<MDNode *, 64> NodesSeen;
|
SmallPtrSet<MDNode *, 64> NodesSeen;
|
||||||
DITypeIdentifierMap TypeIdentifierMap;
|
DITypeIdentifierMap TypeIdentifierMap;
|
||||||
|
/// Specify if TypeIdentifierMap is initialized.
|
||||||
|
bool TypeMapInitialized;
|
||||||
};
|
};
|
||||||
} // end namespace llvm
|
} // end namespace llvm
|
||||||
|
|
||||||
|
|
|
@ -951,12 +951,21 @@ void DebugInfoFinder::reset() {
|
||||||
Scopes.clear();
|
Scopes.clear();
|
||||||
NodesSeen.clear();
|
NodesSeen.clear();
|
||||||
TypeIdentifierMap.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.
|
/// processModule - Process entire module and collect debug info.
|
||||||
void DebugInfoFinder::processModule(const Module &M) {
|
void DebugInfoFinder::processModule(const Module &M) {
|
||||||
|
IntializeTypeMap(M);
|
||||||
if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) {
|
if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) {
|
||||||
TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
|
|
||||||
for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
|
for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
|
||||||
DICompileUnit CU(CU_Nodes->getOperand(i));
|
DICompileUnit CU(CU_Nodes->getOperand(i));
|
||||||
addCompileUnit(CU);
|
addCompileUnit(CU);
|
||||||
|
@ -993,11 +1002,12 @@ void DebugInfoFinder::processModule(const Module &M) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// processLocation - Process DILocation.
|
/// processLocation - Process DILocation.
|
||||||
void DebugInfoFinder::processLocation(DILocation Loc) {
|
void DebugInfoFinder::processLocation(const Module &M, DILocation Loc) {
|
||||||
if (!Loc)
|
if (!Loc)
|
||||||
return;
|
return;
|
||||||
|
IntializeTypeMap(M);
|
||||||
processScope(Loc.getScope());
|
processScope(Loc.getScope());
|
||||||
processLocation(Loc.getOrigLocation());
|
processLocation(M, Loc.getOrigLocation());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// processType - Process DIType.
|
/// processType - Process DIType.
|
||||||
|
@ -1084,10 +1094,12 @@ void DebugInfoFinder::processSubprogram(DISubprogram SP) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// processDeclare - Process DbgDeclareInst.
|
/// processDeclare - Process DbgDeclareInst.
|
||||||
void DebugInfoFinder::processDeclare(const DbgDeclareInst *DDI) {
|
void DebugInfoFinder::processDeclare(const Module &M,
|
||||||
|
const DbgDeclareInst *DDI) {
|
||||||
MDNode *N = dyn_cast<MDNode>(DDI->getVariable());
|
MDNode *N = dyn_cast<MDNode>(DDI->getVariable());
|
||||||
if (!N)
|
if (!N)
|
||||||
return;
|
return;
|
||||||
|
IntializeTypeMap(M);
|
||||||
|
|
||||||
DIDescriptor DV(N);
|
DIDescriptor DV(N);
|
||||||
if (!DV.isVariable())
|
if (!DV.isVariable())
|
||||||
|
@ -1099,10 +1111,11 @@ void DebugInfoFinder::processDeclare(const DbgDeclareInst *DDI) {
|
||||||
processType(DIVariable(N).getType());
|
processType(DIVariable(N).getType());
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebugInfoFinder::processValue(const DbgValueInst *DVI) {
|
void DebugInfoFinder::processValue(const Module &M, const DbgValueInst *DVI) {
|
||||||
MDNode *N = dyn_cast<MDNode>(DVI->getVariable());
|
MDNode *N = dyn_cast<MDNode>(DVI->getVariable());
|
||||||
if (!N)
|
if (!N)
|
||||||
return;
|
return;
|
||||||
|
IntializeTypeMap(M);
|
||||||
|
|
||||||
DIDescriptor DV(N);
|
DIDescriptor DV(N);
|
||||||
if (!DV.isVariable())
|
if (!DV.isVariable())
|
||||||
|
|
|
@ -2125,7 +2125,7 @@ void Verifier::visitInstruction(Instruction &I) {
|
||||||
|
|
||||||
if (!DisableDebugInfoVerifier) {
|
if (!DisableDebugInfoVerifier) {
|
||||||
MD = I.getMetadata(LLVMContext::MD_dbg);
|
MD = I.getMetadata(LLVMContext::MD_dbg);
|
||||||
Finder.processLocation(DILocation(MD));
|
Finder.processLocation(*Mod, DILocation(MD));
|
||||||
}
|
}
|
||||||
|
|
||||||
InstsInThisBlock.insert(&I);
|
InstsInThisBlock.insert(&I);
|
||||||
|
@ -2303,13 +2303,13 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) {
|
||||||
Assert1(MD->getNumOperands() == 1,
|
Assert1(MD->getNumOperands() == 1,
|
||||||
"invalid llvm.dbg.declare intrinsic call 2", &CI);
|
"invalid llvm.dbg.declare intrinsic call 2", &CI);
|
||||||
if (!DisableDebugInfoVerifier)
|
if (!DisableDebugInfoVerifier)
|
||||||
Finder.processDeclare(cast<DbgDeclareInst>(&CI));
|
Finder.processDeclare(*Mod, cast<DbgDeclareInst>(&CI));
|
||||||
} break;
|
} break;
|
||||||
case Intrinsic::dbg_value: { //llvm.dbg.value
|
case Intrinsic::dbg_value: { //llvm.dbg.value
|
||||||
if (!DisableDebugInfoVerifier) {
|
if (!DisableDebugInfoVerifier) {
|
||||||
Assert1(CI.getArgOperand(0) && isa<MDNode>(CI.getArgOperand(0)),
|
Assert1(CI.getArgOperand(0) && isa<MDNode>(CI.getArgOperand(0)),
|
||||||
"invalid llvm.dbg.value intrinsic call 1", &CI);
|
"invalid llvm.dbg.value intrinsic call 1", &CI);
|
||||||
Finder.processValue(cast<DbgValueInst>(&CI));
|
Finder.processValue(*Mod, cast<DbgValueInst>(&CI));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue