% hg clone ssh://one@http://www.cr.ie.u-ryukyu.ac.jp/hg/Members/anatofuz/MoarVM/ (保存先。指定しない場合./MoarVMになる)
% git clone git@github.com:MoarVM/MoarVM.git
% ./Configure.pl --cc /usr/local/x86-cbc/bin/gcc --debug --no-optimize --compiler gcc --prefix=/mnt/dalmore-home/one/src/build_perl6/MoarVM
% make -j 50 && make install
Perl6のサブセット.Perl6はNQPで記述されている
%./Configure.pl --prefix=/mnt/dalmore-home/one/src/build_perl6/nqp --backends=moar --with-moar=/mnt/dalm ore-home/one/src/build_perl6/MoarVM/bin/moar
このcommitハッシュに合わせる
45ab6e373b4168071a5b3fb806cf37e8d02c13d0
通常の関数からCodeSegment?にgotoした後にCodeSegment?側で通常の関数を呼び出すとスタックポインタ(rst)がDataSegement?のメモリ領域より下にくる可能性がある.
コンパイラのバグなのでコンパイラを治すかDataSegement?を一度関数を経由させてCodeSegment?に移行するように書き換える
CbC側のnqpにcdし
%cbc-tools/create_test2moarvm.zsh t/nativecall
vmtestの中に生成される
シェルスクリプト中では
${ORIGIN_NQP}/nqp --target=mbc --output="001-hoge.t.moarvm" 001-hoge.t
を実行している
CbCではcbc-interp.cbcで定義しているcbc_*オペコードに対応しているルーチン これらはcbc_next経由で呼ばれるのでそこにbreak pointを書けてdumpする
(gdb) b cbc_next Breakpoint 2 at 0x7ffff7560288: file src/core/cbc-interp.cbc, line 61. (gdb) command 2 Type commands for breakpoint(s) 2, one per line. End with a line saying just "end". >p CODES[*(MVMuint16 *)i->cur_op] >p *(MVMuint16 *)i->cur_op >c >end
scriptコマンドをかけてneter押すとログに出来る
オペコードはラベルで飛ぶのでNEXTのマクロにdummyの関数をいれてそこにbreak point
(gdb) b dummy Function "dummy" not defined. Make breakpoint pending on future shared library load? (y or [n]) y Breakpoint 1 (dummy) pending. (gdb) command 1 Type commands for breakpoint(s) 1, one per line. End with a line saying just "end". >up >p *(MVMuint16 *)(cur_op) >c >end
%./moar --dump hoge.moar
% cbc-tools/debug-moar.sh vmtest/src/001-backend.t.moar
% cbc-tools/check-nqp-test.sh vmtest/src/001-backend.t.moar % cbc-tools/check-cbc-nqp-test.sh vmtest/src/001-backend.t.moar
% $cbc-tools/this.sh vmtest/nqp
% $cbc-tools/this.sh vmtest/nqp ori
$ perl cbc-tools/dotest_coverage.pl