変数のフックも考えています
trace_funcの実装がうまく行ったので、調子に乗って変数のアクセス時にもフックができるようにしようと考えています。
例えば、こんな感じになります。
module YARV2LLVM # ローカル変数とダイナミック変数の書き込み時に呼ばれる def local_var_write_func(lvalue, rvalue, コンテキスト情報) : YARV2LLVM::store(lvalue, rvalue) # フックを設定したら書き込みは自動的にはやらないので明示的に行う end end
一瞬、簡単に実現できるような気がしたのですが、なかなか難しいです。lvalueとrvalueがさまざまなデータ型を取りうるからです。つまり、local_var_write_funcは引数と戻り値の型が一意に決まる必要のある普通のメソッドでは実現できないわけです。今のところ、マクロのようなものを実装して実現しようと考えています。
変数のアクセスのフックが実現できるとtrace_func以上に使いでがあると思います。こんな感じのことに使えるかなって思います。
- デバッグ時のWatch point
- Verilogなどで出てくるVCD(http://en.wikipedia.org/wiki/Value_change_dump)を生成する。ところで、VCDを作ってViewer(たとえばGTKWave(http://intranet.cs.man.ac.uk/apt/projects/tools/gtkwave/) (GUI画面 http://en.wikipedia.org/wiki/File:Gtkwave_analog.jpeg) で変数の変化をみるってのはLSIだけではなく、ソフトウエア(特に並列)でも有効だと思うのですが、あまり聞かないなって思います。
- write barrier (・・・遠い将来、yarv2llvmでGCを書いてみたいなって思っています...)