MinCamlをLLVMに対応させました
先日、表紙がかわいかったので、「きつねさんでもわかるLLVM」を買いました。
なので、MinCamlを改造して、バックエンドにLLVM対応コードを追加してみました。 とりあえずテステケースは全部通ったので、まとめておきます。
MinCamlとは
別名「美しい日本のMLコンパイラ」。住井先生によるMLサブセットであり、以下のようなコードを書けます。
let rec fib n =
if n <= 1 then n else
fib (n - 1) + fib (n - 2) in
print_int (fib 30)
詳しくは解説スライドあたりを読んでください。
やったこと
- バックエンド部分をLLVMにきりかえた。
- LLVMの作法に合せるために、生成させるファイル名を
foo.s
からfoo.bc
に変更した。 - ビルドが面倒だったので、
Makefile
を OASISを使って書き換えた。
ダウンロード & ビルド
LLVM本体およびOCaml bindingのインストール。
$ opam install llvm
ダウンロード & ビルド。
$ git clone git://github.com/mzp/min-caml.git
$ cd min-caml
$ ./arch/to_llvm
$ make
使い方
$ ./main.native test/fib
$ llc test/fib.bc -o test/fib.s
$ gcc -lm test/fib.s stub/stub.c stub/libmincaml.c -o test/fib
所感
MinCamlで苦労したところ
LLVM
ちょっと間違えるとsegmentation faultするので、かなりつらい。
opam install llvm
でLLVM本体とocaml-bindingがインストールできる。 ただし、make -j 4
でビルドされるので、非力なマシンでやると死ぬ。- ちょっと間違えるとassertに引っかって死ぬ。
- ちょっと間違えるとsegmentation faultで死ぬ。
- ちょっと間違えると生成したコードを実行してもsegmentation faultで死ぬ。
- きつねさんかわいい
LLVMのデバッグ
下に行くほどきびしい。
- clangで似たコードを生成してみて、比べてみる。
print_endline
を挟んで落ちている箇所を特定する。- 生成したbitcodeを逆アセンブルして、デバッグコードを挟みこんで、再コンパイルする
今後やりたいこと
- 全部が
llvalue
になってしまってかなし。ocaml-llvm-phantomを使いたい。 - せっかくLLVM対応したので、いろいろなアーキテクチャ上で動かしまくりたい。
- ベンチマークの結果を比較したい。