llvmrubyにinvoke/unwindを追加してはまっています。

llvmrubyはinvoke/unwind命令の生成がまだサポートされていないので、それらの命令のサポートを作っています。作るのはそれほど難しくないのですが、変なアサーションが出ます。

assertion "use_empty() && "Uses remain when a value is destroyed!"" failed: file "Value.cpp", line 63

というエラーなんですが、解放するんだけど参照があるよって言っているみたいなのですが、じゃあ解放するなよって突っ込みたくなります。このエラーがどうしても取れず困っています。1箇所スタックにデータを取っていたのでこれをグローバル変数にとって解放されないようにしたのですがやっぱり出ます。内部エラーじゃないのって思ってllvmをバージョンアップしたのですが、今度はリンク時にエラーが出ます。llvmをバージョンアップしたときは、llvmrubyの中のext/llvmruby.hの先頭に

#define __STDC_CONSTANT_MACROS

の1行を加え再コンパイルする必要があります。また、llvmそのものもsvn updateした後は。単にmakeじゃ無くmake clean/makeとしないといけないみたいです。いま、llvm全体の再コンパイル中です。llvmがらみのコンパイル・リンクはとても時間が掛かるので大変です。llvmrubyはllvmを使いながらすぐ結果が見られるのがうれしいです。

どうもここ1月くらいの間にllvmの内部構造がずいぶん変わったみたいです。インタフェースはほとんど同じなのですが、再コンパイルしないと結構はまるような気がします。

追記
とりあえず、llvmの最新版でllvmrubyが動きましたが、まだアサーションエラーが出ます。invoke/unwindを使っているプログラムがあればそれとの差異を見ればいいのですがあるのかなー?llvmC++はsetjmpを使っているみたいだし。setjmpは例外ジャンプが無くてもCPUタイムを食うので使いたくないです。