# HG changeset patch # User Doug Simon # Date 1364589594 -3600 # Node ID 5c58da5b823363459d7feb5d345e8e6a609e5993 # Parent 480c564d90ef493a7737d1ec6c2e1e56da3280f6# Parent 77970b4f131c805a36e2602348380d134bdd2ca7 Merge. diff -r 480c564d90ef -r 5c58da5b8233 graal/com.oracle.graal.api.runtime/src/com/oracle/graal/api/runtime/Graal.java --- a/graal/com.oracle.graal.api.runtime/src/com/oracle/graal/api/runtime/Graal.java Fri Mar 29 21:05:51 2013 +0100 +++ b/graal/com.oracle.graal.api.runtime/src/com/oracle/graal/api/runtime/Graal.java Fri Mar 29 21:39:54 2013 +0100 @@ -36,26 +36,38 @@ try { runtime = initializeRuntime(); } catch (UnsatisfiedLinkError e) { - runtime = new GraalRuntime() { - - @Override - public String getName() { - return ""; - } - - @Override - public T getCapability(Class clazz) { - return null; - } - }; + runtime = new InvalidGraalRuntime(); } } public static T getRequiredCapability(Class clazz) { T t = getRuntime().getCapability(clazz); if (t == null) { - throw new IllegalAccessError("Runtime does not expose required capability " + clazz.getName()); + String javaHome = System.getProperty("java.home"); + String vmName = System.getProperty("java.vm.name"); + StringBuilder errorMessage = new StringBuilder(); + if (runtime.getClass() == InvalidGraalRuntime.class) { + errorMessage.append(String.format("The VM does not support the Graal API.\n")); + } else { + errorMessage.append(String.format("The VM does not expose required Graal capability %s.\n", clazz.getName())); + } + errorMessage.append(String.format("Currently used Java home directory is %s.\n", javaHome)); + errorMessage.append(String.format("Currently used VM configuration is: %s", vmName)); + throw new UnsupportedOperationException(errorMessage.toString()); } return t; } + + private static final class InvalidGraalRuntime implements GraalRuntime { + + @Override + public String getName() { + return ""; + } + + @Override + public T getCapability(Class clazz) { + return null; + } + } } diff -r 480c564d90ef -r 5c58da5b8233 graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/InstalledCodeExecuteHelperTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/InstalledCodeExecuteHelperTest.java Fri Mar 29 21:39:54 2013 +0100 @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2012, 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; + +import java.lang.reflect.*; + +import org.junit.*; + +import com.oracle.graal.api.meta.*; +import com.oracle.graal.api.runtime.*; +import com.oracle.graal.compiler.test.*; +import com.oracle.graal.hotspot.meta.*; +import com.oracle.graal.nodes.spi.*; + +public class InstalledCodeExecuteHelperTest extends GraalCompilerTest { + + private static final int ITERATIONS = 100000000; + + @Ignore + @Test + public void test1() throws NoSuchMethodException, SecurityException { + + final Method benchrMethod = InstalledCodeExecuteHelperTest.class.getMethod("bench", long.class, long.class); + final ResolvedJavaMethod benchJavaMethod = Graal.getRequiredCapability(GraalCodeCacheProvider.class).lookupJavaMethod(benchrMethod); + HotSpotInstalledCode benchCode = (HotSpotInstalledCode) getCode(benchJavaMethod, parse(benchrMethod)); + + final Method wrapperMethod = InstalledCodeExecuteHelperTest.class.getMethod("executeWrapper", long.class, long.class, Object.class, Object.class, Object.class); + final ResolvedJavaMethod wrapperJavaMethod = Graal.getRequiredCapability(GraalCodeCacheProvider.class).lookupJavaMethod(wrapperMethod); + HotSpotInstalledCode wrapperCode = (HotSpotInstalledCode) getCode(wrapperJavaMethod, parse(wrapperMethod)); + + final Method fooMethod = InstalledCodeExecuteHelperTest.class.getMethod("foo", Object.class, Object.class, Object.class); + final HotSpotResolvedJavaMethod fooJavaMethod = (HotSpotResolvedJavaMethod) Graal.getRequiredCapability(GraalCodeCacheProvider.class).lookupJavaMethod(fooMethod); + HotSpotInstalledCode fooCode = (HotSpotInstalledCode) getCode(fooJavaMethod, parse(fooMethod)); + + System.out.println(wrapperCode.executeVarargs(fooCode.getnmethod(), fooJavaMethod.getMetaspaceMethod(), null, null, null)); + + long nmethod = fooCode.getnmethod(); + long metaspacemethod = fooJavaMethod.getMetaspaceMethod(); + + System.out.println("Without replaced InstalledCode.execute:" + bench(nmethod, metaspacemethod)); + + System.out.println("WITH replaced InstalledCode.execute:" + benchCode.executeVarargs(nmethod, metaspacemethod)); + + } + + public static Long bench(long nmethod, long metaspacemethod) { + long start = System.currentTimeMillis(); + + for (int i = 0; i < ITERATIONS; i++) { + HotSpotInstalledCode.executeHelper(nmethod, metaspacemethod, null, null, null); + } + + long end = System.currentTimeMillis(); + return (end - start); + } + + public static Object foo(@SuppressWarnings("unused") Object a1, @SuppressWarnings("unused") Object a2, @SuppressWarnings("unused") Object a3) { + return 42; + } + + public static Object executeWrapper(long nmethod, long metaspaceMethod, Object arg1, Object arg2, Object arg3) { + return HotSpotInstalledCode.executeHelper(nmethod, metaspaceMethod, arg1, arg2, arg3); + } + +} diff -r 480c564d90ef -r 5c58da5b8233 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotInstalledCode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotInstalledCode.java Fri Mar 29 21:05:51 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotInstalledCode.java Fri Mar 29 21:39:54 2013 +0100 @@ -110,7 +110,6 @@ } public static Object executeHelper(long nmethod, long metaspaceMethod, Object arg1, Object arg2, Object arg3) { -// throw new IllegalStateException(); return HotSpotGraalRuntime.getInstance().getCompilerToVM().executeCompiledMethod(metaspaceMethod, nmethod, arg1, arg2, arg3); } } diff -r 480c564d90ef -r 5c58da5b8233 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/HotSpotInstalledCodeExecuteNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/HotSpotInstalledCodeExecuteNode.java Fri Mar 29 21:39:54 2013 +0100 @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2011, 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.nodes; + +import com.oracle.graal.api.code.*; +import com.oracle.graal.api.meta.*; +import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; +import com.oracle.graal.word.*; + +public class HotSpotInstalledCodeExecuteNode extends AbstractCallNode implements Lowerable { + + @Input private final ValueNode targetAddress; + @Input private final ValueNode metaspaceObject; + private final Class[] signature; + + public HotSpotInstalledCodeExecuteNode(Kind kind, ValueNode targetAddress, ValueNode metaspaceObject, Class[] signature, ValueNode arg1, ValueNode arg2, ValueNode arg3) { + super(StampFactory.forKind(kind), new ValueNode[]{arg1, arg2, arg3}); + this.targetAddress = targetAddress; + this.metaspaceObject = metaspaceObject; + this.signature = signature; + } + + @Override + public Object[] getLocationIdentities() { + return new Object[]{LocationNode.ANY_LOCATION}; + } + + @Override + public void lower(LoweringTool tool) { + replaceWithInvoke(tool); + } + + private InvokeNode replaceWithInvoke(LoweringTool tool) { + InvokeNode invoke = createInvoke(tool); + ((StructuredGraph) graph()).replaceFixedWithFixed(this, invoke); + return invoke; + } + + protected InvokeNode createInvoke(LoweringTool tool) { + ResolvedJavaMethod method = null; + try { + method = tool.getRuntime().lookupJavaMethod(HotSpotInstalledCodeExecuteNode.class.getMethod("placeholder", Object.class, Object.class, Object.class)); + } catch (NoSuchMethodException | SecurityException e) { + throw new IllegalStateException(); + } + ResolvedJavaType[] signatureTypes = new ResolvedJavaType[signature.length]; + for (int i = 0; i < signature.length; i++) { + signatureTypes[i] = tool.getRuntime().lookupJavaType(signature[i]); + } + HotSpotIndirectCallTargetNode callTarget = graph().add( + new HotSpotIndirectCallTargetNode(metaspaceObject, targetAddress, arguments, stamp(), signatureTypes, method, CallingConvention.Type.JavaCall)); + InvokeNode invoke = graph().add(new InvokeNode(callTarget, 0)); + invoke.setStateAfter(stateAfter()); + return invoke; + } + + public static Object placeholder(@SuppressWarnings("unused") Object a1, @SuppressWarnings("unused") Object a2, @SuppressWarnings("unused") Object a3) { + return 1; + } + + @NodeIntrinsic + public static native T call(@ConstantNodeParameter Kind kind, Word targetAddress, long metaspaceObject, @ConstantNodeParameter Class[] signature, Object arg1, Object arg2, Object arg3); + +} diff -r 480c564d90ef -r 5c58da5b8233 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotInstalledCodeIntrinsics.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotInstalledCodeIntrinsics.java Fri Mar 29 21:39:54 2013 +0100 @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2013, 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 com.oracle.graal.api.runtime.*; +import com.oracle.graal.phases.*; +import com.oracle.graal.replacements.*; + +@ServiceProvider(ReplacementsProvider.class) +public class HotSpotInstalledCodeIntrinsics implements ReplacementsProvider { + + @Override + public void installReplacements(ReplacementsInstaller installer) { + if (GraalOptions.IntrinsifyInstalledCodeMethods) { + installer.installSubstitutions(HotSpotInstalledCodeSubstitutions.class); + } + } +} diff -r 480c564d90ef -r 5c58da5b8233 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotInstalledCodeSubstitutions.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotInstalledCodeSubstitutions.java Fri Mar 29 21:39:54 2013 +0100 @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2013, 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 com.oracle.graal.api.meta.*; +import com.oracle.graal.api.replacements.*; +import com.oracle.graal.hotspot.meta.*; +import com.oracle.graal.hotspot.nodes.*; +import com.oracle.graal.replacements.Snippet.Fold; +import com.oracle.graal.word.*; + +@ClassSubstitution(HotSpotInstalledCode.class) +public class HotSpotInstalledCodeSubstitutions { + + @MethodSubstitution + public static Object executeHelper(long nmethod, long metaspaceMethod, final Object arg1, final Object arg2, final Object arg3) { + final int verifiedEntryPointOffset = HotSpotSnippetUtils.verifiedEntryPointOffset(); + final Word callTarget = Word.unsigned(nmethod).readWord(verifiedEntryPointOffset); + return HotSpotInstalledCodeExecuteNode.call(Kind.Object, callTarget, metaspaceMethod, getSignature(), arg1, arg2, arg3); + } + + @Fold + private static Class[] getSignature() { + return new Class[]{Object.class, Object.class, Object.class}; + } +} diff -r 480c564d90ef -r 5c58da5b8233 graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/ConvertJTT.java --- a/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/ConvertJTT.java Fri Mar 29 21:05:51 2013 +0100 +++ b/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/ConvertJTT.java Fri Mar 29 21:39:54 2013 +0100 @@ -52,8 +52,7 @@ try { processFile(file.toPath(), new File(targetDir, file.getName()).toPath(), packageName); } catch (RuntimeException e) { - e.printStackTrace(); - System.out.println("in file " + file.getAbsolutePath()); + throw new RuntimeException(String.format("Exception while processing file %s", file.getAbsolutePath()), e); } } } diff -r 480c564d90ef -r 5c58da5b8233 graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/reflect/Field_get03.java --- a/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/reflect/Field_get03.java Fri Mar 29 21:05:51 2013 +0100 +++ b/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/reflect/Field_get03.java Fri Mar 29 21:39:54 2013 +0100 @@ -50,10 +50,8 @@ FloatField = Field_get03.class.getField("floatField"); DoubleField = Field_get03.class.getField("doubleField"); BooleanField = Field_get03.class.getField("booleanField"); - } catch (SecurityException e) { - e.printStackTrace(); - } catch (NoSuchFieldException e) { - e.printStackTrace(); + } catch (SecurityException | NoSuchFieldException e) { + throw new RuntimeException(e); } } diff -r 480c564d90ef -r 5c58da5b8233 graal/com.oracle.graal.rawnativecall.test/test/com/oracle/graal/rawnativecall/test/InstalledCodeExecuteHelperTest.java --- a/graal/com.oracle.graal.rawnativecall.test/test/com/oracle/graal/rawnativecall/test/InstalledCodeExecuteHelperTest.java Fri Mar 29 21:05:51 2013 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2012, 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.rawnativecall.test; - -import java.lang.reflect.*; - -import org.junit.*; - -import com.oracle.graal.api.meta.*; -import com.oracle.graal.api.runtime.*; -import com.oracle.graal.compiler.test.*; -import com.oracle.graal.hotspot.meta.*; -import com.oracle.graal.nodes.spi.*; - -public class InstalledCodeExecuteHelperTest extends GraalCompilerTest { - - private static final int ITERATIONS = 10000000; - - @Ignore - @Test - public void test1() throws NoSuchMethodException, SecurityException { - - final Method benchrMethod = InstalledCodeExecuteHelperTest.class.getMethod("bench", long.class, long.class); - final ResolvedJavaMethod benchJavaMethod = Graal.getRequiredCapability(GraalCodeCacheProvider.class).lookupJavaMethod(benchrMethod); - HotSpotInstalledCode benchCode = (HotSpotInstalledCode) getCode(benchJavaMethod, parse(benchrMethod)); - - final Method wrapperMethod = InstalledCodeExecuteHelperTest.class.getMethod("executeWrapper", long.class, long.class, Object.class, Object.class, Object.class); - final ResolvedJavaMethod wrapperJavaMethod = Graal.getRequiredCapability(GraalCodeCacheProvider.class).lookupJavaMethod(wrapperMethod); - HotSpotInstalledCode wrapperCode = (HotSpotInstalledCode) getCode(wrapperJavaMethod, parse(wrapperMethod)); - - final Method fooMethod = InstalledCodeExecuteHelperTest.class.getMethod("foo", Object.class, Object.class, Object.class); - final HotSpotResolvedJavaMethod fooJavaMethod = (HotSpotResolvedJavaMethod) Graal.getRequiredCapability(GraalCodeCacheProvider.class).lookupJavaMethod(fooMethod); - HotSpotInstalledCode fooCode = (HotSpotInstalledCode) getCode(fooJavaMethod, parse(fooMethod)); - - System.out.println(wrapperCode.executeVarargs(fooCode.getnmethod(), fooJavaMethod.getMetaspaceMethod(), null, null, null)); - - long nmethod = fooCode.getnmethod(); - long metaspacemethod = fooJavaMethod.getMetaspaceMethod(); - - System.out.println("Without replaced InstalledCode.execute:" + bench(nmethod, metaspacemethod)); - - System.out.println("WITH replaced InstalledCode.execute:" + benchCode.executeVarargs(nmethod, metaspacemethod)); - - } - - public static Long bench(long nmethod, long metaspacemethod) { - long start = System.currentTimeMillis(); - - for (int i = 0; i < ITERATIONS; i++) { - HotSpotInstalledCode.executeHelper(nmethod, metaspacemethod, null, null, null); - } - - long end = System.currentTimeMillis(); - return (end - start); - } - - public static Object foo(@SuppressWarnings("unused") Object a1, @SuppressWarnings("unused") Object a2, @SuppressWarnings("unused") Object a3) { - return 42; - } - - public static Object executeWrapper(long nmethod, long metaspaceMethod, Object arg1, Object arg2, Object arg3) { - return HotSpotInstalledCode.executeHelper(nmethod, metaspaceMethod, arg1, arg2, arg3); - } - -} diff -r 480c564d90ef -r 5c58da5b8233 graal/com.oracle.graal.rawnativecall/src/com/oracle/graal/rawnativecall/nodes/HotSpotInstalledCodeExecuteNode.java --- a/graal/com.oracle.graal.rawnativecall/src/com/oracle/graal/rawnativecall/nodes/HotSpotInstalledCodeExecuteNode.java Fri Mar 29 21:05:51 2013 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2011, 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.rawnativecall.nodes; - -import com.oracle.graal.api.code.*; -import com.oracle.graal.api.meta.*; -import com.oracle.graal.hotspot.nodes.*; -import com.oracle.graal.nodes.*; -import com.oracle.graal.nodes.extended.*; -import com.oracle.graal.nodes.spi.*; -import com.oracle.graal.nodes.type.*; -import com.oracle.graal.word.*; - -public class HotSpotInstalledCodeExecuteNode extends AbstractCallNode implements Lowerable { - - @Input private final ValueNode targetAddress; - @Input private final ValueNode metaspaceObject; - private final Class[] signature; - - public HotSpotInstalledCodeExecuteNode(Kind kind, ValueNode targetAddress, ValueNode metaspaceObject, Class[] signature, ValueNode arg1, ValueNode arg2, ValueNode arg3) { - super(StampFactory.forKind(kind), new ValueNode[]{arg1, arg2, arg3}); - this.targetAddress = targetAddress; - this.metaspaceObject = metaspaceObject; - this.signature = signature; - } - - @Override - public Object[] getLocationIdentities() { - return new Object[]{LocationNode.ANY_LOCATION}; - } - - @Override - public void lower(LoweringTool tool) { - replaceWithInvoke(tool); - } - - private InvokeNode replaceWithInvoke(LoweringTool tool) { - InvokeNode invoke = createInvoke(tool); - ((StructuredGraph) graph()).replaceFixedWithFixed(this, invoke); - return invoke; - } - - protected InvokeNode createInvoke(LoweringTool tool) { - ResolvedJavaMethod method = null; - try { - method = tool.getRuntime().lookupJavaMethod(HotSpotInstalledCodeExecuteNode.class.getMethod("placeholder", Object.class, Object.class, Object.class)); - } catch (NoSuchMethodException | SecurityException e) { - throw new IllegalStateException(); - } - ResolvedJavaType[] signatureTypes = new ResolvedJavaType[signature.length]; - for (int i = 0; i < signature.length; i++) { - signatureTypes[i] = tool.getRuntime().lookupJavaType(signature[i]); - } - HotSpotIndirectCallTargetNode callTarget = graph().add( - new HotSpotIndirectCallTargetNode(metaspaceObject, targetAddress, arguments, stamp(), signatureTypes, method, CallingConvention.Type.JavaCall)); - InvokeNode invoke = graph().add(new InvokeNode(callTarget, 0)); - invoke.setStateAfter(stateAfter()); - return invoke; - } - - public static Object placeholder(@SuppressWarnings("unused") Object a1, @SuppressWarnings("unused") Object a2, @SuppressWarnings("unused") Object a3) { - return 1; - } - - @NodeIntrinsic - public static native T call(@ConstantNodeParameter Kind kind, Word targetAddress, long metaspaceObject, @ConstantNodeParameter Class[] signature, Object arg1, Object arg2, Object arg3); - -} diff -r 480c564d90ef -r 5c58da5b8233 graal/com.oracle.graal.rawnativecall/src/com/oracle/graal/rawnativecall/replacements/HotSpotInstalledCodeIntrinsics.java --- a/graal/com.oracle.graal.rawnativecall/src/com/oracle/graal/rawnativecall/replacements/HotSpotInstalledCodeIntrinsics.java Fri Mar 29 21:05:51 2013 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2013, 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.rawnativecall.replacements; - -import com.oracle.graal.api.runtime.*; -import com.oracle.graal.phases.*; -import com.oracle.graal.replacements.*; - -@ServiceProvider(ReplacementsProvider.class) -public class HotSpotInstalledCodeIntrinsics implements ReplacementsProvider { - - @Override - public void installReplacements(ReplacementsInstaller installer) { - if (GraalOptions.IntrinsifyInstalledCodeMethods) { - installer.installSubstitutions(HotSpotInstalledCodeSubstitutions.class); - } - } -} diff -r 480c564d90ef -r 5c58da5b8233 graal/com.oracle.graal.rawnativecall/src/com/oracle/graal/rawnativecall/replacements/HotSpotInstalledCodeSubstitutions.java --- a/graal/com.oracle.graal.rawnativecall/src/com/oracle/graal/rawnativecall/replacements/HotSpotInstalledCodeSubstitutions.java Fri Mar 29 21:05:51 2013 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2013, 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.rawnativecall.replacements; - -import com.oracle.graal.api.meta.*; -import com.oracle.graal.api.replacements.*; -import com.oracle.graal.hotspot.meta.*; -import com.oracle.graal.hotspot.replacements.*; -import com.oracle.graal.rawnativecall.nodes.*; -import com.oracle.graal.replacements.Snippet.Fold; -import com.oracle.graal.word.*; - -@ClassSubstitution(HotSpotInstalledCode.class) -public class HotSpotInstalledCodeSubstitutions { - - @MethodSubstitution - public static Object executeHelper(long nmethod, long metaspaceMethod, final Object arg1, final Object arg2, final Object arg3) { - final int verifiedEntryPointOffset = HotSpotSnippetUtils.verifiedEntryPointOffset(); - final Word callTarget = Word.unsigned(nmethod).readWord(verifiedEntryPointOffset); - return HotSpotInstalledCodeExecuteNode.call(Kind.Object, callTarget, metaspaceMethod, getSignature(), arg1, arg2, arg3); - } - - @Fold - private static Class[] getSignature() { - return new Class[]{Object.class, Object.class, Object.class}; - } -} diff -r 480c564d90ef -r 5c58da5b8233 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationPhase.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationPhase.java Fri Mar 29 21:05:51 2013 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationPhase.java Fri Mar 29 21:39:54 2013 +0100 @@ -62,11 +62,16 @@ } } - public static Class[] signatureToTypes(Signature signature, ResolvedJavaType accessingClass) { - int count = signature.getParameterCount(false); + public static Class[] signatureToTypes(Signature signature, JavaType receiverType, ResolvedJavaType accessingClass) { + int count = signature.getParameterCount(receiverType != null); Class[] result = new Class[count]; - for (int i = 0; i < result.length; ++i) { - result[i] = getMirrorOrFail(signature.getParameterType(i, accessingClass).resolve(accessingClass), Thread.currentThread().getContextClassLoader()); + int j = 0; + if (receiverType != null) { + result[0] = getMirrorOrFail(receiverType.resolve(accessingClass), Thread.currentThread().getContextClassLoader()); + j = 1; + } + for (int i = 0; i + j < result.length; ++i) { + result[i + j] = getMirrorOrFail(signature.getParameterType(i, accessingClass).resolve(accessingClass), Thread.currentThread().getContextClassLoader()); } return result; } @@ -75,10 +80,12 @@ ResolvedJavaMethod target = invoke.methodCallTarget().targetMethod(); NodeIntrinsic intrinsic = target.getAnnotation(Node.NodeIntrinsic.class); ResolvedJavaType declaringClass = target.getDeclaringClass(); + JavaType receiverType = invoke.methodCallTarget().isStatic() ? null : declaringClass; if (intrinsic != null) { assert target.getAnnotation(Fold.class) == null; - Class[] parameterTypes = signatureToTypes(target.getSignature(), declaringClass); + // TODO mjj non-static intrinsic? + Class[] parameterTypes = signatureToTypes(target.getSignature(), null, declaringClass); ResolvedJavaType returnType = target.getSignature().getReturnType(declaringClass).resolve(declaringClass); // Prepare the arguments for the reflective constructor call on the node class. @@ -98,7 +105,7 @@ // Clean up checkcast instructions inserted by javac if the return type is generic. cleanUpReturnCheckCast(newInstance); } else if (target.getAnnotation(Fold.class) != null) { - Class[] parameterTypes = signatureToTypes(target.getSignature(), declaringClass); + Class[] parameterTypes = signatureToTypes(target.getSignature(), receiverType, declaringClass); // Prepare the arguments for the reflective method call Object[] arguments = prepareArguments(invoke, parameterTypes, target, true); @@ -109,6 +116,7 @@ if (!invoke.methodCallTarget().isStatic()) { receiver = arguments[0]; arguments = Arrays.asList(arguments).subList(1, arguments.length).toArray(); + parameterTypes = Arrays.asList(parameterTypes).subList(1, parameterTypes.length).toArray(new Class[parameterTypes.length - 1]); } // Call the method diff -r 480c564d90ef -r 5c58da5b8233 graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectList.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectList.java Fri Mar 29 21:05:51 2013 +0100 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectList.java Fri Mar 29 21:39:54 2013 +0100 @@ -53,8 +53,8 @@ try { field.setAccessible(true); str.append(str.length() > 0 ? ", " : "").append(name).append("=").append(format(field.get(this))); - } catch (Exception e) { - e.printStackTrace(); + } catch (SecurityException | IllegalAccessException e) { + throw new RuntimeException(e); } } } diff -r 480c564d90ef -r 5c58da5b8233 make/build-graal.xml --- a/make/build-graal.xml Fri Mar 29 21:05:51 2013 +0100 +++ b/make/build-graal.xml Fri Mar 29 21:39:54 2013 +0100 @@ -64,7 +64,6 @@ - diff -r 480c564d90ef -r 5c58da5b8233 mx/projects --- a/mx/projects Fri Mar 29 21:05:51 2013 +0100 +++ b/mx/projects Fri Mar 29 21:39:54 2013 +0100 @@ -23,7 +23,7 @@ library@DACAPO_SCALA@urls=http://repo.scalabench.org/snapshots/org/scalabench/benchmarks/scala-benchmark-suite/0.1.0-SNAPSHOT/scala-benchmark-suite-0.1.0-20120216.103539-3.jar distribution@GRAAL@path=graal.jar -distribution@GRAAL@dependencies=com.oracle.graal.hotspot.amd64,com.oracle.graal.hotspot.sparc, com.oracle.graal.rawnativecall +distribution@GRAAL@dependencies=com.oracle.graal.hotspot.amd64,com.oracle.graal.hotspot.sparc,com.oracle.graal.hotspot # graal.api.runtime project@com.oracle.graal.api.runtime@subDir=graal @@ -98,7 +98,7 @@ project@com.oracle.graal.hotspot@sourceDirs=src project@com.oracle.graal.hotspot@dependencies=com.oracle.graal.replacements,com.oracle.graal.printer project@com.oracle.graal.hotspot@checkstyle=com.oracle.graal.graph -project@com.oracle.graal.hotspot@annotationProcessors=com.oracle.graal.replacements.verifier +project@com.oracle.graal.hotspot@annotationProcessors=com.oracle.graal.replacements.verifier, com.oracle.graal.service.processor project@com.oracle.graal.hotspot@javaCompliance=1.7 # graal.hotspot.amd64 @@ -386,21 +386,6 @@ project@com.oracle.graal.asm.sparc@checkstyle=com.oracle.graal.graph project@com.oracle.graal.asm.sparc@javaCompliance=1.7 -# graal.rawnativecall -project@com.oracle.graal.rawnativecall@subDir=graal -project@com.oracle.graal.rawnativecall@sourceDirs=src -project@com.oracle.graal.rawnativecall@dependencies=com.oracle.graal.hotspot -project@com.oracle.graal.rawnativecall@checkstyle=com.oracle.graal.graph -project@com.oracle.graal.rawnativecall@annotationProcessors=com.oracle.graal.replacements.verifier, com.oracle.graal.service.processor -project@com.oracle.graal.rawnativecall@javaCompliance=1.7 - -# graal.rawnativecall.test -project@com.oracle.graal.rawnativecall.test@subDir=graal -project@com.oracle.graal.rawnativecall.test@sourceDirs=test -project@com.oracle.graal.rawnativecall.test@dependencies=com.oracle.graal.compiler.test,com.oracle.graal.hotspot -project@com.oracle.graal.rawnativecall.test@checkstyle=com.oracle.graal.graph -project@com.oracle.graal.rawnativecall.test@javaCompliance=1.7 - # truffle.api project@com.oracle.truffle.api@subDir=graal project@com.oracle.truffle.api@sourceDirs=src