Scheme Compiler の勉強(17) - c->llvm-ir

いままでは地味に "llvm-gcc -O3 -emit-llvm -o c-test.s c-test.c" なんてのを手で入力して、 LLVM IR を調べていた。でもよく考えるといちいち shell (実際は eshell だけど)でコマンドを打つなんて面倒。c->llvm-ir という scheme の手続きをでっちあげた(単に上記のコマンドを scheme から呼ぶだけ)。

gosh> (c->llvm-ir "int main(int argc) { if (argc==1) { foo();} else { bar();}; baz();}")
; ModuleID = 'c-cheat.c'
target datalayout = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f128:64:128"
target triple = "powerpc-apple-darwin8"

define i32 @main(i32 %argc) nounwind  {
entry:
	%tmp1 = icmp eq i32 %argc, 1		; <i1> [#uses=1]
	br i1 %tmp1, label %bb, label %bb4

bb:		; preds = %entry
	%tmp3 = tail call i32 (...)* @foo( ) nounwind 		; <i32> [#uses=0]
	br label %bb6

bb4:		; preds = %entry
	%tmp5 = tail call i32 (...)* @bar( ) nounwind 		; <i32> [#uses=0]
	br label %bb6

bb6:		; preds = %bb4, %bb
	%tmp7 = tail call i32 (...)* @baz( ) nounwind 		; <i32> [#uses=0]
	ret i32 undef
}

declare i32 @foo(...)

declare i32 @bar(...)

declare i32 @baz(...)
#<undef>
gosh> 

これを眺めたり(あるいはまっとうに http://llvm.org/docs/tutorial/LangImpl5.html を読んだり)すると条件分岐が実装できる、はず。手続きを定義するまでもう少し。手続きが定義できると、ベンチマークを取ったりして遊べる。楽しみだ。

続く。