# HG changeset patch # User Lukas Stadler # Date 1312809549 -7200 # Node ID 6111c168756fb61479a2a2898314190addf045d2 # Parent dd3ecadecc60e49a39d00b68b47adef09cdd2cb5 IdealGraphPrinter can now output bytecodes, enabled by default (GraalOptions.PrintIdealGraphBytecodes) diff -r dd3ecadecc60 -r 6111c168756f graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java --- 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"; diff -r dd3ecadecc60 -r 6111c168756f graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java --- 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 "); stream.printf("

%s

Graal

%n", escape(name)); - stream.printf(" %n", escape(name), escape(shortName), bci); + stream.printf(" %n", escape(name), escape(shortName), bci); + if (GraalOptions.PrintIdealGraphBytecodes) { + StringBuilder sb = new StringBuilder(40); + stream.println("\n<![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("]]>"); + } + stream.println(""); } /** diff -r dd3ecadecc60 -r 6111c168756f graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinterObserver.java --- 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