changeset 3500:6111c168756f

IdealGraphPrinter can now output bytecodes, enabled by default (GraalOptions.PrintIdealGraphBytecodes)
author Lukas Stadler <lukas.stadler@jku.at>
date Mon, 08 Aug 2011 15:19:09 +0200
parents dd3ecadecc60
children 600ffdb9adda
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinterObserver.java
diffstat 3 files changed, 30 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java	Mon Aug 08 14:37:01 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java	Mon Aug 08 15:19:09 2011 +0200
@@ -99,6 +99,7 @@
     public static boolean Plot                               = ____;
     public static boolean PlotVerbose                        = ____;
     public static boolean PlotOnError                        = ____;
+    public static boolean PrintIdealGraphBytecodes           = true;
     public static int     PrintIdealGraphLevel               = 0;
     public static boolean PrintIdealGraphFile                = ____;
     public static String  PrintIdealGraphAddress             = "127.0.0.1";
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java	Mon Aug 08 14:37:01 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java	Mon Aug 08 15:19:09 2011 +0200
@@ -27,6 +27,7 @@
 import java.util.AbstractMap.SimpleImmutableEntry;
 import java.util.Map.Entry;
 
+import com.oracle.max.graal.compiler.*;
 import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.schedule.*;
 import com.oracle.max.graal.compiler.util.*;
@@ -34,6 +35,8 @@
 import com.oracle.max.graal.compiler.value.*;
 import com.oracle.max.graal.graph.*;
 import com.oracle.max.graal.graph.collections.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ri.*;
 
 /**
  * Generates a representation of {@link Graph Graphs} that can be visualized and inspected with the <a
@@ -90,10 +93,27 @@
     /**
      * Starts a new group of graphs with the given name, short name and method byte code index (BCI) as properties.
      */
-    public void beginGroup(String name, String shortName, int bci) {
+    public void beginGroup(String name, String shortName, RiMethod method, int bci) {
         stream.println("<group>");
         stream.printf(" <properties><p name='name'>%s</p><p name='origin'>Graal</p></properties>%n", escape(name));
-        stream.printf(" <method name='%s' shortName='%s' bci='%d'/>%n", escape(name), escape(shortName), bci);
+        stream.printf(" <method name='%s' shortName='%s' bci='%d'>%n", escape(name), escape(shortName), bci);
+        if (GraalOptions.PrintIdealGraphBytecodes) {
+            StringBuilder sb = new StringBuilder(40);
+            stream.println("<bytecodes>\n&lt;![CDATA[");
+            BytecodeStream bytecodes = new BytecodeStream(method.code());
+            while (bytecodes.currentBC() != Bytecodes.END) {
+                sb.setLength(0);
+                sb.append(bytecodes.currentBCI()).append(' ');
+                sb.append(Bytecodes.nameOf(bytecodes.currentBC()));
+                for (int i = bytecodes.currentBCI() + 1; i < bytecodes.nextBCI(); ++i) {
+                    sb.append(' ').append(bytecodes.readUByte(i));
+                }
+                stream.println(sb.toString());
+                bytecodes.next();
+            }
+            stream.println("]]&gt;</bytecodes>");
+        }
+        stream.println("</method>");
     }
 
     /**
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinterObserver.java	Mon Aug 08 14:37:01 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinterObserver.java	Mon Aug 08 15:19:09 2011 +0200
@@ -30,6 +30,7 @@
 import com.oracle.max.graal.compiler.observer.*;
 import com.oracle.max.graal.compiler.value.*;
 import com.oracle.max.graal.graph.*;
+import com.sun.cri.ri.*;
 
 /**
  * Observes compilation events and uses {@link IdealGraphPrinter} to generate a graph representation that can be
@@ -73,14 +74,14 @@
             name = name + "." + event.getMethod().name();
 
             if (host != null) {
-                openNetworkPrinter(name);
+                openNetworkPrinter(name, event.getMethod());
             } else {
-                openFilePrinter(name);
+                openFilePrinter(name, event.getMethod());
             }
         }
     }
 
-    private void openFilePrinter(String name) {
+    private void openFilePrinter(String name, RiMethod method) {
         String filename = name + ".igv.xml";
         filename = INVALID_CHAR.matcher(filename).replaceAll("_");
 
@@ -91,13 +92,13 @@
                 printer.addOmittedClass(FrameState.class);
             }
             printer.begin();
-            printer.beginGroup(name, name, -1);
+            printer.beginGroup(name, name, method, -1);
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
 
-    private void openNetworkPrinter(String name) {
+    private void openNetworkPrinter(String name, RiMethod method) {
         try {
             socket = new Socket(host, port);
             if (socket.getInputStream().read() == 'y') {
@@ -114,7 +115,7 @@
                 printer.addOmittedClass(FrameState.class);
             }
             printer.begin();
-            printer.beginGroup(name, name, -1);
+            printer.beginGroup(name, name, method, -1);
             printer.flush();
             if (socket.getInputStream().read() != 'y') {
                 // server declines input for this method