# HG changeset patch # User Christian Wimmer # Date 1326857780 28800 # Node ID 015c53fefd3a2ab76dba09be74465ed33bcfa27f # Parent 21400bafb3ffe679049e172b65f0edd6608c1eb3 Use HexCodeFile for disassembly to avoid loading slow disassembler. diff -r 21400bafb3ff -r 015c53fefd3a 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 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; } } diff -r 21400bafb3ff -r 015c53fefd3a graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIR.java --- 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) { diff -r 21400bafb3ff -r 015c53fefd3a graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/HotSpotOptions.java --- 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; } diff -r 21400bafb3ff -r 015c53fefd3a graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/ri/HotSpotRuntime.java --- 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 ? "" : 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