#author("2018-11-27T08:20:16+00:00","game","game") *MoarVM [#c4cd56b9] - CbConMoarVM http://www.cr.ie.u-ryukyu.ac.jp/hg/Members/anatofuz/MoarVM/ - NQP関連の便利スクリプト http://www.cr.ie.u-ryukyu.ac.jp/hg/Members/anatofuz/nqp-cbc-tools/ ** 勉強する [#x73ce59c] [[Rakudo and NQP internals:http://edumentab.github.io/rakudo-and-nqp-internals-course/]] **インストール方法 [#l4b2cc17] - まずはMercurialリポジトリもしくはGitHubからMoarVMを取得 % hg clone ssh://one@http://www.cr.ie.u-ryukyu.ac.jp/hg/Members/anatofuz/MoarVM/ (保存先。指定しない場合./MoarVMになる) - GitHubからの場合 % git clone git@github.com:MoarVM/MoarVM.git - 予めインストール先のディレクトリを作っておく - build % ./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 --- debugオプション -- compiler --- コンパイラの種類を指定する --- gcc, clang, clをサポートしている -- toolchain <toolchain> --- "posix", "gnu", "bsd" and "msvc"のツールチェインを選択可能 -- prefix --- make installの先を指定 - make % make -j 50 && make install ** NQP [#t052565e] Perl6のサブセット.Perl6はNQPで記述されている *** build方法 [#q561f123] %./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関連 [#ma4b5ce5] *** CodeSegmentから通常の関数を呼び出す際の確認するポイント [#l1ce7a77] 通常の関数からCodeSegmentにgotoした後にCodeSegment側で通常の関数を呼び出すとスタックポインタ(rst)がDataSegementのメモリ領域より下にくる可能性がある. コンパイラのバグなのでコンパイラを治すかDataSegementを一度関数を経由させてCodeSegmentに移行するように書き換える *** Originalのnqpからmoarvmバイトコードを出力する [#wbadb84f] CbC側のnqpにcdし %cbc-tools/create_test2moarvm.zsh t/nativecall vmtestの中に生成される シェルスクリプト中では ${ORIGIN_NQP}/nqp --target=mbc --output="001-hoge.t.moarvm" 001-hoge.t を実行している ** 実行しているオペコードを確認する方法 [#mbfc1ca6] *** CbC [#zec94e9d] 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 [#v1f9a6ae] オペコードはラベルで飛ぶので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 ** Moarbytecodeのdump [#ea1ba63c] %./moar --dump hoge.moar ** MoarVMbytecodeからMoarVMのdebug [#ja07c75b] % cbc-tools/debug-moar.sh vmtest/src/001-backend.t.moar ** MoarvmBytecodeからのNQPのテスト [#d22b622d] % 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一斉テスト [#b3f020b5] % $cbc-tools/this.sh vmtest/nqp ** NQP(Original)テスト [#vcf91426] % $cbc-tools/this.sh vmtest/nqp ori ** テストカバレッジ [#z34febf3] $ perl cbc-tools/dotest_coverage.pl