mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-22 20:26:31 +00:00
Add some debug routines to SelectionDAG to dump full DAGs.
print/dumpWithDepth allows one to dump a DAG up to N levels deep. dump/printWithFullDepth prints the whole DAG, subject to a depth limit on 100 in the default case (to prevent infinite recursion). Have CannotYetSelect to a dumpWithFullDepth so it is clearer exactly what the non-matching DAG looks like. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93538 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
54482b472a
commit
ac931c011f
@ -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; }
|
||||
|
||||
|
@ -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())
|
||||
|
@ -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());
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user