diff --git a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h index 7b1931abcc61..b60e2f2a31f1 100644 --- a/llvm/include/llvm/CodeGen/SelectionDAGNodes.h +++ b/llvm/include/llvm/CodeGen/SelectionDAGNodes.h @@ -1285,10 +1285,29 @@ public: void print_details(raw_ostream &OS, const SelectionDAG *G) const; void print(raw_ostream &OS, const SelectionDAG *G = 0) const; void printr(raw_ostream &OS, const SelectionDAG *G = 0) const; + /// printWithDepth - Print a SelectionDAG node and children up to + /// depth "depth." "limit" controls whether a message should be + /// printed if we hit depth "depth." + /// + void printWithDepth(raw_ostream &O, const SelectionDAG *G = 0, + unsigned depth = -1, unsigned indent = 0, + bool limit = false) const; + /// printWithFullDepth - Print a SelectionDAG node and all children + /// down to the leaves. + /// + void printWithFullDepth(raw_ostream &O, const SelectionDAG *G = 0, + unsigned indent = 0) const; void dump() const; void dumpr() const; void dump(const SelectionDAG *G) const; void dumpr(const SelectionDAG *G) const; + /// dumpWithDepth - printWithDepth to dbgs(). + /// + void dumpWithDepth(const SelectionDAG *G = 0, unsigned depth = 1, + unsigned indent = 0, bool limit = false) const; + /// dumpWithFullDepth - printWithFullDepth to dbgs(). + /// + void dumpWithFullDepth(const SelectionDAG *G = 0, unsigned indent = 0) const; static bool classof(const SDNode *) { return true; } diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index cb1a0d660b4c..b8ac005952a1 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -5893,6 +5893,49 @@ void SDNode::print(raw_ostream &OS, const SelectionDAG *G) const { print_details(OS, G); } +void SDNode::printWithDepth(raw_ostream &OS, const SelectionDAG *G, + unsigned depth, unsigned indent, + bool limit) const { + if (depth == 0) { + if (limit) + OS << "*** - Cycle? ***\n"; + return; + } + + int myindent = indent; + + while (myindent--) { + OS << ' '; + } + + print(OS, G); + + if (depth > 1) { + for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { + OS << '\n'; + getOperand(i).getNode()->printWithDepth(OS, G, + depth > 0 ? depth-1 : depth, + indent+2); + } + } +} + +void SDNode::printWithFullDepth(raw_ostream &OS, const SelectionDAG *G, + unsigned indent) const { + // Don't print impossibly deep things. + printWithDepth(OS, G, 100, indent, true); +} + +void SDNode::dumpWithDepth(const SelectionDAG *G, unsigned depth, + unsigned indent, bool limit) const { + printWithDepth(dbgs(), G, depth, indent, limit); +} + +void SDNode::dumpWithFullDepth(const SelectionDAG *G, unsigned indent) const { + // Don't print impossibly deep things. + dumpWithDepth(G, 100, indent, true); +} + static void DumpNodes(const SDNode *N, unsigned indent, const SelectionDAG *G) { for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) if (N->getOperand(i).getNode()->hasOneUse()) diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 9ac8f83ad44b..e53966426c60 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -1426,7 +1426,7 @@ void SelectionDAGISel::CannotYetSelect(SDNode *N) { std::string msg; raw_string_ostream Msg(msg); Msg << "Cannot yet select: "; - N->print(Msg, CurDAG); + N->printWithFullDepth(Msg, CurDAG); llvm_report_error(Msg.str()); }