如何使用LLVM 3.3执行bitcode文件?

时间:2013-07-03 09:45:38

标签: llvm

我开始使用LLVM进行编程,并尝试执行bitcode。 我想到了这个代码,改编自旧例子(我怀疑是MemoryBuffer的创建,getFile(string)不再存在了):

    string *errorString = new string;
    LLVMContext context;

    OwningPtr<MemoryBuffer> *mb = new OwningPtr<MemoryBuffer>;
    MemoryBuffer::getFileOrSTDIN(argv[1], *mb);
    Module *m = ParseBitcodeFile(mb->take(), context, errorString);
    ExecutionEngine *ee = EngineBuilder(m).create();

    Function *main = m->getFunction("main");

从这一行起无效(分段错误)

1 - “标准”方法?

    void * f = ee->getPointerToFunction(main);
    void (*FP)() = (void (*)()) f;

2 - lli的方法,不确定envp的'0'

    vector<string> *argList = new vector<string>;
    ee->runFunctionAsMain(main, *argList, 0);

3 - 2的概括。

    vector<struct GenericValue> *argList = new vector<struct GenericValue>;
    ee->runFunction(main, *argList);

2 个答案:

答案 0 :(得分:1)

lli工具是您的参考。作为官方LLVM工具以及存储库和发行版的一部分,它始终与最新的LLVM API保持同步。文件tools/lli/lli.cpp只有大约500行代码,大部分是头文件,选项定义和注释。 main函数包含确切的执行流程,并且结构清晰,注释完整。

您可以选择以下两种方法之一:

  1. lli.cpp开始,逐步剥离您不需要的内容。
  2. lli.cpp中的相关部分放入您自己的主文件中。

  3. 如果问题出在您的main上,您总是可以在LLVM测试中找到实际与lli一起运行的bitcode文件示例 - test/ExecutionEngine - 大多数测试都有bitcode文件调用lli并成功运行。

答案 1 :(得分:0)

在遇到与您相同的问题后,我通过lli.cpp搜索了对模块,引擎制造商等的所有非可选调用...

我相信你缺少的是对“ee-&gt; runStaticConstructorDestructors(false)”的调用

至少,这为我解决了这个问题

注意:这是在llvm3.4下,但我已经验证llvm3.1中也存在相同的指令,表明它可以存在于3.3中。