[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