Mercurial > hg > graal-jvmci-8
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<![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("]]></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