mosh

Mosh JIT のバグつぶし

(mosh jit compiler) ライブラリの invoke のタイミングバグ修正 --enable-jit オプション JIT コンパイラの再帰バグ修正 REFER_GLOBAL gloc の場合コード追加。

Shibuya.lisp に向けて Scheme コードバトンするのはどうか?

次回 Shibuya.lisp のネタ。「英単語覚えるスクリプト」のように短くていじりやすいコードを github に置いてコードバトンをするのはどうかな。ルールは2つ 自分がこれだ!と思える変更を2日以内にコードに加える。人に優しい変更なら何でも良い。1文字の変…

英単語覚えるスクリプト

Shibuya.lisp の発表で少し触れた、英単語覚えるスクリプトを改善した。毎日使っていて単語量が増えたので誤り回数が多い物順に出題する事にした。 (import (rnrs) (mosh control) (mosh) (match) (mosh file) (srfi :8) (only (srfi :1) first second)) (de…

JIT コンパイルが再帰して困った

JIT コンパイラが Scheme で書かれているので、JIT コンパイラ自身も JIT コンパイルされる可能性があることに気付いた。そうすると 手続き A を JIT コンパイルしようとする。 JIT コンパイラ中の手続き B が閾値を超えて call される。 手続き B を JIT コ…

年末から悩んでいたバグを修正

手続きの呼び出し回数が閾値を超えた場合に JIT コンパイラが発動する。という機能を組み込んだところ、エラー手続きが再帰してスタックがガンガン拡張する不具合に遭遇。 調べていくと (current-exception-handler) の値がおかしくなる事が判明。この時点で…

parameterize 周りのバグに悩まされる

原因究明中。ひげ太は上の歯が生えてきたせいか若干機嫌が悪い。

続 Mosh のバージョン表示 -v に Git の情報を載せたい

Mosh のバージョン表示 -v に Git の情報を載せたいで id:jch2355 さん(Git の中の人)からコメントを頂いて改良。 GIT_BRANCH=$(shell git symbolic-ref HEAD|cut -d'/' -f3) GIT_IS_DIRTY=$(shell git diff --quiet HEAD && echo "dirty") GIT_COMMIT_REV…

Mosh のバージョン表示 -v に Git の情報を載せたい

Makefile で以下のようにしてみた。 GIT_BRANCH=$(shell git branch|grep -m1 '*'|cut -d' ' -f2) GIT_COMMIT_REVISION=$(shell git show|grep -m1 'commit'|cut -d ' ' -f2) GIT_COMMIT_DATE=$(shell git show|grep -m1 'Date'|cut -d ' ' -f4-9) mosh_CFLA…

REFER_LOCAL を JIT 化

JIT コンパイラを書くヘルパーの準備も整い、あとは全てのインストラクションを手動で JIT 手続きを書いていくフェーズになった。 ヘルパーのおかげで g++ の出力したコードが以下のようなコードになるので多少は楽が出来る。 ;; REFER_LOCAL (movq rbx (& r…

今日の Mosh

JIT コンパイラが VM の中から呼べるようになった。 あと FFI call がネストしたときにスタックがずれるバグを修正。

JIT が動く小さなサンプル

(define (a) 3) (do ([i 0 (+ i 1)]) [(= i 20)] (test-equal 3 (a))) とかやると (a) の 10 回目の呼び出し時に JIT コンパイルされる。以降 JIT コンパイルされた手続きが呼ばれる。

Mosh の ChangeLog を捨ててみた

kosaki さんと naruse さんに Linux & Ruby の git log と ChangeLog の運用を教えていただいた。 Linux: git log に完全移行。昔の ChangeLog が見たかったら Web で探してね Ruby: git log と ChangeLog は手動でプログラマが同期。細かい git log は Chan…

Jit 組み込み中

やっと Jit コンパイラを VM から呼び出してみるなど。

sigaltstack でシグナルハンドラ用の代替スタックを指定

SIGSEGV がうまくハンドルできない は代替スタックを指定すべきだったことを id:kazuhooku に教えてもらった。 こうしておけばスタックオーバーフローでも正しくシグナルハンドラが呼ばれる。 man sigaltstack にある例の通り。 stack_t ss; ss.ss_sp = GC_m…

SIGSEGV がうまくハンドルできない

JIT コンパイルされたコードの VM インストラクション毎にスタックトレース用に情報を push しておいて、SIGSEGV が起きたら直近のスタックトレースを出す機能を作っている。 SIGSEGV をハンドルするように sigaction でセットして試しに直後に uintptr_t* p…

UTF16 UTF32 変換のバグを修正

Mosh の utf16-codec における UTF16 UTF32 変換のバグを修正。 U+10FFFF (境界値)でバグってた。反省を生かして素直に unicode.org の FAQ のコードの通りに実装。 http://unicode.org/faq/utf_bom.html#utf16-3

Mosh のリポジトリを Git に移行しました

id:mjt さんの協力により Mosh のリポジトリを Git に移行し higepon's mosh at master - GitHub に置きました。 リリース物の配布などは今まで通り Google Code で行います。 今までと違いスクリプトにより生成されるソースコード類を出来るだけリポジトリ…

Git

twitter にも書いたのだけど、個人的に Git が速い(commit, push, clone, merge など)のが気に入った。

SEGV になるバグを修正

定義されているマクロが 750 個を超えると SEGV するバグを修正。スタック自動伸長で一部考慮が足りない部分があった。

Mosh の JIT 実装に戻る

fib の実験でおおよそ 30% 速くなる事が分かったので本実装にはいる事に。 今のペースで実装していたのでは時間がかかりすぎるの足回りを強化する事から始める予定。 g++ -S の結果を加工・変換して sassy 形式に。 JIT デバッグ用スタックトレース。SEGVで…

(mosh concurrent) のスレッドセーフ性

id:mjt さんに指摘いただいていた (mosh concurrent) にスレッドセーフじゃないところがあり落ちる件を調査。 結果としてスレッドセーフじゃなかったのは Symbol::intern : シンボルのインターン処理。 外部ファイルの書き込み。具体的には prefix.txt 。こ…

FFI callout 実装の補強

FFI callout の引数、戻り値が一部の型しか対応していなかったのを修正中。 32/64bitどちらの環境でも正しく動かすのは意外と難しい。

read をスレッドセーフに

bison の pureparser を使ってスレッドセーフにした。Context は currentVM() に持つ。

Mosh が iPod Touch で動いたらしい

@ech0chrome さんから Mosh が iPod touch で動いたとの報告がありました。 これはうれしいです。スクリーンショット→http://twitpic.com/oqir7

JITアセンブラと多値

JIT アセンブラから多値レジスタにアクセスできるようにした。 これで多値を返す手続きも作れる。

Mosh バグ修正の日

JIT の実装をしている関係上後回しにしていた不具合をいくつか修正。 Issue 111 - exact to inexact number when taking the expt of a complex number Issue 110 - [feature request] callout function from raw pointer Issue 109 - utf8->string stops co…

JIT版 fib が動いた - JIT 実験

いろいろと制限付きではあるが JIT 版の fib が動いた。(正確には JIT コンパイラが吐くコードが動いた。Just in time なコンパイルはしてない) 速度比較 通常の (fib 30) 250msec JIT (fib 30) 200msec JIT 版の fib はまだ速くなる余地がある。 VM の仮…

GDB のユーザー定義コマンドで VM の状態を知る - JIT 実装中

JIT 実装中に VM の仮想レジスタの内容やスタックを覗きたい事がある。 GDB のユーザー定義コマンドを利用して以下のように定義した。 ## stack top is "sp 1" define sp printf "%d\n", ((intptr_t*)(*(((intptr_t*)$rdi) + 5)))[-$arg0] end define hook-s…

アセンブラをリファクタリング中

子守の合間にアセンブラをリファクタリングしていた。ようやくまとまってきた。リファクタリングの過程で x86-64 のアドレッシングに関して更に理解が深まった。 mov とか lea はおおよそ以下の pack-op 手続きでアセンブルできる。 (define (pack-op bits64…

JIT における手続き呼び出しの問題点

JIT コンパイルされた手続きが、別の手続きを呼び出す場合の扱いが理解できないので整理。 通常 VM インストラクションにおける処理 FRAME: vPC などを push CALL: cprocedure なら native call 。closure なら vPC に jump RETURN: スタックから pop した v…