JIT コンパイル作業中に使用される一時オブジェクト(ResourceObjクラス).
生成するコードに関するデバッグ情報を蓄えていくためのクラス (この情報は GC やスタック辿りや deopt 処理で使用される).
((cite: hotspot/src/share/vm/code/debugInfoRec.hpp))
//** The DebugInformationRecorder collects debugging information
// for a compiled method.
// Debugging information is used for:
// - garbage collecting compiled frames
// - stack tracing across compiled frames
// - deoptimizating compiled frames
((cite: hotspot/src/share/vm/code/debugInfoRec.hpp))
class DebugInformationRecorder: public ResourceObj {
以下のような情報を含んでいる.
(なお, DebugInformationRecorder 自体は作業用の一時オブジェクト(ResourceObjクラス)なので, 収集された情報は JIT 完了後は nmethod 構造体に格納されて使用される.)
以下の処理を JIT 中に行う
JIT 生成が終了したら, oop_size(), data_size(), pcs_size() で大きさを取得して nmethod 構造体を作り, copy_to() メソッドでデータを nmethod 構造体に書き込んでおく.
((cite: hotspot/src/share/vm/code/debugInfoRec.hpp))
// The implementation requires the compiler to use the recorder
// in the following order:
// 1) Describe debug information for safepoints at increasing addresses.
// a) Add safepoint entry (use add_safepoint or add_non_safepoint)
// b) Describe scopes for that safepoint
// - create locals if needed (use create_scope_values)
// - create expressions if needed (use create_scope_values)
// - create monitor stack if needed (use create_monitor_values)
// - describe scope (use describe_scope)
// "repeat last four steps for all scopes"
// "outer most scope first and inner most scope last"
// NB: nodes from create_scope_values and create_locations
// can be reused for simple sharing.
// - mark the end of the scopes (end_safepoint or end_non_safepoint)
// 2) Use oop_size, data_size, pcs_size to create the nmethod and
// finally migrate the debugging information into the nmethod
// by calling copy_to.
JIT 作業の開始時点である Compile::Init() 処理の中で作成されている.
その後の JIT 作業中で値が蓄えられていく模様(?) #TODO
((cite: hotspot/src/share/vm/opto/compile.cpp))
void Compile::Init(int aliaslevel) {
...
env()->set_debug_info(new DebugInformationRecorder(env()->oop_recorder()));
以下のような場所で呼び出されている. ...(#TODO)
以下のようなメソッドを備えている.
void DebugInformationRecorder::add_safepoint(int pc_offset, OopMap* map) : pc_offset の箇所に対応する OopMap を登録し, さらに, pc_offset の箇所に対応する PcDesc を新たに作って登録する.
void DebugInformationRecorder::add_new_pc_offset(int pc_offset) : pc_offset の箇所に対応する PcDesc を新たに作って登録するための内部関数. 追加時の PcDesc の値は以下の通り. (pc_offset 以外の値は describe_scope() できちんとしたものに設定する?? #TODO)
PcDesc(pc_offset, DebugInformationRecorder::serialized_null, DebugInformationRecorder::serialized_null)
void DebugInformationRecorder::add_non_safepoint(int pc_offset) : pc_offset の箇所に対応する PcDesc を新たに作って登録する.
(add_oopmap() を呼ばない版の DebugInformationRecorder::add_safepoint(). あるいは, DebugInformationRecorder::add_new_pc_offset() 呼んでるだけの関数, とも言う...)
void DebugInformationRecorder::describe_scope(...) :
// must call add_safepoint before: it sets PcDesc and this routine uses // the last PcDesc set
int DebugInformationRecorder::serialize_monitor_values(GrowableArray
int DebugInformationRecorder::serialize_scope_values(GrowableArray
See: here for details
DebugInformationRecorder クラス内で使用される補助クラス.
なお, "DIR" は DebugInformationRecorder の頭文字.
(#Under Construction)
((cite: hotspot/src/share/vm/code/debugInfoRec.cpp))
// Private definition.
// There is one DIR_Chunk for each scope and values array.
// A chunk can potentially be used more than once.
// We keep track of these chunks in order to detect
// repetition and enable sharing.
class DIR_Chunk {
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.