Search in sources :

Example 1 with RegisterFinalizerNode

use of org.graalvm.compiler.nodes.java.RegisterFinalizerNode in project graal by oracle.

the class StandardGraphBuilderPlugins method registerObjectPlugins.

private static void registerObjectPlugins(InvocationPlugins plugins) {
    Registration r = new Registration(plugins, Object.class);
    r.register1("<init>", Receiver.class, new InvocationPlugin() {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) {
            /*
                 * Object.<init> is a common instrumentation point so only perform this rewrite if
                 * the current definition is the normal empty method with a single return bytecode.
                 * The finalizer registration will instead be performed by the BytecodeParser.
                 */
            if (targetMethod.getCodeSize() == 1) {
                ValueNode object = receiver.get();
                if (RegisterFinalizerNode.mayHaveFinalizer(object, b.getAssumptions())) {
                    b.add(new RegisterFinalizerNode(object));
                }
                return true;
            }
            return false;
        }
    });
    r.register1("getClass", Receiver.class, new InvocationPlugin() {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) {
            ValueNode object = receiver.get();
            ValueNode folded = GetClassNode.tryFold(b.getMetaAccess(), b.getConstantReflection(), NodeView.DEFAULT, GraphUtil.originalValue(object));
            if (folded != null) {
                b.addPush(JavaKind.Object, folded);
            } else {
                Stamp stamp = StampFactory.objectNonNull(TypeReference.createTrusted(b.getAssumptions(), b.getMetaAccess().lookupJavaType(Class.class)));
                b.addPush(JavaKind.Object, new GetClassNode(stamp, object));
            }
            return true;
        }
    });
}
Also used : ObjectStamp(org.graalvm.compiler.core.common.type.ObjectStamp) Stamp(org.graalvm.compiler.core.common.type.Stamp) GraphBuilderContext(org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext) Registration(org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Registration) GetClassNode(org.graalvm.compiler.nodes.extended.GetClassNode) ValueNode(org.graalvm.compiler.nodes.ValueNode) InvocationPlugin(org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin) Receiver(org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin.Receiver) RegisterFinalizerNode(org.graalvm.compiler.nodes.java.RegisterFinalizerNode) ResolvedJavaMethod(jdk.vm.ci.meta.ResolvedJavaMethod)

Example 2 with RegisterFinalizerNode

use of org.graalvm.compiler.nodes.java.RegisterFinalizerNode in project graal by oracle.

the class BytecodeParser method beforeReturn.

private void beforeReturn(ValueNode x, JavaKind kind) {
    if (graph.method() != null && graph.method().isJavaLangObjectInit()) {
        /*
             * Get the receiver from the initial state since bytecode rewriting could do arbitrary
             * things to the state of the locals.
             */
        ValueNode receiver = graph.start().stateAfter().localAt(0);
        assert receiver != null && receiver.getStackKind() == JavaKind.Object;
        if (RegisterFinalizerNode.mayHaveFinalizer(receiver, graph.getAssumptions())) {
            append(new RegisterFinalizerNode(receiver));
        }
    }
    genInfoPointNode(InfopointReason.METHOD_END, x);
    if (finalBarrierRequired) {
        assert originalReceiver != null;
        /*
             * When compiling an OSR with a final field store, don't bother tracking the original
             * receiver since the receiver cannot be EA'ed.
             */
        append(new FinalFieldBarrierNode(entryBCI == INVOCATION_ENTRY_BCI ? originalReceiver : null));
    }
    synchronizedEpilogue(BytecodeFrame.AFTER_BCI, x, kind);
}
Also used : FinalFieldBarrierNode(org.graalvm.compiler.nodes.java.FinalFieldBarrierNode) ValueNode(org.graalvm.compiler.nodes.ValueNode) RegisterFinalizerNode(org.graalvm.compiler.nodes.java.RegisterFinalizerNode)

Aggregations

ValueNode (org.graalvm.compiler.nodes.ValueNode)2 RegisterFinalizerNode (org.graalvm.compiler.nodes.java.RegisterFinalizerNode)2 ResolvedJavaMethod (jdk.vm.ci.meta.ResolvedJavaMethod)1 ObjectStamp (org.graalvm.compiler.core.common.type.ObjectStamp)1 Stamp (org.graalvm.compiler.core.common.type.Stamp)1 GetClassNode (org.graalvm.compiler.nodes.extended.GetClassNode)1 GraphBuilderContext (org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext)1 InvocationPlugin (org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin)1 Receiver (org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin.Receiver)1 Registration (org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Registration)1 FinalFieldBarrierNode (org.graalvm.compiler.nodes.java.FinalFieldBarrierNode)1