LLVM 例外
わ。これ書いたの2017年かよ
LLVMで〜という記事タイトルだが、実際はlibunwindの話になっている
Rustもlibunwindを使うっぽい
LLVMとの関係は?
今回見た.llはlandingpad 型 cleanupのパターンだけだった
cleanupは、Javaでいうfinallyのことかな?
Rustでは、panicしたときでも必ずdropを呼ぶためにcleanupを使っているはず
見てみると、たしかにこの次の行でdrop_in_place?を呼んでいる
型 は何に使うんだろう。発生した例外の情報が取れるとか?
catchpad命令が、Javaでいうcatchに対応するのかな
cleanuppad命令は…なんだろう
cleanup処理のあと、unwindをつづけるにはresume命令を呼ぶらしい
もう一つ大事そうなのがinvoke命令。これはinvoke xx to yy unwind zzという形をとる
通常はyyに飛んで、例外が発生したらzzに飛ぶ
「例外が発生」の定義は?
となると、libunwindの_Unwind_RaiseExceptionを呼ぶのが「例外の発生」の起点か。
Rustのpanicも_Unwind_RaiseExceptionを呼ぶのかな?
こっちに清書しました。