Search in sources :

Example 1 with ExternalLibrary

use of com.oracle.truffle.llvm.runtime.LLVMContext.ExternalLibrary in project sulong by graalvm.

the class Runner method parse.

private LLVMParserResult parse(LLVMLanguage language, LLVMContext context, Source source, ExternalLibrary library, ByteBuffer bytes) throws IOException {
    assert library != null;
    BitcodeParserResult bitcodeParserResult = BitcodeParserResult.getFromSource(source, bytes);
    context.addLibraryPaths(bitcodeParserResult.getLibraryPaths());
    List<String> libraries = bitcodeParserResult.getLibraries();
    if (!libraries.isEmpty()) {
        ExternalLibrary[] libs = context.addExternalLibraries(libraries);
        LLVMParserResult[] parserResults = parse(language, context, libs);
        handleParserResult(context, parserResults);
    }
    return LLVMParserRuntime.parse(source, library, bitcodeParserResult, language, context, nodeFactory);
}
Also used : ExternalLibrary(com.oracle.truffle.llvm.runtime.LLVMContext.ExternalLibrary) LLVMParserResult(com.oracle.truffle.llvm.parser.LLVMParserResult) BitcodeParserResult(com.oracle.truffle.llvm.parser.BitcodeParserResult)

Example 2 with ExternalLibrary

use of com.oracle.truffle.llvm.runtime.LLVMContext.ExternalLibrary in project sulong by graalvm.

the class Runner method parse.

private LLVMParserResult[] parse(LLVMLanguage language, LLVMContext context, ExternalLibrary[] libs) {
    LLVMParserResult[] parserResults = new LLVMParserResult[libs.length];
    for (int i = 0; i < libs.length; i++) {
        ExternalLibrary lib = libs[i];
        if (!lib.isParsed()) {
            try {
                Path path = lib.getPath();
                byte[] bytes = Files.readAllBytes(path);
                // at the moment, we don't need the bitcode as the content of the source
                Source source = Source.newBuilder(path.toString()).mimeType(LLVMLanguage.LLVM_BITCODE_MIME_TYPE).name(path.getFileName().toString()).build();
                parserResults[i] = parse(language, context, source, lib, ByteBuffer.wrap(bytes));
                lib.setParsed();
            } catch (Throwable t) {
                throw new RuntimeException("Error while trying to parse " + lib.getName(), t);
            }
        }
    }
    return parserResults;
}
Also used : Path(java.nio.file.Path) ExternalLibrary(com.oracle.truffle.llvm.runtime.LLVMContext.ExternalLibrary) LLVMParserResult(com.oracle.truffle.llvm.parser.LLVMParserResult) Source(com.oracle.truffle.api.source.Source)

Example 3 with ExternalLibrary

use of com.oracle.truffle.llvm.runtime.LLVMContext.ExternalLibrary in project sulong by graalvm.

the class LLVMParserRuntime method checkReplaceExistingFunction.

private boolean checkReplaceExistingFunction(LLVMFunctionDescriptor functionDescriptor) {
    if (library.getLibrariesToReplace() != null) {
        for (ExternalLibrary lib : library.getLibrariesToReplace()) {
            if (functionDescriptor.getLibrary().equals(lib)) {
                // We already have a symbol defined in another library but now we are
                // overwriting it. We rename the already existing symbol by prefixing it with
                // "__libName_", e.g., "@__clock_gettime" would be renamed to
                // "@__libc___clock_gettime".
                String functionName = functionDescriptor.getName();
                assert functionName.charAt(0) == '@';
                String renamedFunctionName = "@__" + functionDescriptor.getLibrary().getName() + "_" + functionName.substring(1);
                LLVMFunctionDescriptor renamedFunctionDescriptor = scope.lookupOrCreateFunction(functionDescriptor.getContext(), renamedFunctionName, true, index -> LLVMFunctionDescriptor.createDescriptor(functionDescriptor.getContext(), functionDescriptor.getLibrary(), renamedFunctionName, functionDescriptor.getType(), index));
                renamedFunctionDescriptor.declareInSulong(functionDescriptor.getFunction(), functionDescriptor.isWeak(), false);
                functionDescriptor.setLibrary(library);
                return true;
            }
        }
    }
    return false;
}
Also used : ExternalLibrary(com.oracle.truffle.llvm.runtime.LLVMContext.ExternalLibrary) LLVMFunctionDescriptor(com.oracle.truffle.llvm.runtime.LLVMFunctionDescriptor)

Example 4 with ExternalLibrary

use of com.oracle.truffle.llvm.runtime.LLVMContext.ExternalLibrary in project sulong by graalvm.

the class LLVMParserRuntime method parse.

public static LLVMParserResult parse(Source source, ExternalLibrary library, BitcodeParserResult parserResult, LLVMLanguage language, LLVMContext context, NodeFactory nodeFactory) {
    ModelModule model = parserResult.getModel();
    TargetDataLayout layout = model.getTargetDataLayout();
    assert layout != null;
    LLVMModelVisitor module = new LLVMModelVisitor();
    model.accept(module);
    DataLayoutConverter.DataSpecConverterImpl targetDataLayout = DataLayoutConverter.getConverter(layout.getDataLayout());
    context.setDataLayoutConverter(targetDataLayout);
    LLVMParserRuntime runtime = new LLVMParserRuntime(source, library, language, context, nodeFactory, module.getAliases());
    runtime.registerFunctions(model);
    LLVMSymbolReadResolver symbolResolver = new LLVMSymbolReadResolver(runtime, runtime.getGlobalFrameDescriptor());
    LLVMExpressionNode[] globals = runtime.createGlobalVariableInitializationNodes(symbolResolver, module.getGlobals());
    RootNode globalVarInits = nodeFactory.createStaticInitsRootNode(runtime, globals);
    RootCallTarget globalVarInitsTarget = Truffle.getRuntime().createCallTarget(globalVarInits);
    LLVMExpressionNode[] deallocs = runtime.getDeallocations();
    RootNode globalVarDeallocs = nodeFactory.createStaticInitsRootNode(runtime, deallocs);
    RootCallTarget globalVarDeallocsTarget = Truffle.getRuntime().createCallTarget(globalVarDeallocs);
    RootCallTarget constructorFunctions = runtime.getConstructors(module.getGlobals());
    RootCallTarget destructorFunctions = runtime.getDestructors(module.getGlobals());
    if (context.getEnv().getOptions().get(SulongEngineOption.ENABLE_LVI)) {
        final LLVMSourceContext sourceContext = context.getSourceContext();
        model.getSourceGlobals().forEach((symbol, irValue) -> {
            final LLVMExpressionNode node = symbolResolver.resolve(irValue);
            final LLVMDebugValue value = nodeFactory.createDebugStaticValue(node);
            sourceContext.registerStatic(symbol, value);
        });
        model.getSourceStaticMembers().forEach(((type, symbol) -> {
            final LLVMExpressionNode node = symbolResolver.resolve(symbol);
            final LLVMDebugValue value = nodeFactory.createDebugStaticValue(node);
            type.setValue(value);
        }));
    }
    RootCallTarget mainFunctionCallTarget = null;
    if (runtime.getScope().functionExists("@main")) {
        LLVMFunctionDescriptor mainDescriptor = runtime.getScope().getFunctionDescriptor("@main");
        LLVMFunctionDescriptor startDescriptor = runtime.getScope().getFunctionDescriptor("@_start");
        RootCallTarget startCallTarget = startDescriptor.getLLVMIRFunction();
        String applicationPath = source.getPath() == null ? "" : source.getPath().toString();
        RootNode globalFunction = nodeFactory.createGlobalRootNode(runtime, startCallTarget, mainDescriptor, applicationPath);
        RootCallTarget globalFunctionRoot = Truffle.getRuntime().createCallTarget(globalFunction);
        RootNode globalRootNode = nodeFactory.createGlobalRootNodeWrapping(runtime, globalFunctionRoot, startDescriptor.getType().getReturnType());
        mainFunctionCallTarget = Truffle.getRuntime().createCallTarget(globalRootNode);
    }
    return new LLVMParserResult(runtime.getScope(), mainFunctionCallTarget, globalVarInitsTarget, globalVarDeallocsTarget, constructorFunctions, destructorFunctions);
}
Also used : GlobalVariable(com.oracle.truffle.llvm.parser.model.symbols.globals.GlobalVariable) DataLayoutConverter(com.oracle.truffle.llvm.runtime.datalayout.DataLayoutConverter) GlobalConstant(com.oracle.truffle.llvm.parser.model.symbols.globals.GlobalConstant) GlobalValueSymbol(com.oracle.truffle.llvm.parser.model.symbols.globals.GlobalValueSymbol) RootCallTarget(com.oracle.truffle.api.RootCallTarget) FunctionDefinition(com.oracle.truffle.llvm.parser.model.functions.FunctionDefinition) Pair(com.oracle.truffle.llvm.parser.util.Pair) Linkage(com.oracle.truffle.llvm.parser.model.enums.Linkage) LLVMContext(com.oracle.truffle.llvm.runtime.LLVMContext) SulongEngineOption(com.oracle.truffle.llvm.runtime.options.SulongEngineOption) LLVMSymbolReadResolver(com.oracle.truffle.llvm.parser.nodes.LLVMSymbolReadResolver) ArrayList(java.util.ArrayList) FrameDescriptor(com.oracle.truffle.api.frame.FrameDescriptor) LLVMFunctionDescriptor(com.oracle.truffle.llvm.runtime.LLVMFunctionDescriptor) Type(com.oracle.truffle.llvm.runtime.types.Type) ModelModule(com.oracle.truffle.llvm.parser.model.ModelModule) LLVMSourceContext(com.oracle.truffle.llvm.runtime.debug.LLVMSourceContext) LLVMLanguage(com.oracle.truffle.llvm.runtime.LLVMLanguage) Map(java.util.Map) RootNode(com.oracle.truffle.api.nodes.RootNode) ArrayConstant(com.oracle.truffle.llvm.parser.model.symbols.constants.aggregate.ArrayConstant) LLVMSourceSymbol(com.oracle.truffle.llvm.runtime.debug.LLVMSourceSymbol) PrimitiveType(com.oracle.truffle.llvm.runtime.types.PrimitiveType) ExternalLibrary(com.oracle.truffle.llvm.runtime.LLVMContext.ExternalLibrary) LLVMExpressionNode(com.oracle.truffle.llvm.runtime.nodes.api.LLVMExpressionNode) LLVMStack(com.oracle.truffle.llvm.runtime.memory.LLVMStack) SymbolImpl(com.oracle.truffle.llvm.parser.model.SymbolImpl) TargetDataLayout(com.oracle.truffle.llvm.parser.model.target.TargetDataLayout) LLVMDebugValue(com.oracle.truffle.llvm.runtime.debug.LLVMDebugValue) PointerType(com.oracle.truffle.llvm.runtime.types.PointerType) LLVMScope(com.oracle.truffle.llvm.runtime.LLVMScope) List(java.util.List) Source(com.oracle.truffle.api.source.Source) StructureType(com.oracle.truffle.llvm.runtime.types.StructureType) StructureConstant(com.oracle.truffle.llvm.parser.model.symbols.constants.aggregate.StructureConstant) GlobalAlias(com.oracle.truffle.llvm.parser.model.symbols.globals.GlobalAlias) FunctionType(com.oracle.truffle.llvm.runtime.types.FunctionType) Truffle(com.oracle.truffle.api.Truffle) ArrayType(com.oracle.truffle.llvm.runtime.types.ArrayType) Comparator(java.util.Comparator) RootNode(com.oracle.truffle.api.nodes.RootNode) TargetDataLayout(com.oracle.truffle.llvm.parser.model.target.TargetDataLayout) DataLayoutConverter(com.oracle.truffle.llvm.runtime.datalayout.DataLayoutConverter) LLVMSymbolReadResolver(com.oracle.truffle.llvm.parser.nodes.LLVMSymbolReadResolver) ModelModule(com.oracle.truffle.llvm.parser.model.ModelModule) LLVMFunctionDescriptor(com.oracle.truffle.llvm.runtime.LLVMFunctionDescriptor) LLVMExpressionNode(com.oracle.truffle.llvm.runtime.nodes.api.LLVMExpressionNode) LLVMDebugValue(com.oracle.truffle.llvm.runtime.debug.LLVMDebugValue) RootCallTarget(com.oracle.truffle.api.RootCallTarget) LLVMSourceContext(com.oracle.truffle.llvm.runtime.debug.LLVMSourceContext)

Example 5 with ExternalLibrary

use of com.oracle.truffle.llvm.runtime.LLVMContext.ExternalLibrary in project sulong by graalvm.

the class NFIContextExtension method addLibraries.

private void addLibraries(LLVMContext context) {
    CompilerAsserts.neverPartOfCompilation();
    context.addExternalLibrary("libsulong." + getNativeLibrarySuffix());
    // dummy library for C++, see {@link #handleSpecialLibraries}
    context.addExternalLibrary("libsulong++." + getNativeLibrarySuffix());
    List<ExternalLibrary> libraries = context.getExternalLibraries(lib -> lib.getPath().toString().contains("." + getNativeLibrarySuffix()));
    for (ExternalLibrary l : libraries) {
        addLibrary(l);
    }
}
Also used : ExternalLibrary(com.oracle.truffle.llvm.runtime.LLVMContext.ExternalLibrary)

Aggregations

ExternalLibrary (com.oracle.truffle.llvm.runtime.LLVMContext.ExternalLibrary)6 LLVMParserResult (com.oracle.truffle.llvm.parser.LLVMParserResult)3 Source (com.oracle.truffle.api.source.Source)2 LLVMFunctionDescriptor (com.oracle.truffle.llvm.runtime.LLVMFunctionDescriptor)2 RootCallTarget (com.oracle.truffle.api.RootCallTarget)1 Truffle (com.oracle.truffle.api.Truffle)1 FrameDescriptor (com.oracle.truffle.api.frame.FrameDescriptor)1 RootNode (com.oracle.truffle.api.nodes.RootNode)1 BitcodeParserResult (com.oracle.truffle.llvm.parser.BitcodeParserResult)1 ModelModule (com.oracle.truffle.llvm.parser.model.ModelModule)1 SymbolImpl (com.oracle.truffle.llvm.parser.model.SymbolImpl)1 Linkage (com.oracle.truffle.llvm.parser.model.enums.Linkage)1 FunctionDefinition (com.oracle.truffle.llvm.parser.model.functions.FunctionDefinition)1 ArrayConstant (com.oracle.truffle.llvm.parser.model.symbols.constants.aggregate.ArrayConstant)1 StructureConstant (com.oracle.truffle.llvm.parser.model.symbols.constants.aggregate.StructureConstant)1 GlobalAlias (com.oracle.truffle.llvm.parser.model.symbols.globals.GlobalAlias)1 GlobalConstant (com.oracle.truffle.llvm.parser.model.symbols.globals.GlobalConstant)1 GlobalValueSymbol (com.oracle.truffle.llvm.parser.model.symbols.globals.GlobalValueSymbol)1 GlobalVariable (com.oracle.truffle.llvm.parser.model.symbols.globals.GlobalVariable)1 TargetDataLayout (com.oracle.truffle.llvm.parser.model.target.TargetDataLayout)1