mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-01 10:02:42 +00:00
Added source file/line correspondence for dwarf (PowerPC only at this point.)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24748 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d9e0ba49a4
commit
f5395cee6a
80
include/llvm/CodeGen/MachineDebugInfo.h
Normal file
80
include/llvm/CodeGen/MachineDebugInfo.h
Normal file
@ -0,0 +1,80 @@
|
||||
//===-- llvm/CodeGen/MachineDebugInfo.h -------------------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file was developed by James M. Laskey and is distributed under
|
||||
// the University of Illinois Open Source License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Collect debug information for a module. This information should be in a
|
||||
// neutral form that can be used by different debugging schemes.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CODEGEN_MACHINEDEBUGINFO_H
|
||||
#define LLVM_CODEGEN_MACHINEDEBUGINFO_H
|
||||
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
namespace llvm {
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// MachineDebugInfo - This class contains debug information specific to a
|
||||
/// module. Queries can be made by different debugging schemes and reformated
|
||||
/// for specific use.
|
||||
///
|
||||
class MachineDebugInfo {
|
||||
private:
|
||||
// convenience types
|
||||
typedef std::map<std::string, unsigned> StrIntMap;
|
||||
typedef StrIntMap::iterator StrIntMapIter;
|
||||
|
||||
StrIntMap SourceMap; // Map of source file path to id
|
||||
unsigned SourceCount; // Number of source files (used to
|
||||
// generate id)
|
||||
|
||||
public:
|
||||
// Ctor.
|
||||
MachineDebugInfo() : SourceMap(), SourceCount(0) {}
|
||||
|
||||
/// RecordSource - Register a source file with debug info. Returns an id.
|
||||
///
|
||||
unsigned RecordSource(std::string fname, std::string dirname) {
|
||||
// Compose a key
|
||||
std::string path = dirname + "/" + fname;
|
||||
// Check if the source file is already recorded
|
||||
StrIntMapIter SMI = SourceMap.find(path);
|
||||
// If already there return existing id
|
||||
if (SMI != SourceMap.end()) return SMI->second;
|
||||
// Bump up the count
|
||||
++SourceCount;
|
||||
// Record the count
|
||||
SourceMap[path] = SourceCount;
|
||||
// Return id
|
||||
return SourceCount;
|
||||
}
|
||||
|
||||
/// getSourceFiles - Return a vector of files. Vector index + 1 equals id.
|
||||
///
|
||||
std::vector<std::string> getSourceFiles() {
|
||||
std::vector<std::string> Sources(SourceCount);
|
||||
|
||||
for (StrIntMapIter SMI = SourceMap.begin(), E = SourceMap.end(); SMI != E;
|
||||
SMI++) {
|
||||
unsigned Index = SMI->second - 1;
|
||||
std::string Path = SMI->first;
|
||||
Sources[Index] = Path;
|
||||
}
|
||||
return Sources;
|
||||
}
|
||||
|
||||
}; // End class MachineDebugInfo
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
@ -18,6 +18,7 @@
|
||||
#ifndef LLVM_CODEGEN_MACHINEFUNCTION_H
|
||||
#define LLVM_CODEGEN_MACHINEFUNCTION_H
|
||||
|
||||
#include "llvm/CodeGen/MachineDebugInfo.h"
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
#include "llvm/Support/Annotation.h"
|
||||
|
||||
@ -112,6 +113,10 @@ class MachineFunction : private Annotation {
|
||||
/// stored in the second element.
|
||||
std::vector<std::pair<unsigned, unsigned> > LiveIns;
|
||||
std::vector<unsigned> LiveOuts;
|
||||
|
||||
/// DebugInfo - Keep track of debug information for the function.
|
||||
///
|
||||
MachineDebugInfo DebugInfo;
|
||||
|
||||
public:
|
||||
MachineFunction(const Function *Fn, const TargetMachine &TM);
|
||||
@ -212,6 +217,11 @@ public:
|
||||
const MachineBasicBlock *getLastBlock() const {
|
||||
return MBBNumbering.back();
|
||||
}
|
||||
|
||||
/// getDebugInfo - Returns the DebugInfo.
|
||||
MachineDebugInfo &getDebugInfo() {
|
||||
return DebugInfo;
|
||||
}
|
||||
|
||||
/// print - Print out the MachineFunction in a format suitable for debugging
|
||||
/// to the specified stream.
|
||||
|
@ -352,6 +352,12 @@ namespace ISD {
|
||||
// as output.
|
||||
LOCATION,
|
||||
|
||||
// DEBUG_LOC - This node is used to represent source line information
|
||||
// embedded in the code. It takes token chain as input, then a line number,
|
||||
// then a column then a file id (provided by MachineDebugInfo. It produces
|
||||
// a token chain as output.
|
||||
DEBUG_LOC,
|
||||
|
||||
// BUILTIN_OP_END - This must be the last enum value in this list.
|
||||
BUILTIN_OP_END,
|
||||
};
|
||||
|
@ -108,7 +108,7 @@ void ilist_traits<MachineBasicBlock>::transferNodesFromList(
|
||||
|
||||
MachineFunction::MachineFunction(const Function *F,
|
||||
const TargetMachine &TM)
|
||||
: Annotation(MF_AID), Fn(F), Target(TM), UsedPhysRegs(0) {
|
||||
: Annotation(MF_AID), Fn(F), Target(TM), UsedPhysRegs(0), DebugInfo() {
|
||||
SSARegMapping = new SSARegMap();
|
||||
MFInfo = 0;
|
||||
FrameInfo = new MachineFrameInfo();
|
||||
|
@ -611,9 +611,18 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
|
||||
switch (TLI.getOperationAction(ISD::LOCATION, MVT::Other)) {
|
||||
case TargetLowering::Promote:
|
||||
default: assert(0 && "This action is not supported yet!");
|
||||
case TargetLowering::Expand:
|
||||
// If the target doesn't support line numbers, ignore this node.
|
||||
Result = Tmp1;
|
||||
case TargetLowering::Expand: {
|
||||
MachineDebugInfo &DebugInfo = DAG.getMachineFunction().getDebugInfo();
|
||||
std::vector<SDOperand> Ops;
|
||||
Ops.push_back(Tmp1); // chain
|
||||
Ops.push_back(Node->getOperand(1)); // line #
|
||||
Ops.push_back(Node->getOperand(2)); // col #
|
||||
const std::string &fname = cast<StringSDNode>(Node->getOperand(3))->getValue();
|
||||
const std::string &dirname=cast<StringSDNode>(Node->getOperand(4))->getValue();
|
||||
unsigned id = DebugInfo.RecordSource(fname, dirname);
|
||||
Ops.push_back(DAG.getConstant(id, MVT::i32)); // source file id
|
||||
Result = DAG.getNode(ISD::DEBUG_LOC, MVT::Other, Ops);
|
||||
}
|
||||
break;
|
||||
case TargetLowering::Legal:
|
||||
if (Tmp1 != Node->getOperand(0) ||
|
||||
@ -635,6 +644,28 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case ISD::DEBUG_LOC:
|
||||
assert(Node->getNumOperands() == 4 && "Invalid DEBUG_LOC node!");
|
||||
switch (TLI.getOperationAction(ISD::DEBUG_LOC, MVT::Other)) {
|
||||
case TargetLowering::Promote:
|
||||
case TargetLowering::Expand:
|
||||
default: assert(0 && "This action is not supported yet!");
|
||||
case TargetLowering::Legal:
|
||||
Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain.
|
||||
Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the line #.
|
||||
Tmp3 = LegalizeOp(Node->getOperand(2)); // Legalize the col #.
|
||||
Tmp4 = LegalizeOp(Node->getOperand(3)); // Legalize the source file id.
|
||||
|
||||
if (Tmp1 != Node->getOperand(0) ||
|
||||
Tmp2 != Node->getOperand(1) ||
|
||||
Tmp3 != Node->getOperand(2) ||
|
||||
Tmp4 != Node->getOperand(3)) {
|
||||
Result = DAG.getNode(ISD::DEBUG_LOC,MVT::Other, Tmp1, Tmp2, Tmp3, Tmp4);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case ISD::Constant:
|
||||
// We know we don't need to expand constants here, constants only have one
|
||||
|
@ -1961,6 +1961,7 @@ const char *SDNode::getOperationName(const SelectionDAG *G) const {
|
||||
|
||||
// Debug info
|
||||
case ISD::LOCATION: return "location";
|
||||
case ISD::DEBUG_LOC: return "debug_loc";
|
||||
|
||||
case ISD::CONDCODE:
|
||||
switch (cast<CondCodeSDNode>(this)->get()) {
|
||||
|
@ -918,8 +918,8 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
|
||||
if (ConstantStruct *CS =
|
||||
dyn_cast<ConstantStruct>(cunit->getInitializer())) {
|
||||
if (CS->getNumOperands() > 0) {
|
||||
Ops.push_back(DAG.getString(getStringValue(CS->getOperand(4))));
|
||||
Ops.push_back(DAG.getString(getStringValue(CS->getOperand(3))));
|
||||
Ops.push_back(DAG.getString(getStringValue(CS->getOperand(4))));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include "llvm/Module.h"
|
||||
#include "llvm/Assembly/Writer.h"
|
||||
#include "llvm/CodeGen/AsmPrinter.h"
|
||||
#include "llvm/CodeGen/MachineDebugInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||
#include "llvm/CodeGen/MachineInstr.h"
|
||||
#include "llvm/Support/Mangler.h"
|
||||
@ -375,6 +376,13 @@ void PPCAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
|
||||
bool DarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
||||
SetupMachineFunction(MF);
|
||||
O << "\n\n";
|
||||
|
||||
// Print out dwarf file info
|
||||
MachineDebugInfo &DebugInfo = MF.getDebugInfo();
|
||||
std::vector<std::string> Sources = DebugInfo.getSourceFiles();
|
||||
for (unsigned i = 0, N = Sources.size(); i < N; i++) {
|
||||
O << "\t; .file\t" << (i + 1) << "," << "\"" << Sources[i] << "\"" << "\n";
|
||||
}
|
||||
|
||||
// Print out constants referenced by the function
|
||||
EmitConstantPool(MF.getConstantPool());
|
||||
|
@ -921,6 +921,15 @@ def V_SET0 : VXForm_setzero<1220, (ops VRRC:$vD),
|
||||
[]>;
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// DWARF Pseudo Instructions
|
||||
//
|
||||
|
||||
def DWARF_LOC : Pseudo<(ops i32imm:$line, i32imm:$col, i32imm:$file),
|
||||
"; .loc $file, $line, $col",
|
||||
[(dwarf_loc (i32 imm:$line), (i32 imm:$col),
|
||||
(i32 imm:$file))]>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// PowerPC Instruction Patterns
|
||||
//
|
||||
|
@ -415,3 +415,13 @@ class ComplexPattern<ValueType ty, int numops, string fn, list<SDNode> roots = [
|
||||
string SelectFunc = fn;
|
||||
list<SDNode> RootNodes = roots;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Dwarf support.
|
||||
//
|
||||
def SDT_dwarf_loc : SDTypeProfile<0, 3,
|
||||
[SDTCisInt<0>, SDTCisInt<1>, SDTCisInt<2>]>;
|
||||
def dwarf_loc : SDNode<"ISD::DEBUG_LOC", SDT_dwarf_loc,[SDNPHasChain]>;
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user