从c程序调用LLVM Jit

时间:2009-12-03 07:43:24

标签: llvm jit llvm-ir

我已经在llvm.org上使用在线编译器生成了一个bc文件,我想知道是否可以从ac或c ++程序加载这个bc文件,用llvm jit执行bc文件中的IR (以编程方式在c程序中),并获得结果。

我该如何做到这一点?

3 个答案:

答案 0 :(得分:23)

以下是一些基于Nathan Howell的工作代码:

#include <string>
#include <memory>
#include <iostream>

#include <llvm/LLVMContext.h>
#include <llvm/Target/TargetSelect.h>
#include <llvm/Bitcode/ReaderWriter.h>
#include <llvm/ExecutionEngine/ExecutionEngine.h>
#include <llvm/ModuleProvider.h>
#include <llvm/Support/MemoryBuffer.h>
#include <llvm/ExecutionEngine/JIT.h>

using namespace std;
using namespace llvm;

int main()
{
    InitializeNativeTarget();
    llvm_start_multithreaded();
    LLVMContext context;
    string error;
    Module *m = ParseBitcodeFile(MemoryBuffer::getFile("tst.bc"), context, &error);
    ExecutionEngine *ee = ExecutionEngine::create(m);

    Function* func = ee->FindFunctionNamed("main");

    typedef void (*PFN)();
    PFN pfn = reinterpret_cast<PFN>(ee->getPointerToFunction(func));
    pfn();
    delete ee;
}

一个奇怪的是,没有最终的包含,ee就是NULL。奇异。

要生成我的tst.bc,我使用了http://llvm.org/demo/index.cgi和llvm-as命令行工具。

答案 1 :(得分:15)

这应该(或多或少)使用LLVM 2.6。看起来SVN中有一些辅助函数可以在bitcode文件之上创建一个惰性ModuleProvider。我没有尝试过编译它,只是将我的一个JIT应用程序中的一些内容粘在一起。

#include <string>
#include <memory>

#include <llvm/Bitcode/ReaderWriter.h>
#include <llvm/ExecutionEngine/ExecutionEngine.h>
#include <llvm/ModuleProvider.h>
#include <llvm/Support/MemoryBuffer.h>
#include <llvm/ExecutionEngine/JIT.h>

using namespace std;
using namespace llvm;

int main()
{
    InitializeNativeTarget();
    llvm_start_multithreaded();
    LLVMContext context;

    string error;
    auto_ptr<MemoryBuffer> buffer(MemoryBuffer::getFile("bitcode.bc"));
    auto_ptr<Module> module(ParseBitcodeFile(buffer.get(), context, &error));
    auto_ptr<ModuleProvider> mp(new ExistingModuleProvider(module));
    module.release();

    auto_ptr<ExecutionEngine> ee(ExecutionEngine::createJIT(mp.get(), &error));
    mp.release();

    Function* func = ee->getFunction("foo");

    typedef void (*PFN)();
    PFN pfn = reinterpret_cast<PFN>(ee->getPointerToFunction(func));
    pfn();
}

答案 2 :(得分:-3)

从命令行,您可以使用LLVM程序lli运行bc文件。如果文件是LLVM汇编语言,则必须首先运行llvm-as,以创建二进制bitcode文件。

从C执行此操作非常简单。我建议您查看大量的LLVM文档:http://llvm.org/docs

LLVM irc频道在该页面上有一个链接,里面有很多知识渊博的人,他们愿意回答问题。

对不起间接答复。我广泛使用LLVM,但我不是直接代码生成,而是仅仅及时补充。