2013-07-03 17 views
10

私も書いたC++ライブラリを使用するC++プロジェクトがあります。私はclang ++ 3.3を使ってすべてを構築しています。ライブラリ内の各ファイルは、私はその後、私はそうLLVMビットコードライブラリの作成と使用

llvm-link -o MyLibrary.bc somefile.bc someotherfile.bc etc.bc 

のような単一ビットのコードファイルにすべてのライブラリは* .BCファイルを結合するためのllvm-リンクを使用してい

clang++ -c -O -emit-llvm somefile.cpp -o somefile.bc 

としてコンパイルされますこれを概念化してオブジェクトファイルのアーカイブを作成するのと似ていると思いますが、物事がどのように作用しているかに基づいて真実だとは思いません。

私は上記のコマンドと同様のコマンドを使ってプロジェクトのソースファイルをコンパイルします。私はその後、私はネイティブオブジェクトファイル

llc -filetype=obj app.bc1 -o app.o 
にapp.bc1をコンパイルし、この

llvm-link -o app.bc1 main.bc x.bc y.bc path/to/MyLibrary.bc 

次のような単一ビットのコードファイルにライブラリビットコードファイルとともに、これらを組み合わせて(再び)LLVM-リンクを使用します

最後に私がHAPと思われるもの、しかし

clang++ app.o -o app 

打ち鳴らすには(そして、そのようなC++標準ライブラリ、などなど、私が必要とする他のネイティブライブラリに対する)このネイティブオブジェクトファイルをリンクするために再び++を使用アプリケーションのビットコードをllvm-linkすると、MyLibrary.bcの全内容が結果に含まれているように見えます。したがって、最終的なリンクは、実際に使用していないライブラリコンポーネントによって作成された参照を解決する必要があります。

私がしたいことは、アプリケーションに必要なビットコードファイルのみをMyLibrary.bcから抽出することです。私はllvm-arプログラムがあることを知っていますが、それについて読むことで私はここで助けになるという印象を得られません。私はライブラリをllvm-linkの代わりにllvm-arと組み合わせることができたと推測しましたが、わかりません。私は少しだけプッシュが必要なことを望んでいます:)

+0

リンク手順には、実行する必要がある最適化またはデッドストリッピングの兆候は含まれていません。あなたはそれを行うためのフラグを追加しようとしましたか? –

+0

あなたはllvm-linkのフラグを意味していますか?ここのドキュメントhttp://llvm.org/docs/CommandGuide/llvm-link.htmlでは、そのようなフラグについては何も話しません。私は-dceと-adceフラグを使ってoptを試してみましたが、問題はありませんでした。 –

+0

いいえ、最終リンクにあります。ライブラリをデッドストリッピングすることは本当に意味をなさない。 –

答えて

4

EDIT:それは実際に働くarです。

少し遅く、それでも誰かに関連するかもしれないが、我々はビットコードをリンクするLLVMプラグインでarld.goldを使用します。もちろん

ar r --plugin /usr/lib64/llvm/LLVMgold.so library.a <files...> 
ld.gold --plugin /usr/lib64/llvm/LLVMgold.so -plugin-opt emit-llvm main.bc library.a 

LLVMgold.soへのパスが異なる場合があります。このようにして.bcの結果としてシンボルが必要になります。

+0

Vladimirは、この性質のプラグインをAOPなどのプロセスで使用してバイトコードを計測することはできますか? –

+0

LLVMのoptを使用してビットコード計測を行うこともできますが、プラグイン(この場合はLLVMビットコードを超えるカスタムパス)もサポートしていると思います。 –

関連する問題