[Scummvm-cvs-logs] SF.net SVN: scummvm:[41832] tools/branches/gsoc2009-decompiler/decompiler

kjdf at users.sourceforge.net kjdf at users.sourceforge.net
Wed Jun 24 20:28:18 CEST 2009


Revision: 41832
          http://scummvm.svn.sourceforge.net/scummvm/?rev=41832&view=rev
Author:   kjdf
Date:     2009-06-24 18:28:18 +0000 (Wed, 24 Jun 2009)

Log Message:
-----------
decompiler: inner loops are marked

Modified Paths:
--------------
    tools/branches/gsoc2009-decompiler/decompiler/decompiler.cpp
    tools/branches/gsoc2009-decompiler/decompiler/graph.h
    tools/branches/gsoc2009-decompiler/decompiler/instruction.h

Modified: tools/branches/gsoc2009-decompiler/decompiler/decompiler.cpp
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/decompiler.cpp	2009-06-24 18:28:00 UTC (rev 41831)
+++ tools/branches/gsoc2009-decompiler/decompiler/decompiler.cpp	2009-06-24 18:28:18 UTC (rev 41832)
@@ -56,7 +56,9 @@
 	cfg._graph.intervals();
 	if (vars.count("graph")) {
 		Graph<Block*> &g = cfg._graph;
+		g.markReversePostOrder();
 		g.intervals();
+		g.loopStruct();
 		for (int i = 0; i < vars["derive"].as<int>(); i++)
 			g.extendIntervals();
 		cfg.printDot(cout);

Modified: tools/branches/gsoc2009-decompiler/decompiler/graph.h
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/graph.h	2009-06-24 18:28:00 UTC (rev 41831)
+++ tools/branches/gsoc2009-decompiler/decompiler/graph.h	2009-06-24 18:28:18 UTC (rev 41832)
@@ -42,8 +42,10 @@
 		Node *_interval;
 		std::list<Node*> _in;
 		std::list<Node*> _out;
+		int _order;
+		int _loop;
 
-		Node(const Data &data) : _data(data), _interval() {
+		Node(const Data &data) : _data(data), _interval(), _order(), _loop() {
 		}
 
 		~Node() {
@@ -52,8 +54,10 @@
 
 	std::list<Node*> _nodes;
 	Node *_entry;
+	int _currentOrder;
+	int _currentLoop;
 
-	Graph() : _entry() {
+	Graph() : _entry(), _currentOrder(), _currentLoop() {
 	}
 
 	Graph(const Graph &g) : _entry() {
@@ -65,7 +69,6 @@
 			foreach (Node *v, u->_out)
 				addEdge(trans[u], trans[v]);
 			trans[u]->_interval = trans[u->_interval];
-			trans[u]->_primitive = u->_primitive;
 		}
 		_entry = trans[g._entry];
 	}
@@ -85,7 +88,6 @@
 			foreach (Node *v, u->_out)
 				addEdge(trans[u], trans[v]);
 			trans[u]->_interval = trans[u->_interval];
-			trans[u]->_primitive = u->_primitive;
 		}
 		_entry = trans[g._entry];
 		return *this;
@@ -147,6 +149,30 @@
 		return ret;
 	}
 
+	// TODO: merge with removeUnreachableNodes?
+	void markReversePostOrder() {
+		foreach (Node *u, _nodes)
+			u->_visited = false;
+		_currentOrder = _nodes.size();
+		assert(_entry);
+		visit(_entry);
+	}
+
+	void loopStruct() {
+		foreach (Node *interval, intervals()) {
+			foreach (Node *latch, interval->_in) {
+				if (latch->_interval == interval) { // it *is* latching node not only by name :)
+					if (!latch->_loop && !interval->_loop) {
+						int curloop = ++_currentLoop;
+						foreach (Node *u, _nodes)
+							if (interval->_order <= u->_order && u->_order <= latch->_order && u->_interval == interval)
+								u->_loop = curloop;
+					}
+				}
+			}
+		}
+	}
+
 	void extendIntervals() {
 		Graph<Node*> d;
 		std::map<Node*, typename Graph<Node*>::Node*> trans;
@@ -177,7 +203,11 @@
 						<< "[fontname=" << '"' << fontname << '"'
 						<< ",fontsize=" << fontsize
 						<< ",shape=box"
-						<< ",label=" << '"' << graphvizEscapeLabel(printer(u->_data)) << '"'
+						<< ",label=" << '"'
+						             << "<order: " << u->_order << ", "
+						             << "loop: " << u->_loop << ">\\n"
+						             << graphvizEscapeLabel(printer(u->_data))
+						             << '"'
 						<< "];" << std::endl;
 			ret << "}" << std::endl;
 		}
@@ -198,6 +228,7 @@
 		foreach (Node *v, u->_out)
 			if (!v->_visited)
 				visit(v);
+		u->_order = _currentOrder--;
 	}
 
 	void assignIntervals() const {

Modified: tools/branches/gsoc2009-decompiler/decompiler/instruction.h
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/instruction.h	2009-06-24 18:28:00 UTC (rev 41831)
+++ tools/branches/gsoc2009-decompiler/decompiler/instruction.h	2009-06-24 18:28:18 UTC (rev 41832)
@@ -68,7 +68,7 @@
 
 	void print(ostream &out, index_t i) {
 		if (i >= 1 && _instructions[i]->_addr == _instructions[i-1]->_addr)
-			out << "       " << _instructions[i]->_description;
+			out << "      " << _instructions[i]->_description;
 		else
 			out << phex(_instructions[i]->_addr-8) << "  " << _instructions[i]->_description;
 		Jump *jump = dynamic_cast<Jump*>(_instructions[i]);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list