22

llvm.org のオンライン コンパイラを使用して bc ファイルを生成しました。この bc ファイルを ac または C++ プログラムからロードし、llvm jit を使用して bc ファイルで IR を実行できるかどうかを知りたいです (プログラムでc プログラム)、結果を取得します。

どうすればこれを達成できますか?

4

3 に答える 3

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 に答える