mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-25 20:59:51 +00:00
Move DbgInfoPrinter specific utlities inside DbgInfoPrinter.cpp
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125571 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
497acb91dc
commit
fc0569e55a
@ -868,10 +868,6 @@ namespace llvm {
|
||||
Constant *GetTagConstant(unsigned TAG);
|
||||
};
|
||||
|
||||
bool getLocationInfo(const Value *V, std::string &DisplayName,
|
||||
std::string &Type, unsigned &LineNo, std::string &File,
|
||||
std::string &Dir);
|
||||
|
||||
/// getDISubprogram - Find subprogram that is enclosing this scope.
|
||||
DISubprogram getDISubprogram(const MDNode *Scope);
|
||||
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "llvm/Function.h"
|
||||
#include "llvm/IntrinsicInst.h"
|
||||
#include "llvm/Metadata.h"
|
||||
#include "llvm/Module.h"
|
||||
#include "llvm/Assembly/Writer.h"
|
||||
#include "llvm/Analysis/DebugInfo.h"
|
||||
#include "llvm/Analysis/Passes.h"
|
||||
@ -57,6 +58,117 @@ INITIALIZE_PASS(PrintDbgInfo, "print-dbginfo",
|
||||
|
||||
FunctionPass *llvm::createDbgInfoPrinterPass() { return new PrintDbgInfo(); }
|
||||
|
||||
/// Find the debug info descriptor corresponding to this global variable.
|
||||
static Value *findDbgGlobalDeclare(GlobalVariable *V) {
|
||||
const Module *M = V->getParent();
|
||||
NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.gv");
|
||||
if (!NMD)
|
||||
return 0;
|
||||
|
||||
for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
|
||||
DIDescriptor DIG(cast<MDNode>(NMD->getOperand(i)));
|
||||
if (!DIG.isGlobalVariable())
|
||||
continue;
|
||||
if (DIGlobalVariable(DIG).getGlobal() == V)
|
||||
return DIG;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// Find the debug info descriptor corresponding to this function.
|
||||
static Value *findDbgSubprogramDeclare(Function *V) {
|
||||
const Module *M = V->getParent();
|
||||
NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.sp");
|
||||
if (!NMD)
|
||||
return 0;
|
||||
|
||||
for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
|
||||
DIDescriptor DIG(cast<MDNode>(NMD->getOperand(i)));
|
||||
if (!DIG.isSubprogram())
|
||||
continue;
|
||||
if (DISubprogram(DIG).getFunction() == V)
|
||||
return DIG;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// Finds the llvm.dbg.declare intrinsic corresponding to this value if any.
|
||||
/// It looks through pointer casts too.
|
||||
static const DbgDeclareInst *findDbgDeclare(const Value *V) {
|
||||
V = V->stripPointerCasts();
|
||||
|
||||
if (!isa<Instruction>(V) && !isa<Argument>(V))
|
||||
return 0;
|
||||
|
||||
const Function *F = NULL;
|
||||
if (const Instruction *I = dyn_cast<Instruction>(V))
|
||||
F = I->getParent()->getParent();
|
||||
else if (const Argument *A = dyn_cast<Argument>(V))
|
||||
F = A->getParent();
|
||||
|
||||
for (Function::const_iterator FI = F->begin(), FE = F->end(); FI != FE; ++FI)
|
||||
for (BasicBlock::const_iterator BI = (*FI).begin(), BE = (*FI).end();
|
||||
BI != BE; ++BI)
|
||||
if (const DbgDeclareInst *DDI = dyn_cast<DbgDeclareInst>(BI))
|
||||
if (DDI->getAddress() == V)
|
||||
return DDI;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool getLocationInfo(const Value *V, std::string &DisplayName,
|
||||
std::string &Type, unsigned &LineNo,
|
||||
std::string &File, std::string &Dir) {
|
||||
DICompileUnit Unit;
|
||||
DIType TypeD;
|
||||
|
||||
if (GlobalVariable *GV = dyn_cast<GlobalVariable>(const_cast<Value*>(V))) {
|
||||
Value *DIGV = findDbgGlobalDeclare(GV);
|
||||
if (!DIGV) return false;
|
||||
DIGlobalVariable Var(cast<MDNode>(DIGV));
|
||||
|
||||
StringRef D = Var.getDisplayName();
|
||||
if (!D.empty())
|
||||
DisplayName = D;
|
||||
LineNo = Var.getLineNumber();
|
||||
Unit = Var.getCompileUnit();
|
||||
TypeD = Var.getType();
|
||||
} else if (Function *F = dyn_cast<Function>(const_cast<Value*>(V))){
|
||||
Value *DIF = findDbgSubprogramDeclare(F);
|
||||
if (!DIF) return false;
|
||||
DISubprogram Var(cast<MDNode>(DIF));
|
||||
|
||||
StringRef D = Var.getDisplayName();
|
||||
if (!D.empty())
|
||||
DisplayName = D;
|
||||
LineNo = Var.getLineNumber();
|
||||
Unit = Var.getCompileUnit();
|
||||
TypeD = Var.getType();
|
||||
} else {
|
||||
const DbgDeclareInst *DDI = findDbgDeclare(V);
|
||||
if (!DDI) return false;
|
||||
DIVariable Var(cast<MDNode>(DDI->getVariable()));
|
||||
|
||||
StringRef D = Var.getName();
|
||||
if (!D.empty())
|
||||
DisplayName = D;
|
||||
LineNo = Var.getLineNumber();
|
||||
Unit = Var.getCompileUnit();
|
||||
TypeD = Var.getType();
|
||||
}
|
||||
|
||||
StringRef T = TypeD.getName();
|
||||
if (!T.empty())
|
||||
Type = T;
|
||||
StringRef F = Unit.getFilename();
|
||||
if (!F.empty())
|
||||
File = F;
|
||||
StringRef D = Unit.getDirectory();
|
||||
if (!D.empty())
|
||||
Dir = D;
|
||||
return true;
|
||||
}
|
||||
|
||||
void PrintDbgInfo::printVariableDeclaration(const Value *V) {
|
||||
std::string DisplayName, File, Directory, Type;
|
||||
unsigned LineNo;
|
||||
|
@ -1575,117 +1575,6 @@ bool DebugInfoFinder::addSubprogram(DISubprogram SP) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Find the debug info descriptor corresponding to this global variable.
|
||||
static Value *findDbgGlobalDeclare(GlobalVariable *V) {
|
||||
const Module *M = V->getParent();
|
||||
NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.gv");
|
||||
if (!NMD)
|
||||
return 0;
|
||||
|
||||
for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
|
||||
DIDescriptor DIG(cast<MDNode>(NMD->getOperand(i)));
|
||||
if (!DIG.isGlobalVariable())
|
||||
continue;
|
||||
if (DIGlobalVariable(DIG).getGlobal() == V)
|
||||
return DIG;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// Find the debug info descriptor corresponding to this function.
|
||||
static Value *findDbgSubprogramDeclare(Function *V) {
|
||||
const Module *M = V->getParent();
|
||||
NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.sp");
|
||||
if (!NMD)
|
||||
return 0;
|
||||
|
||||
for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
|
||||
DIDescriptor DIG(cast<MDNode>(NMD->getOperand(i)));
|
||||
if (!DIG.isSubprogram())
|
||||
continue;
|
||||
if (DISubprogram(DIG).getFunction() == V)
|
||||
return DIG;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// Finds the llvm.dbg.declare intrinsic corresponding to this value if any.
|
||||
/// It looks through pointer casts too.
|
||||
static const DbgDeclareInst *findDbgDeclare(const Value *V) {
|
||||
V = V->stripPointerCasts();
|
||||
|
||||
if (!isa<Instruction>(V) && !isa<Argument>(V))
|
||||
return 0;
|
||||
|
||||
const Function *F = NULL;
|
||||
if (const Instruction *I = dyn_cast<Instruction>(V))
|
||||
F = I->getParent()->getParent();
|
||||
else if (const Argument *A = dyn_cast<Argument>(V))
|
||||
F = A->getParent();
|
||||
|
||||
for (Function::const_iterator FI = F->begin(), FE = F->end(); FI != FE; ++FI)
|
||||
for (BasicBlock::const_iterator BI = (*FI).begin(), BE = (*FI).end();
|
||||
BI != BE; ++BI)
|
||||
if (const DbgDeclareInst *DDI = dyn_cast<DbgDeclareInst>(BI))
|
||||
if (DDI->getAddress() == V)
|
||||
return DDI;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool llvm::getLocationInfo(const Value *V, std::string &DisplayName,
|
||||
std::string &Type, unsigned &LineNo,
|
||||
std::string &File, std::string &Dir) {
|
||||
DICompileUnit Unit;
|
||||
DIType TypeD;
|
||||
|
||||
if (GlobalVariable *GV = dyn_cast<GlobalVariable>(const_cast<Value*>(V))) {
|
||||
Value *DIGV = findDbgGlobalDeclare(GV);
|
||||
if (!DIGV) return false;
|
||||
DIGlobalVariable Var(cast<MDNode>(DIGV));
|
||||
|
||||
StringRef D = Var.getDisplayName();
|
||||
if (!D.empty())
|
||||
DisplayName = D;
|
||||
LineNo = Var.getLineNumber();
|
||||
Unit = Var.getCompileUnit();
|
||||
TypeD = Var.getType();
|
||||
} else if (Function *F = dyn_cast<Function>(const_cast<Value*>(V))){
|
||||
Value *DIF = findDbgSubprogramDeclare(F);
|
||||
if (!DIF) return false;
|
||||
DISubprogram Var(cast<MDNode>(DIF));
|
||||
|
||||
StringRef D = Var.getDisplayName();
|
||||
if (!D.empty())
|
||||
DisplayName = D;
|
||||
LineNo = Var.getLineNumber();
|
||||
Unit = Var.getCompileUnit();
|
||||
TypeD = Var.getType();
|
||||
} else {
|
||||
const DbgDeclareInst *DDI = findDbgDeclare(V);
|
||||
if (!DDI) return false;
|
||||
DIVariable Var(cast<MDNode>(DDI->getVariable()));
|
||||
|
||||
StringRef D = Var.getName();
|
||||
if (!D.empty())
|
||||
DisplayName = D;
|
||||
LineNo = Var.getLineNumber();
|
||||
Unit = Var.getCompileUnit();
|
||||
TypeD = Var.getType();
|
||||
}
|
||||
|
||||
StringRef T = TypeD.getName();
|
||||
if (!T.empty())
|
||||
Type = T;
|
||||
StringRef F = Unit.getFilename();
|
||||
if (!F.empty())
|
||||
File = F;
|
||||
StringRef D = Unit.getDirectory();
|
||||
if (!D.empty())
|
||||
Dir = D;
|
||||
return true;
|
||||
}
|
||||
|
||||
/// getDISubprogram - Find subprogram that is enclosing this scope.
|
||||
DISubprogram llvm::getDISubprogram(const MDNode *Scope) {
|
||||
DIDescriptor D(Scope);
|
||||
|
Loading…
Reference in New Issue
Block a user