2009-12-03 17 views
22

llvm.orgのオンラインコンパイラでbcファイルを生成しました。このbcファイルをacまたはC++プログラムから読み込むことが可能かどうか知りたいです。 bcファイルをllvm jit(プログラムではCプログラム)に置き換えて、結果を取得します。cプログラムからLLVM Jitを呼び出してください。

どうすればこの問題を解決できますか?

答えて

-3

コマンドラインから、LLVMプログラムlliを使用してbcファイルを実行できます。ファイルがLLVMアセンブリ言語である場合は、最初にllvm-asを実行してバイナリビットコードファイルを作成する必要があります。

私があなたが大規模なLLVMのドキュメントを見てお勧めしますC.からこれを行うには簡単です:そのページ上のリンクを持っているhttp://llvm.org/docs

LLVMのIRCチャンネルは、その非常に博識の人でいっぱいです質問に答えようとしている。

間接的な回答は申し訳ありません。私は広範囲にLLVMを使用していますが、私は時間の合併だけでなく、直接コード生成も行います。

15

これは、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(); 
} 
23

ここネイサンハウエルさんに基づいていくつかの作業コードです:

#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コマンドラインツールを使用しました。

+1

Doh、#を含めると、リンカーがJITを強制的にプルする必要があります。そうでなければ、それは破棄されます。サンプルを更新します。 –

+0

これを行うためのAPIはありますか? – Ariel

+1

Ariel:はい、ほとんどのLLVMはLLVM自体で提供されているバインディングを使用してプレーンCから使用できます。 http://llvm.org/docs/FAQ.html#langirgenとhttp://npcontemplation.blogspot.com/2008/06/secret-of-llvm-c-bindings.html –

関連する問題