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を改良し, 興味のあるプログラムへ変更してゆきます.