src/share/vm/compiler/disassembler.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/vm/compiler/disassembler.cpp	Fri Feb  5 16:13:48 2016
--- new/src/share/vm/compiler/disassembler.cpp	Fri Feb  5 16:13:48 2016

*** 78,87 **** --- 78,88 ---- if (_tried_to_load_library) { // Do not try twice. // To force retry in debugger: assign _tried_to_load_library=0 return false; } + // Try to load it. char ebuf[1024]; char buf[JVM_MAXPATHLEN]; os::jvm_path(buf, sizeof(buf)); int jvm_offset = -1;
*** 163,172 **** --- 164,189 ---- // Success. tty->print_cr("Loaded disassembler from %s", buf); return true; } + bool Disassembler::can_decode() { + if (_decode_instructions_virtual != NULL || _decode_instructions != NULL) { + // Already succeeded. + return true; + } + if (_tried_to_load_library) { + // Do not try twice. + // To force retry in debugger: assign _tried_to_load_library=0 + return false; + } + + // If it was not loaded - lock and load. (double checked) + MutexLockerEx locker(DirectivesStack_lock, Mutex::_no_safepoint_check_flag); + return Disassembler::load_library(); + } + class decode_env { private: nmethod* _nm; CodeBlob* _code;
*** 511,522 **** --- 528,539 ---- options()); } void Disassembler::decode(CodeBlob* cb, outputStream* st) { + if (!can_decode()) return; ttyLocker ttyl; if (!load_library()) return; if (cb->is_nmethod()) { decode((nmethod*)cb, st); return; } decode_env env(cb, st);
*** 525,543 **** --- 542,560 ---- env.output()->print_cr(" at [" PTR_FORMAT ", " PTR_FORMAT "] " JLONG_FORMAT " bytes", p2i(cb->code_begin()), p2i(cb->code_end()), ((jlong)(cb->code_end() - cb->code_begin())) * sizeof(unsigned char*)); env.decode_instructions(cb->code_begin(), cb->code_end()); } void Disassembler::decode(address start, address end, outputStream* st, CodeStrings c) { + if (!can_decode()) return; ttyLocker ttyl; if (!load_library()) return; decode_env env(CodeCache::find_blob_unsafe(start), st, c); env.decode_instructions(start, end); } void Disassembler::decode(nmethod* nm, outputStream* st) { + if (!can_decode()) return; ttyLocker ttyl; if (!load_library()) return; decode_env env(nm, st); env.output()->print_cr("----------------------------------------------------------------------"); #ifdef SHARK SharkEntry* entry = (SharkEntry *) nm->code_begin();

src/share/vm/compiler/disassembler.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File