8059340: ConstantPool::_resolved_references is missing in heap dump

Reviewed-by: sspitsyn, stefank, twisti
This commit is contained in:
Vladimir Ivanov 2015-05-21 18:22:33 +03:00
parent e5a92a9fb9
commit 3f096651f3
17 changed files with 101 additions and 77 deletions

View file

@ -482,6 +482,14 @@ void InterpreterMacroAssembler::get_cache_and_index_and_bytecode_at_bcp(Register
andl(bytecode, ConstantPoolCacheEntry::bytecode_1_mask);
}
void InterpreterMacroAssembler::get_resolved_references(Register reg) {
get_constant_pool(reg);
movptr(reg, Address(reg, ConstantPool::pool_holder_offset_in_bytes()));
movptr(reg, Address(reg, Klass::java_mirror_offset()));
assert(java_lang_Class::resolved_references_offset_in_bytes() > 0, "");
load_heap_oop(reg, Address(reg, java_lang_Class::resolved_references_offset_in_bytes()));
}
void InterpreterMacroAssembler::get_cache_entry_pointer_at_bcp(Register cache,
Register tmp,
int bcp_offset,
@ -499,20 +507,16 @@ void InterpreterMacroAssembler::get_cache_entry_pointer_at_bcp(Register cache,
addptr(cache, tmp); // construct pointer to cache entry
}
// Load object from cpool->resolved_references(index)
void InterpreterMacroAssembler::load_resolved_reference_at_index(
Register result, Register index) {
// Load object from cpool->pool_holder->mirror->resolved_references(index)
void InterpreterMacroAssembler::load_resolved_reference_at_index(Register result, Register index) {
assert_different_registers(result, index);
// convert from field index to resolved_references() index and from
// word index to byte offset. Since this is a java object, it can be compressed
Register tmp = index; // reuse
shll(tmp, LogBytesPerHeapOop);
get_constant_pool(result);
// load pointer for resolved_references[] objArray
movptr(result, Address(result, ConstantPool::resolved_references_offset_in_bytes()));
// JNIHandles::resolve(obj);
movptr(result, Address(result, 0));
get_resolved_references(result);
// Add in the index
addptr(result, tmp);
load_heap_oop(result, Address(result, arrayOopDesc::base_offset_in_bytes(T_OBJECT)));