LLVM for Grad Students 大学院生のためのLLVM を訳す5
Let’s Write a Pass
通常LLVMの研究は、パスを書くことを意味する.
この章では, ビルドを通して簡単なプログラムを変換するパスを動作させる.
A Skeleton
私は無駄なLLVMのパスが含まれているテンプレートリポジトリ
sampsyo/llvm-pass-skeleton · GitHub
フルスクラッチでやると, ビルド設定のとき痛い目をみるかもしれない.
$ git clone git@github.com:sampsyo/llvm-pass-skeleton.git
- 実際の作業は、skeleton/Skeleton.cppで行われる.開くとつぎのようになっている部分がある:
virtual bool runOnFunction(Function &F) { errs() << "I saw a function called " << F.getName() << "!\n"; return false; }
LLVMパスにはいくつかの種類があり、我々はfunctionパスと呼ばれる1つのpassを使用しています(はじめはこれがいい).
期待した通りに, すべての"Function"をコンパイルしているプログラムの中で見つけ, 上記のメソッドを呼び出します.
それはすべてのメソッド名前を出力します. 逆に言えば変換するときはtrueを変えさせる必要がある.
Details:
errs() はコンソールに出力するために使用できるLLVMが提供するC++出力ストリームである.
functionはFが変更していない場合はFalseを返り値として返す.
Build It (構築)
CMakeでパスを構築する.$ cd llvm-pass-skeleton $ mkdir build $ cd build $ cmake .. # Generate the Makefile. $ make # Actually build the pass.
もしLLVMが環境にインストールされていない場合, どこにあるかCmakeに教える必要があります.
あなたはLLVM_DIR環境変数に格納された中のshare/llvm/cmake/ディレクトリへのパスを与えることによって, LLVMを構築することができる.4
ここではHomebrewのPathを説明します.
$ LLVM_DIR=/usr/local/opt/llvm/share/llvm/cmake cmake ..
構築するあなたのパスは共有ライブラリを生成する.
/build/skeleton/libSkeltonPass.soか同じような名前をあなたの依存プラットフォームから見つけることができる.
つぎのステップでは, このライブラリをいくつかの実際のPassコードの実行中ロードします.
Run It (実行)
新しいPassを実行するとき, Cプログラム上のclangと実行し, さきほどコンパイルした共有ライブラリのフラグを使用する.clang -Xclang -load -Xclang build/skeleton/libSkeletonPass.* something.c
- Xclang -load -Xclang path/to/lib.so はClangのパスをアクティブにしてロードします(
Adrian Sampson: Run an LLVM Pass Automatically with Clang
).
もし大規模なプロジェクトを処理する必要があるならば, MakefileのCFLAGSにそれらの引数やビルド環境を追加することができる.
(独立したclangの実行から一度で一つのパスができる. これにはoptコマンドを利用する. この方法は公式でやられているので省略する.)
おめでとう. これであなたも開発者です. つぎの ステップでは, hello-world Passを改良し, 興味のあるプログラムへ変更してゆきます.