これらは, 実行時のマシン語コード生成を行うためのクラス. より具体的に言うと, stubcode に対する生成処理やデバッグ/出力処理等に関するクラス (See: here for details).
((cite: hotspot/src/share/vm/runtime/stubCodeGenerator.hpp))
// All the basic framework for stubcode generation/debugging/printing.
何らかのスタブコードの生成処理で使用される一時オブジェクト(StackObjクラス) (の基底クラス).
実際にスタブコードを生成する機能を提供する.
((cite: hotspot/src/share/vm/runtime/stubCodeGenerator.hpp))
// The base class for all stub-generating code generators.
// Provides utility functions.
class StubCodeGenerator: public StackObj {
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
現状では以下のようなサブクラスが存在する.
StubCodeGenerator に定義されている以下の 2つのメソッドは, 補助クラスである StubCodeMark のコンストラクタ/デストラクタから呼び出される.
((cite: hotspot/src/share/vm/runtime/stubCodeGenerator.hpp))
virtual void stub_prolog(StubCodeDesc* cdesc); // called by StubCodeMark constructor
virtual void stub_epilog(StubCodeDesc* cdesc); // called by StubCodeMark destructor
デフォルトの挙動は以下の通り.
これらは, 必要に応じてサブクラスでオーバーライドすることもできる. ただし, 現状でオーバーライドしているのは Sparc 版の StubGenerator クラスのみ (この場合はインストラクションキャッシュのキャッシュライン幅に合わせて先頭アドレスをアラインメントさせている).
See: here for details
See: here for details
See: here for details
See: here for details
StubCodeGenerator が生成した stub の管理用のクラス.
StubCodeGenerator が生成した stub に関する「メタ情報」を格納している (e.g. その stub の名前, 開始アドレス, 終端アドレス, etc). この情報は主にデバッグや出力用途に使用される模様.
((cite: hotspot/src/share/vm/runtime/stubCodeGenerator.hpp))
// A StubCodeDesc describes a piece of generated code (usually stubs).
// This information is mainly useful for debugging and printing.
// Currently, code descriptors are simply chained in a linked list,
// this may have to change if searching becomes too slow.
class StubCodeDesc: public CHeapObj {
なお, 生成された StubCodeDesc オブジェクトは自動的に大域変数に登録される (内部構造も参照).
スタブ用のコードを生成する. このコード生成の前後で StubCodeDesc::set_begin() 及び StubCodeDesc::set_end() を呼び出し, コードの開始アドレスと終端アドレスを登録しておく.
以下の static メソッドで, 生成済みの StubCodeDesc (あるいはその内部の情報) を取得できる.
以下の箇所に(のみ)格納されている.
(正確には, このフィールドは StubCodeDesc の線形リストを格納するフィールド. StubCodeDesc オブジェクトは _next フィールドで次の StubCodeDesc オブジェクトを指せる構造になっている. 生成した StubCodeDesc オブジェクトは全てこの線形リスト内に格納されている)
((cite: hotspot/src/share/vm/runtime/stubCodeGenerator.hpp))
static StubCodeDesc* _list; // the list of all descriptors
static int _count; // length of list
(正確には, これらのフィールドは StubCodeDesc の線形リスト(の先頭と最後)を格納するフィールド. StubCodeDesc オブジェクトは _next フィールドで次の StubCodeDesc オブジェクトを指せる構造になっている. その StubCodeGenerator 内で生成した StubCodeDesc オブジェクトは全てこの線形リスト内に格納されている)
(格納している StubCodeDesc オブジェクト自体は, StubCodeDesc::_list が指しているものと重複)
StubCodeMark::StubCodeMark() 内で(のみ)生成されている.
生成した StubCodeDesc オブジェクトは, 以下の箇所で(のみ)参照されている.
(#TODO)
relocInfo から Relocation への変換処理
(#TODO)
-XX:+PrintAssembly の処理
トレース出力処理
定義されているフィールドは以下の通り.
_next
線形リストを構成するためのポインタ. 次の StubCodeDesc を指す.
_group
そのスタブコードが属しているグループ ("ICache", "StubRoutines", 等). コンストラクタに渡した文字列がそのまま設定される.
_name
そのスタブコードの名前 ("flush_icache_stub", "call_stub", 等). コンストラクタに渡した文字列がそのまま設定される.
_index
そのスタブコードを指し示す一意な番号. 現在は StubCodeDesc::_list 中での順番が格納されている.
_begin
そのスタブコードの開始アドレス.
_end
そのスタブコードの終端アドレス.
((cite: hotspot/src/share/vm/runtime/stubCodeGenerator.hpp))
StubCodeDesc* _next; // the next element in the linked list
const char* _group; // the group to which the stub code belongs
const char* _name; // the name assigned to the stub code
int _index; // serial number assigned to the stub
address _begin; // points to the first byte of the stub code (included)
address _end; // points to the first byte after the stub code (excluded)
なお, StubCodeDesc::_list につなぐ処理はコンストラクタで行われている.
See: here for details
See: here for details
StubCodeGenerator クラス用のユーティリティ・クラス.
StubCodeDesc オブジェクトの生成処理を簡単に行うための補助クラス(StackObjクラス). ソースコード上のスコープに連動して StubCodeDesc の生成処理(や初期化等)を行う.
((cite: hotspot/src/share/vm/runtime/stubCodeGenerator.hpp))
// Stack-allocated helper class used to assciate a stub code with a name.
// All stub code generating functions that use a StubCodeMark will be registered
// in the global StubCodeDesc list and the generated stub code can be identified
// later via an address pointing into it.
class StubCodeMark: public StackObj {
コード中で StubCodeMark 型の局所変数を宣言するだけ.
以下の箇所で(のみ)使用されている.
MethodHandlesAdapterGenerator::generate()
Sparc の場合
x86 (32/64 共通) の場合
VM_Version_StubGenerator::generate_getPsrInfo()
x86_32 の場合
x86_64 の場合
コンストラクタで新しい StubCodeDesc を作成し, group や name, スタブコードの先頭アドレス等を設定する.
デストラクタでスタブコードの終端アドレスを設定する.
((cite: hotspot/src/share/vm/runtime/stubCodeGenerator.cpp))
StubCodeMark::StubCodeMark(StubCodeGenerator* cgen, const char* group, const char* name) {
_cgen = cgen;
_cdesc = new StubCodeDesc(group, name, _cgen->assembler()->pc());
_cgen->stub_prolog(_cdesc);
// define the stub's beginning (= entry point) to be after the prolog:
_cdesc->set_begin(_cgen->assembler()->pc());
}
StubCodeMark::~StubCodeMark() {
_cgen->assembler()->flush();
_cdesc->set_end(_cgen->assembler()->pc());
assert(StubCodeDesc::_list == _cdesc, "expected order on list");
_cgen->stub_epilog(_cdesc);
Forte::register_stub(_cdesc->name(), _cdesc->begin(), _cdesc->end());
if (JvmtiExport::should_post_dynamic_code_generated()) {
JvmtiExport::post_dynamic_code_generated(_cdesc->name(), _cdesc->begin(), _cdesc->end());
}
}
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.