changeset 11379:0942e34b6c7d

added PrintBackendCFG option (default is true) for controlling if backend output is dumped to the C1Visualizer
author Doug Simon <doug.simon@oracle.com>
date Tue, 20 Aug 2013 18:23:43 +0200
parents 7e297d001c30
children d9bcf8789d57
files graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinter.java graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinterObserver.java graal/com.oracle.graal.printer/src/com/oracle/graal/printer/DebugEnvironment.java
diffstat 4 files changed, 37 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java	Tue Aug 20 16:09:26 2013 +0200
+++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java	Tue Aug 20 18:23:43 2013 +0200
@@ -146,12 +146,14 @@
     @Option(help = "")
     public static final OptionValue<Integer> GCDebugStartCycle = new OptionValue<>(-1);
     // Ideal graph visualizer output settings
-    @Option(help = "")
+    @Option(help = "Dump IdealGraphVisualizer output in binary format")
     public static final OptionValue<Boolean> PrintBinaryGraphs = new OptionValue<>(true);
-    @Option(help = "outputs probabilities for fixed nodes during binary graph dumping")
+    @Option(help = "Output probabilities for fixed nodes during binary graph dumping")
     public static final OptionValue<Boolean> PrintGraphProbabilities = new OptionValue<>(false);
-    @Option(help = "")
+    @Option(help = "Enables dumping to the C1Visualizer. Enabling this option implies PrintBackendCFG.")
     public static final OptionValue<Boolean> PrintCFG = new OptionValue<>(false);
+    @Option(help = "Enables dumping LIR, register allocation and code generation info to the C1Visualizer.")
+    public static final OptionValue<Boolean> PrintBackendCFG = new OptionValue<>(true);
     @Option(help = "")
     public static final OptionValue<Boolean> PrintIdealGraphFile = new OptionValue<>(false);
     @Option(help = "")
@@ -245,7 +247,7 @@
     public static final OptionValue<Double> MinTableSwitchDensity = new OptionValue<>(0.5);
 
     // Ahead of time compilation
-    @Option(help = "configure compiler to emit code compatible with AOT requirements for HotSpot")
+    @Option(help = "Configure compiler to emit code  compatible with AOT requirements for HotSpot")
     public static final OptionValue<Boolean> AOTCompilation = new OptionValue<>(false);
 
     // Runtime settings
--- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinter.java	Tue Aug 20 16:09:26 2013 +0200
+++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinter.java	Tue Aug 20 18:23:43 2013 +0200
@@ -127,7 +127,7 @@
      * @param label A label describing the compilation phase that produced the control flow graph.
      * @param blocks The list of blocks to be printed.
      */
-    public void printCFG(String label, List<Block> blocks) {
+    public void printCFG(String label, List<Block> blocks, boolean printNodes) {
         if (lir == null) {
             latestScheduling = new NodeMap<>(cfg.getNodeToBlock());
             for (Block block : blocks) {
@@ -149,7 +149,7 @@
         begin("cfg");
         out.print("name \"").print(label).println('"');
         for (Block block : blocks) {
-            printBlock(block);
+            printBlock(block, printNodes);
         }
         end("cfg");
 
@@ -185,7 +185,7 @@
         }
     }
 
-    private void printBlock(Block block) {
+    private void printBlock(Block block, boolean printNodes) {
         begin("block");
 
         out.print("name \"").print(blockToString(block)).println('"');
@@ -231,7 +231,9 @@
             out.print("loop_depth ").println(block.getLoop().depth);
         }
 
-        printNodes(block);
+        if (printNodes) {
+            printNodes(block);
+        }
         printLIR(block);
         end("block");
     }
--- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinterObserver.java	Tue Aug 20 16:09:26 2013 +0200
+++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinterObserver.java	Tue Aug 20 18:23:43 2013 +0200
@@ -47,6 +47,12 @@
     private File cfgFile;
     private JavaMethod curMethod;
     private List<String> curDecorators = Collections.emptyList();
+    private final boolean dumpFrontend;
+    private Object previousObject;
+
+    public CFGPrinterObserver(boolean dumpFrontend) {
+        this.dumpFrontend = dumpFrontend;
+    }
 
     @Override
     public void dump(Object object, String message) {
@@ -100,8 +106,16 @@
     private static final long timestamp = System.currentTimeMillis();
     private static final AtomicInteger uniqueId = new AtomicInteger();
 
+    private static boolean isFrontendObject(Object object) {
+        return object instanceof Graph || object instanceof BciBlockMapping;
+    }
+
     public void dumpSandboxed(Object object, String message) {
 
+        if (!dumpFrontend && isFrontendObject(object)) {
+            return;
+        }
+
         if (cfgPrinter == null) {
             cfgFile = new File("compilations-" + timestamp + "_" + uniqueId.incrementAndGet() + ".cfg");
             try {
@@ -143,14 +157,17 @@
             }
 
         } else if (object instanceof LIR) {
-            cfgPrinter.printCFG(message, cfgPrinter.lir.codeEmittingOrder());
+            // No need to print the HIR nodes again if this is not the first
+            // time dumping the same LIR since the HIR will not have changed.
+            boolean printNodes = previousObject != object;
+            cfgPrinter.printCFG(message, cfgPrinter.lir.codeEmittingOrder(), printNodes);
 
         } else if (object instanceof StructuredGraph) {
             if (cfgPrinter.cfg == null) {
                 StructuredGraph graph = (StructuredGraph) object;
                 cfgPrinter.cfg = ControlFlowGraph.compute(graph, true, true, true, false);
             }
-            cfgPrinter.printCFG(message, Arrays.asList(cfgPrinter.cfg.getBlocks()));
+            cfgPrinter.printCFG(message, Arrays.asList(cfgPrinter.cfg.getBlocks()), true);
 
         } else if (object instanceof CompilationResult) {
             final CompilationResult compResult = (CompilationResult) object;
@@ -168,6 +185,8 @@
         cfgPrinter.lirGenerator = null;
         cfgPrinter.cfg = null;
         cfgPrinter.flush();
+
+        previousObject = object;
     }
 
     private static boolean isCompilationResultAndInstalledCode(Object object) {
--- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/DebugEnvironment.java	Tue Aug 20 16:09:26 2013 +0200
+++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/DebugEnvironment.java	Tue Aug 20 18:23:43 2013 +0200
@@ -37,11 +37,11 @@
         Debug.enable();
         List<DebugDumpHandler> dumpHandlers = new ArrayList<>();
         dumpHandlers.add(new GraphPrinterDumpHandler());
-        if (PrintCFG.getValue()) {
-            if (PrintBinaryGraphs.getValue()) {
-                TTY.println("CFG dumping slows down PrintBinaryGraphs: use -G:-PrintCFG to disable it");
+        if (PrintCFG.getValue() || PrintBackendCFG.getValue()) {
+            if (PrintBinaryGraphs.getValue() && PrintCFG.getValue()) {
+                TTY.println("Complete C1Visualizer dumping slows down PrintBinaryGraphs: use -G:-PrintCFG to disable it");
             }
-            dumpHandlers.add(new CFGPrinterObserver());
+            dumpHandlers.add(new CFGPrinterObserver(PrintCFG.getValue()));
         }
         if (DecompileAfterPhase.getValue() != null) {
             dumpHandlers.add(new DecompilerDebugDumpHandler());