#author(“2018-12-04T10:50:22+00:00”,“game”,“game”)
#
MoarVM
#
勉強する
Rakudo and NQP internals
#
インストール方法
- まずはMercurialリポジトリもしくはGitHubからMoarVMを取得
1
|
% hg clone ssh://one@http://www.cr.ie.u-ryukyu.ac.jp/hg/Members/anatofuz/MoarVM/ (保存先。指定しない場合./MoarVMになる)
|
1
|
% git clone git@github.com:MoarVM/MoarVM.git
|
- 予めインストール先のディレクトリを作っておく
- build
1
|
% ./Configure.pl --cc /usr/local/x86-cbc/bin/gcc --debug --no-optimize --compiler gcc --prefix=/mnt/dalmore-home/one/src/build_perl6/MoarVM
|
-
各オプション
- cc
- debug
- compiler
- コンパイラの種類を指定する
- gcc, clang, clをサポートしている
- toolchain
- “posix”, “gnu”, “bsd” and “msvc"のツールチェインを選択可能
- prefix
-
make
1
|
% make -j 50 && make install
|
#
NQP
Perl6のサブセット.Perl6はNQPで記述されている
#
build方法
1
|
%./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し
1
|
%cbc-tools/create_test2moarvm.zsh t/nativecall
|
vmtestの中に生成される
シェルスクリプト中では
1
|
${ORIGIN_NQP}/nqp --target=mbc --output="001-hoge.t.moarvm" 001-hoge.t
|
を実行している
#
実行しているオペコードを確認する方法
#
CbC
CbCではcbc-interp.cbcで定義しているcbc_*オペコードに対応しているルーチン
これらはcbc_next経由で呼ばれるのでそこにbreak pointを書けてdumpする
1
2
3
4
5
6
7
8
9
|
(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
1
2
3
4
5
6
7
8
9
10
11
|
(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を使う
1
2
3
4
|
$perl trans2opcode.pl 98
cbc_neg_n
$perl trans2opcode.pl cbc_neg_n
98
|
#
Moarbytecodeのdump
1
|
%./moar --dump hoge.moar
|
#
MoarVMbytecodeからMoarVMのdebug
1
|
% cbc-tools/debug-moar.sh vmtest/src/001-backend.t.moar
|
#
MoarvmBytecodeからのNQPのテスト
1
2
|
% 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一斉テスト
1
|
% $cbc-tools/this.sh vmtest/nqp
|
#
NQP(Original)テスト
1
|
% $cbc-tools/this.sh vmtest/nqp ori
|
#
テストカバレッジ
1
|
$ perl cbc-tools/dotest_coverage.pl
|
#
MoarVMの便利ツール
#
デバッガ内でdissass
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
(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)
|
#
スタックトレースの表示
nqp側でerrorした際にdumpされるback trace
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
(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
|