1

我开始使用 LLVM 进行编程,并尝试执行一个位码。我想出了这段代码,改编自旧示例(我的疑问是在创建MemoryBuffergetFile(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);
4

2 回答 2

1

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

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

  1. 从原样开始lli.cpp,逐渐剥离你不需要的东西。
  2. lli.cpp将相关部分从您自己的主文件中取出。

如果问题在于mainlli的.test/ExecutionEnginelli

于 2013-07-03T12:23:38.393 回答
0

在遇到与您相同的问题后,我在 lli.cpp 中搜索了对模块、引擎构建器等的所有非可选调用...

我相信您缺少的是对“ee->runStaticConstructorDestructors(false)”的调用

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

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

于 2014-05-23T02:37:32.377 回答