[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