2012-02-05 12 views
0

私の言語バックエンドで関数と型を段階的に構築したいが、関数と型がうまく構築できないとき(ユーザー入力の問題のため)メインモジュールとコンテキストを汚染しない。llvm:JITコンテンツを徐々に構築する方法

これはan earlier questionです。 私が見ることができる1つの戦略は、一時モジュールとLLVMContextのすべてをビルドし、成功後にメインコンテキストに移行するだけですが、現在のAPIで可能かどうかはわかりません。たとえば、LLVM機能の分離された島を表現するはずなので、さまざまなコンテキスト間でそのコンテンツを移行することはわかりませんが、おそらく、すべてを.bcに保存して別の場所に読み込むという選択肢がありますか?

これを達成するために他にどのような戦略をお勧めしますか?

答えて

1

ソースと宛先の2つのモジュールがあると仮定すると、ソースから宛先へ関数をコピーすることができます。例として使用できるLLVMのコードは、LLVMリンカーの本体で、lib/linker/LinkModules.cppです。

特に、そのファイルのlinkFunctionProtolinkFunctionBodyのメソッドを見てください。 linkFunctionBodyは関数定義をコピーし、重い持ち上げにはllvm::CloneFunctionIntoユーティリティを使用します。 LLVMContextについては


あなたが特に異なるスレッドで同時に複数のLLVMのインスタンスを実行する必要がない限り、あまり心配とちょうどコンテキストが必要とされているすべての箇所getGlobalContext()を使用しないでください。詳細については、this doc pageをお読みください。

+0

長時間実行されているサービスプロセスから呼び出され、グローバルLLVMContextを保持すると、おそらく無制限になるため、複数のLLVMContextを保持する必要があります。個々のLLVMContextはメモリ管理とガベージコレクションを改善します(シングルスレッドプロセス内で実行されている場合でも) – lurscher

+0

@lurscher:私は真剣に "無限に成長するだろう"と真剣に疑う。単一のコンテキストとベンチマーク/プロファイリングを使用して実装することをお勧めします。ほとんどのメモリ使用量は重要ではありません。リンク先のページにあるように、コンテキスト間でメモリ内のデータ構造を渡すことはできません。私はあなたがそれらをビットコードに直列化し、反対側で(別のコンテキストで)それらを直列化解除することができると想像します。 –

+0

ええ、私もそう思っていました。ありがとう! – lurscher

関連する問題