前回の続き。MicrosoftのC言語拡張 "Checked-C" のLLVM環境が公開されているので、ビルドに挑戦してみる。
使用したのはVagrant上で構築されたUbuntu-14.04だ。ちなみにメモリは8GB程度必要になる。LLVMエグいな!
リポジトリのクローン
Checked-C LLVMの注意事項
これはトライアルした後に気が付いたのだが、現在のClangおよびLLVMでは、Checked-Cの文法はサポートされているものの、実際にアセンブリに違いが現れるわけではない。 それなら何のために公開したのかいまいち理解に苦しむが、ちゃんとある程度コンパイラによる効果が見えてから公開すればよいのに。。。
Extended LLVM/clang with a feature flag -fcheckedc-extension. This flag is valid only for C programs. It cannot be used with C++, Objective C, or OpenCL. Implemented parsing and typechecking for the new ptr, array_ptr, and checked array types, including implicit conversions described in Section 5.1.4 of the Checked C specification. The new types are converted to unchecked types during compilation, so they do not have any bounds checking yet.
git clone https://github.com/Microsoft/checkedc-llvm git checkout master cd checkedc-llvm/tools git clone https://github.com/Microsoft/checkedc-clang git checkout master cd ../projects/checkedc-wrapper git clone https://github.com/Microsoft/checkedc git checkout master
ビルド
ちなみにビルドにはCMakeの比較的新しいバージョンが必要だ。CMakeの公式サイトからダウンロードしてインストールしておくのが無難だ。
mkdir work/build cd work/build cmake ../../checkedc-llvm/ -DLLVM_TARGETS_TO_BUILD="X86" -DCMAKE_INSTALL_PREFIX=/home/vagrant/work/checkedc
上記のようにしてOut-of sourceビルドが必要になる。あとはmakeとmake installをするだけだ。全体で私のマシンでは1時間近くかかった。
インストールディレクトリに、LLVMのバイナリ一式が格納されていることが分かる。
~/work/checkedc$ ls -lt total 48 drwxr-xr-x 2 root root 4096 Jun 21 16:34 bin drwxr-xr-x 4 root root 4096 Jun 21 16:32 lib drwxr-xr-x 6 root root 4096 Jun 21 16:32 share drwxr-xr-x 2 root root 4096 Jun 21 16:32 libexec drwxr-xr-x 6 root root 4096 Jun 21 16:30 include drwxrwxr-x 2 vagrant vagrant 4096 Jun 21 14:37 tests -rw-rw-r-- 1 vagrant vagrant 3973 Jun 21 14:37 CONTRIBUTING.md -rw-rw-r-- 1 vagrant vagrant 1125 Jun 21 14:37 LICENSE.TXT -rw-rw-r-- 1 vagrant vagrant 2132 Jun 21 14:37 MAILING-LISTS.md -rw-rw-r-- 1 vagrant vagrant 1364 Jun 21 14:37 README.md drwxrwxr-x 3 vagrant vagrant 4096 Jun 21 14:37 spec -rw-rw-r-- 1 vagrant vagrant 3126 Jun 21 14:37 WishList.md
Checked-Cプログラムのコンパイルを行う
以下のプログラムをコンパイルしてみる。
void add(int a checked[2][2], int b checked[2][2]) { for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { a[i][j] += b[i][j]; } } }
上記の-fcheckedc-extensionオプションを付加してコンパイルしてみる。
$ clang -fcheckedc-extension test.c -c $ objdump test.o | less
ちなみにコンパイル結果は通常のC言語プログラムのコンパイル結果と同一である。。。
void add(int a[2][2], int b[2][2]) { for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { a[i][j] += b[i][j]; } } }
もうちょっと進化してから期待だな。。。