Mercurial > hg > graal-compiler
changeset 22685:36e61de8d971
Merge
author | Christian Wimmer <christian.wimmer@oracle.com> |
---|---|
date | Tue, 22 Sep 2015 18:04:38 -0700 |
parents | 4ea1c903f00f (current diff) f36a430db1c2 (diff) |
children | b7ccafc71a9d |
files | graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/InvocationPlugin.java graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/InvocationPlugins.java graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParser.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java |
diffstat | 5 files changed, 82 insertions(+), 32 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/InvocationPlugin.java Tue Sep 22 17:26:22 2015 -0700 +++ b/graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/InvocationPlugin.java Tue Sep 22 18:04:38 2015 -0700 @@ -40,8 +40,8 @@ /** * The receiver in a non-static method. The class literal for this interface must be used with - * {@link InvocationPlugins#put(InvocationPlugin, boolean, boolean, Class, String, Class...)} to - * denote the receiver argument for such a non-static method. + * {@link InvocationPlugins#put(InvocationPlugin, boolean, boolean, boolean, Class, String, Class...)} + * to denote the receiver argument for such a non-static method. */ public interface Receiver { /**
--- a/graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/InvocationPlugins.java Tue Sep 22 17:26:22 2015 -0700 +++ b/graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/InvocationPlugins.java Tue Sep 22 18:04:38 2015 -0700 @@ -35,6 +35,7 @@ import java.util.Map; import java.util.stream.Collectors; +import jdk.internal.jvmci.common.JVMCIError; import jdk.internal.jvmci.meta.MetaAccessProvider; import jdk.internal.jvmci.meta.ResolvedJavaMethod; @@ -92,6 +93,7 @@ private final InvocationPlugins plugins; private final Class<?> declaringClass; + private boolean allowOverwrite; /** * Creates an object for registering {@link InvocationPlugin}s for methods declared by a @@ -107,13 +109,38 @@ } /** + * Creates an object for registering {@link InvocationPlugin}s for methods declared by a + * given class. + * + * @param plugins where to register the plugins + * @param declaringClassName the name of the class class declaring the methods for which + * plugins will be registered via this object + */ + public Registration(InvocationPlugins plugins, String declaringClassName) { + this.plugins = plugins; + try { + this.declaringClass = Class.forName(declaringClassName); + } catch (ClassNotFoundException ex) { + throw JVMCIError.shouldNotReachHere(ex); + } + } + + /** + * Configures this registration to allow or disallow overwriting of invocation plugins. + */ + public Registration setAllowOverwrite(boolean allowOverwrite) { + this.allowOverwrite = allowOverwrite; + return this; + } + + /** * Registers a plugin for a method with no arguments. * * @param name the name of the method * @param plugin the plugin to be registered */ public void register0(String name, InvocationPlugin plugin) { - plugins.register(plugin, declaringClass, name); + plugins.register(plugin, false, allowOverwrite, declaringClass, name); } /** @@ -123,7 +150,7 @@ * @param plugin the plugin to be registered */ public void register1(String name, Class<?> arg, InvocationPlugin plugin) { - plugins.register(plugin, declaringClass, name, arg); + plugins.register(plugin, false, allowOverwrite, declaringClass, name, arg); } /** @@ -133,7 +160,7 @@ * @param plugin the plugin to be registered */ public void register2(String name, Class<?> arg1, Class<?> arg2, InvocationPlugin plugin) { - plugins.register(plugin, declaringClass, name, arg1, arg2); + plugins.register(plugin, false, allowOverwrite, declaringClass, name, arg1, arg2); } /** @@ -143,7 +170,7 @@ * @param plugin the plugin to be registered */ public void register3(String name, Class<?> arg1, Class<?> arg2, Class<?> arg3, InvocationPlugin plugin) { - plugins.register(plugin, declaringClass, name, arg1, arg2, arg3); + plugins.register(plugin, false, allowOverwrite, declaringClass, name, arg1, arg2, arg3); } /** @@ -153,7 +180,7 @@ * @param plugin the plugin to be registered */ public void register4(String name, Class<?> arg1, Class<?> arg2, Class<?> arg3, Class<?> arg4, InvocationPlugin plugin) { - plugins.register(plugin, declaringClass, name, arg1, arg2, arg3, arg4); + plugins.register(plugin, false, allowOverwrite, declaringClass, name, arg1, arg2, arg3, arg4); } /** @@ -163,7 +190,37 @@ * @param plugin the plugin to be registered */ public void register5(String name, Class<?> arg1, Class<?> arg2, Class<?> arg3, Class<?> arg4, Class<?> arg5, InvocationPlugin plugin) { - plugins.register(plugin, declaringClass, name, arg1, arg2, arg3, arg4, arg5); + plugins.register(plugin, false, allowOverwrite, declaringClass, name, arg1, arg2, arg3, arg4, arg5); + } + + /** + * Registers a plugin for an optional method with no arguments. + * + * @param name the name of the method + * @param plugin the plugin to be registered + */ + public void registerOptional0(String name, InvocationPlugin plugin) { + plugins.register(plugin, true, allowOverwrite, declaringClass, name); + } + + /** + * Registers a plugin for an optional method with 1 argument. + * + * @param name the name of the method + * @param plugin the plugin to be registered + */ + public void registerOptional1(String name, Class<?> arg, InvocationPlugin plugin) { + plugins.register(plugin, true, allowOverwrite, declaringClass, name, arg); + } + + /** + * Registers a plugin for an optional method with 2 arguments. + * + * @param name the name of the method + * @param plugin the plugin to be registered + */ + public void registerOptional2(String name, Class<?> arg1, Class<?> arg2, InvocationPlugin plugin) { + plugins.register(plugin, true, allowOverwrite, declaringClass, name, arg1, arg2); } /** @@ -173,7 +230,7 @@ * @param plugin the plugin to be registered */ public void registerOptional3(String name, Class<?> arg1, Class<?> arg2, Class<?> arg3, InvocationPlugin plugin) { - plugins.registerOptional(plugin, declaringClass, name, arg1, arg2, arg3); + plugins.register(plugin, true, allowOverwrite, declaringClass, name, arg1, arg2, arg3); } /** @@ -183,7 +240,7 @@ * @param plugin the plugin to be registered */ public void registerOptional4(String name, Class<?> arg1, Class<?> arg2, Class<?> arg3, Class<?> arg4, InvocationPlugin plugin) { - plugins.registerOptional(plugin, declaringClass, name, arg1, arg2, arg3, arg4); + plugins.register(plugin, true, allowOverwrite, declaringClass, name, arg1, arg2, arg3, arg4); } /** @@ -198,7 +255,7 @@ */ public void registerMethodSubstitution(Class<?> substituteDeclaringClass, String name, Class<?>... argumentTypes) { MethodSubstitutionPlugin plugin = new MethodSubstitutionPlugin(substituteDeclaringClass, name, argumentTypes); - plugins.register(plugin, declaringClass, name, argumentTypes); + plugins.register(plugin, false, allowOverwrite, declaringClass, name, argumentTypes); } } @@ -319,11 +376,11 @@ * {@code declaringClass} iff the method is non-static. * @return an object representing the method */ - MethodKey put(InvocationPlugin value, boolean isStatic, boolean isOptional, Class<?> declaringClass, String name, Class<?>... argumentTypes) { + MethodKey put(InvocationPlugin value, boolean isStatic, boolean isOptional, boolean allowOverwrite, Class<?> declaringClass, String name, Class<?>... argumentTypes) { assert isStatic || argumentTypes[0] == declaringClass; MethodKey methodKey = new MethodKey(value, isStatic, isOptional, declaringClass, name, argumentTypes); assert entries == null : "registration is closed"; - assert !registrations.contains(methodKey) : "a value is already registered for " + methodKey; + assert allowOverwrite || !registrations.contains(methodKey) : "a value is already registered for " + methodKey; registrations.add(methodKey); return methodKey; } @@ -379,10 +436,6 @@ private InvocationPlugins(InvocationPlugins parent, MetaAccessProvider metaAccess) { this.metaAccess = metaAccess; InvocationPlugins p = parent; - // Only adopt a non-empty parent - while (p != null && p.size() == 0) { - p = p.parent; - } this.parent = p; } @@ -401,12 +454,12 @@ this(null, metaAccess); } - private void register(InvocationPlugin plugin, boolean isOptional, Class<?> declaringClass, String name, Class<?>... argumentTypes) { + private void register(InvocationPlugin plugin, boolean isOptional, boolean allowOverwrite, Class<?> declaringClass, String name, Class<?>... argumentTypes) { boolean isStatic = argumentTypes.length == 0 || argumentTypes[0] != InvocationPlugin.Receiver.class; if (!isStatic) { argumentTypes[0] = declaringClass; } - MethodKey methodInfo = put(plugin, isStatic, isOptional, declaringClass, name, argumentTypes); + MethodKey methodInfo = put(plugin, isStatic, isOptional, allowOverwrite, declaringClass, name, argumentTypes); assert Checker.check(this, methodInfo, plugin); } @@ -420,7 +473,7 @@ * {@code declaringClass} */ public void register(InvocationPlugin plugin, Class<?> declaringClass, String name, Class<?>... argumentTypes) { - register(plugin, false, declaringClass, name, argumentTypes); + register(plugin, false, false, declaringClass, name, argumentTypes); } /** @@ -433,7 +486,7 @@ * {@code declaringClass} */ public void registerOptional(InvocationPlugin plugin, Class<?> declaringClass, String name, Class<?>... argumentTypes) { - register(plugin, true, declaringClass, name, argumentTypes); + register(plugin, true, false, declaringClass, name, argumentTypes); } /**
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParser.java Tue Sep 22 17:26:22 2015 -0700 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParser.java Tue Sep 22 18:04:38 2015 -0700 @@ -583,7 +583,7 @@ private ValueNode unwindValue; private FixedWithNextNode beforeUnwindNode; - private FixedWithNextNode lastInstr; // the last instruction added + protected FixedWithNextNode lastInstr; // the last instruction added private final boolean explodeLoops; private final boolean mergeExplosions; private final Map<FrameStateBuilder, Integer> mergeExplosionsMap; @@ -1853,7 +1853,7 @@ } @SuppressWarnings("try") - private void parseAndInlineCallee(ResolvedJavaMethod targetMethod, ValueNode[] args, IntrinsicContext calleeIntrinsicContext) { + protected void parseAndInlineCallee(ResolvedJavaMethod targetMethod, ValueNode[] args, IntrinsicContext calleeIntrinsicContext) { try (IntrinsicScope s = calleeIntrinsicContext != null && !parsingIntrinsic() ? new IntrinsicScope(this, targetMethod.getSignature().toParameterKinds(!targetMethod.isStatic()), args) : null) { BytecodeParser parser = graphBuilderInstance.createBytecodeParser(graph, this, targetMethod, Compiler.INVOCATION_ENTRY_BCI, calleeIntrinsicContext); @@ -1886,7 +1886,7 @@ } } - protected MethodCallTargetNode createMethodCallTarget(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args, JavaType returnType, JavaTypeProfile profile) { + public MethodCallTargetNode createMethodCallTarget(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args, JavaType returnType, JavaTypeProfile profile) { return new MethodCallTargetNode(invokeKind, targetMethod, args, returnType, profile); }
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Tue Sep 22 17:26:22 2015 -0700 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Tue Sep 22 18:04:38 2015 -0700 @@ -133,10 +133,7 @@ */ public class SnippetTemplate { - // Checkstyle: stop - public static boolean LAZY_SNIPPETS = true; - - // Checkstyle: resume + private static final boolean EAGER_SNIPPETS = Boolean.getBoolean("graal.snippets.eager"); /** * Holds the {@link ResolvedJavaMethod} of the snippet, together with some information about the @@ -587,10 +584,10 @@ assert findMethod(declaringClass, methodName, method) == null : "found more than one method named " + methodName + " in " + declaringClass; ResolvedJavaMethod javaMethod = providers.getMetaAccess().lookupJavaMethod(method); providers.getReplacements().registerSnippet(javaMethod); - if (LAZY_SNIPPETS) { + if (EAGER_SNIPPETS) { + return new EagerSnippetInfo(javaMethod, privateLocations); + } else { return new LazySnippetInfo(javaMethod, privateLocations); - } else { - return new EagerSnippetInfo(javaMethod, privateLocations); } }
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java Tue Sep 22 17:26:22 2015 -0700 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java Tue Sep 22 18:04:38 2015 -0700 @@ -365,7 +365,7 @@ } } - public void compile() { + public final void compile() { if (!isCompiling()) { compiling = true; runtime.compile(this, TruffleBackgroundCompilation.getValue() && !TruffleCompilationExceptionsAreThrown.getValue());