24

共有ライブラリを作成する CMake プロジェクトで LLVM を使用してリンク時の最適化を適用しようとしています。私の質問はこれとほとんど同じです:

CMake を使用して GCC と Clang/LLVM を切り替える

llvm-ldただし、新しいバージョンには存在しないため、回答はもう適用できないようです。コマンド ラインで、次のコマンドを実行して LTO を取得します (.cppファイルが 2 つしかない場合)。

バイトコードにコンパイル:

clang++ -c FirstClass.cpp -O3 -flto -o FirstClass.bc
clang++ -c SecondClass.cpp -O3 -flto -o SecondClass.bc

リンクバイトコード:

llvm-link FirstClass.bc SecondClass.bc -o unoptimized.bc

バイトコードを最適化:

opt -O3 unoptimized.bc -o optimized.bc

バイト コードを共有オブジェクトに変換します。

clang++ -shared optimized.bc -o libTest.so

CMake で追加の手順を実行する方法を教えてください。

4

3 に答える 3

18

Clang を使用して LTO を有効にする正しい方法は、コンパイル時リンク時の両方でコマンド ラインに-fltoフラグを使用することです。clang

さらに、LTO (一般的に Apple のプラットフォーム) を直接サポートするリンカー、または LLVM リンカー プラグイン (Gold リンカーを使用する Linux ですが、BFD リンカーをサポートするようになっているものもあると思います) を備えたプラットフォームで作業する必要があります。リンカープラグインも同様です)。リンカー プラグインを使用している場合は、LLVM のインストールでプラグインがビルドおよびインストールされていることを確認する必要があります。その場合、Clang は、-flto共有オブジェクトであっても、 とリンクするときにプラグインを使用するために必要なリンカー コマンド ライン オプションを自動的に追加します。

また、LLVM プロジェクトは、サポートするすべてのプラットフォームですぐに LTO をサポートする新しいリンカー (LLD) に取り組んでいますが、まだかなり初期の段階です。現在、Windows と Linux で LTO サポートをテストしている人々を知っています。うまく機能しているように見えますが、まだ多くの機能が欠けています。

于 2016-05-31T06:16:48.070 に答える
3

check_ipo_supported()CMake 3.9.1で「ポリシーCMP0069が設定されていません」というエラーが発生しました。

そのヘルプによると、3.8 までの CMake は Intel コンパイラの LTO のみをサポートしていました。XCode 9のclangでも機能しませんでした。

最終的に何がうまくいったか:

cmake_policy(SET CMP0069 NEW)
include(CheckIPOSupported)
check_ipo_supported()

add_executable(Foobar SOURCES)
set_target_properties(Foobar PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE)

add_executable()の後にある必要があるようcmake_policy(SET CMP0069 NEW)です。

LTO キャッシュ

target_link_libraries(Foobar "-Wl,-cache_path_lto,${PROJECT_BINARY_DIR}/lto.cache")害はありませんでした。

リンカーに応じてコマンドライン オプションを選択します。

より残忍なオプション

@ChandlerCarruthの回答によると:

if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto")
    target_link_libraries(Foobar -flto)
endif ()
于 2017-10-27T00:35:32.470 に答える