llvm.orgのオンラインコンパイラでbcファイルを生成しました。このbcファイルをacまたはC++プログラムから読み込むことが可能かどうか知りたいです。 bcファイルをllvm jit(プログラムではCプログラム)に置き換えて、結果を取得します。cプログラムからLLVM Jitを呼び出してください。
どうすればこの問題を解決できますか?
llvm.orgのオンラインコンパイラでbcファイルを生成しました。このbcファイルをacまたはC++プログラムから読み込むことが可能かどうか知りたいです。 bcファイルをllvm jit(プログラムではCプログラム)に置き換えて、結果を取得します。cプログラムからLLVM Jitを呼び出してください。
どうすればこの問題を解決できますか?
コマンドラインから、LLVMプログラムlliを使用してbcファイルを実行できます。ファイルがLLVMアセンブリ言語である場合は、最初にllvm-asを実行してバイナリビットコードファイルを作成する必要があります。
私があなたが大規模なLLVMのドキュメントを見てお勧めしますC.からこれを行うには簡単です:そのページ上のリンクを持っているhttp://llvm.org/docs
LLVMのIRCチャンネルは、その非常に博識の人でいっぱいです質問に答えようとしている。
間接的な回答は申し訳ありません。私は広範囲にLLVMを使用していますが、私は時間の合併だけでなく、直接コード生成も行います。
これは、LLVM 2.6を使用すると多かれ少なかれ動作するはずです。ビットコードファイルの上に怠惰なModuleProviderを作成するために、SVNにいくつかのヘルパー関数があるようです。私はそれをコンパイルしようとしていない、ちょうど私のJITアプリケーションの1つからいくつかのビットを一緒に接着した。
#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();
}
ここネイサンハウエルさんに基づいていくつかの作業コードです:
#include <string>
#include <memory>
#include <iostream>
#include <llvm/LLVMContext.h>
#include <llvm/Target/TargetSelect.h>
#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;
Module *m = ParseBitcodeFile(MemoryBuffer::getFile("tst.bc"), context, &error);
ExecutionEngine *ee = ExecutionEngine::create(m);
Function* func = ee->FindFunctionNamed("main");
typedef void (*PFN)();
PFN pfn = reinterpret_cast<PFN>(ee->getPointerToFunction(func));
pfn();
delete ee;
}
一つ奇妙には、最終的にはせず、EEがNULLであるということでした。奇妙な。
私はtst.bcを生成するために、http://llvm.org/demo/index.cgiとllvm-asコマンドラインツールを使用しました。
Doh、#を含めると、リンカーがJITを強制的にプルする必要があります。そうでなければ、それは破棄されます。サンプルを更新します。 –
これを行うためのAPIはありますか? – Ariel
Ariel:はい、ほとんどのLLVMはLLVM自体で提供されているバインディングを使用してプレーンCから使用できます。 http://llvm.org/docs/FAQ.html#langirgenとhttp://npcontemplation.blogspot.com/2008/06/secret-of-llvm-c-bindings.html –