22

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

我怎样才能做到这一点?

4

3 回答 3

22

这是一些基于 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 命令行工具。

于 2010-01-18T07:13:35.443 回答
14

这应该(或多或少)使用 LLVM 2.6 工作。看起来 SVN 中还有一些辅助函数可以在位码文件之上创建一个惰性 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();
}
于 2009-12-29T19:20:41.293 回答
-3

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

从 C 中很容易做到这一点。我建议您查看大量的 LLVM 文档: http: //llvm.org/docs

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

抱歉间接回答。我广泛使用 LLVM,但我直接生成代码,而不仅仅是及时编译。

于 2009-12-19T14:25:00.370 回答