# HG changeset patch # User Doug Simon # Date 1367263117 -7200 # Node ID ffa27c3058e90caf7b068a4e94fe24c3a0a08689 # Parent 016523a011b796efcb5df457aa0e5235c1fa186c minor simplifications for writing compiled stubs diff -r 016523a011b7 -r ffa27c3058e9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/CRuntimeStub.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/CRuntimeStub.java Mon Apr 29 21:18:37 2013 +0200 @@ -0,0 +1,49 @@ +/* + * 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.stubs; + +import com.oracle.graal.api.code.*; +import com.oracle.graal.hotspot.*; +import com.oracle.graal.hotspot.meta.*; +import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.replacements.SnippetTemplate.Arguments; +import com.oracle.graal.replacements.SnippetTemplate.SnippetInfo; + +/** + * Base class for a stub that saves registers around a C runtime call. + */ +public abstract class CRuntimeStub extends Stub { + + public CRuntimeStub(final HotSpotRuntime runtime, Replacements replacements, TargetDescription target, HotSpotRuntimeCallTarget linkage) { + super(runtime, replacements, target, linkage); + } + + @Override + protected Arguments makeArguments(SnippetInfo stub) { + Arguments args = new Arguments(stub); + for (int i = 0; i < stub.getParameterCount(); i++) { + args.add(stub.getParameterName(i), null); + } + return args; + } +} diff -r 016523a011b7 -r ffa27c3058e9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewArrayStub.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewArrayStub.java Mon Apr 29 18:26:39 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewArrayStub.java Mon Apr 29 21:18:37 2013 +0200 @@ -53,7 +53,7 @@ public class NewArrayStub extends Stub { public NewArrayStub(final HotSpotRuntime runtime, Replacements replacements, TargetDescription target, HotSpotRuntimeCallTarget linkage) { - super(runtime, replacements, target, linkage, "newArray"); + super(runtime, replacements, target, linkage); } @Override diff -r 016523a011b7 -r ffa27c3058e9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewInstanceStub.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewInstanceStub.java Mon Apr 29 18:26:39 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewInstanceStub.java Mon Apr 29 21:18:37 2013 +0200 @@ -55,7 +55,7 @@ public class NewInstanceStub extends Stub { public NewInstanceStub(final HotSpotRuntime runtime, Replacements replacements, TargetDescription target, HotSpotRuntimeCallTarget linkage) { - super(runtime, replacements, target, linkage, "newInstance"); + super(runtime, replacements, target, linkage); } @Override diff -r 016523a011b7 -r ffa27c3058e9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewMultiArrayStub.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewMultiArrayStub.java Mon Apr 29 18:26:39 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewMultiArrayStub.java Mon Apr 29 21:18:37 2013 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.hotspot.stubs; -import static com.oracle.graal.api.code.DeoptimizationAction.*; -import static com.oracle.graal.api.meta.DeoptimizationReason.*; import static com.oracle.graal.hotspot.replacements.HotSpotSnippetUtils.*; import com.oracle.graal.api.code.RuntimeCallTarget.Descriptor; @@ -35,33 +33,18 @@ import com.oracle.graal.hotspot.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.replacements.*; -import com.oracle.graal.replacements.SnippetTemplate.Arguments; -import com.oracle.graal.replacements.SnippetTemplate.SnippetInfo; import com.oracle.graal.word.*; -public class NewMultiArrayStub extends Stub { +public class NewMultiArrayStub extends CRuntimeStub { public NewMultiArrayStub(final HotSpotRuntime runtime, Replacements replacements, TargetDescription target, HotSpotRuntimeCallTarget linkage) { - super(runtime, replacements, target, linkage, "newMultiArray"); - } - - @Override - protected Arguments makeArguments(SnippetInfo stub) { - Arguments args = new Arguments(stub); - args.add("hub", null); - args.add("rank", null); - args.add("dims", null); - return args; + super(runtime, replacements, target, linkage); } @Snippet private static Object newMultiArray(Word hub, int rank, Word dims) { newMultiArrayC(NEW_MULTI_ARRAY_C, thread(), hub, rank, dims); - - if (clearPendingException(thread())) { - getAndClearObjectResult(thread()); - DeoptimizeCallerNode.deopt(InvalidateReprofile, RuntimeConstraint); - } + handlePendingException(true); return verifyOop(getAndClearObjectResult(thread())); } diff -r 016523a011b7 -r ffa27c3058e9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/Stub.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/Stub.java Mon Apr 29 18:26:39 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/Stub.java Mon Apr 29 21:18:37 2013 +0200 @@ -22,7 +22,10 @@ */ package com.oracle.graal.hotspot.stubs; +import static com.oracle.graal.api.code.DeoptimizationAction.*; +import static com.oracle.graal.api.meta.DeoptimizationReason.*; import static com.oracle.graal.hotspot.nodes.CStringNode.*; +import static com.oracle.graal.hotspot.replacements.HotSpotSnippetUtils.*; import java.util.*; import java.util.concurrent.*; @@ -39,6 +42,7 @@ import com.oracle.graal.graph.Node.NodeIntrinsic; import com.oracle.graal.hotspot.*; import com.oracle.graal.hotspot.meta.*; +import com.oracle.graal.hotspot.nodes.*; import com.oracle.graal.java.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; @@ -99,9 +103,9 @@ * * @param linkage linkage details for a call to the stub */ - public Stub(HotSpotRuntime runtime, Replacements replacements, TargetDescription target, HotSpotRuntimeCallTarget linkage, String methodName) { + public Stub(HotSpotRuntime runtime, Replacements replacements, TargetDescription target, HotSpotRuntimeCallTarget linkage) { super(runtime, replacements, target); - this.stubInfo = snippet(getClass(), methodName); + this.stubInfo = snippet(getClass(), null); this.linkage = linkage; } @@ -200,6 +204,15 @@ } } + static void handlePendingException(boolean isObjectResult) { + if (clearPendingException(thread())) { + if (isObjectResult) { + getAndClearObjectResult(thread()); + } + DeoptimizeCallerNode.deopt(InvalidateReprofile, RuntimeConstraint); + } + } + public static final Descriptor STUB_PRINTF = new Descriptor("stubPrintf", false, void.class, Word.class, long.class, long.class, long.class); @NodeIntrinsic(RuntimeCallNode.class) diff -r 016523a011b7 -r ffa27c3058e9 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Mon Apr 29 18:26:39 2013 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Mon Apr 29 21:18:37 2013 +0200 @@ -116,6 +116,10 @@ public boolean isVarargsParameter(int paramIdx) { return varargsParameters[paramIdx]; } + + public String getParameterName(int paramIdx) { + return names[paramIdx]; + } } /** @@ -283,16 +287,20 @@ this.templates = new ConcurrentHashMap<>(); } + /** + * Finds the method in {@code declaringClass} annotated with {@link Snippet} named + * {@code methodName}. If {@code methodName} is null, then there must be exactly one snippet + * method in {@code declaringClass}. + */ protected SnippetInfo snippet(Class declaringClass, String methodName) { Method found = null; for (Method method : declaringClass.getDeclaredMethods()) { - if (method.getAnnotation(Snippet.class) != null && method.getName().equals(methodName)) { - assert found == null : "found more than one @" + Snippet.class.getSimpleName() + " method " + methodName + " in " + declaringClass; + if (method.getAnnotation(Snippet.class) != null && (methodName == null || method.getName().equals(methodName))) { + assert found == null : "found more than one @" + Snippet.class.getSimpleName() + " method in " + declaringClass + (methodName == null ? "" : " named " + methodName); found = method; } } - assert found != null : "did not find @" + Snippet.class.getSimpleName() + " method " + methodName + " in " + declaringClass; - + assert found != null : "did not find @" + Snippet.class.getSimpleName() + " method in " + declaringClass + (methodName == null ? "" : " named " + methodName); return new SnippetInfo(runtime.lookupJavaMethod(found)); }