これらは, JIT コンパイラに対するデバッグ用のクラス. 生成したマシン語を逆アセンブルして表示する為に使われる.
トラブルシューティング用/デバッグ用(開発時用)のクラス?? (関連する diagnostic オプションまたは develop オプション/notproduct オプションが指定されている場合にのみ使用される?? (<= 通常時でも使用されるパスはある?? #TODO)) (See: PrintAdapterHandlers, PrintAssembly, PrintInterpreter, PrintOptoAssembly, PrintSignatureHandlers, PrintStubCode, TracePatching, G1SATBPrintStubs, Verbose, WizardMode, )
生成したマシン語を逆アセンブルして表示するための機能を納めた名前空間 (このクラスは AllStatic ではないが, static なフィールド/メソッドしか持たない).
((cite: hotspot/src/share/vm/compiler/disassembler.hpp))
// The disassembler prints out assembly code annotated
// with Java specific information.
class Disassembler {
Disassembler::decode() を呼び出すと, 逆アセンブル結果が出力される.
なお, Disassembler::decode() は 3種類存在している.
((cite: hotspot/src/share/vm/compiler/disassembler.hpp))
static void decode(CodeBlob *cb, outputStream* st = NULL);
static void decode(nmethod* nm, outputStream* st = NULL);
static void decode(address begin, address end, outputStream* st = NULL);
以下の箇所で(のみ)使用されている.
内部では hsdis-$LIBARCH というライブラリ (e.g. libhsdis-amd64.so) の decode_instruction() 関数を使用している. このライブラリは hotspot/src/share/tools/hsdis をコンパイルすると作られる (See: here for details).
((cite: hotspot/src/share/vm/compiler/disassembler.cpp))
static const char hsdis_library_name[] = "hsdis-"HOTSPOT_LIB_ARCH;
static const char decode_instructions_name[] = "decode_instructions";
See: here for details
Disassembler クラス内で使用される補助クラス. 逆アセンブル作業中に使われる一時オブジェクト (なお, このクラスは StackObjクラスではないが現状では局所変数としてのみ生成されている).
このクラスがマシン依存な箇所を担当している (というか Disassembler クラスは実際の処理はほとんどせず decode_env クラスに丸投げしているだけ).
((cite: hotspot/src/share/vm/compiler/disassembler.cpp))
class decode_env {
以下の箇所で(のみ)使用されている.
実際の逆アセンブル処理自体は hsdis ライブラリが行っている.
ただし, hsdis ライブラリから (event_to_env や printf_to_env という関数を介して) decode_env クラスのメソッドがコールバックで呼び出されている模様.
(以下の this がコールバックに引数として渡される decode_env オブジェクト)
((cite: hotspot/src/share/vm/compiler/disassembler.cpp))
address decode_env::decode_instructions(address start, address end) {
...
return (address)
(*Disassembler::_decode_instructions)(start, end,
&event_to_env, (void*) this,
&printf_to_env, (void*) this,
options());
このクラスの挙動は diagnostic オプションである PrintAssemblyOptions で設定できる模様.
((cite: hotspot/src/share/vm/compiler/disassembler.cpp))
decode_env::decode_env(CodeBlob* code, outputStream* output) {
...
collect_options(PrintAssemblyOptions);
if (strstr(options(), "hsdis-")) {
if (strstr(options(), "hsdis-print-raw"))
_print_raw = (strstr(options(), "xml") ? 2 : 1);
if (strstr(options(), "hsdis-print-pc"))
_print_pc = !_print_pc;
if (strstr(options(), "hsdis-print-bytes"))
_print_bytes = !_print_bytes;
}
if (strstr(options(), "help")) {
tty->print_cr("PrintAssemblyOptions help:");
tty->print_cr(" hsdis-print-raw test plugin by requesting raw output");
tty->print_cr(" hsdis-print-raw-xml test plugin by requesting raw xml");
tty->print_cr(" hsdis-print-pc turn off PC printing (on by default)");
tty->print_cr(" hsdis-print-bytes turn on instruction byte output");
tty->print_cr("combined options: %s", options());
}
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.