インストール - LLVM
ナビゲーションに移動
検索に移動
概要
LLVMプロジェクトは、モジュール化され再利用可能なコンパイラとツールチェイン技術の集合体である。
イリノイ大学の研究プロジェクトとして始まり、任意のプログラミング言語の静的 / 動的コンパイルをサポートできる、SSAベースの近代的なコンパイル戦略を提供することを目的としていた。
その後、LLVMは多くのサブプロジェクトからなるアンブレラプロジェクトに成長して、その多くは、学術研究において広く利用されるだけでなく、様々な商用およびオープンソースプロジェクトによって稼働している。
LLVMの主なサブプロジェクトを、以下に示す。
- LLVMコアライブラリ
- ソースコードやターゲットに依存しない最新のオプティマイザと、多くの一般的なCPUに対応したコード生成機能を提供する。
- これらのライブラリは、LLVM中間表現(LLVM IR)として知られる指定されたコード表現を中心に構築されている。
- LLVMコアライブラリは文書化されており、LLVMをオプティマイザやコード生成器として使用するための独自の言語の考案(または既存のコンパイラの移植)が容易である。
- Clang
- LLVMネイティブのC / C++ / Objective-Cコンパイラにおいて、速いコンパイル、非常に有用なエラーと警告メッセージ、優れたソースレベルツールを構築するためのプラットフォームを提供することを目的としている。
- Clang Static Analyzerとclang-tidyは、コードのバグを自動的に見つけるツールであり、C / C++コードを解析するライブラリとしてClangフロントエンドを使用して構築できる。
- libc++およびlibc++ ABIプロジェクト
- C++11およびC++14の完全サポートを含むC++標準ライブラリの標準準拠かつ高性能な実装を提供する。
- compiler-rtプロジェクト
- __fixunsdfdi等の低レベルコードジェネレータサポートルーチンや、ターゲットがコアIR操作を実装するための短いネイティブ命令列を持っていない場合に発生するその他のコールの高度に調整された実装を提供する。
- また、AddressSanitizer、ThreadSanitizer、MemorySanitizer、DataFlowSanitizer等の動的テストツールのランタイムライブラリの実装を提供している。
- MLIRサブプロジェクト
- 再利用可能で拡張性のあるコンパイラ基盤を構築するための新しいアプローチである。
- MLIRは、ソフトウェアの断片化の対処、異種ハードウェアに対するコンパイルの改善、ドメイン固有のコンパイラを構築するコストを大幅に削減する等、既存のコンパイラの接続を支援することを目的としている。
- OpenMPサブプロジェクト
- ClangのOpenMP実装で使用するためのOpenMPランタイムを提供する。
- pollyプロジェクト
- 多面体モデルを用いて、自動並列化やベクトル化だけでなく、キャッシュローカリティ最適化のスイートも実装している。
- libclcプロジェクト
- OpenCL標準ライブラリの実装を目的としている。
- kleeプロジェクト
- 定理証明器を用いてプログラムの動的パスの評価を行い、バグの発見や関数の性質を証明する"記号的仮想機械"を実装している。
- kleeの大きな特徴は、バグを検出した際にテストケースを生成することができる点である。
- LLDプロジェクト
- リンカのことであり、システムリンカのドロップイン置き換えで、高速に動作する。
- BOLTプロジェクト
- ポストリンクオプティマイザである。
- サンプリングプロファイラで収集した実行プロファイルをもとに、ソフトウェアのコードレイアウトを最適化することにより、高速化を実現する。
LLVMのインストール
パッケージ管理システムからインストール
sudo zypper install llvm llvm-gold llvm-polly clang lldb lld
ソースコードからインストール
LLVMのGithubから、LLVMのソースコードをダウンロードする。
ダウンロードするファイルは、llvm-project-<バージョン>.src.tar.xzである。
ダウンロードしたLLVMのソースコードを解凍する。
tar xf llvm-project-<バージョン>.src.tar.xz
LLVMのビルドディレクトリを作成する。
cd llvm-project mkdir build && cd build
LLVMをビルドおよびインストールする。
cmake -G "Unix Makefiles" \ -DCMAKE_C_COMPILER=<GCC 8以降のgccコンパイラのパス> -DCMAKE_CXX_COMPILER=<GCC 8以降のg++コンパイラのパス> \ -DLLVM_TARGETS_TO_BUILD="X86;AArch64" \ # x86, x86-64, AArch64向けのLLVMをビルドする場合(デフォルトは全てのアーキテクチャ) -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=<LLVMのインストールディレクトリ> \ -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;compiler-rt;flang;libclc;lld;lldb;mlir;openmp;polly" \ -DLLVM_ENABLE_RUNTIMES="compiler-rt;libc;libcxx;libcxxabi;libunwind;openmp" \ ../llvm make -j $(nproc) make install # または cmake -G Ninja \ -DCMAKE_C_COMPILER=<GCC 8以降のgccコンパイラのパス> -DCMAKE_CXX_COMPILER=<GCC 8以降のg++コンパイラのパス> \ -DLLVM_TARGETS_TO_BUILD="X86;AArch64" \ # x86, x86-64, AArch64向けのLLVMをビルドする場合(デフォルトは全てのアーキテクチャ) -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=<LLVMのインストールディレクトリ> \ -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;compiler-rt;flang;libclc;lld;lldb;mlir;openmp;polly" \ -DLLVM_ENABLE_RUNTIMES="compiler-rt;libc;libcxx;libcxxabi;libunwind;openmp" \ ../llvm ninja -j $(nproc) ninja install
ビルド向けオプションは、以下の通りである。
- PYTHON_EXECUTABLE
- Pythonへのパスを渡すことで、CMakeに特定のPythonのバージョンを使用する。
- デフォルトでは環境変数PATHにあるPythonが使用される。
- LLVM_TARGETS_TO_BUILD
- ビルドするターゲットを選択する。
- これは、LLVMにどのターゲットをリンクするかを制御するセミコロンで区切られたリストである。
- デフォルトは、LLVM_ALL_TARGETSとして定義されている。
- デフォルトでは、以下のターゲットが含まれる。
- AArch64, AMDGPU, ARM, AVR, BPF, Hexagon, Lanai, Mips, MSP430, NVPTX, PowerPC, RISCV, Sparc, SystemZ, WebAssembly, X86, XCore
- LLVM_ENABLE_DOXYGEN
- ソースコードからdoxygenベースのドキュメントをビルドする。
- これは多くの出力を生成するため、デフォルトでは無効になっている。
- LLVM_ENABLE_PROJECTS
- 他のLLVMサブプロジェクトの内、どのプロジェクトを追加でビルドするかをセミコロンで区切ったリストで指定する。
- デフォルトでは空のリストである。
- ビルドできるプロジェクトは、以下の通りである。
- clang、clang-tools-extra、compiler-rt、cross-project-tests、flang、libc、libclc、libcxx、libcxxabi、libunwind、lld、lldb、mlir、openmp、polly、pstl
- LLVM_ENABLE_SPHINX
- Sphinxベースのドキュメントをビルドする。
- これは多くの出力を生成するため、デフォルトでは無効になっている。
- Sphinx 1.5以降を推奨する。
- LLVM_BUILD_LLVM_DYLIB
- libLLVM.soを生成する。
- このライブラリには、LLVMコンポーネントのデフォルトセットが含まれており、LLVM_DYLIB_COMPONENTSでオーバーライドすることができる。
- デフォルトでは、ほとんどのLLVMが含まれており、tools/llvm-shlib/CMakelists.txtで定義されている。
- このオプションはWindowsでは使用できない。
- LLVM_OPTIMIZED_TABLEGEN
- リリーステーブル生成器を構築する。
LLVMのインストール完了後、~/.profileファイル等に環境変数を設定する。
export PATH="/<LLVMのインストールディレクトリ>/bin:$PATH" export LLVM_INSTALL_DIR="<LLVMのインストールディレクトリ>" export LDFLAGS="-L/<LLVMのインストールディレクトリ>/lib" # 不要の可能性あり export CPPFLAGS="-I/<LLVMのインストールディレクトリ>/include" # 不要の可能性あり
LLVMのクロスコンパイル
LLVMの実行ファイルやライブラリにおいて、ビルドされるプラットフォームとは異なるプラットフォームでホストするためにインストールすることができる。
クロスコンパイル向けのビルドファイルを生成するために、-DCMAKE_TOOLCHAIN_FILE
オプションを、LLVMのインストール時に使用するコンパイラフラグや変数を定義することができる。
以下の例では、iOSをターゲットとしたLLVMをクロスビルドおよびインストールしている。
mkdir build && cd build cmake -G Ninja "Unix Makefiles" \ -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=<LLVMのインストールディレクトリ> \ -DCMAKE_OSX_ARCHITECTURES="armv7;armv7s;arm64" \ -DCMAKE_TOOLCHAIN_FILE=<PATH_TO_LLVM>/cmake/platforms/iOS.cmake \ -DLLVM_BUILD_RUNTIME=Off -DLLVM_INCLUDE_TESTS=Off \ -DLLVM_INCLUDE_EXAMPLES=Off -DLLVM_ENABLE_BACKTRACES=Off \ ../llvm ninja -j $(nproc) ninja install