Search in sources :

Example 16 with InvokeNode

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

the class CInterfaceEnumTool method replaceEnumValueInvoke.

boolean replaceEnumValueInvoke(BytecodeParser p, EnumInfo enumInfo, ResolvedJavaMethod method, ValueNode[] args) {
    ResolvedJavaMethod valueMethod = getValueMethodForKind(method.getSignature().getReturnKind());
    JavaType originalReturnType = method.getSignature().getReturnType(null);
    assert args.length == 1;
    InvokeNode invoke = invokeEnumValue(p, CallTargetFactory.from(p), p.getFrameStateBuilder(), p.bci(), enumInfo, valueMethod, args[0]);
    ValueNode adapted = CInterfaceInvocationPlugin.adaptPrimitiveType(p.getGraph(), invoke, invoke.stamp(NodeView.DEFAULT).getStackKind(), originalReturnType.getJavaKind(), false);
    Stamp originalStamp = p.getInvokeReturnStamp(null).getTrustedStamp();
    adapted = CInterfaceInvocationPlugin.adaptPrimitiveType(p.getGraph(), adapted, originalReturnType.getJavaKind(), originalStamp.getStackKind(), false);
    p.push(CInterfaceInvocationPlugin.pushKind(method), adapted);
    return true;
}
Also used : ResolvedJavaType(jdk.vm.ci.meta.ResolvedJavaType) JavaType(jdk.vm.ci.meta.JavaType) ObjectStamp(org.graalvm.compiler.core.common.type.ObjectStamp) Stamp(org.graalvm.compiler.core.common.type.Stamp) InvokeNode(org.graalvm.compiler.nodes.InvokeNode) ValueNode(org.graalvm.compiler.nodes.ValueNode) ResolvedJavaMethod(jdk.vm.ci.meta.ResolvedJavaMethod)

Example 17 with InvokeNode

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

the class CInterfaceEnumTool method invokeEnumLookup.

private InvokeNode invokeEnumLookup(GraphBuilderTool b, CallTargetFactory callTargetFactory, FrameStateBuilder frameState, int bci, EnumInfo enumInfo, JavaKind parameterKind, ValueNode arg) {
    ValueNode[] args = new ValueNode[2];
    args[0] = ConstantNode.forConstant(snippetReflection.forObject(enumInfo.getRuntimeData()), b.getMetaAccess(), b.getGraph());
    assert !Modifier.isStatic(convertCToJavaMethod.getModifiers()) && convertCToJavaMethod.getSignature().getParameterCount(false) == 1;
    JavaKind expectedKind = convertCToJavaMethod.getSignature().getParameterType(0, null).getJavaKind();
    args[1] = CInterfaceInvocationPlugin.adaptPrimitiveType(b.getGraph(), arg, parameterKind, expectedKind, false);
    ResolvedJavaType convertReturnType = (ResolvedJavaType) convertCToJavaMethod.getSignature().getReturnType(null);
    StampPair returnStamp = StampFactory.forDeclaredType(null, convertReturnType, false);
    MethodCallTargetNode callTargetNode = b.append(callTargetFactory.createMethodCallTarget(InvokeKind.Virtual, convertCToJavaMethod, args, returnStamp, bci));
    Stamp invokeStamp = StampFactory.object(TypeReference.createWithoutAssumptions(convertReturnType));
    InvokeNode invoke = b.append(new InvokeNode(callTargetNode, bci, invokeStamp));
    frameState.push(convertReturnType.getJavaKind(), invoke);
    FrameState stateWithInvoke = frameState.create(bci, invoke);
    frameState.pop(convertReturnType.getJavaKind());
    invoke.setStateAfter(stateWithInvoke);
    return invoke;
}
Also used : MethodCallTargetNode(org.graalvm.compiler.nodes.java.MethodCallTargetNode) ObjectStamp(org.graalvm.compiler.core.common.type.ObjectStamp) Stamp(org.graalvm.compiler.core.common.type.Stamp) ValueNode(org.graalvm.compiler.nodes.ValueNode) StampPair(org.graalvm.compiler.core.common.type.StampPair) InvokeNode(org.graalvm.compiler.nodes.InvokeNode) FrameState(org.graalvm.compiler.nodes.FrameState) ResolvedJavaType(jdk.vm.ci.meta.ResolvedJavaType) JavaKind(jdk.vm.ci.meta.JavaKind)

Example 18 with InvokeNode

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

the class CInterfaceEnumTool method replaceEnumLookupInvoke.

boolean replaceEnumLookupInvoke(BytecodeParser p, EnumInfo enumInfo, ResolvedJavaMethod method, ValueNode[] args) {
    assert Modifier.isStatic(method.getModifiers()) && method.getSignature().getParameterCount(false) == 1;
    assert args.length == 1;
    JavaKind methodParameterKind = method.getSignature().getParameterType(0, null).getJavaKind();
    InvokeNode invokeNode = invokeEnumLookup(p, CallTargetFactory.from(p), p.getFrameStateBuilder(), p.bci(), enumInfo, methodParameterKind, args[0]);
    Stamp returnStamp = p.getInvokeReturnStamp(null).getTrustedStamp();
    assert returnStamp.getStackKind() == JavaKind.Object && invokeNode.stamp(NodeView.DEFAULT).getStackKind() == JavaKind.Object;
    assert StampTool.typeOrNull(invokeNode.stamp(NodeView.DEFAULT)).isAssignableFrom(StampTool.typeOrNull(returnStamp));
    ValueNode adapted = p.getGraph().unique(new PiNode(invokeNode, returnStamp));
    p.push(CInterfaceInvocationPlugin.pushKind(method), adapted);
    return true;
}
Also used : ObjectStamp(org.graalvm.compiler.core.common.type.ObjectStamp) Stamp(org.graalvm.compiler.core.common.type.Stamp) InvokeNode(org.graalvm.compiler.nodes.InvokeNode) ValueNode(org.graalvm.compiler.nodes.ValueNode) PiNode(org.graalvm.compiler.nodes.PiNode) JavaKind(jdk.vm.ci.meta.JavaKind)

Example 19 with InvokeNode

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

the class CInterfaceInvocationPlugin method replaceFunctionPointerInvoke.

private boolean replaceFunctionPointerInvoke(GraphBuilderContext b, ResolvedJavaMethod method, ValueNode[] args, CallingConvention.Type callType) {
    if (!functionPointerType.isAssignableFrom(method.getDeclaringClass())) {
        throw UserError.abort(new CInterfaceError("function pointer invocation method " + method.format("%H.%n(%p)") + " must be in a type that extends " + CFunctionPointer.class.getSimpleName(), method).getMessage());
    }
    assert b.getInvokeKind() == InvokeKind.Interface;
    JavaType[] parameterTypes = method.getSignature().toParameterTypes(null);
    if (callType == SubstrateCallingConventionType.NativeCall) {
        Predicate<JavaType> isValid = t -> t.getJavaKind().isPrimitive() || wordTypes.isWord(t);
        UserError.guarantee(Stream.of(parameterTypes).allMatch(isValid) && isValid.test(method.getSignature().getReturnType(null)), "C function pointer invocation method must have only primitive types or word types for its parameters and return value: " + method.format("%H.%n(%p)"));
    /*
             * We currently do not support automatic conversions for @CEnum because it entails
             * introducing additional invokes without real BCIs in a BytecodeParser context, which
             * does not work too well.
             */
    }
    // We "discard" the receiver from the signature by pretending we are a static method
    assert args.length >= 1;
    ValueNode methodAddress = args[0];
    ValueNode[] argsWithoutReceiver = Arrays.copyOfRange(args, 1, args.length);
    assert argsWithoutReceiver.length == parameterTypes.length;
    Stamp returnStamp;
    if (wordTypes.isWord(b.getInvokeReturnType())) {
        returnStamp = wordTypes.getWordStamp((ResolvedJavaType) b.getInvokeReturnType());
    } else {
        returnStamp = b.getInvokeReturnStamp(null).getTrustedStamp();
    }
    CallTargetNode indirectCallTargetNode = b.add(new IndirectCallTargetNode(methodAddress, argsWithoutReceiver, StampPair.createSingle(returnStamp), parameterTypes, method, callType, InvokeKind.Static));
    if (callType == SubstrateCallingConventionType.JavaCall) {
        b.handleReplacedInvoke(indirectCallTargetNode, b.getInvokeReturnType().getJavaKind());
    } else if (callType == SubstrateCallingConventionType.NativeCall) {
        // Native code cannot throw exceptions, omit exception edge
        InvokeNode invokeNode = new InvokeNode(indirectCallTargetNode, b.bci());
        if (pushKind(method) != JavaKind.Void) {
            b.addPush(pushKind(method), invokeNode);
        } else {
            b.add(invokeNode);
        }
    } else {
        throw shouldNotReachHere("Unsupported type of call: " + callType);
    }
    return true;
}
Also used : Arrays(java.util.Arrays) ResolvedJavaType(jdk.vm.ci.meta.ResolvedJavaType) LocationIdentity(org.graalvm.word.LocationIdentity) NodePlugin(org.graalvm.compiler.nodes.graphbuilderconf.NodePlugin) OffsetAddressNode(org.graalvm.compiler.nodes.memory.address.OffsetAddressNode) WordTypes(org.graalvm.compiler.word.WordTypes) AccessorInfo(com.oracle.svm.hosted.c.info.AccessorInfo) NarrowNode(org.graalvm.compiler.nodes.calc.NarrowNode) StampFactory(org.graalvm.compiler.core.common.type.StampFactory) NativeLibraries(com.oracle.svm.hosted.c.NativeLibraries) JavaKind(jdk.vm.ci.meta.JavaKind) AndNode(org.graalvm.compiler.nodes.calc.AndNode) InvokeJavaFunctionPointer(com.oracle.svm.core.annotate.InvokeJavaFunctionPointer) StructFieldInfo(com.oracle.svm.hosted.c.info.StructFieldInfo) UserError(com.oracle.svm.core.util.UserError) StructBitfieldInfo(com.oracle.svm.hosted.c.info.StructBitfieldInfo) SignExtendNode(org.graalvm.compiler.nodes.calc.SignExtendNode) CInterfaceError(com.oracle.svm.hosted.c.CInterfaceError) FloatConvertNode(org.graalvm.compiler.nodes.calc.FloatConvertNode) ZeroExtendNode(org.graalvm.compiler.nodes.calc.ZeroExtendNode) InvokeCFunctionPointer(org.graalvm.nativeimage.c.function.InvokeCFunctionPointer) EnumInfo(com.oracle.svm.hosted.c.info.EnumInfo) CallTargetNode(org.graalvm.compiler.nodes.CallTargetNode) SizableInfo(com.oracle.svm.hosted.c.info.SizableInfo) ElementInfo(com.oracle.svm.hosted.c.info.ElementInfo) Predicate(java.util.function.Predicate) OrNode(org.graalvm.compiler.nodes.calc.OrNode) FrameAccess(com.oracle.svm.core.amd64.FrameAccess) CInterfaceWriteNode(com.oracle.svm.core.graal.nodes.CInterfaceWriteNode) Stamp(org.graalvm.compiler.core.common.type.Stamp) LogicNode(org.graalvm.compiler.nodes.LogicNode) ValueNode(org.graalvm.compiler.nodes.ValueNode) JavaType(jdk.vm.ci.meta.JavaType) Stream(java.util.stream.Stream) SnippetReflectionProvider(org.graalvm.compiler.api.replacements.SnippetReflectionProvider) GraphBuilderContext(org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext) CFunctionPointer(org.graalvm.nativeimage.c.function.CFunctionPointer) StructInfo(com.oracle.svm.hosted.c.info.StructInfo) MulNode(org.graalvm.compiler.nodes.calc.MulNode) MetaAccessProvider(jdk.vm.ci.meta.MetaAccessProvider) LeftShiftNode(org.graalvm.compiler.nodes.calc.LeftShiftNode) BytecodeParser(org.graalvm.compiler.java.BytecodeParser) ConstantInfo(com.oracle.svm.hosted.c.info.ConstantInfo) ConstantNode(org.graalvm.compiler.nodes.ConstantNode) SubstrateObjectConstant(com.oracle.svm.core.meta.SubstrateObjectConstant) IntegerEqualsNode(org.graalvm.compiler.nodes.calc.IntegerEqualsNode) InvokeKind(org.graalvm.compiler.nodes.CallTargetNode.InvokeKind) AddNode(org.graalvm.compiler.nodes.calc.AddNode) VMError.shouldNotReachHere(com.oracle.svm.core.util.VMError.shouldNotReachHere) EnumValueInfo(com.oracle.svm.hosted.c.info.EnumValueInfo) CInterfaceLocationIdentity(com.oracle.svm.core.c.struct.CInterfaceLocationIdentity) RightShiftNode(org.graalvm.compiler.nodes.calc.RightShiftNode) EnumLookupInfo(com.oracle.svm.hosted.c.info.EnumLookupInfo) InvokeNode(org.graalvm.compiler.nodes.InvokeNode) PointerToInfo(com.oracle.svm.hosted.c.info.PointerToInfo) ConditionalNode(org.graalvm.compiler.nodes.calc.ConditionalNode) BarrierType(org.graalvm.compiler.nodes.memory.HeapAccess.BarrierType) CInterfaceReadNode(com.oracle.svm.core.graal.nodes.CInterfaceReadNode) IndirectCallTargetNode(org.graalvm.compiler.nodes.IndirectCallTargetNode) AccessorKind(com.oracle.svm.hosted.c.info.AccessorInfo.AccessorKind) StampPair(org.graalvm.compiler.core.common.type.StampPair) SubstrateCallingConventionType(com.oracle.svm.core.graal.code.amd64.SubstrateCallingConventionType) FloatConvert(org.graalvm.compiler.core.common.calc.FloatConvert) StructuredGraph(org.graalvm.compiler.nodes.StructuredGraph) CallingConvention(jdk.vm.ci.code.CallingConvention) ResolvedJavaMethod(jdk.vm.ci.meta.ResolvedJavaMethod) CInterfaceError(com.oracle.svm.hosted.c.CInterfaceError) ResolvedJavaType(jdk.vm.ci.meta.ResolvedJavaType) JavaType(jdk.vm.ci.meta.JavaType) Stamp(org.graalvm.compiler.core.common.type.Stamp) ValueNode(org.graalvm.compiler.nodes.ValueNode) InvokeNode(org.graalvm.compiler.nodes.InvokeNode) IndirectCallTargetNode(org.graalvm.compiler.nodes.IndirectCallTargetNode) ResolvedJavaType(jdk.vm.ci.meta.ResolvedJavaType) CallTargetNode(org.graalvm.compiler.nodes.CallTargetNode) IndirectCallTargetNode(org.graalvm.compiler.nodes.IndirectCallTargetNode)

Example 20 with InvokeNode

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

the class GraphKit method createInvoke.

/**
 * Creates and appends an {@link InvokeNode} for a call to a given method with a given set of
 * arguments.
 */
@SuppressWarnings("try")
public InvokeNode createInvoke(ResolvedJavaMethod method, InvokeKind invokeKind, FrameStateBuilder frameStateBuilder, int bci, ValueNode... args) {
    try (DebugCloseable context = graph.withNodeSourcePosition(NodeSourcePosition.substitution(graph.currentNodeSourcePosition(), method))) {
        assert method.isStatic() == (invokeKind == InvokeKind.Static);
        Signature signature = method.getSignature();
        JavaType returnType = signature.getReturnType(null);
        assert checkArgs(method, args);
        StampPair returnStamp = graphBuilderPlugins.getOverridingStamp(this, returnType, false);
        if (returnStamp == null) {
            returnStamp = StampFactory.forDeclaredType(graph.getAssumptions(), returnType, false);
        }
        MethodCallTargetNode callTarget = graph.add(createMethodCallTarget(invokeKind, method, args, returnStamp, bci));
        InvokeNode invoke = append(new InvokeNode(callTarget, bci));
        if (frameStateBuilder != null) {
            if (invoke.getStackKind() != JavaKind.Void) {
                frameStateBuilder.push(invoke.getStackKind(), invoke);
            }
            invoke.setStateAfter(frameStateBuilder.create(bci, invoke));
            if (invoke.getStackKind() != JavaKind.Void) {
                frameStateBuilder.pop(invoke.getStackKind());
            }
        }
        return invoke;
    }
}
Also used : JavaType(jdk.vm.ci.meta.JavaType) MethodCallTargetNode(org.graalvm.compiler.nodes.java.MethodCallTargetNode) Signature(jdk.vm.ci.meta.Signature) StampPair(org.graalvm.compiler.core.common.type.StampPair) InvokeNode(org.graalvm.compiler.nodes.InvokeNode) DebugCloseable(org.graalvm.compiler.debug.DebugCloseable)

Aggregations

InvokeNode (org.graalvm.compiler.nodes.InvokeNode)29 ValueNode (org.graalvm.compiler.nodes.ValueNode)17 MethodCallTargetNode (org.graalvm.compiler.nodes.java.MethodCallTargetNode)12 ResolvedJavaMethod (jdk.vm.ci.meta.ResolvedJavaMethod)8 ResolvedJavaType (jdk.vm.ci.meta.ResolvedJavaType)8 CallTargetNode (org.graalvm.compiler.nodes.CallTargetNode)8 StampPair (org.graalvm.compiler.core.common.type.StampPair)7 FixedWithNextNode (org.graalvm.compiler.nodes.FixedWithNextNode)7 StructuredGraph (org.graalvm.compiler.nodes.StructuredGraph)7 JavaType (jdk.vm.ci.meta.JavaType)6 Stamp (org.graalvm.compiler.core.common.type.Stamp)6 FixedNode (org.graalvm.compiler.nodes.FixedNode)6 FrameState (org.graalvm.compiler.nodes.FrameState)6 InvokeWithExceptionNode (org.graalvm.compiler.nodes.InvokeWithExceptionNode)6 ObjectStamp (org.graalvm.compiler.core.common.type.ObjectStamp)5 Node (org.graalvm.compiler.graph.Node)5 DeoptimizeNode (org.graalvm.compiler.nodes.DeoptimizeNode)5 LogicNode (org.graalvm.compiler.nodes.LogicNode)5 ParameterNode (org.graalvm.compiler.nodes.ParameterNode)5 PiNode (org.graalvm.compiler.nodes.PiNode)5