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

kjdf at users.sourceforge.net kjdf at users.sourceforge.net
Fri Jul 3 22:56:28 CEST 2009


Revision: 42077
          http://scummvm.svn.sourceforge.net/scummvm/?rev=42077&view=rev
Author:   kjdf
Date:     2009-07-03 20:56:28 +0000 (Fri, 03 Jul 2009)

Log Message:
-----------
decompiler: mark loop information

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

Modified: tools/branches/gsoc2009-decompiler/decompiler/decompiler.cpp
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/decompiler.cpp	2009-07-03 19:58:55 UTC (rev 42076)
+++ tools/branches/gsoc2009-decompiler/decompiler/decompiler.cpp	2009-07-03 20:56:28 UTC (rev 42077)
@@ -70,6 +70,7 @@
 		exit(0);
 	}
 	cfg.loopStruct();
+	cfg.ifStruct();
 	if (vars.count("graph-struct")) {
 		cout << cfg.graphvizToString(vars["fontname"].as<string>());
 		exit(0);

Modified: tools/branches/gsoc2009-decompiler/decompiler/graph.cpp
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/graph.cpp	2009-07-03 19:58:55 UTC (rev 42076)
+++ tools/branches/gsoc2009-decompiler/decompiler/graph.cpp	2009-07-03 20:56:28 UTC (rev 42077)
@@ -158,12 +158,34 @@
 		}
 		if (u->_loopFollow && !hadFollow)
 		    ret << '"' << u << "\" -> \"" << u->_loopFollow << '"' << "[color=blue,style=dashed];" << std::endl;
+		if (u->_ifFollow)
+		    ret << '"' << u << "\" -> \"" << u->_ifFollow << '"' << "[color=red,style=dashed];" << std::endl;
 	}
 	ret << "}" << std::endl;
 	return ret.str();
 }
 
 
+void ControlFlowGraph::ifStruct() {
+	std::list<Block*> unresolved;
+	foreach (Block *u, inPostOrder(_blocks))
+		// TODO how will this work with 2-way head and 2-way latch loops - on latch node? how are loops going to be structured anyway
+		if (u->_out.size() == 2 && !((u->_loopLatch && u->_loopType == PRE_TESTED) || u->_loopHead)) {
+			Block *follow = 0;
+			// find the deepest node with immediate dominator u
+			foreach (Block *v, _blocks)
+				if (v->_dominator == u && v->_in.size() >= 2 && (!follow || v->_number < follow->_number))
+					follow = v;
+			unresolved.push_back(u);
+			if (follow) {
+				foreach (Block *v, unresolved)
+					v->_ifFollow = follow;
+				unresolved.clear();
+			}
+		}
+}
+
+
 std::list<Block*> inPostOrder(std::list<Block*> &blocks) {
 	std::list<Block*> ret(blocks);
 	ret.sort(postOrderCompare);

Modified: tools/branches/gsoc2009-decompiler/decompiler/graph.h
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/graph.h	2009-07-03 19:58:55 UTC (rev 42076)
+++ tools/branches/gsoc2009-decompiler/decompiler/graph.h	2009-07-03 20:56:28 UTC (rev 42077)
@@ -23,6 +23,7 @@
 
 	bool _visited;
 	Block *_dominator;       // immediate dominator
+	Block *_ifFollow;        // block is header node for if, branches converge at _ifFollow
 	Block *_interval;        // header node of the interval this block belongs to
 	Block *_loopFollow;      // if not null, this block is a loop header, and follow is a first block after exit
     Block *_loopHead;        // if not null, this is a latching block
@@ -59,7 +60,7 @@
 		return 0;
 	}
 
-	Block() : _interval(), _number(), _loopHead(), _loopFollow(), _loopLatch(), _visited(), _dominator() {
+	Block() : _interval(), _number(), _loopHead(), _loopFollow(), _loopLatch(), _visited(), _dominator(), _ifFollow() {
 	}
 
 	~Block() {
@@ -115,6 +116,7 @@
 
 	void loopStruct();               // fill in all information about loops
 	std::list<Block*> intervals();   // partition graph into intervals and return list of header blocks
+	void ifStruct();                 // fill in all information about if-then-else, must be called after loopStruct
 
 	void orderBlocks();              // assign block numbers in post-order
 	void removeJumpsToJumps();


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