ruby-trunk-changes 2021-08-13

今日は TraecPoint の利用などで MJIT の JIT 済みコードの利用が無効になる時の挙動の変更や、コンパイラの最適化の不具合(?) による SEGV に対する対処などがありました。

[573eef7c89] Nobuyoshi Nakada 2021-08-12 01:30:42 UTC

include/ruby/internal/value_type.h の Check_Type() の型チェック失敗時の rb_check_type() の呼び出しを rb_unexpected_type() に変更しています。絶対に失敗する条件で例外発生のために rb_check_type() を呼んでたので直接例外発生させる関数を呼ぶようにしているみたいです。例外発生のため関数から return してこないことを明示するためみたいです。チケットによるとコンパイラの最適化によって(おそらく GCC の不具合で?) SEGV することがあったみたいです。コメントアウトされた状態でですが RB_BUILTIN_TYPE() の定義のほうに RB_SPECIAL_CONST_P() の呼び出し後に __asm を使ってメモリバリア(アセンブラ命令の reorder を防ぐためのやつ)を置く処理も追加されています(preprocess の条件に 0 が入ってるので常に使われない状態)。 [ruby-core:104780] [Bug #18062]

[611da9faef] Nobuyoshi Nakada 2021-08-12 01:42:33 UTC

611da9faef76777e57718cf5b0286b965879479c の続き。呼び出すようにした rb_unexpected_type() の宣言に NORETURN() に加えて COLDFUNC 修飾子も追加しています。 [ruby-core:104780] [Bug #18062]

[1a16940291] git 2021-08-13 05:51:56 UTC

version.h の日付更新

[b3f8c491ef] Takashi Kokubun 2021-08-13 05:54:40 UTC

TracePoint や GC.compact の影響で JIT されたコードが無効化された時に --jit-wait や --jit-warning オプションが指定されていたら標準エラー出力にメッセージを出力するようにしています。

[b64f81c817] Takashi Kokubun 2021-08-13 06:15:34 UTC

b3f8c491efefc0461ab225d062f6c64286498609 の続きで JIT されたコードを無効にする時の関数 mjit_cancel_all() で mjit_pause() も呼び出して worker プロセスの処理が止まるまで待つようにしています。

[365da4c6ac] Takashi Kokubun 2021-08-13 06:19:59 UTC

MJIT が無効の状態で mjit_cancel_all() を呼んだ時に mjit_pause() で例外発生しないように mjit_enabled が偽だったら先頭ですぐ return するようにしています。

[ac4d53bd46] Takashi Kokubun 2021-08-13 06:19:15 UTC

b3f8c491efefc0461ab225d062f6c64286498609 の続きで TracePoint の :class イベントのみが有効にされた場合は JIT は無効にする必要はないそうなので update_global_event_hook() で mjit_cancel_all() を呼び出す条件分岐を追加しています。