ruby-trunk-changes r62179 - r62198

今日は MJIT の導入などがありました。

normal: r62179 2018-02-04 04:59:05 +0900

rb_thread_terminate_all() で struct timeval の変数を初期化する時に double2timeval() という関数を使って 1 秒の struct timeval を作ってましたが、このために浮動小数点数演算が含まれるのは無駄なので { 1, 0 } で初期化するようにしています。たぶん構造体の中身のレイアウトとかに依存しないために使ってたのかなという気がしますが、どうなんだろ。

svn: r62180 2018-02-04 04:59:06 +0900

version.h の日付更新。

normal: r62181 2018-02-04 04:59:11 +0900

thread.c で struct timeval の減算処理を timeval_sub() という関数に切り出すリファクタリング

normal: r62182 2018-02-04 04:59:16 +0900

Thread#join の実装でもタイムアウトの指定を double に変換してから double2timeval() を利用していたのを、整数での指定だったら double2timeval() を使わずに計算するようにして極力浮動小数点数演算を回避するようにしています。

normal: r62183 2018-02-04 04:59:21 +0900

rb_wait_for_single_fd() でタイムアウトを更新するのに一度 double にして計算していたのを、変化分も struct timeval で表現することで浮動小数点数演算を回避するようにしています。って簡単に書いたけど結構差分は大きいですね。

normal: r62184 2018-02-04 07:24:17 +0900

r62182 の変更で Thread#join に渡されたタイムアウト値が Bignum だった時にも整数処理にするようにしていましたが、Bignum だと time_t の範囲に収まらない可能性があるので、double に変換して処理するパスのほうに分岐するようにしています。

nobu: r62186 2018-02-04 10:31:48 +0900

r62183 で timespec_for() という struct timeval から struct timespec に変換する関数が導入されましたが、これは poll(3) を利用する時だけ呼ばれるので、#ifdef USE_POLL で括るようにしています。

k0kubun: r62187 2018-02-04 14:49:21 +0900

vm.c から rb_mjit_header.h というヘッダを生成するルールを追加して、さらに tool/transform_mjit_header.rb というツールを導入して rb_mjit_header.h から architecture 毎に特化して不要な部分を削ったヘッダファイルを生成するようにしています。名前の通り MJIT のために必要なものみたいです。 [Feature #12589] [Feature #14235]

svn: r62188 2018-02-04 14:49:22 +0900

r62187 の新規追加ファイルの svn property 設定。

k0kubun: r62189 2018-02-04 15:58:09 +0900

MJIT の最初のバージョンがマージされています。ruby の実行時にコンパイラを利用して hot spot をコンパイルするという方式の JIT です。詳細はよくわかってませんが、すごいなーこういう方法でいけるもんなんだなぁ。とりあえず --jit というオプションが追加されていて、これを指定すると MJIT が有効化され、RubyVM::MJIT.enabled? というメソッドで有効かどうかが ruby スクリプトから判定できます。 [Feature #12589] [Feature #14235]

svn: r62190 2018-02-04 15:58:11 +0900

r62189 の新規追加ファイルの svn property 設定。

k0kubun: r62191 2018-02-04 16:43:20 +0900

mjit.c で C99 以降で定義されている va_copy() というマクロが未定義だったら独自定義するようにしています。

k0kubun: r62192 2018-02-04 16:52:54 +0900

mjit.c に vm_core.h の前に #include "internal.h" を追加しています。 Solaris でのビルドエラーの修正のためとのこと。

k0kubun: r62193 2018-02-04 17:24:58 +0900

mjit.c の worker() で ATOMIC_SET() マクロを利用していたところを、Windows 版で InterlockedExchangePointer() が利用可能だったらこれを利用するように独自の MJIT_ATOMIC_SET() というマクロを導入してこれを使うようにしています。 Windows で ATOMIC_SET() が InterlockedExchange() を利用してて、ビルド時に警告が出ていたのでこの対策のためだそうです。

nobu: r62194 2018-02-04 18:13:19 +0900

r62187 の rb_mjit_header.h の生成のルールで tool/ifchange を使って変更があった時だけ上書きするようにしています。 cmp コマンドを使ってましたが Windows では cmp コマンドが使えるとは限らないため。

nobu: r62195 2018-02-04 18:34:16 +0900

r62187 で Makefile.in と win32/Makefile.sub に rb_mjit_header.h の生成ルールを別々に入れていたのを common.mk に統合しています。

k0kubun: r62196 2018-02-04 18:48:44 +0900

Makefile.in の rb_mjit_header.h を vm.c から生成する時のコンパイラオプションから -arch を削ったものを使うようにしています。 arch の違いはこの後で tool/transform_mjit_header.rb で個別のヘッダ生成する時に吸収するのでここで指定するのはまずいということかと。

k0kubun: r62197 2018-02-04 20:22:28 +0900

r62189 の続き。 mjit_compile() の中身が空っぽだったのを追加して、MJIT のコンパイラ実装を追加しています。また実行時にコンパイルするコードから参照するための関数群に MJIT_FUNC_EXPORTED というマクロを使って export するようにしています。 [Feature #14235]

kazu: r62198 2018-02-04 20:59:19 +0900

tool/transform_mjit_header.rb で正規表現リテラル内の #{} が抜けてたのを修正したり、不要な式展開をしていたり(正規表現リテラル内に式展開だけになっていた)のをリテラルをやめたりしています。