Mercurial > hg > truffle
changeset 8643:3d2c2b68fe93
lower ExceptionObjectNode with a snippet (GRAAL-133)
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java Fri Apr 05 01:58:32 2013 +0200 +++ b/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java Fri Apr 05 02:33:42 2013 +0200 @@ -458,11 +458,6 @@ } @Override - public void visitLoadException(LoadExceptionObjectNode i) { - throw new InternalError("NYI"); - } - - @Override public void visitSafepointNode(SafepointNode i) { throw new InternalError("NYI"); }
--- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Fri Apr 05 01:58:32 2013 +0200 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Fri Apr 05 02:33:42 2013 +0200 @@ -346,12 +346,6 @@ } @Override - public void visitLoadException(LoadExceptionObjectNode i) { - // SPARC: Auto-generated method stub - - } - - @Override public void visitSafepointNode(SafepointNode i) { // SPARC: Auto-generated method stub
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Fri Apr 05 01:58:32 2013 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Fri Apr 05 02:33:42 2013 +0200 @@ -33,7 +33,7 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.asm.*; -import com.oracle.graal.asm.amd64.AMD64Address.*; +import com.oracle.graal.asm.amd64.AMD64Address.Scale; import com.oracle.graal.compiler.amd64.*; import com.oracle.graal.compiler.gen.*; import com.oracle.graal.graph.*; @@ -42,13 +42,13 @@ import com.oracle.graal.hotspot.nodes.*; import com.oracle.graal.hotspot.stubs.*; import com.oracle.graal.lir.*; -import com.oracle.graal.lir.StandardOp.*; +import com.oracle.graal.lir.StandardOp.ParametersOp; import com.oracle.graal.lir.amd64.*; -import com.oracle.graal.lir.amd64.AMD64Move.*; +import com.oracle.graal.lir.amd64.AMD64Move.CompareAndSwapOp; +import com.oracle.graal.lir.amd64.AMD64Move.MoveFromRegOp; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.cfg.*; -import com.oracle.graal.nodes.java.*; -import com.oracle.graal.nodes.java.MethodCallTargetNode.*; +import com.oracle.graal.nodes.java.MethodCallTargetNode.InvokeKind; /** * LIR generator specialized for AMD64 HotSpot. @@ -165,16 +165,6 @@ append(new AMD64SafepointOp(info, runtime().config, this)); } - @Override - public void visitLoadException(LoadExceptionObjectNode x) { - HotSpotVMConfig config = runtime().config; - RegisterValue thread = runtime().threadRegister().asValue(); - Value exception = emitLoad(Kind.Object, thread, config.threadExceptionOopOffset, Value.ILLEGAL, 0, false); - emitStore(Kind.Object, thread, config.threadExceptionOopOffset, Value.ILLEGAL, 0, Constant.NULL_OBJECT, false); - emitStore(Kind.Long, thread, config.threadExceptionPcOffset, Value.ILLEGAL, 0, Constant.LONG_0, false); - setResult(x, exception); - } - @SuppressWarnings("hiding") @Override public void visitDirectCompareAndSwap(DirectCompareAndSwapNode x) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Fri Apr 05 01:58:32 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Fri Apr 05 02:33:42 2013 +0200 @@ -89,6 +89,7 @@ private NewObjectSnippets.Templates newObjectSnippets; private MonitorSnippets.Templates monitorSnippets; private WriteBarrierSnippets.Templates writeBarrierSnippets; + private LoadExceptionObjectSnippets.Templates exceptionObjectSnippets; private final Map<Descriptor, HotSpotRuntimeCallTarget> runtimeCalls = new HashMap<>(); private final Map<ResolvedJavaMethod, Stub> stubs = new HashMap<>(); @@ -336,6 +337,7 @@ newObjectSnippets = new NewObjectSnippets.Templates(this, replacements, graalRuntime.getTarget(), config.useTLAB); monitorSnippets = new MonitorSnippets.Templates(this, replacements, graalRuntime.getTarget(), config.useFastLocking); writeBarrierSnippets = new WriteBarrierSnippets.Templates(this, replacements, graalRuntime.getTarget()); + exceptionObjectSnippets = new LoadExceptionObjectSnippets.Templates(this, replacements, graalRuntime.getTarget()); registerStub(new NewInstanceStub(this, replacements, graalRuntime.getTarget(), runtimeCalls.get(NEW_INSTANCE))); registerStub(new NewArrayStub(this, replacements, graalRuntime.getTarget(), runtimeCalls.get(NEW_ARRAY))); @@ -767,10 +769,12 @@ newObjectSnippets.lower((InitializeArrayNode) n, tool); } else if (n instanceof NewMultiArrayNode) { newObjectSnippets.lower((NewMultiArrayNode) n, tool); + } else if (n instanceof LoadExceptionObjectNode) { + exceptionObjectSnippets.lower((LoadExceptionObjectNode) n); } else if (n instanceof IntegerDivNode || n instanceof IntegerRemNode || n instanceof UnsignedDivNode || n instanceof UnsignedRemNode) { // Nothing to do for division nodes. The HotSpot signal handler catches divisions by // zero and the MIN_VALUE / -1 cases. - } else if (n instanceof UnwindNode || n instanceof ExceptionObjectNode) { + } else if (n instanceof UnwindNode) { // Nothing to do, using direct LIR lowering for these nodes. } else { assert false : "Node implementing Lowerable not handled: " + n;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotSnippetUtils.java Fri Apr 05 01:58:32 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotSnippetUtils.java Fri Apr 05 02:33:42 2013 +0200 @@ -62,6 +62,20 @@ return config().verifyOops; } + public static final Object EXCEPTION_OOP_LOCATION = LocationNode.createLocation("ExceptionOop"); + + @Fold + public static int threadExceptionOopOffset() { + return config().threadExceptionOopOffset; + } + + public static final Object EXCEPTION_PC_LOCATION = LocationNode.createLocation("ExceptionPc"); + + @Fold + public static int threadExceptionPcOffset() { + return config().threadExceptionPcOffset; + } + public static final Object TLAB_TOP_LOCATION = LocationNode.createLocation("TlabTop"); @Fold @@ -83,6 +97,18 @@ return config().threadTlabStartOffset; } + public static Object readExceptionOop(Word thread) { + return thread.readObject(threadExceptionOopOffset(), EXCEPTION_OOP_LOCATION); + } + + public static void writeExceptionOop(Word thread, Object value) { + thread.writeObject(threadExceptionOopOffset(), value, EXCEPTION_OOP_LOCATION); + } + + public static void writeExceptionPc(Word thread, Word value) { + thread.writeWord(threadExceptionPcOffset(), value, EXCEPTION_PC_LOCATION); + } + public static Word readTlabTop(Word thread) { return thread.readWord(threadTlabTopOffset(), TLAB_TOP_LOCATION); }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/LoadExceptionObjectSnippets.java Fri Apr 05 02:33:42 2013 +0200 @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.hotspot.replacements; + +import static com.oracle.graal.hotspot.replacements.HotSpotSnippetUtils.*; +import static com.oracle.graal.nodes.extended.UnsafeCastNode.*; +import static com.oracle.graal.replacements.SnippetTemplate.*; + +import com.oracle.graal.api.code.*; +import com.oracle.graal.api.meta.*; +import com.oracle.graal.debug.*; +import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.java.*; +import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; +import com.oracle.graal.replacements.*; +import com.oracle.graal.replacements.SnippetTemplate.AbstractTemplates; +import com.oracle.graal.replacements.SnippetTemplate.Arguments; +import com.oracle.graal.replacements.SnippetTemplate.Key; +import com.oracle.graal.word.*; + +/** + * Snippet for loading the exception object at the start of an exception dispatcher. + */ +public class LoadExceptionObjectSnippets implements Snippets { + + @Snippet + public static Object loadException() { + Word thread = thread(); + Object exception = readExceptionOop(thread); + writeExceptionOop(thread, null); + writeExceptionPc(thread, Word.zero()); + return unsafeCast(exception, StampFactory.forNodeIntrinsic()); + } + + public static class Templates extends AbstractTemplates<LoadExceptionObjectSnippets> { + + private final ResolvedJavaMethod loadException; + + public Templates(CodeCacheProvider runtime, Replacements replacements, TargetDescription target) { + super(runtime, replacements, target, LoadExceptionObjectSnippets.class); + loadException = snippet("loadException"); + } + + public void lower(LoadExceptionObjectNode loadExceptionObject) { + StructuredGraph graph = (StructuredGraph) loadExceptionObject.graph(); + Arguments arguments = new Arguments(); + + Key key = new Key(loadException); + SnippetTemplate template = cache.get(key); + Debug.log("Lowering exception object in %s: node=%s, template=%s, arguments=%s", graph, loadExceptionObject, template, arguments); + template.instantiate(runtime, loadExceptionObject, DEFAULT_REPLACER, arguments); + } + } +}
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ExceptionObjectNode.java Fri Apr 05 01:58:32 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ExceptionObjectNode.java Fri Apr 05 02:33:42 2013 +0200 @@ -35,7 +35,7 @@ public class ExceptionObjectNode extends DispatchBeginNode implements Lowerable, MemoryCheckpoint { public ExceptionObjectNode(MetaAccessProvider runtime) { - super(StampFactory.declared(runtime.lookupJavaType(Throwable.class))); + super(StampFactory.declaredNonNull(runtime.lookupJavaType(Throwable.class))); } @Override
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadExceptionObjectNode.java Fri Apr 05 01:58:32 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadExceptionObjectNode.java Fri Apr 05 02:33:42 2013 +0200 @@ -30,14 +30,14 @@ * Loads an exception object passed by the runtime from a callee to an exception handler in a * caller. The node is only produced when lowering an {@link ExceptionObjectNode}. */ -public class LoadExceptionObjectNode extends AbstractStateSplit implements LIRLowerable { +public class LoadExceptionObjectNode extends AbstractStateSplit implements Lowerable { public LoadExceptionObjectNode(Stamp stamp) { super(stamp); } @Override - public void generate(LIRGeneratorTool gen) { - gen.visitLoadException(this); + public void lower(LoweringTool tool) { + tool.getRuntime().lower(this, tool); } }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java Fri Apr 05 01:58:32 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java Fri Apr 05 02:33:42 2013 +0200 @@ -123,7 +123,6 @@ public abstract void visitCompareAndSwap(CompareAndSwapNode i); // These methods define the contract a runtime specific backend must provide. - public abstract void visitLoadException(LoadExceptionObjectNode i); public abstract void visitReturn(ReturnNode i);