These are chat archives for Constellation/iv

22nd
Feb 2014
iseki
@iseki-masaya
Feb 22 2014 13:04
diagramのcompilerを作るために、breakerのcompilerを理解しようとしたところくつか疑問が湧いたので質問させて下さい。
iseki
@iseki-masaya
Feb 22 2014 13:17
1.|Compiler::SplitBasicBlock|の'asm->L(MakeLabel(it->second.counter).c_str());'についてです。|MakeLabel|で|Compiler::ScanJumps|で割り当てたcounterの数字に対応したラベルを生成するのは分かるのですが、|asm_->L|でloadする理由が分かりません。
iseki
@iseki-masaya
Feb 22 2014 13:25
2.breaker::Compilerのhandlerlinksについてなのですが、この変数は何をするための変数なのでしょうか。|Compiler::SplitBasicBlock|の中でexception_handledがtrueの時にinsertされているので例外処理に関する変数なのかと考えたのですが、よく理解できてません。
3.breakerからrailgunにOSRで飛ぶ箇所についてです。まず、処理の概要があっているのか確認させて下さい。|ExecuteInGlobal|から
iseki
@iseki-masaya
Feb 22 2014 14:37
一つ前のポストは無視して下さい。
3.breakerのnativecodeの実行についてです。まず、処理の概要があっているのか確認させて下さい。breaker/api.hの|ExecuteInGlobal|から実行した場合初めにrailgunでcompileされ、得られたbytecodeを|breaker::Compiler|に渡します。|breaker::Compiler|は受け取ったbytecodeにコンストラクタで空のアセンブラを持つnative_codeを埋め込みます。その後、opcodeに対応したアセンブラにnative_codeを変更し、breaker/api.hの|Run|で実行します。|Run|では|RunEval|を呼び出し、このメソッド内の|breaker_prologue|でnative_codeを実行します。|breaker_prologue|では、TemplatesGeneratorのPrologueType型の変数prologueを実行しています。prologueは|CompileBreakerPrologue|でprologue = core::BitCast<PrologueType>(getCode() + size);が代入されています。疑問なのは、なぜ右辺がPrologueType型になるのかということです。|BitCast|はv8のutilitiesであり、通常のキャストではできない型変換を行うメソッドです。|getCode|はxbyakのメソッドであり、topのアドレスを返します。topについてはあまり理解してないのですが、xbyakのコールスタックの先頭アドレスを指す変数(top自体は配列の先頭アドレス)だと思います。なので、getCode() + sizeはコールスタックの特定の部分を示すアドレスになるのですが、なぜそれがPrologueType型の関数ポインタになるのか分かりません。
iseki
@iseki-masaya
Feb 22 2014 14:45
4.|RunEval|のctx->vm()->stack()->Unwind(frame);でOSRをしていると思うのですが、|Unwind|でframeの比較(Restore((std::max)(current_->GetFrameEnd(), frame->GetFrameBase()));)をしているのはなぜですか。
Yusuke Suzuki
@Constellation
Feb 22 2014 15:40
1.
asm->L(str) で str に対応した label が 作られ, この文字列を用いてあとで jump が生成できます. L は label の L です (xbyak の code 参照)
2.
例外のためのものです. 例外が起こった時に, unwind しながら, handler の range 内に pc があるかどうかを check しています. breaker/exception.h を確認してください.
3.
getCode の返す top は, xbyak の生成したコードの先頭です. size はコレまでに生成した code の大きさなので, top + size でこれから生成するコードの先頭ポインタになります, で, これを PrologueType, 関数ポインタにキャストします.
Yusuke Suzuki
@Constellation
Feb 22 2014 15:46
4.
現行, lv5 には OSR の仕組みが入っていません. breaker で実行されるときは最初から breaker で, railgun で実行されるときはずっと railgun で実行されます.
Yusuke Suzuki
@Constellation
Feb 22 2014 15:59
これは, ScopedArguments で用いるためです
Yusuke Suzuki
@Constellation
Feb 22 2014 16:08
ScopedArguments は C 上で JS の Stack を確保しますが, frame 作らない場合があるので (JS の code を呼ばない時), GetFrameEnd() よりも後に有効な stack が積まれてる可能性があって,
で, 一個後の frame の base との大きい方を取ることで安全策を撮っていますが,
チョットここは汚いですね.