Scheme Compiler の勉強 (4) - LLVM IR の出力
llvm-gcc があれば gcc と同じようにできる、と思ったらそうでもなかった。※以下、ろくにドキュメントを読んでいないので注意。
- やりたいことは llvm の instruction set を吐き出す scheme コンパイラを作る勉強。
- 困ったときは C で書いて確認(少なくとも即値を調べる段階では)。gcc 同様、llvm-gcc -S -emit-llvm も、不要な(オプショナルな)情報をいくつか含む。いまはばっさり削る。
- gcc は入力ファイルの言語を勝手に認識して、必要なものをコンパイルしてくれるが、 llvm-gcc はそうではない? llvm-gcc に llvm のアセンブラを渡しても、エラーとなる。でも、これは自分で行えばいいだけ。
これでテストが通るようになった。なるほど。下の 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")))
続く。