Search in sources :

Example 6 with DataLayout

use of com.oracle.truffle.llvm.runtime.datalayout.DataLayout in project graal by oracle.

the class InitializeGlobalNode method createGlobalVariableInitializer.

private static StaticInitsNode createGlobalVariableInitializer(LLVMParserResult parserResult, Object moduleName) {
    LLVMParserRuntime runtime = parserResult.getRuntime();
    GetStackSpaceFactory stackFactory = GetStackSpaceFactory.createAllocaFactory();
    List<GlobalVariable> globals = parserResult.getDefinedGlobals();
    DataLayout dataLayout = parserResult.getDataLayout();
    LLVMStatementNode initNode;
    int totalSize = 0;
    try {
        int[] sizes = new int[globals.size()];
        int nonEmptyGlobals = 0;
        for (int i = 0; i < sizes.length; i++) {
            GlobalVariable global = globals.get(i);
            if (global == null || global.getValue() == null) {
                continue;
            }
            long size = globals.get(i).getType().getPointeeType().getSize(dataLayout);
            if (size > Integer.MAX_VALUE || (totalSize + size) > Integer.MAX_VALUE) {
                throw new TypeOverflowException("globals section > 2GB is not supported");
            }
            if (size == 0) {
                continue;
            }
            sizes[i] = (int) size;
            totalSize += (int) size;
            nonEmptyGlobals++;
        }
        int[] bufferOffsets = new int[nonEmptyGlobals];
        LLVMGlobal[] descriptors = new LLVMGlobal[nonEmptyGlobals];
        Buffer buffer = new Buffer(totalSize, runtime, dataLayout);
        int globalIndex = 0;
        totalSize = 0;
        for (int i = 0; i < sizes.length; i++) {
            if (sizes[i] == 0) {
                continue;
            }
            GlobalVariable global = globals.get(i);
            /*
                 * For fetching the address of the global that we want to initialize, we must use
                 * the file scope because we are initializing the globals of the current file.
                 */
            descriptors[globalIndex] = runtime.getFileScope().getGlobalVariable(global.getName());
            assert descriptors[globalIndex] != null;
            bufferOffsets[globalIndex] = totalSize;
            global.getValue().addToBuffer(buffer, runtime, dataLayout, stackFactory);
            totalSize += sizes[i];
            globalIndex++;
        }
        initNode = buffer.createNode(bufferOffsets, descriptors);
    } catch (TypeOverflowException e) {
        initNode = Type.handleOverflowStatement(e);
    }
    return StaticInitsNodeGen.create(new LLVMStatementNode[] { initNode }, "global variable initializers", moduleName);
}
Also used : DataLayout(com.oracle.truffle.llvm.runtime.datalayout.DataLayout) ByteBuffer(java.nio.ByteBuffer) TypeOverflowException(com.oracle.truffle.llvm.runtime.types.Type.TypeOverflowException) LLVMGlobal(com.oracle.truffle.llvm.runtime.global.LLVMGlobal) LLVMParserRuntime(com.oracle.truffle.llvm.parser.LLVMParserRuntime) GetStackSpaceFactory(com.oracle.truffle.llvm.runtime.GetStackSpaceFactory) GlobalVariable(com.oracle.truffle.llvm.parser.model.symbols.globals.GlobalVariable) LLVMStatementNode(com.oracle.truffle.llvm.runtime.nodes.api.LLVMStatementNode)

Aggregations

DataLayout (com.oracle.truffle.llvm.runtime.datalayout.DataLayout)6 LLVMParserRuntime (com.oracle.truffle.llvm.parser.LLVMParserRuntime)2 TruffleBoundary (com.oracle.truffle.api.CompilerDirectives.TruffleBoundary)1 Source (com.oracle.truffle.api.source.Source)1 LLVMParser (com.oracle.truffle.llvm.parser.LLVMParser)1 LLVMParserResult (com.oracle.truffle.llvm.parser.LLVMParserResult)1 ModelModule (com.oracle.truffle.llvm.parser.model.ModelModule)1 SymbolImpl (com.oracle.truffle.llvm.parser.model.SymbolImpl)1 FunctionDefinition (com.oracle.truffle.llvm.parser.model.functions.FunctionDefinition)1 FunctionParameter (com.oracle.truffle.llvm.parser.model.functions.FunctionParameter)1 GlobalVariable (com.oracle.truffle.llvm.parser.model.symbols.globals.GlobalVariable)1 TargetDataLayout (com.oracle.truffle.llvm.parser.model.target.TargetDataLayout)1 LLVMSymbolReadResolver (com.oracle.truffle.llvm.parser.nodes.LLVMSymbolReadResolver)1 CommonNodeFactory (com.oracle.truffle.llvm.runtime.CommonNodeFactory)1 GetStackSpaceFactory (com.oracle.truffle.llvm.runtime.GetStackSpaceFactory)1 LLVMLanguage (com.oracle.truffle.llvm.runtime.LLVMLanguage)1 LLVMScope (com.oracle.truffle.llvm.runtime.LLVMScope)1 NodeFactory (com.oracle.truffle.llvm.runtime.NodeFactory)1 LLVMSourceFunctionType (com.oracle.truffle.llvm.runtime.debug.type.LLVMSourceFunctionType)1 LLVMSourceType (com.oracle.truffle.llvm.runtime.debug.type.LLVMSourceType)1