JIT コンパイラによるコードの生成処理は, 対象がネイティブメソッドの場合, AdapterHandlerLibrary::create_native_wrapper() で実行される (See: here for details).
実際の生成処理は, そこから呼び出される SharedRuntime::generate_native_wrapper() 内で行われる. この処理は, アーキテクチャ(sparc,x86,zero)によって変わるが, コンパイラ種別(C1,C2)には依存しない.
生成されたコードは, methodOopDesc::set_code() で methodOopDesc に登録され, 次回以降の呼び出し時に使用されるようになる.
この処理は, CompilerThread ではなく, コンパイル要求を出したスレッドが実行する.
SharedRuntime::generate_native_wrapper() が生成するコードの内容については別ページ参照(See: here for details).
(See: here for details) -> AdapterHandlerLibrary::create_native_wrapper() -> (1) JIT コンパイル処理を行う. -> SharedRuntime::generate_native_wrapper() -> 処理はアーキテクチャ依存 (See below) (1) JIT 生成したコードを methodOopDesc 中にセットする -> methodOopDesc::set_code()
(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()
(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()
(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()
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
(#Under Construction) See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.