mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-07-05 13:29:22 +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);
|
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.
|
/// getDISubprogram - Find subprogram that is enclosing this scope.
|
||||||
DISubprogram getDISubprogram(const MDNode *Scope);
|
DISubprogram getDISubprogram(const MDNode *Scope);
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "llvm/Function.h"
|
#include "llvm/Function.h"
|
||||||
#include "llvm/IntrinsicInst.h"
|
#include "llvm/IntrinsicInst.h"
|
||||||
#include "llvm/Metadata.h"
|
#include "llvm/Metadata.h"
|
||||||
|
#include "llvm/Module.h"
|
||||||
#include "llvm/Assembly/Writer.h"
|
#include "llvm/Assembly/Writer.h"
|
||||||
#include "llvm/Analysis/DebugInfo.h"
|
#include "llvm/Analysis/DebugInfo.h"
|
||||||
#include "llvm/Analysis/Passes.h"
|
#include "llvm/Analysis/Passes.h"
|
||||||
@ -57,6 +58,117 @@ INITIALIZE_PASS(PrintDbgInfo, "print-dbginfo",
|
|||||||
|
|
||||||
FunctionPass *llvm::createDbgInfoPrinterPass() { return new PrintDbgInfo(); }
|
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) {
|
void PrintDbgInfo::printVariableDeclaration(const Value *V) {
|
||||||
std::string DisplayName, File, Directory, Type;
|
std::string DisplayName, File, Directory, Type;
|
||||||
unsigned LineNo;
|
unsigned LineNo;
|
||||||
|
@ -1575,117 +1575,6 @@ bool DebugInfoFinder::addSubprogram(DISubprogram SP) {
|
|||||||
return true;
|
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.
|
/// getDISubprogram - Find subprogram that is enclosing this scope.
|
||||||
DISubprogram llvm::getDISubprogram(const MDNode *Scope) {
|
DISubprogram llvm::getDISubprogram(const MDNode *Scope) {
|
||||||
DIDescriptor D(Scope);
|
DIDescriptor D(Scope);
|
||||||
|
Loading…
Reference in New Issue
Block a user