Compiler construction 在Windows上运行时执行LLVM IR

Compiler construction 在Windows上运行时执行LLVM IR,compiler-construction,runtime,llvm,interpreter,Compiler Construction,Runtime,Llvm,Interpreter,在互联网和Stackoverflow上的一些研究中,关于如何在运行时执行IR代码的唯一示例是SO。现在,我已经用Visual Studio 2012编译了llvm和clang,并且我能够编译一些源文件,以便使用clangfile.cpp-S-emit llvm-O3来“编写”扩展名,这样的输出就像通常的IR代码一样 ; ModuleID = '.\Test.cpp' target datalayout = "/* ... */" target triple = "i686-pc-win32" d

在互联网和Stackoverflow上的一些研究中,关于如何在运行时执行IR代码的唯一示例是SO。现在,我已经用Visual Studio 2012编译了llvm和clang,并且我能够编译一些源文件,以便使用
clangfile.cpp-S-emit llvm-O3来“编写”扩展名,这样的输出就像通常的IR代码一样

; ModuleID = '.\Test.cpp'
target datalayout = "/* ... */"
target triple = "i686-pc-win32"
define i32 @test() #0 {
  ret i32 43
}
attributes #0 = { nounwind /* ... */ }
我提到的帖子确实很老,我想知道两件事:

  • 如何在LLVM3.2运行时初始化引擎并执行这样的代码(使用C++)?还是用同样的电话吗
  • 在编译过程中,创建了一个。我如何知道哪些必须链接

  • 我的代码有效,可能需要一些优化

    #include <iostream>
    #include <llvm/IR/LLVMContext.h>
    #include <llvm/ADT/Triple.h>
    #include <llvm/Bitcode/ReaderWriter.h>
    #include <llvm/CodeGen/LinkAllCodegenComponents.h>
    #include <llvm/ExecutionEngine/GenericValue.h>
    #include <llvm/ExecutionEngine/Interpreter.h>
    #include <llvm/ExecutionEngine/JIT.h>
    #include <llvm/ExecutionEngine/JITEventListener.h>
    #include <llvm/ExecutionEngine/JITMemoryManager.h>
    #include <llvm/ExecutionEngine/MCJIT.h>
    #include <llvm/ExecutionEngine/SectionMemoryManager.h>
    #include <llvm/IR/Module.h>
    #include <llvm/IR/Type.h>
    #include <llvm/Support/CommandLine.h>
    #include <llvm/Support/Debug.h>
    #include <llvm/Support/DynamicLibrary.h>
    #include <llvm/Support/Format.h>
    #include <llvm/Support/IRReader.h>
    #include <llvm/Support/ManagedStatic.h>
    #include <llvm/Support/MathExtras.h>
    #include <llvm/Support/Memory.h>
    #include <llvm/Support/MemoryBuffer.h>
    #include <llvm/Support/PluginLoader.h>
    #include <llvm/Support/PrettyStackTrace.h>
    #include <llvm/Support/Process.h>
    #include <llvm/Support/Signals.h>
    #include <llvm/Support/TargetSelect.h>
    #include <llvm/Support/raw_ostream.h>
    
    #pragma comment(lib, "LLVMMCJIT.lib")
    #pragma comment(lib, "LLVMInterpreter.lib")
    #pragma comment(lib, "LLVMBitReader.lib")
    #pragma comment(lib, "LLVMAsmParser.lib")
    #pragma comment(lib, "LLVMX86CodeGen.lib")
    #pragma comment(lib, "LLVMX86AsmParser.lib")
    #pragma comment(lib, "LLVMX86Disassembler.lib")
    #pragma comment(lib, "LLVMJIT.lib")
    #pragma comment(lib, "LLVMAsmPrinter.lib")
    #pragma comment(lib, "LLVMSelectionDAG.lib")
    #pragma comment(lib, "LLVMX86Desc.lib")
    #pragma comment(lib, "LLVMExecutionEngine.lib")
    #pragma comment(lib, "LLVMRuntimeDyld.lib")
    #pragma comment(lib, "LLVMMCParser.lib")
    #pragma comment(lib, "LLVMCodeGen.lib")
    #pragma comment(lib, "LLVMX86AsmPrinter.lib")
    #pragma comment(lib, "LLVMX86Info.lib")
    #pragma comment(lib, "LLVMObjCARCOpts.lib")
    #pragma comment(lib, "LLVMScalarOpts.lib")
    #pragma comment(lib, "LLVMX86Utils.lib")
    #pragma comment(lib, "LLVMInstCombine.lib")
    #pragma comment(lib, "LLVMTransformUtils.lib")
    #pragma comment(lib, "LLVMipa.lib")
    #pragma comment(lib, "LLVMAnalysis.lib")
    #pragma comment(lib, "LLVMTarget.lib")
    #pragma comment(lib, "LLVMCore.lib")
    #pragma comment(lib, "LLVMMC.lib")
    #pragma comment(lib, "LLVMObject.lib")
    #pragma comment(lib, "LLVMSupport.lib")
    
    using namespace llvm;
    
    int main(int argc, char **argv) {
        InitializeNativeTarget();
        LLVMContext &context = getGlobalContext();
        ExecutionEngine *ee;
        SMDiagnostic diag;
        Module *m = ParseIRFile("Script.s", diag, context);
        if(!m) {
            diag.print("LLVMSandbox", errs());
            return 1;
        }
        m->MaterializeAllPermanently();
        ee = EngineBuilder(m).create();
        Function *func = ee->FindFunctionNamed("main");
        typedef int (*PFN)();
        PFN pfn = reinterpret_cast<PFN>(ee->getPointerToFunction(func));
        int i = pfn();
        std::cout << i;
        std::cin.get();
        delete ee;
        return 0;
    }
    
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #pragma注释(lib,“LLVMMCJIT.lib”)
    #pragma注释(lib,“LLVMInterpreter.lib”)
    #pragma注释(lib,“LLVMBitReader.lib”)
    #pragma注释(lib,“LLVMAsmParser.lib”)
    #pragma注释(lib,“LLVMX86CodeGen.lib”)
    #pragma注释(lib,“llvmx86asparser.lib”)
    #pragma注释(lib,“llvmx86discomposer.lib”)
    #pragma注释(lib,“LLVMJIT.lib”)
    #pragma注释(lib,“LLVMAsmPrinter.lib”)
    #pragma注释(lib,“LLVMSelectionDAG.lib”)
    #pragma注释(lib,“LLVMX86Desc.lib”)
    #pragma注释(lib,“LLVMExecutionEngine.lib”)
    #pragma注释(lib,“LLVMRuntimeDyld.lib”)
    #pragma注释(lib,“LLVMMCParser.lib”)
    #pragma注释(lib,“LLVMCodeGen.lib”)
    #pragma注释(lib,“llvmx86asprinter.lib”)
    #pragma注释(lib,“LLVMX86Info.lib”)
    #pragma注释(lib,“LLVMObjCARCOpts.lib”)
    #pragma注释(lib,“LLVMScalarOpts.lib”)
    #pragma注释(lib,“LLVMX86Utils.lib”)
    #pragma注释(lib,“LLVMInstCombine.lib”)
    #pragma注释(lib,“LLVMTransformUtils.lib”)
    #pragma注释(lib,“LLVMipa.lib”)
    #pragma注释(lib,“LLVMAnalysis.lib”)
    #pragma注释(lib,“LLVMTarget.lib”)
    #pragma注释(lib,“LLVMCore.lib”)
    #pragma注释(lib,“LLVMMC.lib”)
    #pragma注释(lib,“LLVMObject.lib”)
    #pragma注释(lib,“LLVMSupport.lib”)
    使用名称空间llvm;
    int main(int argc,字符**argv){
    InitializeEnableTarget();
    LLVMContext&context=getGlobalContext();
    执行引擎*ee;
    SMD诊断诊断;
    Module*m=ParseIRFile(“Script.s”、diag、context);
    如果(!m){
    diag.print(“LLVMSandbox”,errs());
    返回1;
    }
    m->materialalpermanently();
    ee=EngineBuilder(m).create();
    函数*func=ee->FindFunctionNamed(“main”);
    typedef int(*PFN)();
    PFN PFN=重新解释强制转换(ee->getPointerToFunction(func));
    int i=pfn();
    
    LLVM正在以极快的速度发展,很难跟上。因此,在LLVM不断向前发展的同时,找到持续工作的代码的最佳方法是查看使用LLVM构建和测试的代码


    在此情况下,您需要代码中的 LLI< /code >工具(代码>工具/LLI/code >)。它是LLVM IR的通用“执行器”,使用解释器或JIT引擎之一。它也应该在Windows上工作。您可以使用它作为实例来实例化所有所需的LLVM机制(以C++代码形式)。构建一个新的独立工具(你可以模仿它的makefile或

    CMakeLists.txt

    LLVM正在以极快的速度发展,而且很难跟上。因此,在LLVM不断向前发展的同时,找到持续工作的代码的最佳方法是查看使用LLVM构建和测试的代码


    在此情况下,您需要代码中的 LLI< /code >工具(代码>工具/LLI/code >)。它是LLVM IR的通用“执行器”,使用解释器或JIT引擎之一。它也应该在Windows上工作。您可以使用它作为实例来实例化所有所需的LLVM机制(以C++代码形式)。以及构建一个新的独立工具(您可以模仿它的makefile或

    CMakeLists.txt

    我能够将
    lli
    中的代码和我链接到的代码改编为最新版本,并在IRC中获得了更多帮助。虽然我现在有大量的include和lib,但我可能不会检查哪些可以删除,因为我将所有内容封装在DLL中,这并不需要太多优化。再次感谢。@ChristianIvicevic:你为什么要担心include和lib?链接器应该为你清理一下。也就是说,当JIT IR时,你最终会使用大部分LLVM lib。最大的大小优化是禁用你不打算交叉编译的目标。只是不喜欢有这么多不必要的东西ssary includes使文件变得比必须的大。我能够将
    lli
    中的代码和我链接到的代码改编为最新版本,并在IRC中获得了一些帮助。虽然我现在有大量的includes和lib,但我可能不会检查哪些可以删除,因为我将封装吃掉DLL中的所有内容,这就不需要太多优化。再次感谢你。@ChristianIvicevic:你为什么要担心include和lib?链接器应该为你清理一下。也就是说,当JIT IR时,你最终会使用大部分LLVM lib。最大的大小优化是禁用你不打算跨comp的目标ile到。只是我不喜欢有这么多不必要的包含,这会使文件比必须的大。