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

kjdf at users.sourceforge.net kjdf at users.sourceforge.net
Wed Jul 8 16:35:31 CEST 2009


Revision: 42264
          http://scummvm.svn.sourceforge.net/scummvm/?rev=42264&view=rev
Author:   kjdf
Date:     2009-07-08 14:35:31 +0000 (Wed, 08 Jul 2009)

Log Message:
-----------
decompiler: commandline switch to check script reducibility

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-08 13:08:51 UTC (rev 42263)
+++ tools/branches/gsoc2009-decompiler/decompiler/decompiler.cpp	2009-07-08 14:35:31 UTC (rev 42264)
@@ -16,6 +16,7 @@
 	options_description visible("Allowed options");
 	visible.add_options()
 		("help", "this message")
+		("check-reducibility", "check if the graph is reducible")
 		("disasm", "print disassembly")
 		("blocks", "print basic blocks")
 		("graph-intervals", value<unsigned>(), "print arg-th graph intervals")
@@ -62,6 +63,13 @@
 	cfg.orderBlocks();
 	cfg.removeUnreachableBlocks();
 	cfg.assignDominators();
+	if (vars.count("check-reducibility")) {
+		if (cfg.isReducible())
+			exit(0);
+		foreach (Block *interval, cfg.intervals())
+			cout << phex(interval->_instructions.front()->_addr) << endl;
+		exit(1);
+	}
 	if (vars.count("graph-intervals")) {
 		cfg.assignIntervals();
 		for (unsigned i = 0; i < vars["graph-intervals"].as<unsigned>(); i++)

Modified: tools/branches/gsoc2009-decompiler/decompiler/graph.cpp
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/graph.cpp	2009-07-08 13:08:51 UTC (rev 42263)
+++ tools/branches/gsoc2009-decompiler/decompiler/graph.cpp	2009-07-08 14:35:31 UTC (rev 42264)
@@ -203,6 +203,13 @@
 }
 
 
+bool ControlFlowGraph::isReducible() {
+	for (size_t size = _blocks.size()+1; size > intervals().size(); size = intervals().size(), extendIntervals())
+		;
+	return intervals().size() == 1;
+}
+
+
 Block *ControlFlowGraph::loopFollow(Block *head, Block *latch) {
 	if (head->_loopType == PRE_TESTED)
 		return head->outEdgeOutsideLoop(head);

Modified: tools/branches/gsoc2009-decompiler/decompiler/graph.h
===================================================================
--- tools/branches/gsoc2009-decompiler/decompiler/graph.h	2009-07-08 13:08:51 UTC (rev 42263)
+++ tools/branches/gsoc2009-decompiler/decompiler/graph.h	2009-07-08 14:35:31 UTC (rev 42264)
@@ -126,6 +126,7 @@
 
 	void assignIntervals();  // can be called multiple times
 	void extendIntervals();
+	bool isReducible();
 	void assignDominators();
 
 private:


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