# HG changeset patch # User Gilles Duboscq # Date 1342008818 -7200 # Node ID d241f8b2e6f9dc80d4b2a6afb4333ecf8cb5794f # Parent 3b8bc07f8d17c9a8852e8b0258def7bbe65e17a7 Adapt the coloring filter for binary dumped graphs Update no framestate filter to also remove virtual nodes Improve binary serialization of fields and methods Made sure xml serialzer still works for dumping arrays in properties Added some nameTemplates Improved Name templates to optionaly use a short version of the elements Factored away elementType between NewPrimitiveArrayNode and NewObjectArrayNode into NewArrayNode restored Begin/End nodes shortNames diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java Wed Jul 11 14:13:38 2012 +0200 @@ -429,8 +429,6 @@ * @param map */ public Map getDebugProperties(Map map) { - map.put("usageCount", usages.size()); - map.put("hasPredecessor", predecessor != null); getNodeClass().getDebugProperties(this, map); return map; } diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/RegisterNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/RegisterNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/RegisterNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.hotspot.nodes; -import java.util.*; - import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Wed Jul 11 14:13:38 2012 +0200 @@ -696,7 +696,7 @@ private void genNewPrimitiveArray(int typeCode) { Kind kind = arrayTypeCodeToKind(typeCode); ResolvedJavaType elementType = runtime.getResolvedJavaType(kind); - NewPrimitiveArrayNode nta = currentGraph.add(new NewPrimitiveArrayNode(frameState.ipop(), elementType)); + NewPrimitiveArrayNode nta = currentGraph.add(new NewPrimitiveArrayNode(elementType, frameState.ipop())); frameState.apush(append(nta)); } diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -62,13 +62,6 @@ } @Override - public Map getDebugProperties(Map map) { - Map debugProperties = super.getDebugProperties(map); - debugProperties.put("shortName", "B"); - return debugProperties; - } - - @Override public void simplify(SimplifierTool tool) { FixedNode prev = (FixedNode) this.predecessor(); if (prev == null) { diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -28,7 +28,7 @@ import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; -@NodeInfo(shortName = "Deopt") +@NodeInfo(shortName = "Deopt", nameTemplate = "Deopt {p#reason/s}") public class DeoptimizeNode extends FixedNode implements Node.IterableNodeType, LIRLowerable { private String message; diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -29,10 +29,11 @@ import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; +@NodeInfo(nameTemplate = "FixedGuard(!={p#negated}) {p#reason/s}") public final class FixedGuardNode extends FixedWithNextNode implements Simplifiable, Lowerable, LIRLowerable, Node.IterableNodeType, Negatable { @Input private BooleanNode condition; - private final DeoptimizationReason deoptReason; + private final DeoptimizationReason reason; private final DeoptimizationAction action; private boolean negated; private final long leafGraphId; @@ -56,7 +57,7 @@ this.negated = negated; this.leafGraphId = leafGraphId; this.condition = condition; - this.deoptReason = deoptReason; + this.reason = deoptReason; } @Override @@ -70,7 +71,7 @@ @Override public void generate(LIRGeneratorTool gen) { - gen.emitGuardCheck(condition, deoptReason, action, negated, leafGraphId); + gen.emitGuardCheck(condition, reason, action, negated, leafGraphId); } @Override @@ -84,7 +85,7 @@ if (next != null) { tool.deleteBranch(next); } - setNext(graph().add(new DeoptimizeNode(DeoptimizationAction.InvalidateRecompile, deoptReason, leafGraphId))); + setNext(graph().add(new DeoptimizeNode(DeoptimizationAction.InvalidateRecompile, reason, leafGraphId))); return; } } @@ -92,7 +93,7 @@ @Override public void lower(LoweringTool tool) { - ValueAnchorNode newAnchor = graph().add(new ValueAnchorNode(tool.createGuard(condition, deoptReason, action, negated, leafGraphId))); + ValueAnchorNode newAnchor = graph().add(new ValueAnchorNode(tool.createGuard(condition, reason, action, negated, leafGraphId))); ((StructuredGraph) graph()).replaceFixedWithFixed(this, newAnchor); } diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java Wed Jul 11 14:13:38 2012 +0200 @@ -35,6 +35,7 @@ * The {@code FrameState} class encapsulates the frame state (i.e. local variables and * operand stack) at a particular point in the abstract interpretation. */ +@NodeInfo(nameTemplate = "FrameState@{p#method/s}:{p#bci}") public final class FrameState extends VirtualState implements Node.IterableNodeType, LIRLowerable { /** @@ -355,24 +356,13 @@ public Map getDebugProperties(Map map) { Map properties = super.getDebugProperties(map); if (method != null) { - properties.put("method", MetaUtil.format("%H.%n(%p):%r", method)); + //properties.put("method", MetaUtil.format("%H.%n(%p):%r", method)); StackTraceElement ste = method.toStackTraceElement(bci); if (ste.getFileName() != null && ste.getLineNumber() >= 0) { - properties.put("source", ste.getFileName() + ":" + ste.getLineNumber()); + properties.put("sourceFile", ste.getFileName()); + properties.put("sourceLine", ste.getLineNumber()); } - } else { - properties.put("method", "None"); } - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < localsSize(); i++) { - sb.append(i == 0 ? "" : ", ").append(localAt(i) == null ? "_" : localAt(i).toString(Verbosity.Id)); - } - properties.put("locals", sb.toString()); - sb = new StringBuilder(); - for (int i = 0; i < stackSize(); i++) { - sb.append(i == 0 ? "" : ", ").append(stackAt(i) == null ? "_" : stackAt(i).toString(Verbosity.Id)); - } - properties.put("stack", sb.toString()); return properties; } diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -41,6 +41,7 @@ * maximum flexibility for the guard node and guarantees that deoptimization occurs only if the control flow would have * reached the guarded node (without taking exceptions into account). */ +@NodeInfo(nameTemplate = "Guard(!={p#negated}) {p#reason/s}") public final class GuardNode extends FloatingNode implements Canonicalizable, LIRLowerable, TypeFeedbackProvider, Node.IterableNodeType, Negatable { @Input private BooleanNode condition; diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -34,7 +34,7 @@ /** * The {@code InvokeNode} represents all kinds of method calls. */ -@NodeInfo(nameTemplate = "Invoke#{p#targetMethod}") +@NodeInfo(nameTemplate = "Invoke#{p#targetMethod/s}") public final class InvokeNode extends AbstractStateSplit implements StateSplit, Node.IterableNodeType, Invoke, LIRLowerable, MemoryCheckpoint { @Input private final MethodCallTargetNode callTarget; @@ -90,7 +90,7 @@ public Map getDebugProperties(Map map) { Map debugProperties = super.getDebugProperties(map); if (callTarget != null && callTarget.targetMethod() != null) { - debugProperties.put("targetMethod", MetaUtil.format("%h.%n(%p)", callTarget.targetMethod())); + debugProperties.put("targetMethod", callTarget.targetMethod()); } return debugProperties; } diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -30,7 +30,7 @@ import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.util.*; -@NodeInfo(nameTemplate = "Invoke!#{p#targetMethod}") +@NodeInfo(nameTemplate = "Invoke!#{p#targetMethod/s}") public class InvokeWithExceptionNode extends ControlSplitNode implements Node.IterableNodeType, Invoke, MemoryCheckpoint, LIRLowerable { public static final int NORMAL_EDGE = 0; public static final int EXCEPTION_EDGE = 1; @@ -154,9 +154,8 @@ @Override public Map getDebugProperties(Map map) { Map debugProperties = super.getDebugProperties(map); - debugProperties.put("memoryCheckpoint", "true"); if (callTarget != null && callTarget.targetMethod() != null) { - debugProperties.put("targetMethod", MetaUtil.format("%h.%n(%p)", callTarget.targetMethod())); + debugProperties.put("targetMethod", callTarget.targetMethod()); } return debugProperties; } diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LocalNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LocalNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LocalNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -30,7 +30,7 @@ * The {@code Local} instruction is a placeholder for an incoming argument * to a function call. */ - +@NodeInfo(nameTemplate = "Local({p#index})") public final class LocalNode extends FloatingNode implements Node.IterableNodeType { private final int index; diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -32,7 +32,7 @@ * The {@code PhiNode} represents the merging of dataflow in the graph. It refers to a merge * and a variable. */ -@NodeInfo(nameTemplate = "Phi({i#values})") +@NodeInfo(nameTemplate = "{p#type/s}Phi({i#values})") public final class PhiNode extends FloatingNode implements Canonicalizable, Node.IterableNodeType { public static enum PhiType { diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ScheduledNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ScheduledNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ScheduledNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.nodes; -import java.util.*; - import com.oracle.graal.graph.*; public abstract class ScheduledNode extends Node { @@ -38,17 +36,4 @@ updatePredecessor(scheduledNext, x); scheduledNext = x; } - - @Override - public Map getDebugProperties(Map map) { - Map debugProperties = super.getDebugProperties(map); - if (this instanceof StateSplit) { - StateSplit stateSplit = (StateSplit) this; - if (stateSplit.stateAfter() != null) { - debugProperties.put("stateAfter", stateSplit.stateAfter().toString(Verbosity.Debugger)); - } - } - return debugProperties; - } - } diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -33,6 +33,7 @@ * A location for a memory access in terms of the kind of value accessed and the displacement * (in bytes) from a base object or address. */ +@NodeInfo(nameTemplate = "Loc {p#locationIdentity/s}") public class LocationNode extends FloatingNode implements LIRLowerable, ValueNumberable { private int displacement; diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -23,10 +23,12 @@ package com.oracle.graal.nodes.extended; import com.oracle.graal.api.code.*; +import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; +@NodeInfo(nameTemplate = "RuntimeCall#{p#call/s}") public final class RuntimeCallNode extends AbstractCallNode implements LIRLowerable { private final RuntimeCall call; diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessFieldNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessFieldNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessFieldNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -23,7 +23,6 @@ package com.oracle.graal.nodes.java; import java.lang.reflect.*; -import java.util.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.*; @@ -91,13 +90,6 @@ } @Override - public Map getDebugProperties(Map map) { - Map debugProperties = super.getDebugProperties(map); - debugProperties.put("field", MetaUtil.format("%h.%n", field)); - return debugProperties; - } - - @Override public String toString(Verbosity verbosity) { if (verbosity == Verbosity.Name) { return super.toString(verbosity) + "#" + field.name(); diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadFieldNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadFieldNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadFieldNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -31,6 +31,7 @@ /** * The {@code LoadFieldNode} represents a read of a static or instance field. */ +@NodeInfo(nameTemplate = "LoadField#{p#field/s}") public final class LoadFieldNode extends AccessFieldNode implements Canonicalizable, Node.IterableNodeType { /** diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -39,6 +39,7 @@ public abstract class NewArrayNode extends FixedWithNextNode implements Lowerable, EscapeAnalyzable, TypeFeedbackProvider { @Input private ValueNode length; + private final ResolvedJavaType elementType; public static final int MaximumEscapeAnalysisArrayLength = 32; @@ -50,9 +51,10 @@ * Constructs a new NewArrayNode. * @param length the node that produces the length for this allocation */ - protected NewArrayNode(Stamp stamp, ValueNode length) { - super(stamp); + protected NewArrayNode(ResolvedJavaType elementType, ValueNode length) { + super(StampFactory.exactNonNull(elementType.arrayOf())); this.length = length; + this.elementType = elementType; } /** @@ -64,18 +66,20 @@ } /** + * Gets the element type of the array. + * @return the element type of the array + */ + public ResolvedJavaType elementType() { + return elementType; + } + + /** * The rank of the array allocated by this node, i.e. how many array dimensions. */ public int dimensionCount() { return 1; } - /** - * Gets the element type of the array. - * @return the element type of the array - */ - public abstract ResolvedJavaType elementType(); - @Override public void typeFeedback(TypeFeedbackTool tool) { assert length.kind() == Kind.Int; diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -34,6 +34,7 @@ /** * The {@code NewInstanceNode} represents the allocation of an instance class object. */ +@NodeInfo(nameTemplate = "New {p#instanceClass/s}") public final class NewInstanceNode extends FixedWithNextNode implements EscapeAnalyzable, Lowerable, LIRLowerable, Node.IterableNodeType { private final ResolvedJavaType instanceClass; diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewObjectArrayNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewObjectArrayNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewObjectArrayNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -26,28 +26,20 @@ import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; -import com.oracle.graal.nodes.type.*; /** * The {@code NewObjectArrayNode} represents an allocation of an object array. */ +@NodeInfo(nameTemplate = "NewArray {p#elementType}") public final class NewObjectArrayNode extends NewArrayNode implements LIRLowerable, Node.IterableNodeType { - private final ResolvedJavaType elementClass; - /** * Constructs a new NewObjectArrayNode. * @param elementClass the class of elements in this array * @param length the node producing the length of the array */ public NewObjectArrayNode(ResolvedJavaType elementClass, ValueNode length) { - super(StampFactory.exactNonNull(elementClass.arrayOf()), length); - this.elementClass = elementClass; - } - - @Override - public ResolvedJavaType elementType() { - return elementClass; + super(elementClass, length); } @Override diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewPrimitiveArrayNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewPrimitiveArrayNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewPrimitiveArrayNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -23,25 +23,18 @@ package com.oracle.graal.nodes.java; import com.oracle.graal.api.meta.*; +import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; -import com.oracle.graal.nodes.type.*; /** * The {@code NewPrimitiveArrayNode} class definition. */ +@NodeInfo(nameTemplate = "NewArray {p#elementType}") public final class NewPrimitiveArrayNode extends NewArrayNode implements LIRLowerable { - private final ResolvedJavaType elementType; - - public NewPrimitiveArrayNode(ValueNode length, ResolvedJavaType elementType) { - super(StampFactory.exactNonNull(elementType.arrayOf()), length); - this.elementType = elementType; - } - - @Override - public ResolvedJavaType elementType() { - return elementType; + public NewPrimitiveArrayNode(ResolvedJavaType elementType, ValueNode length) { + super(elementType, length); } @Override diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreFieldNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreFieldNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreFieldNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -23,12 +23,14 @@ package com.oracle.graal.nodes.java; import com.oracle.graal.api.meta.*; +import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.type.*; /** * The {@code StoreFieldNode} represents a write to a static or instance field. */ +@NodeInfo(nameTemplate = "StoreField#{p#field/s}") public final class StoreFieldNode extends AccessFieldNode implements StateSplit { @Input private ValueNode value; diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectNode.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectNode.java Wed Jul 11 14:13:38 2012 +0200 @@ -23,10 +23,11 @@ package com.oracle.graal.nodes.virtual; import com.oracle.graal.api.meta.*; +import com.oracle.graal.graph.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; - +@NodeInfo(nameTemplate = "VirtualObject {p#type}") public class VirtualObjectNode extends FloatingNode implements LIRLowerable { private ResolvedJavaType type; diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.printer/src/com/oracle/graal/printer/BinaryGraphPrinter.java --- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/BinaryGraphPrinter.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/BinaryGraphPrinter.java Wed Jul 11 14:13:38 2012 +0200 @@ -50,6 +50,8 @@ private static final int POOL_METHOD = 0x04; private static final int POOL_NULL = 0x05; private static final int POOL_NODE_CLASS = 0x06; + private static final int POOL_FIELD = 0x07; + private static final int POOL_SIGNATURE = 0x08; private static final int PROPERTY_POOL = 0x00; private static final int PROPERTY_INT = 0x01; @@ -63,11 +65,11 @@ private static final int KLASS = 0x00; private static final int ENUM_KLASS = 0x01; - private static final class CosntantPool extends LinkedHashMap { + private static final class ConstantPool extends LinkedHashMap { private final LinkedList availableIds; private int nextId; private static final long serialVersionUID = -2676889957907285681L; - public CosntantPool() { + public ConstantPool() { super(50, 0.65f); availableIds = new LinkedList<>(); } @@ -94,14 +96,14 @@ } } - private final CosntantPool constantPool; + private final ConstantPool constantPool; private final ByteBuffer buffer; private final WritableByteChannel channel; private long bytes; private long newPoolEntry; public BinaryGraphPrinter(WritableByteChannel channel) { - constantPool = new CosntantPool(); + constantPool = new ConstantPool(); buffer = ByteBuffer.allocateDirect(256 * 1024); this.channel = channel; } @@ -221,6 +223,10 @@ writeByte(POOL_NULL); return; } + if (object instanceof ResolvedJavaType) { + writePoolObject(((ResolvedJavaType) object).toJava()); + return; + } Integer id = constantPool.get(object); if (id == null) { addPoolEntry(object); @@ -233,6 +239,10 @@ writeByte(POOL_NODE_CLASS); } else if (object instanceof ResolvedJavaMethod) { writeByte(POOL_METHOD); + } else if (object instanceof ResolvedJavaField) { + writeByte(POOL_FIELD); + } else if (object instanceof Signature) { + writeByte(POOL_SIGNATURE); } else { writeByte(POOL_STRING); } @@ -280,7 +290,28 @@ } } else if (object instanceof ResolvedJavaMethod) { writeByte(POOL_METHOD); - writeBytes(((ResolvedJavaMethod) object).code()); + ResolvedJavaMethod method = ((ResolvedJavaMethod) object); + writePoolObject(method.holder()); + writePoolObject(method.name()); + writePoolObject(method.signature()); + writeInt(method.accessFlags()); + writeBytes(method.code()); + } else if (object instanceof ResolvedJavaField) { + writeByte(POOL_FIELD); + ResolvedJavaField field = ((ResolvedJavaField) object); + writePoolObject(field.holder()); + writePoolObject(field.name()); + writePoolObject(field.type().name()); + writeInt(field.accessFlags()); + } else if (object instanceof Signature) { + writeByte(POOL_SIGNATURE); + Signature signature = ((Signature) object); + int args = signature.argumentCount(false); + writeShort((char) args); + for (int i = 0; i < args; i++) { + writePoolObject(signature.argumentTypeAt(i, null).name()); + } + writePoolObject(signature.returnType(null).name()); } else { writeByte(POOL_STRING); writeString(object.toString()); @@ -345,6 +376,7 @@ node.getDebugProperties(props); writeInt(node.getId()); writePoolObject(nodeClass); + writeByte(node.predecessor() == null ? 0 : 1); writeShort((char) props.size()); for (Entry entry : props.entrySet()) { String key = entry.getKey().toString(); diff -r 3b8bc07f8d17 -r d241f8b2e6f9 graal/com.oracle.graal.printer/src/com/oracle/graal/printer/IdealGraphPrinter.java --- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/IdealGraphPrinter.java Tue Jul 10 15:02:41 2012 +0200 +++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/IdealGraphPrinter.java Wed Jul 11 14:13:38 2012 +0200 @@ -158,11 +158,38 @@ printProperty(bit, "true"); } } + if (node.getClass() == BeginNode.class) { + printProperty("shortName", "B"); + } else if (node.getClass() == EndNode.class) { + printProperty("shortName", "E"); + } + if (node.predecessor() != null) { + printProperty("hasPredecessor", "true"); + } for (Entry entry : props.entrySet()) { String key = entry.getKey().toString(); - String value = entry.getValue() == null ? "null" : entry.getValue().toString(); - printProperty(key, value); + Object value = entry.getValue(); + String valueString; + if (value == null) { + valueString = "null"; + } else { + Class type = value.getClass(); + if (type.isArray()) { + if (!type.getComponentType().isPrimitive()) { + valueString = Arrays.toString((Object[]) value); + } else if (type.getComponentType() == Integer.TYPE) { + valueString = Arrays.toString((int[]) value); + } else if (type.getComponentType() == Double.TYPE) { + valueString = Arrays.toString((double[]) value); + } else { + valueString = toString(); + } + } else { + valueString = value.toString(); + } + } + printProperty(key, valueString); } endProperties(); diff -r 3b8bc07f8d17 -r d241f8b2e6f9 src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/BinaryParser.java --- a/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/BinaryParser.java Tue Jul 10 15:02:41 2012 +0200 +++ b/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/BinaryParser.java Wed Jul 11 14:13:38 2012 +0200 @@ -5,15 +5,13 @@ package com.sun.hotspot.igv.data.serialization; import com.sun.hotspot.igv.data.*; +import com.sun.hotspot.igv.data.Properties; import com.sun.hotspot.igv.data.services.GroupCallback; import java.io.EOFException; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.ReadableByteChannel; -import java.util.ArrayList; -import java.util.Deque; -import java.util.LinkedList; -import java.util.List; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.SwingUtilities; @@ -34,6 +32,8 @@ private static final int POOL_METHOD = 0x04; private static final int POOL_NULL = 0x05; private static final int POOL_NODE_CLASS = 0x06; + private static final int POOL_FIELD = 0x07; + private static final int POOL_SIGNATURE = 0x08; private static final int KLASS = 0x00; private static final int ENUM_KLASS = 0x01; @@ -51,21 +51,131 @@ private GroupCallback callback; private List constantPool; - private int maxConstant; private final ByteBuffer buffer; private final ReadableByteChannel channel; private Deque folderStack; - private boolean close; + + private enum Length { + S, + M, + L + } - private static class Klass { - public String name; - public Klass(String name) { + private interface LengthToString { + String toString(Length l); + } + + private static abstract class Member implements LengthToString { + public final Klass holder; + public final int accessFlags; + public final String name; + public Member(Klass holder, String name, int accessFlags) { + this.holder = holder; + this.accessFlags = accessFlags; this.name = name; } } + private static class Method extends Member { + public final Signature signature; + public final byte[] code; + public Method(String name, Signature signature, byte[] code, Klass holder, int accessFlags) { + super(holder, name, accessFlags); + this.signature = signature; + this.code = code; + } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(holder).append('.').append(name).append('('); + for (int i = 0; i < signature.argTypes.length; i++) { + if (i > 0) { + sb.append(", "); + } + sb.append(signature.argTypes[i]); + } + sb.append(')'); + return sb.toString(); + } + @Override + public String toString(Length l) { + switch(l) { + case M: + return holder.toString(Length.L) + "." + name; + case S: + return holder.toString(Length.S) + "." + name; + default: + case L: + return toString(); + } + } + } + + private static class Signature { + public final String returnType; + public final String[] argTypes; + public Signature(String returnType, String[] argTypes) { + this.returnType = returnType; + this.argTypes = argTypes; + } + } + + private static class Field extends Member { + public final String type; + public Field(String type, Klass holder, String name, int accessFlags) { + super(holder, name, accessFlags); + this.type = type; + } + @Override + public String toString() { + return holder + "." + name; + } + @Override + public String toString(Length l) { + switch(l) { + case M: + return holder.toString(Length.L) + "." + name; + case S: + return holder.toString(Length.S) + "." + name; + default: + case L: + return toString(); + } + } + } + + private static class Klass implements LengthToString { + public final String name; + public final String simpleName; + public Klass(String name) { + this.name = name; + String simple; + try { + simple = name.substring(name.lastIndexOf('.') + 1); + } catch (IndexOutOfBoundsException ioobe) { + simple = name; + } + this.simpleName = simple; + } + @Override + public String toString() { + return name; + } + @Override + public String toString(Length l) { + switch(l) { + case S: + return simpleName; + default: + case L: + case M: + return toString(); + } + } + } + private static class EnumKlass extends Klass { - public String[] values; + public final String[] values; public EnumKlass(String name, String[] values) { super(name); this.values = values; @@ -83,15 +193,34 @@ this.inputs = inputs; this.sux = sux; } + @Override + public String toString() { + return className; + } } - private static class EnumValue { + private static class EnumValue implements LengthToString { public EnumKlass enumKlass; public int ordinal; public EnumValue(EnumKlass enumKlass, int ordinal) { this.enumKlass = enumKlass; this.ordinal = ordinal; } + @Override + public String toString() { + return enumKlass.simpleName + "." + enumKlass.values[ordinal]; + } + @Override + public String toString(Length l) { + switch(l) { + case S: + return enumKlass.values[ordinal]; + default: + case M: + case L: + return toString(); + } + } } public BinaryParser(GroupCallback callback, ReadableByteChannel channel) { @@ -226,6 +355,7 @@ if (type == POOL_NEW) { return (T) addPoolEntry(klass); } + assert assertObjectType(klass, type); int index = readInt(); if (index < 0 || index >= constantPool.size()) { throw new IOException("Invalid constant pool index : " + index); @@ -241,11 +371,15 @@ case POOL_ENUM: return klass.isAssignableFrom(EnumValue.class); case POOL_METHOD: - return klass.isAssignableFrom(byte[].class); + return klass.isAssignableFrom(Method.class); case POOL_STRING: return klass.isAssignableFrom(String.class); case POOL_NODE_CLASS: return klass.isAssignableFrom(NodeClass.class); + case POOL_FIELD: + return klass.isAssignableFrom(Field.class); + case POOL_SIGNATURE: + return klass.isAssignableFrom(Signature.class); case POOL_NULL: return true; default: @@ -259,7 +393,7 @@ assert assertObjectType(klass, type) : "Wrong object type : " + klass + " != " + type; Object obj; switch(type) { - case POOL_CLASS: + case POOL_CLASS: { String name = readString(); int klasstype = readByte(); if (klasstype == ENUM_KLASS) { @@ -275,12 +409,14 @@ throw new IOException("unknown klass type : " + klasstype); } break; - case POOL_ENUM: + } + case POOL_ENUM: { EnumKlass enumClass = readPoolObject(EnumKlass.class); int ordinal = readInt(); obj = new EnumValue(enumClass, ordinal); break; - case POOL_NODE_CLASS: + } + case POOL_NODE_CLASS: { String className = readString(); String nameTemplate = readString(); int inputCount = readShort(); @@ -295,12 +431,38 @@ } obj = new NodeClass(className, nameTemplate, inputs, sux); break; - case POOL_METHOD: - obj = readBytes(); + } + case POOL_METHOD: { + Klass holder = readPoolObject(Klass.class); + String name = readPoolObject(String.class); + Signature sign = readPoolObject(Signature.class); + int flags = readInt(); + byte[] code = readBytes(); + obj = new Method(name, sign, code, holder, flags); break; - case POOL_STRING: + } + case POOL_FIELD: { + Klass holder = readPoolObject(Klass.class); + String name = readPoolObject(String.class); + String fType = readPoolObject(String.class); + int flags = readInt(); + obj = new Field(fType, holder, name, flags); + break; + } + case POOL_SIGNATURE: { + int argc = readShort(); + String[] args = new String[argc]; + for (int i = 0; i < argc; i++) { + args[i] = readPoolObject(String.class); + } + String returnType = readPoolObject(String.class); + obj = new Signature(returnType, args); + break; + } + case POOL_STRING: { obj = readString(); break; + } default: throw new IOException("unknown pool type"); } @@ -402,15 +564,15 @@ private Group parseGroup(Folder parent) throws IOException { String name = readPoolObject(String.class); String shortName = readPoolObject(String.class); - byte[] bytecodes = readPoolObject(byte[].class); + Method method = readPoolObject(Method.class); int bci = readInt(); Group group = new Group(parent); group.getProperties().setProperty("name", name); - final InputMethod method = new InputMethod(group, name, shortName, bci); - if (bytecodes != null) { - method.setBytecodes("TODO"); + if (method != null) { + InputMethod inMethod = new InputMethod(group, method.name, shortName, bci); + inMethod.setBytecodes("TODO"); + group.setMethod(inMethod); } - group.setMethod(method); return group; } @@ -451,17 +613,23 @@ private void parseNodes(InputGraph graph) throws IOException { int count = readInt(); + Map props = new HashMap<>(); List edges = new LinkedList<>(); for (int i = 0; i < count; i++) { int id = readInt(); InputNode node = new InputNode(id); final Properties properties = node.getProperties(); NodeClass nodeClass = readPoolObject(NodeClass.class); + int preds = readByte(); + if (preds > 0) { + properties.setProperty("hasPredecessor", "true"); + } int propCount = readShort(); for (int j = 0; j < propCount; j++) { String key = readPoolObject(String.class); Object value = readPropertyObject(); properties.setProperty(key, value != null ? value.toString() : "null"); + props.put(key, value); } int edgesStart = edges.size(); int suxCount = readShort(); @@ -474,21 +642,30 @@ for (int j = 0; j < inputCount; j++) { int in = readInt(); int index = readShort(); - edges.add(new Edge(in, id, (char) j, nodeClass.inputs.get(index), true)); + edges.add(new Edge(in, id, (char) (preds + j), nodeClass.inputs.get(index), true)); } - properties.setProperty("name", createName(edges.subList(edgesStart, edges.size()), properties, nodeClass.nameTemplate)); + properties.setProperty("name", createName(edges.subList(edgesStart, edges.size()), props, nodeClass.nameTemplate)); properties.setProperty("class", nodeClass.className); + switch (nodeClass.className) { + case "BeginNode": + properties.setProperty("shortName", "B"); + break; + case "EndNode": + properties.setProperty("shortName", "E"); + break; + } graph.addNode(node); + props.clear(); } for (Edge e : edges) { - char fromIndex = e.input ? 0 : e.num; + char fromIndex = e.input ? 1 : e.num; char toIndex = e.input ? e.num : 0; graph.addEdge(new InputEdge(fromIndex, toIndex, e.from, e.to, e.label)); } } - private String createName(List edges, Properties properties, String template) { - Pattern p = Pattern.compile("\\{(p|i)#(.+)\\}"); + private String createName(List edges, Map properties, String template) { + Pattern p = Pattern.compile("\\{(p|i)#([a-zA-Z0-9$_]+)(/(l|m|s))?\\}"); Matcher m = p.matcher(template); StringBuffer sb = new StringBuffer(); while (m.find()) { @@ -509,9 +686,26 @@ result = inputString.toString(); break; case "p": - result = properties.get(name); - if (result == null) { + Object prop = properties.get(name); + String length = m.group(4); + if (prop == null) { result = "?"; + } else if (length != null && prop instanceof LengthToString) { + LengthToString lengthProp = (LengthToString) prop; + switch(length) { + default: + case "l": + result = lengthProp.toString(Length.L); + break; + case "m": + result = lengthProp.toString(Length.M); + break; + case "s": + result = lengthProp.toString(Length.S); + break; + } + } else { + result = prop.toString(); } break; default: diff -r 3b8bc07f8d17 -r d241f8b2e6f9 src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/color.filter --- a/src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/color.filter Tue Jul 10 15:02:41 2012 +0200 +++ b/src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/color.filter Wed Jul 11 14:13:38 2012 +0200 @@ -9,4 +9,7 @@ colorize("name", "Comp .*", yellow); colorize("name", "Virtual.*", green); -colorize("notInOwnBlock", "true", red); \ No newline at end of file +colorize("name", "ValuePhi.*|ValueProxy", magenta); +colorize("name", "Const.*", new java.awt.Color(0.7, 0.7, 0.7)); +colorize("name", "Local.*", new java.awt.Color(0.85, 0.85, 0.85)); +colorize("stamp", "Condition", yellow); \ No newline at end of file diff -r 3b8bc07f8d17 -r d241f8b2e6f9 src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/noframestate.filter --- a/src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/noframestate.filter Tue Jul 10 15:02:41 2012 +0200 +++ b/src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/noframestate.filter Wed Jul 11 14:13:38 2012 +0200 @@ -1,1 +1,2 @@ -remove("class", "FrameState"); \ No newline at end of file +remove("class", "FrameState"); +remove("class", "Virtual.*"); \ No newline at end of file