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

brixxie at users.sourceforge.net brixxie at users.sourceforge.net
Sat Jul 14 19:29:58 CEST 2007


Revision: 28074
          http://scummvm.svn.sourceforge.net/scummvm/?rev=28074&view=rev
Author:   brixxie
Date:     2007-07-14 10:29:58 -0700 (Sat, 14 Jul 2007)

Log Message:
-----------
Added algorithm to find graph intervals

Modified Paths:
--------------
    tools/branches/gsoc2007-decompiler/antipasto.scm
    tools/branches/gsoc2007-decompiler/cfgg.scm

Property Changed:
----------------
    tools/branches/gsoc2007-decompiler/


Property changes on: tools/branches/gsoc2007-decompiler
___________________________________________________________________
Name: svk:merge
   - 489ca303-0d3d-4dc1-a57d-017c7912a06a:/local/gsoc2007-decompiler:39
   + 489ca303-0d3d-4dc1-a57d-017c7912a06a:/local/gsoc2007-decompiler:42

Modified: tools/branches/gsoc2007-decompiler/antipasto.scm
===================================================================
--- tools/branches/gsoc2007-decompiler/antipasto.scm	2007-07-14 15:12:22 UTC (rev 28073)
+++ tools/branches/gsoc2007-decompiler/antipasto.scm	2007-07-14 17:29:58 UTC (rev 28074)
@@ -2,7 +2,7 @@
 
 ;;; Antipasto - Scumm Script Disassembler Prototype (version 5 scripts)
 ;;; Copyright (C) 2007 Andreas Scholta
-;;; Time-stamp: <2007-07-08 20:34:50 brx>
+;;; Time-stamp: <2007-07-10 20:27:13 brx>
 
 ;;; This program is free software; you can redistribute it and/or
 ;;; modify it under the terms of the GNU General Public License
@@ -820,11 +820,17 @@
         (printf "[~A] (~X) "
                 (caar decoded)
                 (cadar decoded))
-        (write (cddar decoded))
-        (newline)
+        (pretty-print (cddar decoded))
         (print-decoded (cdr decoded))))
-    (for-each (cut printf "~S\n" <>)
-              (generate-control-flow-graph decoded)))
+    (receive (basic-blocks intervals)
+        (generate-control-flow-graph decoded)
+      (printf "Basic Blocks:\n")
+      (pretty-print basic-blocks)
+      (newline)
+      (printf "Intervals:\n")
+      (for-each (compose (hole newline)
+                         (cut pretty-print <>))
+                intervals)))
   (close-input-port current-script-port)
   (set! current-script-port #f)
   (set! current-script-file #f)

Modified: tools/branches/gsoc2007-decompiler/cfgg.scm
===================================================================
--- tools/branches/gsoc2007-decompiler/cfgg.scm	2007-07-14 15:12:22 UTC (rev 28073)
+++ tools/branches/gsoc2007-decompiler/cfgg.scm	2007-07-14 17:29:58 UTC (rev 28074)
@@ -2,7 +2,7 @@
 
 ;;; Antipasto - Scumm Script Disassembler Prototype
 ;;; Copyright (C) 2007 Andreas Scholta
-;;; Time-stamp: <2007-07-09 01:31:43 brx>
+;;; Time-stamp: <2007-07-10 20:25:19 brx>
 
 ;;; This program is free software; you can redistribute it and/or
 ;;; modify it under the terms of the GNU General Public License
@@ -143,11 +143,46 @@
             (correct-trivial-blocks! (cdr trivial-blocks)
                                      fixed-blocks)))))
 
+(define (find-interval interval basic-blocks)
+  (let ((new-interval-nodes (partition (lambda (block)
+                                         (and (not (memq block interval))
+                                              (every (cut memq <> interval)
+                                                     (basic-block-preds block))))
+                                       basic-blocks)))
+    (if (null? new-interval-nodes)
+        interval
+        (find-interval (append interval
+                               new-interval-nodes)
+                       basic-blocks))))
+
+(define (generate-intervals unprocessed-headers headers basic-blocks)
+  (if (null? unprocessed-headers)
+      '()
+      (let* ((new-interval (find-interval (list (car unprocessed-headers))
+                                          basic-blocks))
+             (new-headers (partition (lambda (block)
+                                       (and (not (memq block headers))
+                                            (not (memq block new-interval))
+                                            (any (cut memq <> new-interval)
+                                                 (basic-block-preds block))))
+                                     basic-blocks)))
+        (cons new-interval
+              (generate-intervals (append (cdr unprocessed-headers)
+                                          new-headers)
+                                  (append headers
+                                          new-headers)
+                                  basic-blocks)))))
+
 (define (generate-control-flow-graph disassembly)
-  (let ((trivial-blocks
-         (generate-trivial-blocks
-          (remove-opcodes-from-disassembly disassembly) '() #f)))
-    (correct-trivial-blocks! trivial-blocks trivial-blocks)))
+  (let* ((trivial-blocks
+          (generate-trivial-blocks
+           (remove-opcodes-from-disassembly disassembly) '() #f))
+         (basic-blocks (correct-trivial-blocks! trivial-blocks
+                                                trivial-blocks)))
+    (values basic-blocks
+            (generate-intervals (list (car basic-blocks))
+                                (list (car basic-blocks))
+                                basic-blocks))))
 
 ;; (test-run "/home/brx/code/gsoc2007-decompiler/M1.scummV5/81.cu_bar_2.0092")
 ;; (test-run "/home/brx/code/gsoc2007-decompiler/M2.scummV5/entry-4.dmp")


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