Xbyakを使ったJITの続き。
前回と同様、gcc4.2.1 (x86-64)でのみ動作確認。JITで生成するコード内から外部の関数を呼び出す:
class CallCFunc : public Xbyak::CodeGenerator { |
- x86-64やその呼出規約とかまるでわかってないので勘違いしてる可能性大なんだけど。
- 64ビット環境なので、スタックポインタやベースポインタは
rsp
やrbp
と、64ビットのレジスタを使う。 - 関数へのポインタも64ビットになるけど、直接呼び出す方法はないのかな?いったん
rax
に代入してコールする。これがx86-64のインストラクションの制約なのかxbyakの制約なのかわかってない。 - 生成する関数でローカル変数を扱いたい場合は、
rsp
をマイナスして領域を確保して、rbp
相対でアクセスする。rsp
のアライメントは16単位? x86 calling conventionsには、「GCC4.5以降は16、それ以前は4」と書かれている - 逆にローカル変数を使わない場合は、
push
命令でrbp
を保存しなくても動くんじゃないかと思うんだけど、試した限りsegmentation fault動いたり動かなかったり、よくわからなかった。