Template Interpreter がランタイム(InterpreterRuntime, SharedRuntime)を呼び出す場合, 以下の関数が生成するコードが使用される.
MacroAssembler::call_VM()
非リーフ関数用 (JRT_ENTRY で宣言されているもの等. See: here for details)
MacroAssembler::call_VM_leaf()
リーフ関数用 (JRT_LEAF で宣言されているもの等. See: here for details)
((cite: hotspot/src/cpu/x86/vm/assembler_x86.hpp))
// Support for VM calls
//
// It is imperative that all calls into the VM are handled via the call_VM macros.
// They make sure that the stack linkage is setup correctly. call_VM's correspond
// to ENTRY/ENTRY_X entry points while call_VM_leaf's correspond to LEAF entry points.
MacroAssembler::call_VM() には, 呼び出すランタイム関数の引数の個数に応じて 4通りが存在する (引数の数が 1個, 2個, 3個, 及びそれらから呼び出される可変個版). また, last_java_sp を示すレジスタを渡すものと渡さないものがある. このため, 全体では 4*2 = 8通りの call_VM() 関数が用意されている.
ただし, どの場合も最終的には MacroAssembler::call_VM_base() 内で実際の呼び出し処理が行われる.
なお, 現状の sparc 版では, last_java_sp を渡すバージョンは使われていないとのこと.
((cite: hotspot/src/cpu/sparc/vm/assembler_sparc.hpp))
// these overloadings are not presently used on SPARC:
また, last_java_sp を渡すバージョンは, 既に save が実行されていて last Java frame が一つ前のフレームになっている場合に便利, とのこと (この場合, last_javva_sp は SP ではなく FP として渡される必要がある).
((cite: hotspot/src/cpu/sparc/vm/assembler_sparc.cpp))
// Note: The following call_VM overloadings are useful when a "save"
// has already been performed by a stub, and the last Java frame is
// the previous one. In that case, last_java_sp must be passed as FP
// instead of SP.
MacroAssembler::call_VM_leaf() も MacroAssembler::call_VM() と同様で, 呼び出すランタイム関数の引数の個数に応じて 4通りが存在する (それぞれ, 引数の数が 1個, 2個, 3個, 及びそれらから呼び出される可変個版).
どの場合も, 最終的には MacroAssembler::call_VM_leaf_base() 内で実際の呼び出し処理が行われる
VMルーチンはC++コードであるため, 処理としては native メソッドの呼び出しに若干似ている.
MacroAssembler::call_VM() (引数 1~3 個版) が生成するコード -> MacroAssembler::call_VM() (引数可変個版) が生成するコード -> InterpreterMacroAssembler::call_VM_base() が生成するコード -> MacroAssembler::call_VM_base() が生成するコード -> JavaFrameAnchor に, 呼び出し元の Java メソッドの PC と SP を退避 -> 指定されたエントリポイントを呼び出す -> 呼び出し元の Java メソッドの PC と SP を復帰 -> MacroAssembler::check_and_forward_exception() が生成するコード (例外や PopFrame, ForceEarlyReturn のチェックを行う. 必要に応じてそれぞれの処理ルーチンにジャンプ) -> InterpreterMacroAssembler::check_and_handle_popframe() が生成するコード -> (See: here for details) -> InterpreterMacroAssembler::check_and_handle_earlyret() が生成するコード -> (See: here for details) -> 例外チェックを行い, 発生していれば例外処理ルーチンへジャンプ (StubRoutines::forward_exception_entry()). -> (See: here for details)
MacroAssembler::call_VM() (引数 1~3 個版, last_java_sp 指定有り) が生成するコード -> MacroAssembler::call_VM() (引数可変個版, last_java_sp 指定有り) が生成するコード -> InterpreterMacroAssembler::call_VM_base() が生成するコード -> (同上)
MacroAssembler::call_VM_leaf() (引数 1~3 個版) が生成するコード -> MacroAssembler::call_VM_leaf() (引数可変個版) が生成するコード -> InterpreterMacroAssembler::call_VM_leaf_base() が生成するコード -> MacroAssembler::call_VM_leaf_base() が生成するコード
MacroAssembler::call_VM() (引数 1~3 個, 及び可変個版) が生成するコード -> MacroAssembler::call_VM_helper() が生成するコード -> InterpreterMacroAssembler::call_VM_base() が生成するコード -> MacroAssembler::call_VM_base() が生成するコード -> MacroAssembler::call_VM_leaf_base() が生成するコード -> 指定されたエントリポイントを呼び出す -> InterpreterMacroAssembler::check_and_handle_popframe() が生成するコード -> (See: here for details) -> InterpreterMacroAssembler::check_and_handle_earlyret() が生成するコード -> (See: here for details) -> 例外チェックを行い, 発生していれば例外処理ルーチンへジャンプ (StubRoutines::forward_exception_entry()). -> (See: here for details)
MacroAssembler::call_VM() (引数 1~3 個版, last_java_sp 指定有り) が生成するコード -> MacroAssembler::call_VM() (引数可変個版, last_java_sp 指定有り) が生成するコード -> InterpreterMacroAssembler::call_VM_base() が生成するコード -> (同上)
MacroAssembler::call_VM_leaf() (引数 1~3 個版) が生成するコード -> MacroAssembler::call_VM_leaf() (引数可変個版) が生成するコード -> InterpreterMacroAssembler::call_VM_leaf_base() が生成するコード -> MacroAssembler::call_VM_leaf_base() が生成するコード -> (同上)
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
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
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
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
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
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
See: here for details
See: here for details
See: here for details
なお同じファイル内に #ifndef _LP64 版とそうでない版がある. これは _LP64 版.
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.