hotspot/src/cpu/sparc/vm/interpreter_sparc.cpp
void InterpreterGenerator::generate_counter_overflow(Label& Lcontinue) {
{- -------------------------------------------
(1) (この関数では, カウンタ値がオーバーフローした際に
JIT コンパイルを開始させるためのコードを生成)
---------------------------------------- -}
// Generate code to initiate compilation on the counter overflow.
{- -------------------------------------------
(1) コード生成:
「InterpreterRuntime::frequency_counter_overflow() を呼び出して JIT コンパイル処理を開始し,
その後, 引数で指定された Lcontinue ラベルにジャンプする.」
(なおコメントによると, InterpreterRuntime::frequency_counter_overflow() は引数を2つ取るとのこと.
第1引数は, OSR(ループのコンパイル)かどうかを示す.
第2引数は, 第1引数が true の場合にのみ意味を持つ.
今回はどちらにも zero を渡している)
<= と書いてあるが, 第1引数と第2引数は逆では?? #TODO
(コメントによると, InterpreterRuntime::frequency_counter_overflow() は返値として
JIT 生成されたコードの vep(verified entry point) のアドレスを返す.
あるいは, コンパイルが完了せずにリターンした場合(バックグラウンドで行う場合か失敗した場合)は NULL を返す.
ただし, ここの呼び出し箇所では返値はノーチェック...)
---------------------------------------- -}
// InterpreterRuntime::frequency_counter_overflow takes two arguments,
// the first indicates if the counter overflow occurs at a backwards branch (NULL bcp)
// and the second is only used when the first is true. We pass zero for both.
// The call returns the address of the verified entry point for the method or NULL
// if the compilation did not complete (either went background or bailed out).
__ set((int)false, O2);
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), O2, O2, true);
// returns verified_entry_point or NULL
// we ignore it in any case
__ ba(false, Lcontinue);
__ delayed()->nop();
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.