MoarVM

勉強する

Rakudo and NQP internals

インストール方法

  • まずは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

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

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-12-04 (火) 19:50:22 (1970d)