Search in sources :

Example 6 with SharedMethod

use of com.oracle.svm.core.meta.SharedMethod in project graal by oracle.

the class FrameInfoVerifier method addFrame.

private FrameInfoQueryResult addFrame(FrameData data, BytecodeFrame frame, boolean isDeoptEntry, boolean needLocalValues) {
    FrameInfoQueryResult result = new FrameInfoQueryResult();
    if (frame.caller() != null) {
        assert !isDeoptEntry : "Deoptimization entry point information for caller frames is not encoded";
        result.caller = addFrame(data, frame.caller(), false, needLocalValues);
    }
    result.virtualObjects = data.virtualObjects;
    result.encodedBci = encodeBci(frame.getBCI(), frame.duringCall, frame.rethrowException);
    result.isDeoptEntry = isDeoptEntry;
    result.needLocalValues = needLocalValues;
    SharedMethod method = (SharedMethod) frame.getMethod();
    if (customization.shouldStoreMethod()) {
        result.deoptMethod = method;
        objectConstants.addObject(SubstrateObjectConstant.forObject(method));
    }
    result.deoptMethodOffset = method.getDeoptOffsetInImage();
    result.numLocals = frame.numLocals;
    result.numStack = frame.numStack;
    result.numLocks = frame.numLocks;
    ValueInfo[] valueInfos = null;
    if (needLocalValues) {
        JavaValue[] values = frame.values;
        int numValues = 0;
        for (int i = values.length; --i >= 0; ) {
            if (!ValueUtil.isIllegalJavaValue(values[i])) {
                // Found the last non-illegal value, i.e., the last value we have to encode.
                numValues = i + 1;
                break;
            }
        }
        valueInfos = new ValueInfo[numValues];
        for (int i = 0; i < numValues; i++) {
            valueInfos[i] = makeValueInfo(data, getFrameValueKind(frame, i), values[i]);
        }
    }
    result.valueInfos = valueInfos;
    ImageSingletons.lookup(Counters.class).frameCount.inc();
    return result;
}
Also used : ValueInfo(com.oracle.svm.core.code.FrameInfoQueryResult.ValueInfo) JavaValue(jdk.vm.ci.meta.JavaValue) SharedMethod(com.oracle.svm.core.meta.SharedMethod) Infopoint(jdk.vm.ci.code.site.Infopoint)

Example 7 with SharedMethod

use of com.oracle.svm.core.meta.SharedMethod in project graal by oracle.

the class SubstrateGraphBuilderPlugins method registerKnownIntrinsicsPlugins.

private static void registerKnownIntrinsicsPlugins(InvocationPlugins plugins, boolean analysis) {
    Registration r = new Registration(plugins, KnownIntrinsics.class);
    r.register0("heapBase", new InvocationPlugin() {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) {
            b.addPush(JavaKind.Object, ReadRegisterFixedNode.forHeapBase());
            return true;
        }
    });
    r.register1("readArrayLength", Object.class, new InvocationPlugin() {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode array) {
            b.addPush(JavaKind.Int, new ArrayLengthNode(array));
            return true;
        }
    });
    r.register1("readHub", Object.class, new InvocationPlugin() {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode object) {
            ValueNode nonNullObject = b.nullCheckedValue(object);
            b.addPush(JavaKind.Object, new LoadHubNode(b.getStampProvider(), nonNullObject));
            return true;
        }
    });
    r.register3("formatObject", Pointer.class, Class.class, boolean.class, new InvocationPlugin() {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode memory, ValueNode hub, ValueNode rememberedSet) {
            b.addPush(JavaKind.Object, new FormatObjectNode(memory, hub, rememberedSet));
            return true;
        }
    });
    r.register5("formatArray", Pointer.class, Class.class, int.class, boolean.class, boolean.class, new InvocationPlugin() {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode memory, ValueNode hub, ValueNode length, ValueNode rememberedSet, ValueNode unaligned) {
            b.addPush(JavaKind.Object, new FormatArrayNode(memory, hub, length, rememberedSet, unaligned));
            return true;
        }
    });
    r.register2("unsafeCast", Object.class, Class.class, new InvocationPlugin() {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode object, ValueNode toTypeNode) {
            /*
                 * We need to make sure that the updated type information does not flow up, because
                 * it can depend on any condition before (and we do not know which condition, so we
                 * cannot anchor at a particular block).
                 */
            ResolvedJavaType toType = typeValue(b.getConstantReflection(), b, targetMethod, toTypeNode, "toType");
            TypeReference toTypeRef = TypeReference.createTrustedWithoutAssumptions(toType);
            b.addPush(JavaKind.Object, new FixedValueAnchorNode(object, StampFactory.object(toTypeRef)));
            return true;
        }
    });
    r.register1("nonNullPointer", Pointer.class, new InvocationPlugin() {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode object) {
            b.addPush(JavaKind.Object, new PiNode(object, nonZeroWord()));
            return true;
        }
    });
    r.register0("readStackPointer", new InvocationPlugin() {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) {
            b.addPush(JavaKind.Object, new ReadStackPointerNode());
            return true;
        }
    });
    r.register1("writeStackPointer", Pointer.class, new InvocationPlugin() {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode value) {
            b.add(new WriteStackPointerNode(value));
            return true;
        }
    });
    r.register0("readInstructionPointer", new InvocationPlugin() {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) {
            b.addPush(JavaKind.Object, new ReadInstructionPointerNode());
            return true;
        }
    });
    r.register0("readCallerStackPointer", new InvocationPlugin() {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) {
            b.addPush(JavaKind.Object, new ReadCallerStackPointerNode());
            return true;
        }
    });
    r.register0("readReturnAddress", new InvocationPlugin() {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) {
            b.addPush(JavaKind.Object, new ReadReturnAddressNode());
            return true;
        }
    });
    r.register3("farReturn", Object.class, Pointer.class, CodePointer.class, new InvocationPlugin() {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode result, ValueNode sp, ValueNode ip) {
            b.add(new FarReturnNode(result, sp, ip));
            return true;
        }
    });
    r.register0("testDeoptimize", new InvocationPlugin() {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) {
            b.add(new TestDeoptimizeNode());
            return true;
        }
    });
    r.register0("isDeoptimizationTarget", new InvocationPlugin() {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) {
            if (b.getGraph().method() instanceof SharedMethod) {
                SharedMethod method = (SharedMethod) b.getGraph().method();
                if (method.isDeoptTarget()) {
                    b.addPush(JavaKind.Boolean, ConstantNode.forBoolean(true));
                } else {
                    b.addPush(JavaKind.Boolean, ConstantNode.forBoolean(false));
                }
            } else {
                // In analysis the value is always true.
                b.addPush(JavaKind.Boolean, ConstantNode.forBoolean(true));
            }
            return true;
        }
    });
    r.register2("convertUnknownValue", Object.class, Class.class, new InvocationPlugin() {

        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode object, ValueNode typeNode) {
            ResolvedJavaType type = typeValue(b.getConstantReflection(), b, targetMethod, typeNode, "type");
            TypeReference typeRef = TypeReference.createTrustedWithoutAssumptions(type);
            Stamp stamp = StampFactory.object(typeRef);
            if (analysis) {
                b.addPush(JavaKind.Object, new ConvertUnknownValueNode(object, stamp));
            } else {
                b.addPush(JavaKind.Object, PiNode.create(object, stamp));
            }
            return true;
        }
    });
}
Also used : FixedValueAnchorNode(org.graalvm.compiler.nodes.extended.FixedValueAnchorNode) TestDeoptimizeNode(com.oracle.svm.core.graal.nodes.TestDeoptimizeNode) DynamicPiNode(org.graalvm.compiler.nodes.DynamicPiNode) PiNode(org.graalvm.compiler.nodes.PiNode) ConvertUnknownValueNode(com.oracle.graal.pointsto.nodes.ConvertUnknownValueNode) ResolvedJavaType(jdk.vm.ci.meta.ResolvedJavaType) Registration(org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Registration) FarReturnNode(com.oracle.svm.core.graal.nodes.FarReturnNode) InvocationPlugin(org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin) ReadStackPointerNode(com.oracle.svm.core.graal.nodes.ReadStackPointerNode) TypeReference(org.graalvm.compiler.core.common.type.TypeReference) ArrayLengthNode(org.graalvm.compiler.nodes.java.ArrayLengthNode) ReadCallerStackPointerNode(com.oracle.svm.core.graal.nodes.ReadCallerStackPointerNode) WriteStackPointerNode(com.oracle.svm.core.graal.nodes.WriteStackPointerNode) LoadHubNode(org.graalvm.compiler.nodes.extended.LoadHubNode) Stamp(org.graalvm.compiler.core.common.type.Stamp) IntegerStamp(org.graalvm.compiler.core.common.type.IntegerStamp) Receiver(org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin.Receiver) ReadInstructionPointerNode(com.oracle.svm.core.graal.nodes.ReadInstructionPointerNode) ReadReturnAddressNode(com.oracle.svm.core.graal.nodes.ReadReturnAddressNode) FormatObjectNode(com.oracle.svm.core.graal.nodes.FormatObjectNode) FormatArrayNode(com.oracle.svm.core.graal.nodes.FormatArrayNode) GraphBuilderContext(org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext) StackValueNode(com.oracle.svm.core.graal.stackvalue.StackValueNode) ValueNode(org.graalvm.compiler.nodes.ValueNode) ConvertUnknownValueNode(com.oracle.graal.pointsto.nodes.ConvertUnknownValueNode) SharedMethod(com.oracle.svm.core.meta.SharedMethod) ResolvedJavaMethod(jdk.vm.ci.meta.ResolvedJavaMethod)

Example 8 with SharedMethod

use of com.oracle.svm.core.meta.SharedMethod in project graal by oracle.

the class SubstrateAMD64Backend method newLIRGenerationResult.

@Override
public LIRGenerationResult newLIRGenerationResult(CompilationIdentifier compilationId, LIR lir, FrameMapBuilder frameMapBuilder, StructuredGraph graph, Object stub) {
    SharedMethod method = (SharedMethod) graph.method();
    CallingConvention callingConvention = CodeUtil.getCallingConvention(getCodeCache(), method.isEntryPoint() ? SubstrateCallingConventionType.NativeCallee : SubstrateCallingConventionType.JavaCallee, method, this);
    return new SubstrateLIRGenerationResult(compilationId, lir, frameMapBuilder, callingConvention, method);
}
Also used : CallingConvention(jdk.vm.ci.code.CallingConvention) SharedMethod(com.oracle.svm.core.meta.SharedMethod)

Example 9 with SharedMethod

use of com.oracle.svm.core.meta.SharedMethod in project graal by oracle.

the class SubstrateAMD64Backend method createMoveFactory.

protected AMD64MoveFactoryBase createMoveFactory(LIRGenerationResult lirGenRes, BackupSlotProvider backupSlotProvider) {
    SharedMethod method = ((SubstrateLIRGenerationResult) lirGenRes).getMethod();
    SubstrateAMD64RegisterConfig registerConfig = (SubstrateAMD64RegisterConfig) lirGenRes.getRegisterConfig();
    return new SubstrateAMD64MoveFactory(backupSlotProvider, method, createLirKindTool(), registerConfig);
}
Also used : SharedMethod(com.oracle.svm.core.meta.SharedMethod)

Example 10 with SharedMethod

use of com.oracle.svm.core.meta.SharedMethod in project graal by oracle.

the class MethodSafepointInsertionPhase method run.

@Override
protected void run(StructuredGraph graph) {
    if (graph.method().getAnnotation(Uninterruptible.class) != null) {
        /*
             * If a method is annotated with {@link Uninterruptible}, then I do not want a test for
             * a safepoint at the return.
             */
        return;
    }
    if (graph.method().getAnnotation(CFunction.class) != null) {
        /*
             * If a method transfers from Java to C, then the return transition (if any) contains
             * the safepoint test and one is not needed at the return of the transferring method.
             */
        return;
    }
    if (((SharedMethod) graph.method()).isEntryPoint()) {
        /*
             * If a method is transferring from C to Java, then no safepoint test is needed at the
             * return of the transferring method.
             */
        return;
    }
    for (ReturnNode returnNode : graph.getNodes(ReturnNode.TYPE)) {
        SafepointNode safepointNode = graph.add(new SafepointNode());
        graph.addBeforeFixed(returnNode, safepointNode);
    }
}
Also used : ReturnNode(org.graalvm.compiler.nodes.ReturnNode) Uninterruptible(com.oracle.svm.core.annotate.Uninterruptible) SafepointNode(org.graalvm.compiler.nodes.SafepointNode) CFunction(org.graalvm.nativeimage.c.function.CFunction) SharedMethod(com.oracle.svm.core.meta.SharedMethod)

Aggregations

SharedMethod (com.oracle.svm.core.meta.SharedMethod)10 ValueNode (org.graalvm.compiler.nodes.ValueNode)2 ConvertUnknownValueNode (com.oracle.graal.pointsto.nodes.ConvertUnknownValueNode)1 Uninterruptible (com.oracle.svm.core.annotate.Uninterruptible)1 FrameInfoQueryResult (com.oracle.svm.core.code.FrameInfoQueryResult)1 ValueInfo (com.oracle.svm.core.code.FrameInfoQueryResult.ValueInfo)1 VirtualFrame (com.oracle.svm.core.deopt.DeoptimizedFrame.VirtualFrame)1 Deoptimizer (com.oracle.svm.core.deopt.Deoptimizer)1 SubstrateInstalledCode (com.oracle.svm.core.deopt.SubstrateInstalledCode)1 SubstrateDataBuilder (com.oracle.svm.core.graal.code.SubstrateDataBuilder)1 CGlobalDataLoadAddressNode (com.oracle.svm.core.graal.nodes.CGlobalDataLoadAddressNode)1 FarReturnNode (com.oracle.svm.core.graal.nodes.FarReturnNode)1 FormatArrayNode (com.oracle.svm.core.graal.nodes.FormatArrayNode)1 FormatObjectNode (com.oracle.svm.core.graal.nodes.FormatObjectNode)1 ReadCallerStackPointerNode (com.oracle.svm.core.graal.nodes.ReadCallerStackPointerNode)1 ReadInstructionPointerNode (com.oracle.svm.core.graal.nodes.ReadInstructionPointerNode)1 ReadReturnAddressNode (com.oracle.svm.core.graal.nodes.ReadReturnAddressNode)1 ReadStackPointerNode (com.oracle.svm.core.graal.nodes.ReadStackPointerNode)1 TestDeoptimizeNode (com.oracle.svm.core.graal.nodes.TestDeoptimizeNode)1 WriteStackPointerNode (com.oracle.svm.core.graal.nodes.WriteStackPointerNode)1