NullPointerException in HotSpotRuntime:lower when using Snippets
ATKIN-GRANVILLE Chris
s1255753 at sms.ed.ac.uk
Tue Jul 2 12:36:15 PDT 2013
Hi there,
I'm trying add arbitrary behaviour to array accesses - the end goal being to create traces of all memory operations within a program. What I've done so far was suggested to me in a previous thread on this list, but in short, I've got phases that add my own custom nodes to each LoadIndexedNode/StoreIndexedNode. These are then lowered to the desired behaviour via snippets:
public class InstrumentationSnippets implements Snippets {
@Snippet
public static void store(final ArrayStoreBehaviourNode<?> node) {
Instrument.arrayStores.add(node.getInfo());
}
@Snippet
public static void load(final ArrayLoadBehaviourNode<?> node) {
Instrument.arrayLoads.add(node.getInfo());
}
public static class Templates extends AbstractTemplates {
private final SnippetInfo store = snippet(InstrumentationSnippets.class, "store");
private final SnippetInfo load = snippet(InstrumentationSnippets.class, "load");
public Templates(MetaAccessProvider runtime, Replacements replacements, TargetDescription target) {
super(runtime, replacements, target);
}
public void lower(final ArrayStoreBehaviourNode<?> node) {
Arguments args = new Arguments(store);
args.add("node", node);
template(args).instantiate(runtime, node, DEFAULT_REPLACER, args);
}
public void lower(final ArrayLoadBehaviourNode<?> node) {
Arguments args = new Arguments(load);
args.add("node", node);
template(args).instantiate(runtime, node, DEFAULT_REPLACER, args);
}
}
}
However, doing this causes NullPointerExceptions to be thrown in HotSpotRuntime:lower:
java.lang.NullPointerException
at com.oracle.graal.hotspot.meta.HotSpotRuntime.lower(HotSpotRuntime.java:527)
at com.oracle.graal.hotspot.amd64.AMD64HotSpotRuntime.lower(AMD64HotSpotRuntime.java:218)
at com.oracle.graal.nodes.InvokeNode.lower(InvokeNode.java:97)
at com.oracle.graal.phases.common.LoweringPhase$Round.process(LoweringPhase.java:232)
at com.oracle.graal.phases.common.LoweringPhase$Round.processBlock(LoweringPhase.java:182)
at com.oracle.graal.phases.common.LoweringPhase$Round.run(LoweringPhase.java:173)
at com.oracle.graal.phases.Phase.run(Phase.java:51)
at com.oracle.graal.phases.BasePhase$1.run(BasePhase.java:62)
at com.oracle.graal.debug.internal.DebugScope.executeScope(DebugScope.java:179)
at com.oracle.graal.debug.internal.DebugScope.scope(DebugScope.java:167)
at com.oracle.graal.debug.Debug.scope(Debug.java:118)
at com.oracle.graal.debug.Debug.scope(Debug.java:113)
at com.oracle.graal.phases.BasePhase.apply(BasePhase.java:59)
at com.oracle.graal.phases.BasePhase.apply(BasePhase.java:55)
at com.oracle.graal.phases.PhaseSuite.run(PhaseSuite.java:59)
at com.oracle.graal.phases.common.IncrementalCanonicalizerPhase.run(IncrementalCanonicalizerPhase.java:45)
at com.oracle.graal.phases.common.IncrementalCanonicalizerPhase.run(IncrementalCanonicalizerPhase.java:1)
at com.oracle.graal.phases.BasePhase$1.run(BasePhase.java:62)
at com.oracle.graal.debug.internal.DebugScope.executeScope(DebugScope.java:179)
at com.oracle.graal.debug.internal.DebugScope.scope(DebugScope.java:167)
at com.oracle.graal.debug.Debug.scope(Debug.java:118)
at com.oracle.graal.debug.Debug.scope(Debug.java:113)
at com.oracle.graal.phases.BasePhase.apply(BasePhase.java:59)
at com.oracle.graal.phases.BasePhase.apply(BasePhase.java:55)
at com.oracle.graal.phases.common.LoweringPhase.run(LoweringPhase.java:145)
at com.oracle.graal.phases.common.LoweringPhase.run(LoweringPhase.java:1)
at com.oracle.graal.phases.BasePhase$1.run(BasePhase.java:62)
at com.oracle.graal.debug.internal.DebugScope.executeScope(DebugScope.java:179)
at com.oracle.graal.debug.internal.DebugScope.scope(DebugScope.java:167)
at com.oracle.graal.debug.Debug.scope(Debug.java:118)
at com.oracle.graal.debug.Debug.scope(Debug.java:113)
at com.oracle.graal.phases.BasePhase.apply(BasePhase.java:59)
at com.oracle.graal.phases.BasePhase.apply(BasePhase.java:55)
at com.oracle.graal.compiler.GraalCompiler.emitHIR(GraalCompiler.java:143)
at com.oracle.graal.compiler.GraalCompiler$1$1.call(GraalCompiler.java:66)
at com.oracle.graal.compiler.GraalCompiler$1$1.call(GraalCompiler.java:1)
at com.oracle.graal.debug.internal.DebugScope.call(DebugScope.java:301)
at com.oracle.graal.debug.internal.DebugScope.executeScope(DebugScope.java:182)
at com.oracle.graal.debug.internal.DebugScope.scope(DebugScope.java:167)
at com.oracle.graal.debug.Debug.scope(Debug.java:138)
at com.oracle.graal.debug.Debug.scope(Debug.java:109)
at com.oracle.graal.compiler.GraalCompiler$1.run(GraalCompiler.java:63)
at com.oracle.graal.debug.internal.DebugScope.executeScope(DebugScope.java:179)
at com.oracle.graal.debug.internal.DebugScope.scope(DebugScope.java:167)
at com.oracle.graal.debug.Debug.scope(Debug.java:118)
at com.oracle.graal.compiler.GraalCompiler.compileMethod(GraalCompiler.java:59)
at uk.ac.ed.inf.icsa.locomotion.Locomotion.compile(Locomotion.java:79)
at uk.ac.ed.inf.icsa.locomotion.Application.run(Application.java:34)
at uk.ac.ed.inf.icsa.locomotion.Application.main(Application.java:58)
Following the stack trace leads to this line being the problem:
!callTarget.isStatic() && receiver.kind() == Kind.Object && !receiver.objectStamp().nonNull()
Specifically, receiver == null causes the exception.
Does anyone have any ideas of how I can get around this problem? Ideally without modifying HotSpotRuntime, but if that's whats required then so be it.
chris
--
The University of Edinburgh is a charitable body, registered in
Scotland, with registration number SC005336.
More information about the graal-dev
mailing list