diff --git a/include/llvm/CodeGen/SelectionDAGNodes.h b/include/llvm/CodeGen/SelectionDAGNodes.h index 21d4335720d..800ad3932b7 100644 --- a/include/llvm/CodeGen/SelectionDAGNodes.h +++ b/include/llvm/CodeGen/SelectionDAGNodes.h @@ -356,8 +356,9 @@ namespace ISD { // 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. + // then a column then a file id (provided by MachineDebugInfo), then a + // unique id (provided by MachineDebugInfo for label gen). It produces a + // token chain as output. DEBUG_LOC, // BUILTIN_OP_END - This must be the last enum value in this list. diff --git a/lib/CodeGen/MachineDebugInfo.cpp b/lib/CodeGen/MachineDebugInfo.cpp index 2cd30fad18b..fc88b8ca006 100644 --- a/lib/CodeGen/MachineDebugInfo.cpp +++ b/lib/CodeGen/MachineDebugInfo.cpp @@ -50,6 +50,7 @@ namespace llvm { /// doFinalization - Tear down the debug state after completion of a module. /// bool MachineDebugInfo::doFinalization() { + return true; } diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 30a4c9f637c..1cfa305d858 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -2117,7 +2117,8 @@ SDOperand DAGCombiner::visitDEBUGLOC(SDNode *N) { return DAG.getNode(ISD::DEBUG_LOC, MVT::Other, Chain.getOperand(0), N->getOperand(1), N->getOperand(2), - N->getOperand(3)); + N->getOperand(3), + N->getOperand(4)); } return SDOperand(); diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index af2c4ba1398..bd8c50a53d3 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -628,8 +628,10 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { cast(Node->getOperand(3))->getValue(); const std::string &dirname = cast(Node->getOperand(4))->getValue(); - unsigned id = DebugInfo.RecordSource(fname, dirname); - Ops.push_back(DAG.getConstant(id, MVT::i32)); // source file id + unsigned srcfile = DebugInfo.RecordSource(fname, dirname); + Ops.push_back(DAG.getConstant(srcfile, MVT::i32)); // source file id + unsigned id = DebugInfo.NextUniqueID(); + Ops.push_back(DAG.getConstant(id, MVT::i32)); // label id Result = DAG.getNode(ISD::DEBUG_LOC, MVT::Other, Ops); } else { Result = Tmp1; // chain @@ -659,22 +661,27 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { break; case ISD::DEBUG_LOC: - assert(Node->getNumOperands() == 4 && "Invalid DEBUG_LOC node!"); + assert(Node->getNumOperands() == 5 && "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); + case TargetLowering::Legal: { + SDOperand Tmp5; + 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. + Tmp5 = LegalizeOp(Node->getOperand(4)); // Legalize the label id. + + if (Tmp1 != Node->getOperand(0) || + Tmp2 != Node->getOperand(1) || + Tmp3 != Node->getOperand(2) || + Tmp4 != Node->getOperand(3) || + Tmp5 != Node->getOperand(4)) { + Result = + DAG.getNode(ISD::DEBUG_LOC,MVT::Other, Tmp1, Tmp2, Tmp3, Tmp4, Tmp5); + } } break; } diff --git a/lib/Target/PowerPC/PPCInstrInfo.td b/lib/Target/PowerPC/PPCInstrInfo.td index 395eab678d5..3d3424d17bc 100644 --- a/lib/Target/PowerPC/PPCInstrInfo.td +++ b/lib/Target/PowerPC/PPCInstrInfo.td @@ -955,10 +955,11 @@ 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", +def DWARF_LOC : Pseudo<(ops i32imm:$line, i32imm:$col, i32imm:$file, + i32imm:$id), + "; .loc $file, $line, $col\nLdebug_loc$id:", [(dwarf_loc (i32 imm:$line), (i32 imm:$col), - (i32 imm:$file))]>; + (i32 imm:$file), (i32 imm:$id))]>; //===----------------------------------------------------------------------===// // PowerPC Instruction Patterns diff --git a/lib/Target/TargetSelectionDAG.td b/lib/Target/TargetSelectionDAG.td index db7c2bdd023..13cd40e3916 100644 --- a/lib/Target/TargetSelectionDAG.td +++ b/lib/Target/TargetSelectionDAG.td @@ -440,8 +440,8 @@ class ComplexPattern roots = [ //===----------------------------------------------------------------------===// // Dwarf support. // -def SDT_dwarf_loc : SDTypeProfile<0, 3, - [SDTCisInt<0>, SDTCisInt<1>, SDTCisInt<2>]>; +def SDT_dwarf_loc : SDTypeProfile<0, 4, + [SDTCisInt<0>, SDTCisInt<1>, SDTCisInt<2>, SDTCisInt<3>]>; def dwarf_loc : SDNode<"ISD::DEBUG_LOC", SDT_dwarf_loc,[SDNPHasChain]>;