changeset 4291:015c53fefd3a

Use HexCodeFile for disassembly to avoid loading slow disassembler.
author Christian Wimmer <Christian.Wimmer@Oracle.com>
date Tue, 17 Jan 2012 19:36:20 -0800
parents 21400bafb3ff
children 48cbd78fa964
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/lir/LIR.java graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/HotSpotOptions.java graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/ri/HotSpotRuntime.java
diffstat 4 files changed, 60 insertions(+), 38 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java	Tue Jan 17 19:35:29 2012 -0800
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java	Tue Jan 17 19:36:20 2012 -0800
@@ -174,5 +174,6 @@
     static {
         // turn detailed assertions on when the general assertions are on (misusing the assert keyword for this)
         assert (DetailedAsserts = true) == true;
+        assert (CommentedAssembly = true) == true;
     }
 }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIR.java	Tue Jan 17 19:35:29 2012 -0800
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIR.java	Tue Jan 17 19:36:20 2012 -0800
@@ -131,14 +131,14 @@
 
         // generate code for slow cases
         for (SlowPath sp : slowPaths) {
-            sp.emitCode(tasm);
+            emitSlowPath(tasm, sp);
         }
         // generate deoptimization stubs
         for (SlowPath sp : deoptimizationStubs) {
-            sp.emitCode(tasm);
+            emitSlowPath(tasm, sp);
         }
         // generate traps at the end of the method
-        methodEndMarker.emitCode(tasm);
+        emitSlowPath(tasm, methodEndMarker);
     }
 
     private void emitBlock(TargetMethodAssembler tasm, LIRBlock block) {
@@ -147,16 +147,12 @@
         }
 
         if (GraalOptions.CommentedAssembly) {
-            String st = String.format(" block B%d", block.blockID());
-            tasm.blockComment(st);
+            tasm.blockComment(String.format("block B%d loop %d depth %d", block.blockID(), block.loopIndex(), block.loopDepth()));
         }
 
         for (LIRInstruction op : block.lir()) {
             if (GraalOptions.CommentedAssembly) {
-                // Only print out branches
-                if (op.code instanceof LIRBranch) {
-                    tasm.blockComment(op.toStringWithIdPrefix());
-                }
+                tasm.blockComment(String.format("%d %s", op.id(), op));
             }
             if (GraalOptions.PrintLIRWithAssembly && !TTY.isSuppressed()) {
                 // print out the LIR operation followed by the resulting assembly
@@ -186,6 +182,13 @@
         }
     }
 
+    private static void emitSlowPath(TargetMethodAssembler tasm, SlowPath sp) {
+        if (GraalOptions.CommentedAssembly) {
+            tasm.blockComment(String.format("slow case %s", sp.getClass().getName()));
+        }
+        sp.emitCode(tasm);
+    }
+
     private int lastDecodeStart;
 
     private void printAssembly(TargetMethodAssembler tasm) {
--- a/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/HotSpotOptions.java	Tue Jan 17 19:35:29 2012 -0800
+++ b/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/HotSpotOptions.java	Tue Jan 17 19:36:20 2012 -0800
@@ -31,7 +31,6 @@
 public class HotSpotOptions {
 
     public static void setDefaultOptions() {
-        GraalOptions.CommentedAssembly = false;
         GraalOptions.MethodEndBreakpointGuards = 2;
         GraalOptions.ResolveClassBeforeStaticInvoke = false;
     }
--- a/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/ri/HotSpotRuntime.java	Tue Jan 17 19:35:29 2012 -0800
+++ b/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/ri/HotSpotRuntime.java	Tue Jan 17 19:36:20 2012 -0800
@@ -27,9 +27,13 @@
 import java.util.*;
 
 import com.oracle.max.cri.ci.*;
-import com.oracle.max.cri.ci.CiTargetMethod.*;
+import com.oracle.max.cri.ci.CiTargetMethod.Call;
+import com.oracle.max.cri.ci.CiTargetMethod.DataPatch;
+import com.oracle.max.cri.ci.CiTargetMethod.Safepoint;
+import com.oracle.max.cri.ci.CiUtil.RefMapFormatter;
 import com.oracle.max.cri.ri.*;
-import com.oracle.max.cri.ri.RiType.*;
+import com.oracle.max.cri.ri.RiType.Representation;
+import com.oracle.max.criutils.*;
 import com.oracle.max.graal.compiler.*;
 import com.oracle.max.graal.cri.*;
 import com.oracle.max.graal.graph.*;
@@ -85,37 +89,52 @@
     }
 
     @Override
-    public String disassemble(final CiTargetMethod targetMethod) {
-
-        final DisassemblyPrinter disassemblyPrinter = new DisassemblyPrinter(false) {
-
-            private String siteInfo(int pcOffset) {
-                for (Safepoint site : targetMethod.safepoints) {
-                    if (site.pcOffset == pcOffset) {
-                        return "{safepoint}";
-                    }
+    public String disassemble(CiTargetMethod tm) {
+        byte[] code = Arrays.copyOf(tm.targetCode(), tm.targetCodeSize());
+        CiTarget target = compiler.getTarget();
+        HexCodeFile hcf = new HexCodeFile(code, 0L, target.arch.name, target.wordSize * 8);
+        HexCodeFile.addAnnotations(hcf, tm.annotations());
+        addExceptionHandlersComment(tm, hcf);
+        CiRegister fp = regConfig.getFrameRegister();
+        RefMapFormatter slotFormatter = new RefMapFormatter(target.arch, target.wordSize, fp, 0);
+        for (Safepoint safepoint : tm.safepoints) {
+            if (safepoint instanceof Call) {
+                Call call = (Call) safepoint;
+                if (call.debugInfo != null) {
+                    hcf.addComment(call.pcOffset + call.size, CiUtil.append(new StringBuilder(100), call.debugInfo, slotFormatter).toString());
                 }
-                for (DataPatch site : targetMethod.dataReferences) {
-                    if (site.pcOffset == pcOffset) {
-                        return "{" + site.constant + "}";
-                    }
+                addOperandComment(hcf, call.pcOffset, "{" + call.target + "}");
+            } else {
+                if (safepoint.debugInfo != null) {
+                    hcf.addComment(safepoint.pcOffset, CiUtil.append(new StringBuilder(100), safepoint.debugInfo, slotFormatter).toString());
                 }
-                return null;
+                addOperandComment(hcf, safepoint.pcOffset, "{safepoint}");
             }
-
-            @Override
-            protected String disassembledObjectString(Disassembler disassembler, DisassembledObject disassembledObject) {
-                final String string = super.disassembledObjectString(disassembler, disassembledObject);
+        }
+        for (DataPatch site : tm.dataReferences) {
+            hcf.addOperandComment(site.pcOffset, "{" + site.constant + "}");
+        }
+        return hcf.toEmbeddedString();
+    }
 
-                String site = siteInfo(disassembledObject.startPosition());
-                if (site != null) {
-                    return string + " " + site;
-                }
-                return string;
+    private static void addExceptionHandlersComment(CiTargetMethod tm, HexCodeFile hcf) {
+        if (!tm.exceptionHandlers.isEmpty()) {
+            String nl = HexCodeFile.NEW_LINE;
+            StringBuilder buf = new StringBuilder("------ Exception Handlers ------").append(nl);
+            for (CiTargetMethod.ExceptionHandler e : tm.exceptionHandlers) {
+                buf.append("    ").
+                    append(e.pcOffset).append(" -> ").
+                    append(e.handlerPos).
+                    append("  ").append(e.exceptionType == null ? "<any>" : e.exceptionType).
+                    append(nl);
             }
-        };
-        final byte[] code = Arrays.copyOf(targetMethod.targetCode(), targetMethod.targetCodeSize());
-        return disassemble(code, disassemblyPrinter, 0L);
+            hcf.addComment(0, buf.toString());
+        }
+    }
+
+    private static void addOperandComment(HexCodeFile hcf, int pos, String comment) {
+        String oldValue = hcf.addOperandComment(pos, comment);
+        assert oldValue == null : "multiple comments for operand of instruction at " + pos + ": " + comment + ", " + oldValue;
     }
 
     @Override