みずぴー日記

陽気なプログラマが世界を廻す

MinCamlをLLVMに対応させました

きつねさんでもわかるLLVM
柏木餅子, 風薬
達人出版会
発行日: 2013-02-08
対応フォーマット: EPUB, PDF

先日、表紙がかわいかったので、「きつねさんでもわかる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を逆アセンブルして、デバッグコードを挟みこんで、再コンパイルする

今後やりたいこと