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.