Up Top

JIT Compiler の処理 (3) : JIT コンパイラによるコード生成処理 : ネイティブメソッドの場合


概要(Summary)

JIT コンパイラによるコードの生成処理は, 対象がネイティブメソッドの場合, AdapterHandlerLibrary::create_native_wrapper() で実行される (See: here for details).

実際の生成処理は, そこから呼び出される SharedRuntime::generate_native_wrapper() 内で行われる. この処理は, アーキテクチャ(sparc,x86,zero)によって変わるが, コンパイラ種別(C1,C2)には依存しない.

生成されたコードは, methodOopDesc::set_code() で methodOopDesc に登録され, 次回以降の呼び出し時に使用されるようになる.

備考(Notes)

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

全体の処理の流れ

(See: here for details)
-> AdapterHandlerLibrary::create_native_wrapper()
   -> (1) JIT コンパイル処理を行う.
          -> SharedRuntime::generate_native_wrapper()
             -> 処理はアーキテクチャ依存 (See below)

      (1) JIT 生成したコードを methodOopDesc 中にセットする
          -> methodOopDesc::set_code()

JIT コンパイル処理の詳細 : sparc の場合

(See above)
-> SharedRuntime::generate_native_wrapper()
   -> (1) ネイティブメソッド用の calling convention やレジスタに乗らない引数の個数を計算する
          -> SharedRuntime::c_calling_convention()
      (1) 必要なスタックフレームサイズを計算する
      (1) コードを生成する
      (1) OopMap を OopMapSet に登録する
          -> OopMapSet::add_gc_map()
      (1) 生成したコードを nmethod として登録する
          -> nmethod::new_native_nmethod()

JIT コンパイル処理の詳細 : x86_64 の場合

(See above)
-> SharedRuntime::generate_native_wrapper()
   -> (1) ネイティブメソッド用の calling convention やレジスタに乗らない引数の個数を計算する
          -> SharedRuntime::c_calling_convention()
      (1) 必要なスタックフレームサイズを計算する
      (1) コードを生成する
      (1) OopMap を OopMapSet に登録する
          -> OopMapSet::add_gc_map()
      (1) 生成したコードを nmethod として登録する
          -> nmethod::new_native_nmethod()

JIT コンパイル処理の詳細 : zero の場合

(See above)
-> SharedRuntime::generate_native_wrapper()
   -> SharkCompiler::generate_native_wrapper()
      -> (1) 生成するスタブの内容を表現した LLVM IR を作成する
             -> SharkNativeWrapper::build()
                -> SharkNativeWrapper::SharkNativeWrapper()
                   -> SharkNativeWrapper::initialize()
                      -> (1) 

         (1) LLVM IR に基づいてマシン語コードを生成する
             -> SharkCompiler::generate_native_code()

         (1) 生成したコードを nmethod として登録する
             -> nmethod::new_native_nmethod()

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

AdapterHandlerLibrary::create_native_wrapper()

See: here for details

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

See: here for details

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

See: here for details

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

See: here for details

SharkCompiler::generate_native_wrapper()

See: here for details

SharkNativeWrapper::build()

See: here for details

SharkNativeWrapper::SharkNativeWrapper()

See: here for details

SharkNativeWrapper::initialize()

(#Under Construction) See: here for details


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