10

autotools ビルド システムを使用してソフトウェアを LLVM ビットコードにコンパイルしたいと考えています。つまり、最後に取得する実行可能ファイルを、実際のマシン コードではなく LLVM ビットコードにしたいと考えています。

(目標は、プログラム全体で LLVM ビットコード分析ツールを実行できるようにすることです。)

スクリプトCC="clang -emit-llvm -use-gold-plugins"のバリアントを指定しようとしましたが、役に立ちませんでした。configure常に何かがうまくいかないことがあります (たとえば、パッケージ.aが静的ライブラリをビルドし、リンカーによって拒否されるなど)。

それを行う正しい方法は、LLVMビットコードをクロスコンパイルのターゲットにすることだと思います。で設定されますが--host=、そのような標準的なターゲットはありません (Knuth の MMIX のターゲットはありますが)。

これまでのところ、手動​​でCC="clang -emit-llvm -use-gold-plugins"リンク行をコンパイルして実行するなどのクラッジを使用してきました(llvm-ldまたはを使用)。llvm-linkこれは、 などの単純なパッケージで機能しますgrep

.a堅牢で、中間ファイルや中間ターゲットがある場合を含め、すべてではないにしてもほとんどの構成スクリプトで機能する方法が必要です。

4

1 に答える 1

2

このような方法がいくつかあります。ただし、中間の静的ライブラリが使用されていない単純なビルドの場合は、もっと単純なことを行うことができます。必要なもののリストは次のとおりです。

  1. ゴールド プラグイン サポートで構成された llvm。これを参照してください
  2. ガチャガチャ
  3. fortran や go などのフロントエンドが必要な場合は、dragonegg。

重要なのは、コンパイル時とリンク時の両方で、clang または dragonegg (フロントエンド) の「-flto」を有効にすることです。clang の場合は簡単です。

CC = clang
CLINKER = clang
CFLAGS = -flto -c
CLINKFLAGS = -flto -Wl,-plugin-opt=also-emit-llvm

必要に応じて、「-plugin-opt」オプションを追加して、llvm 固有の codegen オプションを指定します。

-Wl,-plugin-opt=also-emit-llvm,-plugin-opt=-disable-fp-elim

ダンプされた問題のバイトコード全体が、最終的な実行可能ファイルと一緒に存在します。

Dragonegg を使用する場合は、さらに 2 つのものが必要です。

まず、dragonegg は llvm ゴールド プラグインの場所を認識していません。このようにリンカー フラグで指定する必要があります。-Wl,-plugin=/path/to/LLVMgold.so,-plugin-opt=...

次に、dragonegg はバイトコードではなく IR しかダンプできません。そのためには、ラッパー スクリプトが必要です。ここで作成しました。私にとってはうまくいきます。

于 2014-02-07T00:25:38.880 に答える