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

0

あなたと同じ問題に遭遇した後、lli.cpp を検索して、モジュール、エンジンビルダーなどへのオプションではないすべての呼び出しを探しました...

あなたが見逃しているのは、「ee->runStaticConstructorDestructors(false)」への呼び出しだと思います

少なくとも、これで問題は解決しました

注: これは llvm3.4 の下にありますが、同じ命令が llvm3.1 にも存在することを確認しました。これは、おそらく 3.3 にも存在することを示しています。

于 2014-05-23T02:37:32.377 に答える