LLVM-IRの作り方
PROCESS WARPではLLVM-IRを読み込んでプログラムを実行しています。 この記事では、LLVM-IRを作成する環境(MacOSX/Linux)と実際にLLVM-IRを生成する簡単な手順を説明します。
内容
では始めましょう。
clang/llvmをインストールする(MacOSX + homebrew)
XCodeのインストール
MacOSXでclangを使う最も手っ取り早い方法はXCodeに付属の物を使うことです。AppStoreからXCodeを検索し、インストールします。
homebrewのインストール
llvmはhomebrewからインストールする方法が簡単です。(configure & makeに慣れていなければ) homebrewをインストールしていない場合、homebewをインストールします。 Homebrew — OS X用パッケージマネージャー 5/14現在のインストール方法は、ターミナルの起動して以下のコマンドを実行します。 最新のインストール方法はオフィシャルページから確認しましょう。
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
llvmのインストール
homebrewからllvmをインストールします。 ターミナルから以下のコマンドを実行します。(PROCESS WARPではversion 3.5での動作を確認しているためllvm35を指定しています)
$ brew install llvm35
インストールしただけではインストール先がPATHに入っておらずコマンドを呼び出すのが面倒です。 ターミナルから以下のコマンドを実行し、環境変数PATHにインストール先を追加します。(パスはバージョンに合わせて変更します)
$ PATH=$PATH:/usr/local/Cellar/llvm/3.5.1/bin/ $ export PATH
~/.bashrcに書き加えるとターミナル起動時に設定されます。 コマンドが使えるようになったことを確認します。
$ which llvm-dis
/usr/local/Cellar/llvm/3.5.1/bin/llvm-dis
clang/llvmをインストールする(Linux)
Linux環境でclang/llvmをインストールするにはディストリビューションごとのパッケージマネージャを利用するのが簡単です。ubuntuの場合、以下のコマンドを実行すればインストールされます。
$ sudo apt-get install clang-3.5 llvm-3.5
ubuntuではclang/llvmを複数バージョン同時インストールするできるようにコマンドの末尾にバージョン番号が付いているようです。例えば、clangは以下のようになっています。
$ which clang-3.5 /usr/bin/clang-3.5
LLVM-IRを生成する
LLVM-IR(.llファイル)の生成に入ります。 ここではMacOSX環境下でC/C++で書いたプログラムの変換を例示します。 Linux環境ではコマンドを読み替えてください。
clangでソースファイルをllvmのバイナリ形式までコンパイルします。
$ clang -O2 -emit-llvm -fno-exceptions -fno-vectorize -c <ソースファイル>
オプションは以下のとおりです。
- -O2:最適化の指定です。普通のC/C++のコンパイル同様です。LLVM-IRにも最適化が適用されます。Iオプションなども指定できますがPROCESS WARPは現在他の標準ライブラリとOpenGL以外のライブラリの呼び出しに対応していないので省略します。
- -emit-llvm:出力をllvmのバイナリ形式にするためのオプションです。
- -fno-exceptions:例外処理を使わないことを明示します。PROCESS WARPではまだC++の例外を使えないために指定しています。
- -fno-vectorize:SIMDを使った最適化を抑止します。PROCESS WARPではまだSIMD命令に対応していないため指定しています。
- -c:llvmのバイナリ形式で出力する場合、リンクを行わないため指定しています。
実行すると<ソースファイル>.bcファイルが出力されます。llvm-disでLLVM-IRに変換します。
$ llvm-dis <ソースファイル>.bc
変換が成功すると、<ソースファイル>.llファイルが出力されます。
以上です、お疲れ様です。