mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-24 02:38:42 +00:00
Add command line option to print debug info in human readable form as comment in llvm IR output. This, i.e -enable-debug-info-comment, is very useful if you want to easily find out which optimization pass is losing line number information.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130409 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
88e92cf16b
commit
d78bfbc6bb
@ -32,6 +32,7 @@
|
|||||||
#include "llvm/ADT/StringExtras.h"
|
#include "llvm/ADT/StringExtras.h"
|
||||||
#include "llvm/ADT/STLExtras.h"
|
#include "llvm/ADT/STLExtras.h"
|
||||||
#include "llvm/Support/CFG.h"
|
#include "llvm/Support/CFG.h"
|
||||||
|
#include "llvm/Support/CommandLine.h"
|
||||||
#include "llvm/Support/Debug.h"
|
#include "llvm/Support/Debug.h"
|
||||||
#include "llvm/Support/Dwarf.h"
|
#include "llvm/Support/Dwarf.h"
|
||||||
#include "llvm/Support/ErrorHandling.h"
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
@ -41,6 +42,11 @@
|
|||||||
#include <cctype>
|
#include <cctype>
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
|
static cl::opt<bool>
|
||||||
|
EnableDebugInfoComment("enable-debug-info-comment", cl::Hidden,
|
||||||
|
cl::desc("Enable debug info comments"));
|
||||||
|
|
||||||
|
|
||||||
// Make virtual table appear in this compilation unit.
|
// Make virtual table appear in this compilation unit.
|
||||||
AssemblyAnnotationWriter::~AssemblyAnnotationWriter() {}
|
AssemblyAnnotationWriter::~AssemblyAnnotationWriter() {}
|
||||||
|
|
||||||
@ -1729,6 +1735,18 @@ void AssemblyWriter::printBasicBlock(const BasicBlock *BB) {
|
|||||||
if (AnnotationWriter) AnnotationWriter->emitBasicBlockEndAnnot(BB, Out);
|
if (AnnotationWriter) AnnotationWriter->emitBasicBlockEndAnnot(BB, Out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// printDebugLoc - Print DebugLoc.
|
||||||
|
static void printDebugLoc(const DebugLoc &DL, formatted_raw_ostream &OS) {
|
||||||
|
OS << DL.getLine() << ":" << DL.getCol();
|
||||||
|
if (MDNode *N = DL.getInlinedAt(getGlobalContext())) {
|
||||||
|
DebugLoc IDL = DebugLoc::getFromDILocation(N);
|
||||||
|
if (!IDL.isUnknown()) {
|
||||||
|
OS << "@";
|
||||||
|
printDebugLoc(IDL,OS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// printInfoComment - Print a little comment after the instruction indicating
|
/// printInfoComment - Print a little comment after the instruction indicating
|
||||||
/// which slot it occupies.
|
/// which slot it occupies.
|
||||||
///
|
///
|
||||||
@ -1736,6 +1754,43 @@ void AssemblyWriter::printInfoComment(const Value &V) {
|
|||||||
if (AnnotationWriter) {
|
if (AnnotationWriter) {
|
||||||
AnnotationWriter->printInfoComment(V, Out);
|
AnnotationWriter->printInfoComment(V, Out);
|
||||||
return;
|
return;
|
||||||
|
} else if (EnableDebugInfoComment) {
|
||||||
|
bool Padded = false;
|
||||||
|
if (const Instruction *I = dyn_cast<Instruction>(&V)) {
|
||||||
|
const DebugLoc &DL = I->getDebugLoc();
|
||||||
|
if (!DL.isUnknown()) {
|
||||||
|
if (!Padded) {
|
||||||
|
Out.PadToColumn(50);
|
||||||
|
Padded = true;
|
||||||
|
Out << ";";
|
||||||
|
}
|
||||||
|
Out << " [debug line = ";
|
||||||
|
printDebugLoc(DL,Out);
|
||||||
|
Out << "]";
|
||||||
|
}
|
||||||
|
if (const DbgDeclareInst *DDI = dyn_cast<DbgDeclareInst>(I)) {
|
||||||
|
const MDNode *Var = DDI->getVariable();
|
||||||
|
if (!Padded) {
|
||||||
|
Out.PadToColumn(50);
|
||||||
|
Padded = true;
|
||||||
|
Out << ";";
|
||||||
|
}
|
||||||
|
if (Var && Var->getNumOperands() >= 2)
|
||||||
|
if (MDString *MDS = dyn_cast_or_null<MDString>(Var->getOperand(2)))
|
||||||
|
Out << " [debug variable = " << MDS->getString() << "]";
|
||||||
|
}
|
||||||
|
else if (const DbgValueInst *DVI = dyn_cast<DbgValueInst>(I)) {
|
||||||
|
const MDNode *Var = DVI->getVariable();
|
||||||
|
if (!Padded) {
|
||||||
|
Out.PadToColumn(50);
|
||||||
|
Padded = true;
|
||||||
|
Out << ";";
|
||||||
|
}
|
||||||
|
if (Var && Var->getNumOperands() >= 2)
|
||||||
|
if (MDString *MDS = dyn_cast_or_null<MDString>(Var->getOperand(2)))
|
||||||
|
Out << " [debug variable = " << MDS->getString() << "]";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user