LLVM-IRの作り方

PROCESS WARPではLLVM-IRを読み込んでプログラムを実行しています。 この記事では、LLVM-IRを作成する環境(MacOSX/Linux)と実際にLLVM-IRを生成する簡単な手順を説明します。

内容

  • clang/llvmをインストールする(MacOSX + homebrew)
  • clang/llvmをインストールする(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ファイルが出力されます。

以上です、お疲れ様です。