diff options
-rw-r--r-- | include/llvm/CodeGen/MachineDebugInfo.h | 80 | ||||
-rw-r--r-- | include/llvm/CodeGen/MachineFunction.h | 10 | ||||
-rw-r--r-- | include/llvm/CodeGen/SelectionDAGNodes.h | 6 | ||||
-rw-r--r-- | lib/CodeGen/MachineFunction.cpp | 2 | ||||
-rw-r--r-- | lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 37 | ||||
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 1 | ||||
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 2 | ||||
-rw-r--r-- | lib/Target/PowerPC/PPCAsmPrinter.cpp | 8 | ||||
-rw-r--r-- | lib/Target/PowerPC/PPCInstrInfo.td | 9 | ||||
-rw-r--r-- | lib/Target/TargetSelectionDAG.td | 10 |
10 files changed, 160 insertions, 5 deletions
diff --git a/include/llvm/CodeGen/MachineDebugInfo.h b/include/llvm/CodeGen/MachineDebugInfo.h new file mode 100644 index 0000000000..0dba5866ee --- /dev/null +++ b/include/llvm/CodeGen/MachineDebugInfo.h @@ -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 diff --git a/include/llvm/CodeGen/MachineFunction.h b/include/llvm/CodeGen/MachineFunction.h index 8727793eec..05077fe5f0 100644 --- a/include/llvm/CodeGen/MachineFunction.h +++ b/include/llvm/CodeGen/MachineFunction.h @@ -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. diff --git a/include/llvm/CodeGen/SelectionDAGNodes.h b/include/llvm/CodeGen/SelectionDAGNodes.h index 10b9050e26..bf0191031b 100644 --- a/include/llvm/CodeGen/SelectionDAGNodes.h +++ b/include/llvm/CodeGen/SelectionDAGNodes.h @@ -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, }; diff --git a/lib/CodeGen/MachineFunction.cpp b/lib/CodeGen/MachineFunction.cpp index f0ece6b3db..f51176ff21 100644 --- a/lib/CodeGen/MachineFunction.cpp +++ b/lib/CodeGen/MachineFunction.cpp @@ -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(); diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 15376216a5..c5b7bf9f54 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -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 diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 30ebeb2b8e..2fe1b0df0d 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -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()) { diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 20335fbaa4..e6a0913a9b 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -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)))); } } } diff --git a/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp index 83e3b0519a..cb27e1f388 100644 --- a/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -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()); diff --git a/lib/Target/PowerPC/PPCInstrInfo.td b/lib/Target/PowerPC/PPCInstrInfo.td index 225017cea7..af7560b648 100644 --- a/lib/Target/PowerPC/PPCInstrInfo.td +++ b/lib/Target/PowerPC/PPCInstrInfo.td @@ -922,6 +922,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 // diff --git a/lib/Target/TargetSelectionDAG.td b/lib/Target/TargetSelectionDAG.td index 36f83c168f..0da445d5d1 100644 --- a/lib/Target/TargetSelectionDAG.td +++ b/lib/Target/TargetSelectionDAG.td @@ -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]>; + + + |