FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

MicrosoftのC言語拡張"Checked-C"のLLVM環境をビルドする(公開LLVMリポジトリにガッカリ...)

f:id:msyksphinz:20160520003556j:plain

前回の続き。MicrosoftC言語拡張 "Checked-C" のLLVM環境が公開されているので、ビルドに挑戦してみる。

msyksphinz.hatenablog.com

使用したのはVagrant上で構築されたUbuntu-14.04だ。ちなみにメモリは8GB程度必要になる。LLVMエグいな!

github.com

リポジトリのクローン

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];
    }
  }
}

もうちょっと進化してから期待だな。。。