Mercurial > hg > truffle
changeset 19880:3cc8aa066ed3
made resolution of method with InvocationPlugins lazy
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/CheckGraalInvariants.java Thu Mar 12 17:13:29 2015 +0100 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/CheckGraalInvariants.java Thu Mar 12 22:10:07 2015 +0100 @@ -42,6 +42,7 @@ import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.java.*; +import com.oracle.graal.java.GraphBuilderConfiguration.Plugins; import com.oracle.graal.nodeinfo.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.StructuredGraph.AllowAssumptions; @@ -68,7 +69,9 @@ MetaAccessProvider metaAccess = providers.getMetaAccess(); PhaseSuite<HighTierContext> graphBuilderSuite = new PhaseSuite<>(); - graphBuilderSuite.appendPhase(new GraphBuilderPhase(GraphBuilderConfiguration.getEagerDefault())); + GraphBuilderConfiguration config = GraphBuilderConfiguration.getEagerDefault(); + config.setPlugins(new Plugins(metaAccess)); + graphBuilderSuite.appendPhase(new GraphBuilderPhase(config)); HighTierContext context = new HighTierContext(providers, null, graphBuilderSuite, OptimisticOptimizations.NONE); Assume.assumeTrue(VerifyPhase.class.desiredAssertionStatus());
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/FinalizableSubclassTest.java Thu Mar 12 17:13:29 2015 +0100 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/FinalizableSubclassTest.java Thu Mar 12 22:10:07 2015 +0100 @@ -28,11 +28,12 @@ import org.junit.*; +import com.oracle.graal.api.meta.*; import com.oracle.graal.api.meta.Assumptions.Assumption; import com.oracle.graal.api.meta.Assumptions.NoFinalizableSubclass; -import com.oracle.graal.api.meta.*; import com.oracle.graal.debug.*; import com.oracle.graal.java.*; +import com.oracle.graal.java.GraphBuilderConfiguration.Plugins; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.StructuredGraph.AllowAssumptions; import com.oracle.graal.nodes.java.*; @@ -67,6 +68,7 @@ StructuredGraph graph = new StructuredGraph(javaMethod, allowAssumptions); GraphBuilderConfiguration conf = GraphBuilderConfiguration.getSnippetDefault(); + conf.setPlugins(new Plugins(getMetaAccess())); new GraphBuilderPhase.Instance(getMetaAccess(), getProviders().getStampProvider(), getProviders().getConstantReflection(), conf, OptimisticOptimizations.ALL, null).apply(graph); HighTierContext context = new HighTierContext(getProviders(), null, getDefaultGraphBuilderSuite(), OptimisticOptimizations.ALL); new InliningPhase(new CanonicalizerPhase()).apply(graph, context);
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/tutorial/StaticAnalysis.java Thu Mar 12 17:13:29 2015 +0100 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/tutorial/StaticAnalysis.java Thu Mar 12 22:10:07 2015 +0100 @@ -30,6 +30,7 @@ import com.oracle.graal.debug.Debug.Scope; import com.oracle.graal.graph.*; import com.oracle.graal.java.*; +import com.oracle.graal.java.GraphBuilderConfiguration.Plugins; import com.oracle.graal.nodes.CallTargetNode.InvokeKind; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.StructuredGraph.AllowAssumptions; @@ -237,6 +238,7 @@ */ OptimisticOptimizations optimisticOpts = OptimisticOptimizations.NONE; + graphBuilderConfig.setPlugins(new Plugins(metaAccess)); GraphBuilderPhase.Instance graphBuilder = new GraphBuilderPhase.Instance(metaAccess, stampProvider, null, graphBuilderConfig, optimisticOpts, null); graphBuilder.apply(graph); } catch (Throwable ex) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java Thu Mar 12 17:13:29 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java Thu Mar 12 22:10:07 2015 +0100 @@ -36,7 +36,7 @@ import com.oracle.graal.java.*; import com.oracle.graal.java.GraphBuilderPlugin.InvocationPlugin; import com.oracle.graal.java.InvocationPlugins.Registration; -import com.oracle.graal.java.InvocationPlugins.Registration.Receiver; +import com.oracle.graal.java.InvocationPlugins.Receiver; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.HeapAccess.BarrierType; import com.oracle.graal.nodes.extended.*; @@ -70,16 +70,16 @@ plugins.setInlineInvokePlugin(new HotSpotInlineInvokePlugin(nodeIntrinsification, (ReplacementsImpl) providers.getReplacements())); plugins.setGenericInvocationPlugin(new DefaultGenericInvocationPlugin(nodeIntrinsification, wordOperationPlugin)); - registerObjectPlugins(invocationPlugins, metaAccess); - registerSystemPlugins(invocationPlugins, metaAccess, providers.getForeignCalls()); + registerObjectPlugins(invocationPlugins); + registerSystemPlugins(invocationPlugins, providers.getForeignCalls()); registerThreadPlugins(invocationPlugins, metaAccess, wordTypes, config); - registerStableOptionPlugins(invocationPlugins, metaAccess); + registerStableOptionPlugins(invocationPlugins); StandardGraphBuilderPlugins.registerInvocationPlugins(providers.getMetaAccess(), providers.getCodeCache().target.arch, invocationPlugins, !config.useHeapProfiler); return plugins; } - private static void registerObjectPlugins(InvocationPlugins plugins, MetaAccessProvider metaAccess) { - Registration r = new Registration(plugins, metaAccess, Object.class); + private static void registerObjectPlugins(InvocationPlugins plugins) { + Registration r = new Registration(plugins, Object.class); r.register1("getClass", Receiver.class, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode rcvr) { ObjectStamp objectStamp = (ObjectStamp) rcvr.stamp(); @@ -97,8 +97,8 @@ }); } - private static void registerSystemPlugins(InvocationPlugins plugins, MetaAccessProvider metaAccess, ForeignCallsProvider foreignCalls) { - Registration r = new Registration(plugins, metaAccess, System.class); + private static void registerSystemPlugins(InvocationPlugins plugins, ForeignCallsProvider foreignCalls) { + Registration r = new Registration(plugins, System.class); r.register0("currentTimeMillis", new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod) { b.push(Kind.Long, b.append(new ForeignCallNode(foreignCalls, SystemSubstitutions.JAVA_TIME_MILLIS, StampFactory.forKind(Kind.Long)))); @@ -114,7 +114,7 @@ } private static void registerThreadPlugins(InvocationPlugins plugins, MetaAccessProvider metaAccess, WordTypes wordTypes, HotSpotVMConfig config) { - Registration r = new Registration(plugins, metaAccess, Thread.class); + Registration r = new Registration(plugins, Thread.class); r.register0("currentThread", new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod) { CurrentJavaThreadNode thread = b.append(new CurrentJavaThreadNode(wordTypes.getWordKind())); @@ -129,8 +129,8 @@ }); } - private static void registerStableOptionPlugins(InvocationPlugins plugins, MetaAccessProvider metaAccess) { - Registration r = new Registration(plugins, metaAccess, StableOptionValue.class); + private static void registerStableOptionPlugins(InvocationPlugins plugins) { + Registration r = new Registration(plugins, StableOptionValue.class); r.register1("getValue", Receiver.class, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode rcvr) { if (rcvr.isConstant() && !rcvr.isNullConstant()) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotInvocationPlugins.java Thu Mar 12 17:13:29 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotInvocationPlugins.java Thu Mar 12 22:10:07 2015 +0100 @@ -24,39 +24,38 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.hotspot.*; +import com.oracle.graal.java.GraphBuilderPlugin.InvocationPlugin; import com.oracle.graal.java.*; -import com.oracle.graal.java.GraphBuilderPlugin.*; -import com.oracle.graal.replacements.StandardGraphBuilderPlugins.*; +import com.oracle.graal.replacements.StandardGraphBuilderPlugins.BoxPlugin; /** * Extension of {@link InvocationPlugins} that disables plugins based on runtime configuration. */ final class HotSpotInvocationPlugins extends InvocationPlugins { final HotSpotVMConfig config; - final MetaAccessProvider metaAccess; public HotSpotInvocationPlugins(HotSpotVMConfig config, MetaAccessProvider metaAccess) { + super(metaAccess); this.config = config; - this.metaAccess = metaAccess; } @Override - public void register(ResolvedJavaMethod method, InvocationPlugin plugin) { + public void register(InvocationPlugin plugin, Class<?> declaringClass, String name, Class<?>... argumentTypes) { if (!config.usePopCountInstruction) { - if (method.getName().equals("bitCount")) { - assert method.getDeclaringClass().equals(metaAccess.lookupJavaType(Integer.class)) || method.getDeclaringClass().equals(metaAccess.lookupJavaType(Long.class)); + if (name.equals("bitCount")) { + assert declaringClass.equals(Integer.class) || declaringClass.equals(Long.class); return; } } if (!config.useCountLeadingZerosInstruction) { - if (method.getName().equals("numberOfLeadingZeros")) { - assert method.getDeclaringClass().equals(metaAccess.lookupJavaType(Integer.class)) || method.getDeclaringClass().equals(metaAccess.lookupJavaType(Long.class)); + if (name.equals("numberOfLeadingZeros")) { + assert declaringClass.equals(Integer.class) || declaringClass.equals(Long.class); return; } } if (!config.useCountTrailingZerosInstruction) { - if (method.getName().equals("numberOfTrailingZeros")) { - assert method.getDeclaringClass().equals(metaAccess.lookupJavaType(Integer.class)); + if (name.equals("numberOfTrailingZeros")) { + assert declaringClass.equals(Integer.class); return; } } @@ -67,6 +66,6 @@ return; } } - super.register(method, plugin); + super.register(plugin, declaringClass, name, argumentTypes); } }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/SnippetStub.java Thu Mar 12 17:13:29 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/SnippetStub.java Thu Mar 12 22:10:07 2015 +0100 @@ -79,11 +79,12 @@ @Override protected StructuredGraph getGraph() { - GraphBuilderConfiguration config = GraphBuilderConfiguration.getSnippetDefault(); Plugins defaultPlugins = providers.getGraphBuilderPlugins(); - Plugins plugins = config.getPlugins().updateFrom(defaultPlugins, false); + Plugins plugins = new Plugins(providers.getMetaAccess()).updateFrom(defaultPlugins, false); plugins.getInvocationPlugins().setDefaults(defaultPlugins.getInvocationPlugins()); plugins.setParameterPlugin(new ConstantBindingParameterPlugin(makeConstArgs(), plugins.getParameterPlugin(), providers.getMetaAccess(), providers.getSnippetReflection())); + GraphBuilderConfiguration config = GraphBuilderConfiguration.getSnippetDefault(); + config.setPlugins(plugins); // Stubs cannot have optimistic assumptions since they have // to be valid for the entire run of the VM. Nor can they be
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderConfiguration.java Thu Mar 12 17:13:29 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderConfiguration.java Thu Mar 12 22:10:07 2015 +0100 @@ -45,8 +45,8 @@ private GenericInvocationPlugin genericInvocationPlugin; private LoopExplosionPlugin loopExplosionPlugin; - public Plugins() { - invocationPlugins = new InvocationPlugins(); + public Plugins(MetaAccessProvider metaAccess) { + invocationPlugins = new InvocationPlugins(metaAccess); } public Plugins(InvocationPlugins invocationPlugins) { @@ -127,7 +127,7 @@ private final DebugInfoMode debugInfoMode; private final boolean doLivenessAnalysis; private boolean useProfiling; - private Plugins plugins = new Plugins(); + private Plugins plugins; public static enum DebugInfoMode { SafePointsOnly, @@ -252,7 +252,12 @@ } public GraphBuilderConfiguration copyPluginsFrom(GraphBuilderConfiguration other) { - this.plugins.updateFrom(other.plugins, true); + if (other.plugins != null) { + if (this.plugins == null) { + this.plugins = new Plugins(other.plugins.getInvocationPlugins().getMetaAccess()); + } + this.plugins.updateFrom(other.plugins, true); + } return this; } }
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/InvocationPlugins.java Thu Mar 12 17:13:29 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/InvocationPlugins.java Thu Mar 12 22:10:07 2015 +0100 @@ -37,25 +37,26 @@ * Manages a set of {@link InvocationPlugin}s. */ public class InvocationPlugins { + /** - * Utility for {@linkplain InvocationPlugins#register(ResolvedJavaMethod, InvocationPlugin) + * Sentinel class for use with + * {@link InvocationPlugins#register(InvocationPlugin, Class, String, Class...)} to denote the + * receiver argument for a non-static method. + */ + public static final class Receiver { + private Receiver() { + throw GraalInternalError.shouldNotReachHere(); + } + } + + /** + * Utility for + * {@linkplain InvocationPlugins#register(InvocationPlugin, Class, String, Class...) * registration} of invocation plugins. */ public static class Registration { - /** - * Sentinel class for use with {@link Registration#register1}, - * {@link Registration#register2} or {@link Registration#register3} to denote the receiver - * argument for a non-static method. - */ - public static final class Receiver { - private Receiver() { - throw GraalInternalError.shouldNotReachHere(); - } - } - private final InvocationPlugins plugins; - private final MetaAccessProvider metaAccess; private final Class<?> declaringClass; /** @@ -63,13 +64,11 @@ * given class. * * @param plugins where to register the plugins - * @param metaAccess used to resolve classes and methods * @param declaringClass the class declaring the methods for which plugins will be * registered via this object */ - public Registration(InvocationPlugins plugins, MetaAccessProvider metaAccess, Class<?> declaringClass) { + public Registration(InvocationPlugins plugins, Class<?> declaringClass) { this.plugins = plugins; - this.metaAccess = metaAccess; this.declaringClass = declaringClass; } @@ -80,7 +79,7 @@ * @param plugin the plugin to be registered */ public void register0(String name, InvocationPlugin plugin) { - plugins.register(resolve(metaAccess, declaringClass, name), plugin); + plugins.register(plugin, declaringClass, name); } /** @@ -90,7 +89,7 @@ * @param plugin the plugin to be registered */ public void register1(String name, Class<?> arg, InvocationPlugin plugin) { - plugins.register(arg == Receiver.class ? resolve(metaAccess, declaringClass, name) : resolve(metaAccess, declaringClass, name, arg), plugin); + plugins.register(plugin, declaringClass, name, arg); } /** @@ -100,7 +99,7 @@ * @param plugin the plugin to be registered */ public void register2(String name, Class<?> arg1, Class<?> arg2, InvocationPlugin plugin) { - plugins.register(arg1 == Receiver.class ? resolve(metaAccess, declaringClass, name, arg2) : resolve(metaAccess, declaringClass, name, arg1, arg2), plugin); + plugins.register(plugin, declaringClass, name, arg1, arg2); } /** @@ -110,7 +109,7 @@ * @param plugin the plugin to be registered */ public void register3(String name, Class<?> arg1, Class<?> arg2, Class<?> arg3, InvocationPlugin plugin) { - plugins.register(arg1 == Receiver.class ? resolve(metaAccess, declaringClass, name, arg2, arg3) : resolve(metaAccess, declaringClass, name, arg1, arg2, arg3), plugin); + plugins.register(plugin, declaringClass, name, arg1, arg2, arg3); } /** @@ -120,7 +119,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(arg1 == Receiver.class ? resolve(metaAccess, declaringClass, name, arg2, arg3, arg4) : resolve(metaAccess, declaringClass, name, arg1, arg2, arg3, arg4), plugin); + plugins.register(plugin, declaringClass, name, arg1, arg2, arg3, arg4); } /** @@ -130,37 +129,91 @@ * @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(arg1 == Receiver.class ? resolve(metaAccess, declaringClass, name, arg2, arg3, arg4, arg5) : resolve(metaAccess, declaringClass, name, arg1, arg2, arg3, arg4, arg5), - plugin); + plugins.register(plugin, declaringClass, name, arg1, arg2, arg3, arg4, arg5); + } + } + + public static final class MethodInfo { + public final boolean isStatic; + public final Class<?> declaringClass; + public final String name; + public final Class<?>[] argumentTypes; + + public MethodInfo(Class<?> declaringClass, String name, Class<?>... argumentTypes) { + this.isStatic = argumentTypes.length == 0 || argumentTypes[0] != Receiver.class; + this.declaringClass = declaringClass; + this.name = name; + this.argumentTypes = argumentTypes; } - /** - * Resolves a method given a declaring class, name and parameter types. - */ - public static ResolvedJavaMethod resolve(MetaAccessProvider metaAccess, Class<?> declaringClass, String name, Class<?>... parameterTypes) { + @Override + public boolean equals(Object obj) { + if (obj instanceof MethodInfo) { + MethodInfo that = (MethodInfo) obj; + boolean res = this.declaringClass == that.declaringClass && this.name.equals(that.name) && Arrays.equals(this.argumentTypes, that.argumentTypes); + assert !res || this.isStatic == that.isStatic; + return res; + } + return false; + } + + @Override + public int hashCode() { + // Replay compilation mandates use of stable hash codes + return declaringClass.getName().hashCode() ^ name.hashCode(); + } + + public ResolvedJavaMethod resolve(MetaAccessProvider metaAccess) { try { - return metaAccess.lookupJavaMethod(name.equals("<init>") ? declaringClass.getDeclaredConstructor(parameterTypes) : declaringClass.getDeclaredMethod(name, parameterTypes)); + Class<?>[] parameterTypes = isStatic ? argumentTypes : Arrays.copyOfRange(argumentTypes, 1, argumentTypes.length); + ResolvedJavaMethod resolved; + if (name.equals("<init>")) { + resolved = metaAccess.lookupJavaMethod(declaringClass.getDeclaredConstructor(parameterTypes)); + } else { + resolved = metaAccess.lookupJavaMethod(declaringClass.getDeclaredMethod(name, parameterTypes)); + } + assert resolved.isStatic() == isStatic; + return resolved; } catch (NoSuchMethodException | SecurityException e) { throw new GraalInternalError(e); } } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(declaringClass.getName()).append('.').append(name).append('('); + for (Class<?> p : argumentTypes) { + if (sb.charAt(sb.length() - 1) != '(') { + sb.append(", "); + } + sb.append(p.getSimpleName()); + } + return sb.append(')').toString(); + } } - private final Map<ResolvedJavaMethod, InvocationPlugin> plugins = new HashMap<>(); + protected final MetaAccessProvider metaAccess; + private final Map<MethodInfo, InvocationPlugin> registrations = new HashMap<>(); + private volatile Map<ResolvedJavaMethod, InvocationPlugin> plugins; /** * The invocation plugins deferred to if a plugin is not found in this object. */ private InvocationPlugins defaults; + public InvocationPlugins(MetaAccessProvider metaAccess) { + this.metaAccess = metaAccess; + } + /** * Registers an invocation plugin for a given method. There must be no plugin currently * registered for {@code method}. */ - public void register(ResolvedJavaMethod method, InvocationPlugin plugin) { + public void register(InvocationPlugin plugin, Class<?> declaringClass, String name, Class<?>... argumentTypes) { + MethodInfo method = new MethodInfo(declaringClass, name, argumentTypes); assert Checker.check(method, plugin); - GraphBuilderPlugin oldValue = plugins.put(method, plugin); - // System.out.println("registered: " + plugin); + assert plugins == null; + GraphBuilderPlugin oldValue = registrations.put(method, plugin); assert oldValue == null; } @@ -171,6 +224,16 @@ * @return the plugin associated with {@code method} or {@code null} if none exists */ public InvocationPlugin lookupInvocation(ResolvedJavaMethod method) { + if (plugins == null) { + synchronized (this) { + if (plugins == null) { + plugins = new HashMap<>(registrations.size()); + for (Map.Entry<MethodInfo, InvocationPlugin> e : registrations.entrySet()) { + plugins.put(e.getKey().resolve(metaAccess), e.getValue()); + } + } + } + } InvocationPlugin res = plugins.get(method); if (res == null && defaults != null) { return defaults.lookupInvocation(method); @@ -183,6 +246,7 @@ * plugin is not found in this object. */ public InvocationPlugins setDefaults(InvocationPlugins defaults) { + assert defaults != this.defaults; InvocationPlugins old = this.defaults; this.defaults = defaults; return old; @@ -192,7 +256,7 @@ * Adds all the plugins from {@code other} to this object. */ public void updateFrom(InvocationPlugins other) { - this.plugins.putAll(other.plugins); + this.registrations.putAll(other.registrations); if (other.defaults != null) { updateFrom(other.defaults); } @@ -200,7 +264,7 @@ @Override public String toString() { - return plugins.keySet().stream().map(m -> m.format("%H.%n(%p)")).collect(Collectors.joining(", ")) + " / defaults: " + this.defaults; + return registrations.keySet().stream().map(MethodInfo::toString).collect(Collectors.joining(", ")) + " / defaults: " + this.defaults; } private static class Checker { @@ -228,9 +292,9 @@ SIGS = sigs.toArray(new Class<?>[sigs.size()][]); } - public static boolean check(ResolvedJavaMethod method, InvocationPlugin plugin) { - int arguments = method.getSignature().getParameterCount(!method.isStatic()); - assert arguments < SIGS.length : format("need to extend %s to support method with %d arguments: %s", InvocationPlugin.class.getSimpleName(), arguments, method.format("%H.%n(%p)")); + public static boolean check(MethodInfo method, InvocationPlugin plugin) { + int arguments = method.argumentTypes.length; + assert arguments < SIGS.length : format("need to extend %s to support method with %d arguments: %s", InvocationPlugin.class.getSimpleName(), arguments, method); for (Method m : plugin.getClass().getDeclaredMethods()) { if (m.getName().equals("apply")) { Class<?>[] parameterTypes = m.getParameterTypes(); @@ -239,7 +303,11 @@ } } } - throw new AssertionError(format("graph builder plugin for %s not found", method.format("%H.%n(%p)"))); + throw new AssertionError(format("graph builder plugin for %s not found", method)); } } + + public MetaAccessProvider getMetaAccess() { + return metaAccess; + } }
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Thu Mar 12 17:13:29 2015 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Thu Mar 12 22:10:07 2015 +0100 @@ -641,7 +641,8 @@ graph.addAfterFixed(graph.start(), graph.add(new ReturnNode(null))); } else { GraphBuilderConfiguration config = GraphBuilderConfiguration.getSnippetDefault(); - Plugins plugins = config.getPlugins().updateFrom(replacements.graphBuilderPlugins, false); + Plugins plugins = new Plugins(metaAccess).updateFrom(replacements.graphBuilderPlugins, false); + config.setPlugins(plugins); plugins.getInvocationPlugins().setDefaults(replacements.graphBuilderPlugins.getInvocationPlugins()); if (args != null) { plugins.setParameterPlugin(new ConstantBindingParameterPlugin(args, plugins.getParameterPlugin(), metaAccess, replacements.snippetReflection));
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java Thu Mar 12 17:13:29 2015 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java Thu Mar 12 22:10:07 2015 +0100 @@ -34,8 +34,8 @@ import com.oracle.graal.graph.*; import com.oracle.graal.java.*; import com.oracle.graal.java.GraphBuilderPlugin.InvocationPlugin; +import com.oracle.graal.java.InvocationPlugins.Receiver; import com.oracle.graal.java.InvocationPlugins.Registration; -import com.oracle.graal.java.InvocationPlugins.Registration.Receiver; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.debug.*; @@ -57,29 +57,29 @@ // @formatter:on public static void registerInvocationPlugins(MetaAccessProvider metaAccess, Architecture arch, InvocationPlugins plugins, boolean useBoxingPlugins) { - registerObjectPlugins(metaAccess, plugins); - registerClassPlugins(metaAccess, plugins); - registerMathPlugins(metaAccess, arch, plugins); - registerUnsignedMathPlugins(metaAccess, plugins); - registerCharacterPlugins(metaAccess, plugins); - registerShortPlugins(metaAccess, plugins); - registerIntegerLongPlugins(metaAccess, plugins, Kind.Int); - registerIntegerLongPlugins(metaAccess, plugins, Kind.Long); - registerFloatPlugins(metaAccess, plugins); - registerDoublePlugins(metaAccess, plugins); - registerUnsafePlugins(metaAccess, arch, plugins); + registerObjectPlugins(plugins); + registerClassPlugins(plugins); + registerMathPlugins(arch, plugins); + registerUnsignedMathPlugins(plugins); + registerCharacterPlugins(plugins); + registerShortPlugins(plugins); + registerIntegerLongPlugins(plugins, Kind.Int); + registerIntegerLongPlugins(plugins, Kind.Long); + registerFloatPlugins(plugins); + registerDoublePlugins(plugins); + registerUnsafePlugins(arch, plugins); registerEdgesPlugins(metaAccess, plugins); - registerGraalDirectivesPlugins(metaAccess, plugins); + registerGraalDirectivesPlugins(plugins); if (useBoxingPlugins) { - registerBoxingPlugins(metaAccess, plugins); + registerBoxingPlugins(plugins); } if (Options.UseBlackholeSubstitution.getValue()) { - registerJMHBlackholePlugins(metaAccess, plugins); + registerJMHBlackholePlugins(plugins); } } - private static void registerUnsafePlugins(MetaAccessProvider metaAccess, Architecture arch, InvocationPlugins plugins) { - Registration r = new Registration(plugins, metaAccess, Unsafe.class); + private static void registerUnsafePlugins(Architecture arch, InvocationPlugins plugins) { + Registration r = new Registration(plugins, Unsafe.class); for (Kind kind : Kind.values()) { if ((kind.isPrimitive() && kind != Kind.Void) || kind == Kind.Object) { Class<?> javaClass = kind == Kind.Object ? Object.class : kind.toJavaClass(); @@ -141,10 +141,10 @@ return arch.getName().equals("AMD64"); } - private static void registerIntegerLongPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins, Kind kind) { + private static void registerIntegerLongPlugins(InvocationPlugins plugins, Kind kind) { Class<?> declaringClass = kind.toBoxedJavaClass(); Class<?> type = kind.toJavaClass(); - Registration r = new Registration(plugins, metaAccess, declaringClass); + Registration r = new Registration(plugins, declaringClass); r.register1("reverseBytes", type, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode value) { b.push(kind, b.append(new ReverseBytesNode(value).canonical(null, value))); @@ -171,8 +171,8 @@ }); } - private static void registerCharacterPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) { - Registration r = new Registration(plugins, metaAccess, Character.class); + private static void registerCharacterPlugins(InvocationPlugins plugins) { + Registration r = new Registration(plugins, Character.class); r.register1("reverseBytes", char.class, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode value) { // return (char) (Integer.reverse(i) >> 16); @@ -185,8 +185,8 @@ }); } - private static void registerShortPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) { - Registration r = new Registration(plugins, metaAccess, Short.class); + private static void registerShortPlugins(InvocationPlugins plugins) { + Registration r = new Registration(plugins, Short.class); r.register1("reverseBytes", short.class, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode value) { // return (short) (Integer.reverse(i) >> 16); @@ -199,8 +199,8 @@ }); } - private static void registerFloatPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) { - Registration r = new Registration(plugins, metaAccess, Float.class); + private static void registerFloatPlugins(InvocationPlugins plugins) { + Registration r = new Registration(plugins, Float.class); r.register1("floatToRawIntBits", float.class, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode value) { b.push(Kind.Int, b.append(new ReinterpretNode(Kind.Int, value).canonical(null, value))); @@ -215,8 +215,8 @@ }); } - private static void registerDoublePlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) { - Registration r = new Registration(plugins, metaAccess, Double.class); + private static void registerDoublePlugins(InvocationPlugins plugins) { + Registration r = new Registration(plugins, Double.class); r.register1("doubleToRawLongBits", double.class, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode value) { b.push(Kind.Long, b.append(new ReinterpretNode(Kind.Long, value).canonical(null, value))); @@ -231,8 +231,8 @@ }); } - private static void registerMathPlugins(MetaAccessProvider metaAccess, Architecture arch, InvocationPlugins plugins) { - Registration r = new Registration(plugins, metaAccess, Math.class); + private static void registerMathPlugins(Architecture arch, InvocationPlugins plugins) { + Registration r = new Registration(plugins, Math.class); r.register1("abs", Float.TYPE, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode value) { b.push(Kind.Float, b.append(new AbsNode(value).canonical(null, value))); @@ -297,8 +297,8 @@ } } - private static void registerUnsignedMathPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) { - Registration r = new Registration(plugins, metaAccess, UnsignedMath.class); + private static void registerUnsignedMathPlugins(InvocationPlugins plugins) { + Registration r = new Registration(plugins, UnsignedMath.class); r.register2("aboveThan", int.class, int.class, new UnsignedMathPlugin(Condition.AT)); r.register2("aboveThan", long.class, long.class, new UnsignedMathPlugin(Condition.AT)); r.register2("belowThan", int.class, int.class, new UnsignedMathPlugin(Condition.BT)); @@ -333,17 +333,17 @@ }); } - protected static void registerBoxingPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) { + protected static void registerBoxingPlugins(InvocationPlugins plugins) { for (Kind kind : Kind.values()) { if (kind.isPrimitive() && kind != Kind.Void) { - new BoxPlugin(kind).register(metaAccess, plugins); - new UnboxPlugin(kind).register(metaAccess, plugins); + new BoxPlugin(kind).register(plugins); + new UnboxPlugin(kind).register(plugins); } } } - private static void registerObjectPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) { - Registration r = new Registration(plugins, metaAccess, Object.class); + private static void registerObjectPlugins(InvocationPlugins plugins) { + Registration r = new Registration(plugins, Object.class); r.register1("<init>", Receiver.class, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode object) { if (RegisterFinalizerNode.mayHaveFinalizer(object, b.getAssumptions())) { @@ -354,8 +354,8 @@ }); } - private static void registerClassPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) { - Registration r = new Registration(plugins, metaAccess, Class.class); + private static void registerClassPlugins(InvocationPlugins plugins) { + Registration r = new Registration(plugins, Class.class); r.register2("isInstance", Receiver.class, Object.class, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode type, ValueNode object) { ValueNode nullCheckedType = nullCheckedValue(b, type); @@ -393,7 +393,7 @@ * project containing {@link Edges}. */ private static void registerEdgesPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) { - Registration r = new Registration(plugins, metaAccess, Edges.class); + Registration r = new Registration(plugins, Edges.class); for (Class<?> c : new Class<?>[]{Node.class, NodeList.class}) { r.register2("get" + c.getSimpleName() + "Unsafe", Node.class, long.class, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode node, ValueNode offset) { @@ -435,9 +435,8 @@ return true; } - void register(MetaAccessProvider metaAccess, InvocationPlugins plugins) { - ResolvedJavaMethod method = Registration.resolve(metaAccess, kind.toBoxedJavaClass(), "valueOf", kind.toJavaClass()); - plugins.register(method, this); + void register(InvocationPlugins plugins) { + plugins.register(this, kind.toBoxedJavaClass(), "valueOf", kind.toJavaClass()); } } @@ -463,10 +462,9 @@ return true; } - void register(MetaAccessProvider metaAccess, InvocationPlugins plugins) { + void register(InvocationPlugins plugins) { String name = kind.toJavaClass().getSimpleName() + "Value"; - ResolvedJavaMethod method = Registration.resolve(metaAccess, kind.toBoxedJavaClass(), name); - plugins.register(method, this); + plugins.register(this, kind.toBoxedJavaClass(), name, Receiver.class); } } @@ -524,8 +522,8 @@ } } - private static void registerGraalDirectivesPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) { - Registration r = new Registration(plugins, metaAccess, GraalDirectives.class); + private static void registerGraalDirectivesPlugins(InvocationPlugins plugins) { + Registration r = new Registration(plugins, GraalDirectives.class); r.register0("deoptimize", new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod) { b.append(new DeoptimizeNode(DeoptimizationAction.None, DeoptimizationReason.TransferToInterpreter)); @@ -584,7 +582,7 @@ } } - private static void registerJMHBlackholePlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) { + private static void registerJMHBlackholePlugins(InvocationPlugins plugins) { InvocationPlugin blackholePlugin = new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode blackhole, ValueNode value) { b.append(new BlackholeNode(value)); @@ -596,7 +594,7 @@ Class<?> blackholeClass; blackholeClass = ReplacementsImpl.resolveClass(name, true); if (blackholeClass != null) { - Registration r = new Registration(plugins, metaAccess, blackholeClass); + Registration r = new Registration(plugins, blackholeClass); for (Kind kind : Kind.values()) { if ((kind.isPrimitive() && kind != Kind.Void) || kind == Kind.Object) { Class<?> javaClass = kind == Kind.Object ? Object.class : kind.toJavaClass();
--- a/graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/HotSpotTruffleRuntime.java Thu Mar 12 17:13:29 2015 +0100 +++ b/graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/HotSpotTruffleRuntime.java Thu Mar 12 22:10:07 2015 +0100 @@ -44,6 +44,7 @@ import com.oracle.graal.hotspot.meta.*; import com.oracle.graal.hotspot.nodes.*; import com.oracle.graal.java.*; +import com.oracle.graal.java.GraphBuilderConfiguration.Plugins; import com.oracle.graal.lir.asm.*; import com.oracle.graal.lir.phases.*; import com.oracle.graal.nodes.*; @@ -192,7 +193,9 @@ LIRSuites lirSuites = suitesProvider.createLIRSuites(); removeInliningPhase(suites); StructuredGraph graph = new StructuredGraph(javaMethod, AllowAssumptions.NO); - new GraphBuilderPhase.Instance(metaAccess, providers.getStampProvider(), providers.getConstantReflection(), GraphBuilderConfiguration.getEagerDefault(), OptimisticOptimizations.ALL, null).apply(graph); + GraphBuilderConfiguration config = GraphBuilderConfiguration.getEagerDefault(); + config.setPlugins(new Plugins(metaAccess)); + new GraphBuilderPhase.Instance(metaAccess, providers.getStampProvider(), providers.getConstantReflection(), config, OptimisticOptimizations.ALL, null).apply(graph); PhaseSuite<HighTierContext> graphBuilderSuite = getGraphBuilderSuite(suitesProvider); CallingConvention cc = getCallingConvention(providers.getCodeCache(), Type.JavaCallee, graph.method(), false); Backend backend = Graal.getRequiredCapability(RuntimeProvider.class).getHostBackend();
--- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/ExactMathTest.java Thu Mar 12 17:13:29 2015 +0100 +++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/ExactMathTest.java Thu Mar 12 22:10:07 2015 +0100 @@ -33,7 +33,7 @@ @Override protected void editGraphBuilderPlugins(GraphBuilderConfiguration.Plugins plugins) { - TruffleGraphBuilderPlugins.registerExactMathPlugins(getMetaAccess(), plugins.getInvocationPlugins()); + TruffleGraphBuilderPlugins.registerExactMathPlugins(plugins.getInvocationPlugins()); super.editGraphBuilderPlugins(plugins); }
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerImpl.java Thu Mar 12 17:13:29 2015 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerImpl.java Thu Mar 12 22:10:07 2015 +0100 @@ -27,9 +27,9 @@ import java.util.*; -import com.oracle.graal.api.meta.Assumptions.Assumption; import com.oracle.graal.api.code.*; import com.oracle.graal.api.code.CallingConvention.Type; +import com.oracle.graal.api.meta.Assumptions.Assumption; import com.oracle.graal.api.meta.*; import com.oracle.graal.api.replacements.*; import com.oracle.graal.api.runtime.*; @@ -37,6 +37,7 @@ import com.oracle.graal.debug.*; import com.oracle.graal.debug.Debug.Scope; import com.oracle.graal.java.*; +import com.oracle.graal.java.GraphBuilderConfiguration.Plugins; import com.oracle.graal.lir.asm.*; import com.oracle.graal.lir.phases.*; import com.oracle.graal.nodes.*; @@ -91,6 +92,7 @@ GraphBuilderConfiguration eagerConfig = GraphBuilderConfiguration.getEagerDefault().withSkippedExceptionTypes(skippedExceptionTypes); this.config = GraphBuilderConfiguration.getDefault().withSkippedExceptionTypes(skippedExceptionTypes); + this.config.setPlugins(new Plugins(backendProviders.getMetaAccess())); if (TruffleCompilerOptions.FastPE.getValue()) { GraphBuilderPhase phase = (GraphBuilderPhase) backend.getSuites().getDefaultGraphBuilderSuite().findPhase(GraphBuilderPhase.class).previous(); this.config.getPlugins().getInvocationPlugins().setDefaults(phase.getGraphBuilderConfig().getPlugins().getInvocationPlugins());
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPlugins.java Thu Mar 12 17:13:29 2015 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPlugins.java Thu Mar 12 22:10:07 2015 +0100 @@ -34,7 +34,7 @@ import com.oracle.graal.java.*; import com.oracle.graal.java.GraphBuilderPlugin.InvocationPlugin; import com.oracle.graal.java.InvocationPlugins.Registration; -import com.oracle.graal.java.InvocationPlugins.Registration.Receiver; +import com.oracle.graal.java.InvocationPlugins.Receiver; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.extended.*; @@ -53,22 +53,22 @@ public class TruffleGraphBuilderPlugins { public static void registerInvocationPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) { - registerOptimizedAssumptionPlugins(metaAccess, plugins); - registerExactMathPlugins(metaAccess, plugins); - registerCompilerDirectivesPlugins(metaAccess, plugins); + registerOptimizedAssumptionPlugins(plugins); + registerExactMathPlugins(plugins); + registerCompilerDirectivesPlugins(plugins); registerOptimizedCallTargetPlugins(metaAccess, plugins); - registerUnsafeAccessImplPlugins(metaAccess, plugins); + registerUnsafeAccessImplPlugins(plugins); if (TruffleCompilerOptions.TruffleUseFrameWithoutBoxing.getValue()) { - registerFrameWithoutBoxingPlugins(metaAccess, plugins); + registerFrameWithoutBoxingPlugins(plugins); } else { - registerFrameWithBoxingPlugins(metaAccess, plugins); + registerFrameWithBoxingPlugins(plugins); } } - public static void registerOptimizedAssumptionPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) { - Registration r = new Registration(plugins, metaAccess, OptimizedAssumption.class); + public static void registerOptimizedAssumptionPlugins(InvocationPlugins plugins) { + Registration r = new Registration(plugins, OptimizedAssumption.class); r.register1("isValid", Receiver.class, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode arg) { if (arg.isConstant()) { @@ -86,8 +86,8 @@ }); } - public static void registerExactMathPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) { - Registration r = new Registration(plugins, metaAccess, ExactMath.class); + public static void registerExactMathPlugins(InvocationPlugins plugins) { + Registration r = new Registration(plugins, ExactMath.class); for (Kind kind : new Kind[]{Kind.Int, Kind.Long}) { Class<?> type = kind.toJavaClass(); r.register2("addExact", type, type, new InvocationPlugin() { @@ -123,8 +123,8 @@ } } - public static void registerCompilerDirectivesPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) { - Registration r = new Registration(plugins, metaAccess, CompilerDirectives.class); + public static void registerCompilerDirectivesPlugins(InvocationPlugins plugins) { + Registration r = new Registration(plugins, CompilerDirectives.class); r.register0("inInterpreter", new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod) { b.push(Kind.Boolean.getStackKind(), b.append(ConstantNode.forBoolean(false))); @@ -190,7 +190,7 @@ } }); - r = new Registration(plugins, metaAccess, CompilerAsserts.class); + r = new Registration(plugins, CompilerAsserts.class); r.register1("partialEvaluationConstant", Object.class, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode value) { ValueNode curValue = value; @@ -229,7 +229,7 @@ } public static void registerOptimizedCallTargetPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) { - Registration r = new Registration(plugins, metaAccess, OptimizedCallTarget.class); + Registration r = new Registration(plugins, OptimizedCallTarget.class); r.register2("createFrame", FrameDescriptor.class, Object[].class, new InvocationPlugin() { public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode descriptor, ValueNode args) { Class<?> frameClass = TruffleCompilerOptions.TruffleUseFrameWithoutBoxing.getValue() ? FrameWithoutBoxing.class : FrameWithBoxing.class; @@ -245,21 +245,21 @@ }); } - public static void registerFrameWithoutBoxingPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) { - Registration r = new Registration(plugins, metaAccess, FrameWithoutBoxing.class); + public static void registerFrameWithoutBoxingPlugins(InvocationPlugins plugins) { + Registration r = new Registration(plugins, FrameWithoutBoxing.class); registerMaterialize(r); registerUnsafeCast(r); registerUnsafeLoadStorePlugins(r, Kind.Int, Kind.Long, Kind.Float, Kind.Double, Kind.Object); } - public static void registerFrameWithBoxingPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) { - Registration r = new Registration(plugins, metaAccess, FrameWithBoxing.class); + public static void registerFrameWithBoxingPlugins(InvocationPlugins plugins) { + Registration r = new Registration(plugins, FrameWithBoxing.class); registerMaterialize(r); registerUnsafeCast(r); } - public static void registerUnsafeAccessImplPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) { - Registration r = new Registration(plugins, metaAccess, UnsafeAccessImpl.class); + public static void registerUnsafeAccessImplPlugins(InvocationPlugins plugins) { + Registration r = new Registration(plugins, UnsafeAccessImpl.class); registerUnsafeCast(r); registerUnsafeLoadStorePlugins(r, Kind.Boolean, Kind.Byte, Kind.Int, Kind.Short, Kind.Long, Kind.Float, Kind.Double, Kind.Object); }