aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/CodeGen/SelectionDAGNodes.h19
-rw-r--r--lib/CodeGen/SelectionDAG/SelectionDAG.cpp43
-rw-r--r--lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp2
3 files changed, 63 insertions, 1 deletions
diff --git a/include/llvm/CodeGen/SelectionDAGNodes.h b/include/llvm/CodeGen/SelectionDAGNodes.h
index 7b1931abcc..b60e2f2a31 100644
--- a/include/llvm/CodeGen/SelectionDAGNodes.h
+++ b/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/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index cb1a0d660b..b8ac005952 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/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 << "*** <max depth> - 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/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index 9ac8f83ad4..e53966426c 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/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());
}