mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +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:
		| @@ -1285,10 +1285,29 @@ public: | |||||||
|   void print_details(raw_ostream &OS, const SelectionDAG *G) const; |   void print_details(raw_ostream &OS, const SelectionDAG *G) const; | ||||||
|   void print(raw_ostream &OS, const SelectionDAG *G = 0) const; |   void print(raw_ostream &OS, const SelectionDAG *G = 0) const; | ||||||
|   void printr(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 dump() const; | ||||||
|   void dumpr() const; |   void dumpr() const; | ||||||
|   void dump(const SelectionDAG *G) const; |   void dump(const SelectionDAG *G) const; | ||||||
|   void dumpr(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; } |   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); |   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) { | static void DumpNodes(const SDNode *N, unsigned indent, const SelectionDAG *G) { | ||||||
|   for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) |   for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) | ||||||
|     if (N->getOperand(i).getNode()->hasOneUse()) |     if (N->getOperand(i).getNode()->hasOneUse()) | ||||||
|   | |||||||
| @@ -1426,7 +1426,7 @@ void SelectionDAGISel::CannotYetSelect(SDNode *N) { | |||||||
|   std::string msg; |   std::string msg; | ||||||
|   raw_string_ostream Msg(msg); |   raw_string_ostream Msg(msg); | ||||||
|   Msg << "Cannot yet select: "; |   Msg << "Cannot yet select: "; | ||||||
|   N->print(Msg, CurDAG); |   N->printWithFullDepth(Msg, CurDAG); | ||||||
|   llvm_report_error(Msg.str()); |   llvm_report_error(Msg.str()); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user