Search in sources :

Example 1 with TypeArrayBuilder

use of com.oracle.truffle.llvm.runtime.types.Type.TypeArrayBuilder in project graal by oracle.

the class LLVMBitcodeInstructionVisitor method visit.

@Override
public void visit(VoidInvokeInstruction call) {
    final SymbolImpl target = call.getCallTarget();
    if (call.getOperandBundle() != null) {
        throw new LLVMParserException("Unsupported operand bundle on invoke of " + target.toString());
    }
    // stackpointer
    final int argumentCount = call.getArgumentCount() + 1;
    final LLVMExpressionNode[] args = new LLVMExpressionNode[argumentCount];
    final TypeArrayBuilder argsType = new TypeArrayBuilder(argumentCount);
    int argIndex = 0;
    args[argIndex] = nodeFactory.createGetStackFromFrame();
    argsType.set(argIndex, new PointerType(null));
    argIndex++;
    int realArgumentCount = call.getCallTarget().getType() instanceof FunctionType ? ((FunctionType) call.getCallTarget().getType()).getNumberOfArguments() : argumentCount;
    for (int i = call.getArgumentCount() - 1; i >= 0; i--) {
        args[argIndex + i] = symbols.resolve(call.getArgument(i));
        argsType.set(argIndex + i, call.getArgument(i).getType());
        final AttributesGroup paramAttr = call.getParameterAttributesGroup(i);
        boolean isVarArg = i >= realArgumentCount;
        if (isByValue(paramAttr)) {
            args[argIndex + i] = capsuleAddressByValue(args[argIndex + i], argsType.get(argIndex + i), paramAttr);
        } else if (isVarArg && isArrayByValue(argsType.get(argIndex + i), args[argIndex + i])) {
            args[argIndex + i] = capsuleArrayByValue(args[argIndex + i], argsType.get(argIndex + i));
        }
    }
    int regularIndex = call.normalSuccessor().getBlockIndex();
    int unwindIndex = call.unwindSuccessor().getBlockIndex();
    ArrayList<Phi> normalTo = new ArrayList<>();
    ArrayList<Phi> unwindTo = new ArrayList<>();
    if (blockPhis != null) {
        for (LLVMPhiManager.Phi phi : blockPhis) {
            if (call.normalSuccessor() == phi.getBlock()) {
                normalTo.add(phi);
            } else {
                unwindTo.add(phi);
            }
        }
    }
    LLVMStatementNode normalPhi = createPhiWriteNodes(normalTo);
    LLVMStatementNode unwindPhi = createPhiWriteNodes(unwindTo);
    // Builtins are not AST-inlined for Invokes, instead a generic LLVMDispatchNode is used.
    LLVMExpressionNode function = resolveOptimized(target, call.getArguments());
    LLVMControlFlowNode result = nodeFactory.createFunctionInvoke(null, function, args, new FunctionType(call.getType(), argsType, false), regularIndex, unwindIndex, normalPhi, unwindPhi);
    setControlFlowNode(result, call, SourceInstrumentationStrategy.FORCED);
}
Also used : LLVMPhiManager(com.oracle.truffle.llvm.parser.LLVMPhiManager) LLVMControlFlowNode(com.oracle.truffle.llvm.runtime.nodes.api.LLVMControlFlowNode) Phi(com.oracle.truffle.llvm.parser.LLVMPhiManager.Phi) FunctionType(com.oracle.truffle.llvm.runtime.types.FunctionType) ArrayList(java.util.ArrayList) PointerType(com.oracle.truffle.llvm.runtime.types.PointerType) Phi(com.oracle.truffle.llvm.parser.LLVMPhiManager.Phi) SymbolImpl(com.oracle.truffle.llvm.parser.model.SymbolImpl) AttributesGroup(com.oracle.truffle.llvm.parser.model.attributes.AttributesGroup) TypeArrayBuilder(com.oracle.truffle.llvm.runtime.types.Type.TypeArrayBuilder) LLVMStatementNode(com.oracle.truffle.llvm.runtime.nodes.api.LLVMStatementNode) LLVMExpressionNode(com.oracle.truffle.llvm.runtime.nodes.api.LLVMExpressionNode) LLVMParserException(com.oracle.truffle.llvm.runtime.except.LLVMParserException)

Example 2 with TypeArrayBuilder

use of com.oracle.truffle.llvm.runtime.types.Type.TypeArrayBuilder in project graal by oracle.

the class LLVMBitcodeInstructionVisitor method visit.

@Override
public void visit(VoidCallInstruction call) {
    // stackpointer
    final int argumentCount = call.getArgumentCount() + 1;
    final LLVMExpressionNode[] argNodes = new LLVMExpressionNode[argumentCount];
    final TypeArrayBuilder argTypes = new TypeArrayBuilder(argumentCount);
    int argIndex = 0;
    argNodes[argIndex] = nodeFactory.createGetStackFromFrame();
    argTypes.set(argIndex, new PointerType(null));
    argIndex++;
    SymbolImpl target = call.getCallTarget();
    int realArgumentCount = call.getCallTarget().getType() instanceof FunctionType ? ((FunctionType) call.getCallTarget().getType()).getNumberOfArguments() : argumentCount;
    for (int i = call.getArgumentCount() - 1; i >= 0; i--) {
        argNodes[argIndex + i] = resolveOptimized(call.getArgument(i), i, target, call.getArguments());
        argTypes.set(argIndex + i, call.getArgument(i).getType());
        final AttributesGroup paramAttr = call.getParameterAttributesGroup(i);
        boolean isVarArg = i >= realArgumentCount;
        if (isByValue(paramAttr)) {
            argNodes[argIndex + i] = capsuleAddressByValue(argNodes[argIndex + i], argTypes.get(argIndex + i), paramAttr);
        } else if (isVarArg && isArrayByValue(argTypes.get(argIndex + i), argNodes[argIndex + i])) {
            argNodes[argIndex + i] = capsuleArrayByValue(argNodes[argIndex + i], argTypes.get(argIndex + i));
        }
    }
    LLVMExpressionNode result = nodeFactory.createLLVMBuiltin(target, argNodes, argTypes, argCount);
    if (call.getOperandBundle() != null && !(result instanceof LLVMAssume)) {
        throw new LLVMParserException("Unsupported operand bundle on call of " + target.toString());
    }
    SourceInstrumentationStrategy intent = SourceInstrumentationStrategy.ONLY_FIRST_STATEMENT_ON_LOCATION;
    if (result == null) {
        if (target instanceof InlineAsmConstant) {
            final InlineAsmConstant inlineAsmConstant = (InlineAsmConstant) target;
            result = createInlineAssemblerNode(inlineAsmConstant, argNodes, argTypes, call.getType());
            assignSourceLocation(result, call);
        } else {
            final LLVMExpressionNode function = resolveOptimized(target, call.getArguments());
            final FunctionType functionType = new FunctionType(call.getType(), argTypes, false);
            result = CommonNodeFactory.createFunctionCall(function, argNodes, functionType);
            // the callNode needs to be instrumentable so that the debugger can see the CallTag.
            // If it did not provide a source location, the debugger may not be able to show the
            // node on the call stack or offer stepping into the call.
            intent = SourceInstrumentationStrategy.FORCED;
        }
    }
    addStatement(result, call, intent);
}
Also used : FunctionType(com.oracle.truffle.llvm.runtime.types.FunctionType) PointerType(com.oracle.truffle.llvm.runtime.types.PointerType) SymbolImpl(com.oracle.truffle.llvm.parser.model.SymbolImpl) AttributesGroup(com.oracle.truffle.llvm.parser.model.attributes.AttributesGroup) TypeArrayBuilder(com.oracle.truffle.llvm.runtime.types.Type.TypeArrayBuilder) LLVMExpressionNode(com.oracle.truffle.llvm.runtime.nodes.api.LLVMExpressionNode) LLVMAssume(com.oracle.truffle.llvm.runtime.nodes.intrinsics.llvm.LLVMAssume) InlineAsmConstant(com.oracle.truffle.llvm.parser.model.symbols.constants.InlineAsmConstant) LLVMParserException(com.oracle.truffle.llvm.runtime.except.LLVMParserException)

Example 3 with TypeArrayBuilder

use of com.oracle.truffle.llvm.runtime.types.Type.TypeArrayBuilder in project graal by oracle.

the class LLVMBitcodeInstructionVisitor method visit.

@Override
public void visit(InvokeInstruction call) {
    final Type targetType = call.getType();
    int argumentCount = getArgumentCount(call.getArgumentCount(), targetType);
    final LLVMExpressionNode[] argNodes = new LLVMExpressionNode[argumentCount];
    final TypeArrayBuilder argTypes = new TypeArrayBuilder(argumentCount);
    int argIndex = 0;
    argNodes[argIndex] = nodeFactory.createGetStackFromFrame();
    argTypes.set(argIndex, new PointerType(null));
    argIndex++;
    final SymbolImpl target = call.getCallTarget();
    if (call.getOperandBundle() != null) {
        throw new LLVMParserException("Unsupported operand bundle on invoke of " + target.toString());
    }
    if (targetType instanceof StructureType) {
        argTypes.set(argIndex, new PointerType(targetType));
        argNodes[argIndex] = nodeFactory.createGetUniqueStackSpace(targetType, uniquesRegion);
        argIndex++;
    }
    int realArgumentCount = call.getCallTarget().getType() instanceof FunctionType ? ((FunctionType) call.getCallTarget().getType()).getNumberOfArguments() : argumentCount;
    for (int i = call.getArgumentCount() - 1; i >= 0; i--) {
        argNodes[argIndex + i] = resolveOptimized(call.getArgument(i), i, target, call.getArguments());
        argTypes.set(argIndex + i, call.getArgument(i).getType());
        final AttributesGroup paramAttr = call.getParameterAttributesGroup(i);
        boolean isVarArg = i >= realArgumentCount;
        if (isByValue(paramAttr)) {
            argNodes[argIndex + i] = capsuleAddressByValue(argNodes[argIndex + i], argTypes.get(argIndex + i), paramAttr);
        } else if (isVarArg && isArrayByValue(argTypes.get(argIndex + i), argNodes[argIndex + i])) {
            argNodes[argIndex + i] = capsuleArrayByValue(argNodes[argIndex + i], argTypes.get(argIndex + i));
        }
    }
    int regularIndex = call.normalSuccessor().getBlockIndex();
    int unwindIndex = call.unwindSuccessor().getBlockIndex();
    ArrayList<Phi> normalTo = new ArrayList<>();
    ArrayList<Phi> unwindTo = new ArrayList<>();
    if (blockPhis != null) {
        for (LLVMPhiManager.Phi phi : blockPhis) {
            if (call.normalSuccessor() == phi.getBlock()) {
                normalTo.add(phi);
            } else {
                unwindTo.add(phi);
            }
        }
    }
    LLVMStatementNode normalPhi = createPhiWriteNodes(normalTo);
    LLVMStatementNode unwindPhi = createPhiWriteNodes(unwindTo);
    // Builtins are not AST-inlined for Invokes, instead a generic LLVMDispatchNode is used.
    LLVMExpressionNode function = symbols.resolve(target);
    LLVMControlFlowNode result = nodeFactory.createFunctionInvoke(CommonNodeFactory.createFrameWrite(targetType, null, symbols.findOrAddFrameSlot(call)), function, argNodes, new FunctionType(targetType, argTypes, false), regularIndex, unwindIndex, normalPhi, unwindPhi);
    setControlFlowNode(result, call, SourceInstrumentationStrategy.FORCED);
}
Also used : LLVMPhiManager(com.oracle.truffle.llvm.parser.LLVMPhiManager) LLVMControlFlowNode(com.oracle.truffle.llvm.runtime.nodes.api.LLVMControlFlowNode) Phi(com.oracle.truffle.llvm.parser.LLVMPhiManager.Phi) FunctionType(com.oracle.truffle.llvm.runtime.types.FunctionType) ArrayList(java.util.ArrayList) PointerType(com.oracle.truffle.llvm.runtime.types.PointerType) Phi(com.oracle.truffle.llvm.parser.LLVMPhiManager.Phi) SymbolImpl(com.oracle.truffle.llvm.parser.model.SymbolImpl) PrimitiveType(com.oracle.truffle.llvm.runtime.types.PrimitiveType) StructureType(com.oracle.truffle.llvm.runtime.types.StructureType) ArrayType(com.oracle.truffle.llvm.runtime.types.ArrayType) AggregateType(com.oracle.truffle.llvm.runtime.types.AggregateType) PointerType(com.oracle.truffle.llvm.runtime.types.PointerType) FunctionType(com.oracle.truffle.llvm.runtime.types.FunctionType) MetaType(com.oracle.truffle.llvm.runtime.types.MetaType) Type(com.oracle.truffle.llvm.runtime.types.Type) LLVMSourceType(com.oracle.truffle.llvm.runtime.debug.type.LLVMSourceType) AttributesGroup(com.oracle.truffle.llvm.parser.model.attributes.AttributesGroup) TypeArrayBuilder(com.oracle.truffle.llvm.runtime.types.Type.TypeArrayBuilder) StructureType(com.oracle.truffle.llvm.runtime.types.StructureType) LLVMStatementNode(com.oracle.truffle.llvm.runtime.nodes.api.LLVMStatementNode) LLVMExpressionNode(com.oracle.truffle.llvm.runtime.nodes.api.LLVMExpressionNode) LLVMParserException(com.oracle.truffle.llvm.runtime.except.LLVMParserException)

Example 4 with TypeArrayBuilder

use of com.oracle.truffle.llvm.runtime.types.Type.TypeArrayBuilder in project graal by oracle.

the class LLVMBitcodeInstructionVisitor method visit.

@Override
public void visit(CallInstruction call) {
    final Type targetType = call.getType();
    int argumentCount = getArgumentCount(call.getArgumentCount(), targetType);
    final LLVMExpressionNode[] argNodes = new LLVMExpressionNode[argumentCount];
    final TypeArrayBuilder argTypes = new TypeArrayBuilder(argumentCount);
    int argIndex = 0;
    // stack pointer
    argNodes[argIndex] = nodeFactory.createGetStackFromFrame();
    argTypes.set(argIndex, new PointerType(null));
    argIndex++;
    if (targetType instanceof StructureType) {
        argTypes.set(argIndex, new PointerType(targetType));
        argNodes[argIndex] = nodeFactory.createGetUniqueStackSpace(targetType, uniquesRegion);
        argIndex++;
    }
    // realArgumentCount = argumentCount - varArgCount
    int realArgumentCount = call.getCallTarget().getType() instanceof FunctionType ? ((FunctionType) call.getCallTarget().getType()).getNumberOfArguments() : argumentCount;
    final SymbolImpl target = call.getCallTarget();
    for (int i = call.getArgumentCount() - 1; i >= 0; i--) {
        argNodes[argIndex + i] = resolveOptimized(call.getArgument(i), i, target, call.getArguments());
        argTypes.set(argIndex + i, call.getArgument(i).getType());
        boolean isVarArg = i >= realArgumentCount;
        final AttributesGroup paramAttr = call.getParameterAttributesGroup(i);
        if (isByValue(paramAttr)) {
            argNodes[argIndex + i] = capsuleAddressByValue(argNodes[argIndex + i], argTypes.get(argIndex + i), paramAttr);
        } else if (isVarArg && isArrayByValue(argTypes.get(argIndex + i), argNodes[argIndex + i])) {
            argNodes[argIndex + i] = capsuleArrayByValue(argNodes[argIndex + i], argTypes.get(argIndex + i));
        }
    }
    LLVMExpressionNode result = nodeFactory.createLLVMBuiltin(target, argNodes, argTypes, argCount);
    if (call.getOperandBundle() != null && !(result instanceof LLVMAssume)) {
        throw new LLVMParserException("Unsupported operand bundle on call of " + target.toString());
    }
    SourceInstrumentationStrategy intent = SourceInstrumentationStrategy.ONLY_FIRST_STATEMENT_ON_LOCATION;
    if (result == null) {
        if (target instanceof InlineAsmConstant) {
            final InlineAsmConstant inlineAsmConstant = (InlineAsmConstant) target;
            result = createInlineAssemblerNode(inlineAsmConstant, argNodes, argTypes, targetType);
        } else {
            LLVMExpressionNode function = symbols.resolve(target);
            result = CommonNodeFactory.createFunctionCall(function, argNodes, new FunctionType(targetType, argTypes, false));
            // the callNode needs to be instrumentable so that the debugger can see the CallTag.
            // If it did not provide a source location, the debugger may not be able to show the
            // node on the call stack or offer stepping into the call.
            intent = SourceInstrumentationStrategy.FORCED;
        }
    }
    // the SourceSection references the call, not the return value assignment
    createFrameWrite(result, call, intent);
}
Also used : FunctionType(com.oracle.truffle.llvm.runtime.types.FunctionType) PointerType(com.oracle.truffle.llvm.runtime.types.PointerType) SymbolImpl(com.oracle.truffle.llvm.parser.model.SymbolImpl) PrimitiveType(com.oracle.truffle.llvm.runtime.types.PrimitiveType) StructureType(com.oracle.truffle.llvm.runtime.types.StructureType) ArrayType(com.oracle.truffle.llvm.runtime.types.ArrayType) AggregateType(com.oracle.truffle.llvm.runtime.types.AggregateType) PointerType(com.oracle.truffle.llvm.runtime.types.PointerType) FunctionType(com.oracle.truffle.llvm.runtime.types.FunctionType) MetaType(com.oracle.truffle.llvm.runtime.types.MetaType) Type(com.oracle.truffle.llvm.runtime.types.Type) LLVMSourceType(com.oracle.truffle.llvm.runtime.debug.type.LLVMSourceType) AttributesGroup(com.oracle.truffle.llvm.parser.model.attributes.AttributesGroup) TypeArrayBuilder(com.oracle.truffle.llvm.runtime.types.Type.TypeArrayBuilder) StructureType(com.oracle.truffle.llvm.runtime.types.StructureType) LLVMExpressionNode(com.oracle.truffle.llvm.runtime.nodes.api.LLVMExpressionNode) LLVMAssume(com.oracle.truffle.llvm.runtime.nodes.intrinsics.llvm.LLVMAssume) InlineAsmConstant(com.oracle.truffle.llvm.parser.model.symbols.constants.InlineAsmConstant) LLVMParserException(com.oracle.truffle.llvm.runtime.except.LLVMParserException)

Aggregations

SymbolImpl (com.oracle.truffle.llvm.parser.model.SymbolImpl)4 AttributesGroup (com.oracle.truffle.llvm.parser.model.attributes.AttributesGroup)4 LLVMParserException (com.oracle.truffle.llvm.runtime.except.LLVMParserException)4 LLVMExpressionNode (com.oracle.truffle.llvm.runtime.nodes.api.LLVMExpressionNode)4 FunctionType (com.oracle.truffle.llvm.runtime.types.FunctionType)4 PointerType (com.oracle.truffle.llvm.runtime.types.PointerType)4 TypeArrayBuilder (com.oracle.truffle.llvm.runtime.types.Type.TypeArrayBuilder)4 LLVMPhiManager (com.oracle.truffle.llvm.parser.LLVMPhiManager)2 Phi (com.oracle.truffle.llvm.parser.LLVMPhiManager.Phi)2 InlineAsmConstant (com.oracle.truffle.llvm.parser.model.symbols.constants.InlineAsmConstant)2 LLVMSourceType (com.oracle.truffle.llvm.runtime.debug.type.LLVMSourceType)2 LLVMControlFlowNode (com.oracle.truffle.llvm.runtime.nodes.api.LLVMControlFlowNode)2 LLVMStatementNode (com.oracle.truffle.llvm.runtime.nodes.api.LLVMStatementNode)2 LLVMAssume (com.oracle.truffle.llvm.runtime.nodes.intrinsics.llvm.LLVMAssume)2 AggregateType (com.oracle.truffle.llvm.runtime.types.AggregateType)2 ArrayType (com.oracle.truffle.llvm.runtime.types.ArrayType)2 MetaType (com.oracle.truffle.llvm.runtime.types.MetaType)2 PrimitiveType (com.oracle.truffle.llvm.runtime.types.PrimitiveType)2 StructureType (com.oracle.truffle.llvm.runtime.types.StructureType)2 Type (com.oracle.truffle.llvm.runtime.types.Type)2