Up Top

Interpreter に関する処理 : 初期化処理 (3) : Interpreter 自体の初期化処理 (2) : Template Interpreter の場合


概要(Summary)

Interpreter 自体の初期化処理は, HotSpot の起動時に呼び出される Interpreter::initialize() の中で行われる. (See: here for details). Template Interpreter 使用時には Interpreter マクロ定数は TemplateInterpreter に #define されているので, 実際に呼び出されるのは TemplateInterpreter::initialize() になる.

TemplateInterpreter::initialize() 内では TemplateInterpreter の構築処理が行われる. 実際の構築処理のほとんどは InterpreterGenerator のコンストラクタ内に実装されている.

備考(Notes)

InterpreterGenerator のコンストラクタ内の処理は cpu/ ごとに定義されている. ただし, どの定義も (スーパークラスとして CppInterpreterGenerator か TemplateInterpreterGenerator のコンストラクタを呼んだ後) TemplateInterpreterGenerator::generate_all() を呼び出すだけになっている. (なぜ share/ 以下で共通化していない? #TODO)

備考(Notes)

なお, TemplateInterpreter が使用する TemplateTable の初期化処理 (TemplateTable::initialize()) については, TemplateInterpreter の初期化処理 (TemplateInterpreter::initialize()) から呼び出されているほか, init_globals() 内で呼ばれる templateTable_init() からも呼び出されている.

とはいえ, 一度でいいと思うので templateTable_init() の処理は要らない気がするが...?? #TODO.

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

(See: here for details)
-> TemplateInterpreter::initialize()
   -> (1) 基底クラスの初期化メソッドを呼び出して, InvocationCounter 等の初期化を行う.
    
          -> AbstractInterpreter::initialize()
             -> InvocationCounter::reinitialize()
                -> InvocationCounter::def()
    
      (2) 各バイトコードに対応する Template オブジェクトを生成する
          (なお, ここでは Template オブジェクトを作るだけ.
          これらの Template オブジェクトによって実際にコードが生成されるのはもう少し先)
    
          -> TemplateTable::initialize()
             -> TemplateTable::def()
                -> Template::initialize()
             -> TemplateTable::pd_initialize()
    
      (3) 実際にインタープリタを構築する
    
          -> InterpreterGenerator::InterpreterGenerator()
             -> TemplateInterpreterGenerator::generate_all()
    
                (1) ネイティブメソッド用の generic (slow) signature handler の生成
    
                    -> AbstractInterpreterGenerator::generate_all()
                       -> AbstractInterpreterGenerator::generate_slow_signature_handler()
                          -> (See: here for details)
    
                (1) 実行時エラー用のコード (TOS 状態がおかしい時などに使用するコード) を生成
    
                    -> TemplateInterpreterGenerator::generate_error_exit()
    
                (1) デバッグ用のバイトコードトレースコードを生成 (#ifndef PRODUCT にのみ生成)
    
                    -> TemplateInterpreterGenerator::generate_trace_code()
    
                (1) return entry 用のコードを生成
    
                    -> TemplateInterpreterGenerator::generate_return_entry_for()
                       -> (See: here for details)
    
                (1) JVMTI の ForceEarlyReturn 処理用のコードレットを生成
    
                    -> TemplateInterpreterGenerator::generate_earlyret_entry_for()
                       -> (See: here for details)
    
                (1) Deoptimization 処理用の deopt entry を生成
    
                    -> TemplateInterpreterGenerator::generate_deopt_entry_for()
                       -> (See: Deoptimization)
    
                (1) ネイティブメソッド用の result handler を作成
    
                    -> TemplateInterpreterGenerator::generate_result_handler_for()
                       -> (See: here for details)
    
                (1) 各種 invoke 命令 (invokevirtual, invokeinterface etc) 用の return entry を取得する
    
                    -> Interpreter::return_entry()
    
                (1) ??#TODO の生成
    
                    -> TemplateInterpreterGenerator::generate_continuation_for()
    
                (1) Template Interpreter を Safepoint 停止させるためのコードを生成
    
                    -> TemplateInterpreterGenerator::generate_safept_entry_for()
    
                (1) 例外発生時の例外送出処理やスタックの巻き戻し処理コードの生成
    
                    -> TemplateInterpreterGenerator::generate_throw_exception()
                       -> (See: here for details)
                    -> TemplateInterpreterGenerator::generate_${例外名}_handler()
                       -> (See: here for details)
    
                (1) メソッドのエントリ部処理用コードの生成
    
                    -> AbstractInterpreterGenerator::generate_method_entry()
                       -> (See: here for details)
    
                (1) 各バイトコードに対応するコードの生成
    
                    -> TemplateInterpreterGenerator::set_entry_points_for_all_bytes()
                       -> (See: here for details)
    
                (1) Safepoint 停止用の dispatch table(TemplateInterpreter::_safept_table) の生成
    
                    -> TemplateInterpreterGenerator::set_safepoints_for_all_bytes()

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

TemplateInterpreter::initialize()

See: here for details

AbstractInterpreter::initialize()

See: here for details

InvocationCounter::reinitialize()

(#Under Construction) See: here for details

InvocationCounter::def()

See: here for details

TemplateTable::initialize()

See: here for details

TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(), char filler)

See: here for details

TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(int arg), int arg)

See: here for details

TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(Operation op), Operation op)

See: here for details

TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(bool arg ), bool arg)

See: here for details

TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(TosState tos), TosState tos)

See: here for details

TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(Condition cc), Condition cc)

See: here for details

Template::initialize()

See: here for details

TemplateTable::pd_initialize() (sparc の場合)

See: here for details

TemplateTable::pd_initialize() (x86_64 の場合)

See: here for details

InterpreterGenerator::InterpreterGenerator() (sparc の場合)

See: here for details

InterpreterGenerator::InterpreterGenerator() (x86_64 の場合)

See: here for details

TemplateInterpreterGenerator::TemplateInterpreterGenerator()

See: here for details

TemplateInterpreterGenerator::generate_all()

See: here for details

AbstractInterpreterGenerator::generate_all()

See: here for details

TemplateInterpreterGenerator::generate_error_exit()

See: here for details

TemplateInterpreterGenerator::generate_trace_code() (sparc の場合)

See: here for details

TemplateInterpreterGenerator::generate_trace_code() (x86_64 の場合)

See: here for details

SharedRuntime::trace_bytecode()

See: here for details

TemplateInterpreter::return_entry()

See: here for details

TemplateInterpreterGenerator::generate_continuation_for()

(#Under Construction)

TemplateInterpreterGenerator::generate_safept_entry_for() (sparc の場合)

See: here for details

TemplateInterpreterGenerator::generate_safept_entry_for() (x86_64 の場合)

See: here for details

TemplateInterpreterGenerator::set_safepoints_for_all_bytes()

See: here for details

templateTable_init()

See: here for details


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