llvmrubyにinvoke/unwindを追加できました

昨日の日記のアサーションエラーが解決しました。原因はllvmrubyそのものでもLLVMでも無く、使い方の問題でした。

      b.invoke(f2, nd, ud)
      b.return(1.llvm)  # ここがだめ

と、invoke命令の後にreturnをつけていたのですが、これがいけなかったようです。invoke命令はreturnで戻ってくるブロック・unwindで戻ってくるブロックそれぞれ指定するため、invokeの後の命令を実行することはありません。ここにあえて命令を書いてはいけないようです。

追記
なんかunwindがcall _abortと変換されている(涙。llvmの論文によるとinvoke/unwindはテーブルを使ったインプリメントとsetjmp/longjmpを使ったインプリメントがあるみたいだからオプションで切り替えられるのかなー。ちょっと調べてみます。