MoarVM †
勉強する †インストール方法 †
NQP †Perl6のサブセット.Perl6はNQPで記述されている build方法 †%./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 CbC関連 †CodeSegment?から通常の関数を呼び出す際の確認するポイント †通常の関数からCodeSegment?にgotoした後にCodeSegment?側で通常の関数を呼び出すとスタックポインタ(rst)がDataSegement?のメモリ領域より下にくる可能性がある. コンパイラのバグなのでコンパイラを治すかDataSegement?を一度関数を経由させてCodeSegment?に移行するように書き換える Originalのnqpからmoarvmバイトコードを出力する †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では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押すとログに出来る Origin †オペコードはラベルで飛ぶので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 関数名かバイトコード番号で引く場合 †nqp側のcbc-toolsを使う $perl trans2opcode.pl 98 cbc_neg_n $perl trans2opcode.pl cbc_neg_n 98 Moarbytecodeのdump †%./moar --dump hoge.moar MoarVMbytecodeからMoarVMのdebug †% cbc-tools/debug-moar.sh vmtest/src/001-backend.t.moar MoarvmBytecode?からのNQPのテスト †% 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 CbCNQP一斉テスト †% $cbc-tools/this.sh vmtest/nqp NQP(Original)テスト †% $cbc-tools/this.sh vmtest/nqp ori テストカバレッジ †$ perl cbc-tools/dotest_coverage.pl MoarVMの便利ツール †デバッガ内でdissass †MVM_dump_bytecode (lldb) p MVM_dump_bytecode (void (*)(MVMThreadContext *)) $143 = 0x0000000100121b50 (libmoar.so`MVM_dump_bytecode at bytecodedump.c:505) (lldb) p MVM_dump_bytecode(tc) 00000 checkarity 2, 2 00001 param_rp_o loc_0_obj, 0 00002 param_rp_o loc_1_obj, 1 00003 paramnamesused annotation: gen/moar/stage2/QAST.nqp:6682 00004 decont loc_2_obj, loc_0_obj 00005 decont loc_4_obj, loc_2_obj 00006 findmeth loc_3_obj, loc_4_obj, 'node_hash' 00007 prepargs Callsite_0 00008 arg_o 0, loc_2_obj 00009 invoke_o loc_2_obj, loc_3_obj 00010 masttocu loc_2_obj, loc_1_obj, loc_2_obj 00011 -> return_o loc_2_obj (lldb) スタックトレースの表示 †MVM_dump_backtrace nqp側でerrorした際にdumpされるback trace (gdb) p MVM_dump_backtrace(tc) at gen/moar/stage2/QAST.nqp:6682 (../nqp/src/vm/moar/stage0/QAST.moarvm:assemble_and_load) from gen/moar/stage2/NQPHLL.nqp:455 (../nqp/src/vm/moar/stage0/NQPHLL.moarvm:mbc) from gen/moar/stage2/NQPHLL.nqp:1794 (../nqp/src/vm/moar/stage0/NQPHLL.moarvm:execute_stage) from gen/moar/stage2/NQPHLL.nqp:1830 (../nqp/src/vm/moar/stage0/NQPHLL.moarvm:run) from gen/moar/stage2/NQPHLL.nqp:1833 (../nqp/src/vm/moar/stage0/NQPHLL.moarvm:) from gen/moar/stage2/NQPHLL.nqp:1819 (../nqp/src/vm/moar/stage0/NQPHLL.moarvm:compile) from gen/moar/stage2/NQPHLL.nqp:1519 (../nqp/src/vm/moar/stage0/NQPHLL.moarvm:eval) from gen/moar/stage2/NQPHLL.nqp:1453 (../nqp/src/vm/moar/stage0/NQPHLL.moarvm:) from gen/moar/stage2/NQPHLL.nqp:1432 (../nqp/src/vm/moar/stage0/NQPHLL.moarvm:interactive) from gen/moar/stage2/NQPHLL.nqp:1661 (../nqp/src/vm/moar/stage0/NQPHLL.moarvm:command_eval) from gen/moar/stage2/NQPHLL.nqp:1625 (../nqp/src/vm/moar/stage0/NQPHLL.moarvm:command_line) from gen/moar/stage2/NQP.nqp:4124 (../nqp/src/vm/moar/stage0/nqp.moarvm:MAIN) from gen/moar/stage2/NQP.nqp:4119 (../nqp/src/vm/moar/stage0/nqp.moarvm:<mainline>) from <unknown>:1 (../nqp/src/vm/moar/stage0/nqp.moarvm:<main>) from <unknown>:1 (../nqp/src/vm/moar/stage0/nqp.moarvm:<entry>) $32 = void |