Up Top

Template Interpreter によるバイトコードの実行処理 : テンプレートの生成処理


概要(Summary)

各テンプレートは TemplateInterpreterGenerator::generate_and_dispatch() で生成される. TemplateInterpreterGenerator::generate_and_dispatch() の処理は大別すると 3つのフェーズに分けられる. このため, 生成されるコード(テンプレート)も大きく分けると 3つの部位からなる.

  1. まず, テンプレートの入り口部分用のコードを生成 (全テンプレートで共通の部分) (InterpreterMacroAssembler::dispatch_prolog()),
  2. 次に, バイトコード本体の処理を行うコードを生成 (テンプレート毎に異なる部分) (Template::generate()),
  3. 最後に, 次のバイトコードにジャンプするコードを生成 (全テンプレートで共通の部分) (InterpreterMacroAssembler::dispatch_epilog())

TemplateInterpreterGenerator::generate_and_dispatch() によるテンプレート生成処理は, HotSpot 起動中に TemplateInterpreterGenerator::set_entry_points_for_all_bytes() 内で呼び出される. この際には, 以下の 3つの生成関数のどれかを経由する (どの関数も最終的には TemplateInterpreterGenerator::generate_and_dispatch() を呼び出す). どれを経由するかは2つの条件に応じて決められる (対象のバイトコードが wide prefix 付きか否か, TOS の想定が vtos のみか否か).

備考(Notes)

なお dispatch table は, 非 wide 命令については Interpreter::normal_table, wide 命令に付いては Interpreter::wentry_point.

初期状態では, dispatch table 中の各 TOS 用のエントリポイントアドレスは, illegal_bytecode_sequence や _unimplementedbytecode になっている.

そして, dispatch table にエントリポイントを設定する処理でも, 正常箇所しか設定は行われないため, 不正な状態の TOS 用のエントリポイントはそのまま残される.

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

(See: here for details)
-> TemplateInterpreterGenerator::set_entry_points_for_all_bytes()
   -> * bytecode として無効なエントリの場合:
        -> TemplateInterpreterGenerator::set_unimplemented()  (<= 異常終了するコードを生成)
      * bytecode として有効なエントリの場合:
        -> TemplateInterpreterGenerator::set_entry_points()
           -> * wide prefix 付きではないバイトコードの場合:
                -> TemplateInterpreterGenerator::set_short_entry_points()
                   -> * そのバイトコードが想定している TOS 状態が vtos の場合:
                        -> TemplateInterpreterGenerator::set_vtos_entry_points()
                           -> TemplateInterpreterGenerator::generate_and_dispatch()
                              -> (1) 必要に応じてデバッグ用のコードを生成
                                     -> TemplateInterpreterGenerator::histogram_bytecode()
                                     -> TemplateInterpreterGenerator::count_bytecode()
                                     -> TemplateInterpreterGenerator::histogram_bytecode_pair()
                                     -> TemplateInterpreterGenerator::trace_bytecode()
                                     -> TemplateInterpreterGenerator::stop_interpreter_at()
                            
                                 (1) テンプレート入り口用のコードを生成.
                                     -> InterpreterMacroAssembler::dispatch_prolog()
                                        -> (See: here for details)
                            
                                 (1) バイトコード本体の処理を行うコードを生成
                                     -> Template::generate()
                                        -> (テンプレート毎に異なる生成関数を呼び出す)
                                           (See: )
                            
                                 (1) テンプレート終了部用のコード(次のバイトコードに遷移する処理)を生成.
                                     -> InterpreterMacroAssembler::dispatch_epilog()
                                        -> (See: here for details)

                      * それ以外の場合:
                        -> TemplateInterpreterGenerator::generate_and_dispatch()
                           -> (同上)
              * wide prefix 付きのバイトコードの場合:
                -> TemplateInterpreterGenerator::set_wide_entry_point()
                   -> TemplateInterpreterGenerator::generate_and_dispatch()
                      -> (同上)

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

TemplateInterpreterGenerator::set_entry_points_for_all_bytes()

See: here for details

TemplateInterpreterGenerator::set_entry_points()

See: here for details

TemplateInterpreterGenerator::set_short_entry_points()

See: here for details

TemplateInterpreterGenerator::set_wide_entry_point()

See: here for details

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

See: here for details

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

See: here for details

TemplateInterpreterGenerator::generate_and_dispatch()

See: here for details

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

(#Under Construction)

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

(#Under Construction)

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

(#Under Construction)

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

(#Under Construction)

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

(#Under Construction)

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

(#Under Construction)

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

(#Under Construction)

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

(#Under Construction) See: here for details

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

(#Under Construction)

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

(#Under Construction)

InterpreterMacroAssembler::verify_method_data_pointer() (sparc の場合)

See: here for details

InterpreterMacroAssembler::verify_method_data_pointer() (x86_64 の場合)

See: here for details

Template::generate()

See: here for details

TemplateInterpreterGenerator::set_unimplemented()

See: here for details


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