llvm.org のオンライン コンパイラを使用して bc ファイルを生成しました。この bc ファイルを ac または C++ プログラムからロードし、llvm jit を使用して bc ファイルで IR を実行できるかどうかを知りたいです (プログラムでc プログラム)、結果を取得します。
どうすればこれを達成できますか?
これは (多かれ少なかれ) 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();
}
コマンドラインから、LLVM プログラム lli を使用して bc ファイルを実行できます。ファイルが LLVM アセンブリ言語の場合は、最初に llvm-as を実行してバイナリ ビットコード ファイルを作成する必要があります。
C からこれを行うのは簡単です。詳細な LLVM ドキュメントを参照することをお勧めします: http://llvm.org/docs
そのページにリンクがある LLVM irc チャンネルには、質問に喜んで答えてくれる知識豊富な人々がたくさんいます。
間接的な回答で申し訳ありません。私は LLVM を広く使用していますが、時間のコンパイルだけでなく直接コード生成も行っています。