LLVM gold プラグイン

はじめに

リンク時最適化を使用してビルドするには、システムリンカーとの連携が必要です。LinuxシステムでのLTOサポートは、プラグインを介してLTOをサポートするgoldリンカーを介して利用できます。これは、GCC LTOプロジェクトで使用されているのと同じメカニズムです。

LLVM goldプラグインは、libLTOの上にgoldプラグインインターフェースを実装します。同じプラグインは、arnmなどの他のツールでも使用できます。binutilsバージョン2.21.51.0.2以降のld.bfdもプラグインを介してLTOをサポートすることに注意してください。ただし、ld.bfdでのLLVM goldプラグインの使用はテストされておらず、そのため公式にはサポートまたは推奨されていません。

LLVM 15以降、goldプラグインはELFオブジェクトファイル内の.llvmbcセクションからのビットコードを無視します。ただし、ビットコードファイルを使用したLTOはまだサポートされています。

ビルド方法

プラグインをサポートするgoldを用意し、LLVM goldプラグインをビルドする必要があります。goldリンカーはld.goldとしてインストールされます。システムでgoldがデフォルトかどうかを確認するには、/usr/bin/ld -vを実行します。「GNU gold」と表示されるか、そうでない場合は「GNU ld」と表示されます。/usr/bin/ld.goldにgoldが既にインストールされている場合は、既存の/usr/bin/ldをバックアップし、ln -s /usr/bin/ld.gold /usr/bin/ldを使用してシンボリックリンクを作成するだけでデフォルトにすることができます。または、clangの-fuse-ld=goldでビルドするか、-fuse-ld=goldをLDFLAGSに追加すると、clangドライバは/usr/bin/ld.goldを直接呼び出すようになります。

goldがインストールされている場合は、/usr/bin/ld.gold -pluginを実行してプラグインサポートを確認します。「引数が不足しています」というエラーが表示された場合は、プラグインサポートがあります。そうでない場合、「不明なオプション」などのエラーが表示された場合は、goldをビルドするか、プラグインサポートのあるバージョンをインストールする必要があります。

  • プラグインサポート付きでgoldをダウンロード、構成、ビルドします。

    $ git clone --depth 1 git://sourceware.org/git/binutils-gdb.git binutils
    $ mkdir build
    $ cd build
    $ ../binutils/configure --enable-gold --enable-plugins --disable-werror
    $ make all-gold
    

    これにより、-pluginオプションをサポートするbuild/gold/ld-newが作成されます。makeを実行すると、プラグインをサポートするbuild/binutils/arnm-newバイナリも追加でビルドされます。

    goldの使用に切り替える準備ができたら、既存の/usr/bin/ldをバックアップしてからld-newで置き換えます。または、/usr/bin/ld.goldにインストールし、前述のように-fuse-ld=goldを使用します。

    オプションとして、上記の構成呼び出しに--enable-gold=defaultを追加して、make installを使用して新しくビルドされたgoldをデフォルトのリンカーとして自動的にインストールします。

  • LLVM goldプラグインをビルドします。-DLLVM_BINUTILS_INCDIR=/path/to/binutils/includeを使用してCMakeを実行します。正しいインクルードパスにはplugin-api.hファイルが含まれます。

使用方法

clang-fltoオプションを使用してビットコードファイルを作成する必要があります。このフラグにより、clangはプレフィックスの下のlibディレクトリでgoldプラグインを検索し、-pluginオプションをldに渡すようになります。-fuse-ld=goldを使用しない限り、別のリンカーは検索されません。そのため、パスにインストールされているシステムリンカーとしてgoldが必要になります。

arnm-pluginオプションを受け入れ、LLVMgold.so/usr/lib/bfd-pluginsにインストールしてシームレスなセットアップを行うことができます。自分でgoldをビルドした場合は、ビルドしたarnm-new/usr/binにインストールしてください。

autotoolsプロジェクトでLTOを使用するためのクイックスタート

システムのldarnmがすべてLLVMビットコードをサポートするようになると、autotoolsプロジェクトの使いやすいLTOビルドの準備が整います。

  • LLVMgold.soのビルド方法の手順に従ってください。

  • 新しくビルドしたbinutilsを$PREFIXにインストールします。

  • Release/lib/LLVMgold.so$PREFIX/lib/bfd-plugins/にコピーします。

  • 環境変数を設定します($PREFIXはclangとbinutilsをインストールした場所です)。

    export CC="$PREFIX/bin/clang -flto"
    export CXX="$PREFIX/bin/clang++ -flto"
    export AR="$PREFIX/bin/ar"
    export NM="$PREFIX/bin/nm"
    export RANLIB=/bin/true #ranlib is not needed, and doesn't support .bc files in .a
    
  • または、パスを設定するだけです。

    export PATH="$PREFIX/bin:$PATH"
    export CC="clang -flto"
    export CXX="clang++ -flto"
    export RANLIB=/bin/true
    
  • 通常どおりプロジェクトを構成してビルドします。

    % ./configure && make && make check
    

環境変数の設定は、autotools以外のプロジェクトでも機能する場合がありますが、LD環境変数も設定する必要がある場合があります。

ライセンス

goldはGPLv3ライセンスで提供されています。LLVMgoldはgoldからplugin-api.hインターフェースファイルを使用しているため、結果として得られるLLVMgold.soバイナリもGPLv3になります。これは、プラグインなしのgoldと同様に、非GPLv3プログラムをリンクするために使用できます。