Top


定義場所(file name)

hotspot/src/cpu/sparc/vm/interpreter_sparc.cpp

名前(function name)

void InterpreterGenerator::generate_counter_overflow(Label& Lcontinue) {

本体部(body)

  {- -------------------------------------------
  (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.