Up Top

JNI の処理 : native method の処理 : native method の呼び出し処理 : JIT コンパイル対象になった native method の場合


概要(Summary)

JIT コンパイル対象になった native method の場合, method entry 部での処理には SharedRuntime::generate_native_wrapper() で生成されたコードが使われる (See: here for details).

備考(Notes)

zero(shark) を使う場合は, 実際の処理内容は上記の関数から呼び出される SharkNativeWrapper::initialize() が生成している.

処理の流れ (概要)(Execution Flows : Summary)

sparc の場合

(See: here for details)
-> SharedRuntime::generate_native_wrapper() が生成したコード
   -> (1) "unverified entry point" から入ってきた場合は Inline Caching 用の型検査を行う.
          (型が違っていた場合は, SharedRuntime::get_ic_miss_stub() に格納されているスタブにジャンプ)

      (1) stack overflow のチェックを行う (stack banging コード)
          -> AbstractAssembler::generate_stack_overflow_check() が生成したコード

      (1) スタック上に新しいフレームを確保する

      (1) 引数をネイティブメソッドの calling convention に合わせて移動させる

      (1) staic method の場合は, クラスオブジェクトを引数としてセットする

      (1) synchronized method の場合はロックを取得する
          -> MacroAssembler::compiler_lock_object() が生成したコード
          -> SharedRuntime::complete_monitor_locking_C() (<= fast-path が失敗した場合)

      (1) native メソッドの呼び出しを行う
          -> (native メソッドの処理が実行される)

      (1) ネイティブメソッドの返値を Java VM 内の calling convention に合わせて移動させる

      (1) もし Safepoint 停止が開始されていた場合は, ここで block する. 
          -> JavaThread::check_special_condition_for_native_trans()

      (1) スタック上の yellow page が disabled になっていたら, 元に戻す.
          -> SharedRuntime::reguard_yellow_pages()

      (1) synchronized method の場合はロックを解放する
          -> MacroAssembler::compiler_unlock_object() が生成したコード
          -> SharedRuntime::complete_monitor_unlocking_C() (<= fast-path が失敗した場合)

      (1) 例外が起きていれば伝搬させる. この場合は以降の処理は行わない.
          -> StubRoutines::forward_exception_entry() が指しているコード (= StubGenerator::generate_forward_exception() が生成したコード)
             -> (See: here for details)

      (1) 呼び出し元にリターン

x86_64 の場合

(See: here for details)
-> SharedRuntime::generate_native_wrapper() が生成したコード
   -> (1) "unverified entry point" から入ってきた場合は Inline Caching 用の型検査を行う.
          (型が違っていた場合は, SharedRuntime::get_ic_miss_stub() に格納されているスタブにジャンプ)

      (1) stack overflow のチェックを行う (stack banging コード)
          -> MacroAssembler::bang_stack_with_offset() が生成したコード

      (1) スタック上に新しいフレームを確保する

      (1) 引数をネイティブメソッドの calling convention に合わせて移動させる

      (1) staic method の場合は, クラスオブジェクトを引数としてセットする

      (1) synchronized method の場合はロックを取得する
          -> SharedRuntime::complete_monitor_locking_C() (<= fast-path が失敗した場合)

      (1) native メソッドの呼び出しを行う
          -> (native メソッドの処理が実行される)

      (1) ネイティブメソッドの返値を Java VM 内の calling convention に合わせて移動させる

      (1) もし Safepoint 停止が開始されていた場合は, ここで block する. 
          -> JavaThread::check_special_condition_for_native_trans()

      (1) スタック上の yellow page が disabled になっていたら, 元に戻す.
          -> SharedRuntime::reguard_yellow_pages()

      (1) synchronized method の場合はロックを解放する
          -> SharedRuntime::complete_monitor_unlocking_C() (<= fast-path が失敗した場合)

      (1) スタックフレームを破棄する

      (1) 例外が起きていれば伝搬させる. この場合は以降の処理は行わない.
          -> StubRoutines::forward_exception_entry() が指しているコード (= StubGenerator::generate_forward_exception() が生成したコード)
             -> (See: here for details)

      (1) 呼び出し元にリターン

zero(shark) の場合

(See: here for details)
-> SharkNativeWrapper::initialize() が生成したコード
   -> 

処理の流れ (詳細)(Execution Flows : Details)

SharedRuntime::generate_native_wrapper() (sparc の場合)

See: here for details

SharedRuntime::generate_native_wrapper() (x86_64 の場合)

See: here for details

SharkNativeWrapper::initialize()

(#Under Construction) See: here for details


This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.