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 を読んだり)すると条件分岐が実装できる、はず。手続きを定義するまでもう少し。手続きが定義できると、ベンチマークを取ったりして遊べる。楽しみだ。
続く。