Scheme Compiler の勉強 (4) - LLVM IR の出力

llvm-gcc があれば gcc と同じようにできる、と思ったらそうでもなかった。※以下、ろくにドキュメントを読んでいないので注意。

  • やりたいことは llvm の instruction set を吐き出す scheme コンパイラを作る勉強。
  • 困ったときは C で書いて確認(少なくとも即値を調べる段階では)。gcc 同様、llvm-gcc -S -emit-llvm も、不要な(オプショナルな)情報をいくつか含む。いまはばっさり削る。
  • gcc は入力ファイルの言語を勝手に認識して、必要なものをコンパイルしてくれるが、 llvm-gcc はそうではない? llvm-gccllvmアセンブラを渡しても、エラーとなる。でも、これは自分で行えばいいだけ。

これでテストが通るようになった。なるほど。下の emit-program が本質部分。

;; compiler.scm 
(define (emit-program x)
  ;; for LLVM
  (unless (immediate? x) (error ---))
  (emit "define i32 @scheme_entry() nounwind  {")
  (emit "entry:")
  (emit "ret i32 ~s" (immediate-rep x))
  (emit "}"))
;; tests-driver.scm

(define (build)
  (unless (zero? (system "llvm-as -f -o stst.bc stst.s"))
	  (error "fail to llvm-as to generate stst.bc"))
  (unless (zero? (system "llc -f -o stst.n.s stst.bc"))
	  (error "fail to llc to generate stst.n.s"))
  (unless (zero? (system "llvm-gcc -o stst runtime.c stst.n.s"))
	  (error 'make "could not build target")))

続く。