LLVMのbitcode readerを書いた

今まで、moshに直接組み込む形のLLVMバインディングを使っていたけど、色々と不便なのでLLVMを直接使うのはヤメにして、一旦bitcodeを経由する形に変更。ちょっと実用するには遅すぎる。

bitcodeを得るにはclangを使って、

clang -emit-llvm -c hoge.c

とすると、hoge.oがbitcodeになっている。bitcodeをbytevectorに格納してbc→sexp-list手続きを呼ぶと、S式の形でbitcodeの内容が取り出せる。

... 
  (FUNCTION
     (DECLAREBLOCKS 1)
     (METADATA (FN_NODE2 10 724) (FN_NODE2 10 725))
     (ALLOCA 10 2 88 4)
     (ALLOCA 10 2 88 4)
     (STORE2 724 722 4 0)
     (INST_CALL2 0 0 16 3090 3074)
     (DEBUG_LOC2 339 40 2847 0)
     (STORE2 725 723 4 0)
     (INST_CALL2 0 0 16 3091 3075)
     (DEBUG_LOC2 339 51 2847 0)
...

ただ、bitstreamの入力が重い。。それ以前に、(yuni core)の簡易オブジェクトシステム(let-withとかtouch!とかdefine*とか)そのものが重い。マクロ展開時に名前の解決は済ませてしまうように書き換えないと辛いだろうなぁ。。元々はexpanderが特別扱いしてインライン化させる予定だったけど、別にR6RSの範囲で書けなくは無い気がするので。
nmosh以外のR6RS Schemeで動かすためには(yuni core)を移植しないといけない。多分simple-structさえ(recordに置き換えるなりなんなりで)どうにかすればOKなはず。
ちなみに、LLVMバインディングを使ってModuleをwalkするより100倍くらい遅い。実用的な速度で動かすには型チェック等は省略しないと。。