# HG changeset patch # User never # Date 1475168456 25200 # Node ID 94ef14db8a2050619eda10a80b4cdb466e051ebd # Parent 578189b0f23006b3590746b2ac1d14dae0498db4 8166869: [JVMCI] record metadata relocations for metadata references Reviewed-by: kvn diff -r 578189b0f230 -r 94ef14db8a20 hotspot/src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp --- a/hotspot/src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp Wed Sep 28 10:11:40 2016 -0700 +++ b/hotspot/src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp Thu Sep 29 10:00:56 2016 -0700 @@ -71,7 +71,7 @@ if (HotSpotMetaspaceConstantImpl::compressed(constant)) { #ifdef _LP64 NativeMovConstReg32* move = nativeMovConstReg32_at(pc); - narrowKlass narrowOop = record_narrow_metadata_reference(constant, CHECK); + narrowKlass narrowOop = record_narrow_metadata_reference(_instructions, pc, constant, CHECK); move->set_data((intptr_t)narrowOop); TRACE_jvmci_3("relocating (narrow metaspace constant) at " PTR_FORMAT "/0x%x", p2i(pc), narrowOop); #else @@ -79,7 +79,7 @@ #endif } else { NativeMovConstReg* move = nativeMovConstReg_at(pc); - void* reference = record_metadata_reference(constant, CHECK); + void* reference = record_metadata_reference(_instructions, pc, constant, CHECK); move->set_data((intptr_t)reference); TRACE_jvmci_3("relocating (metaspace constant) at " PTR_FORMAT "/" PTR_FORMAT, p2i(pc), p2i(reference)); } diff -r 578189b0f230 -r 94ef14db8a20 hotspot/src/cpu/x86/vm/jvmciCodeInstaller_x86.cpp --- a/hotspot/src/cpu/x86/vm/jvmciCodeInstaller_x86.cpp Wed Sep 28 10:11:40 2016 -0700 +++ b/hotspot/src/cpu/x86/vm/jvmciCodeInstaller_x86.cpp Thu Sep 29 10:00:56 2016 -0700 @@ -89,14 +89,14 @@ if (HotSpotMetaspaceConstantImpl::compressed(constant)) { #ifdef _LP64 address operand = Assembler::locate_operand(pc, Assembler::narrow_oop_operand); - *((narrowKlass*) operand) = record_narrow_metadata_reference(constant, CHECK); + *((narrowKlass*) operand) = record_narrow_metadata_reference(_instructions, operand, constant, CHECK); TRACE_jvmci_3("relocating (narrow metaspace constant) at " PTR_FORMAT "/" PTR_FORMAT, p2i(pc), p2i(operand)); #else JVMCI_ERROR("compressed Klass* on 32bit"); #endif } else { address operand = Assembler::locate_operand(pc, Assembler::imm_operand); - *((void**) operand) = record_metadata_reference(constant, CHECK); + *((void**) operand) = record_metadata_reference(_instructions, operand, constant, CHECK); TRACE_jvmci_3("relocating (metaspace constant) at " PTR_FORMAT "/" PTR_FORMAT, p2i(pc), p2i(operand)); } } diff -r 578189b0f230 -r 94ef14db8a20 hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp --- a/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp Wed Sep 28 10:11:40 2016 -0700 +++ b/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp Thu Sep 29 10:00:56 2016 -0700 @@ -172,7 +172,7 @@ return map; } -void* CodeInstaller::record_metadata_reference(Handle constant, TRAPS) { +void* CodeInstaller::record_metadata_reference(CodeSection* section, address dest, Handle constant, TRAPS) { /* * This method needs to return a raw (untyped) pointer, since the value of a pointer to the base * class is in general not equal to the pointer of the subclass. When patching metaspace pointers, @@ -184,12 +184,14 @@ Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectTypeImpl::javaClass(obj)); assert(!HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected compressed klass pointer %s @ " INTPTR_FORMAT, klass->name()->as_C_string(), p2i(klass)); int index = _oop_recorder->find_index(klass); + section->relocate(dest, metadata_Relocation::spec(index)); TRACE_jvmci_3("metadata[%d of %d] = %s", index, _oop_recorder->metadata_count(), klass->name()->as_C_string()); return klass; } else if (obj->is_a(HotSpotResolvedJavaMethodImpl::klass())) { Method* method = (Method*) (address) HotSpotResolvedJavaMethodImpl::metaspaceMethod(obj); assert(!HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected compressed method pointer %s @ " INTPTR_FORMAT, method->name()->as_C_string(), p2i(method)); int index = _oop_recorder->find_index(method); + section->relocate(dest, metadata_Relocation::spec(index)); TRACE_jvmci_3("metadata[%d of %d] = %s", index, _oop_recorder->metadata_count(), method->name()->as_C_string()); return method; } else { @@ -198,7 +200,7 @@ } #ifdef _LP64 -narrowKlass CodeInstaller::record_narrow_metadata_reference(Handle constant, TRAPS) { +narrowKlass CodeInstaller::record_narrow_metadata_reference(CodeSection* section, address dest, Handle constant, TRAPS) { oop obj = HotSpotMetaspaceConstantImpl::metaspaceObject(constant); assert(HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected uncompressed pointer"); @@ -208,6 +210,7 @@ Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectTypeImpl::javaClass(obj)); int index = _oop_recorder->find_index(klass); + section->relocate(dest, metadata_Relocation::spec(index)); TRACE_jvmci_3("narrowKlass[%d of %d] = %s", index, _oop_recorder->metadata_count(), klass->name()->as_C_string()); return Klass::encode_klass(klass); } @@ -701,12 +704,12 @@ if (constant->is_a(HotSpotMetaspaceConstantImpl::klass())) { if (HotSpotMetaspaceConstantImpl::compressed(constant)) { #ifdef _LP64 - *((narrowKlass*) dest) = record_narrow_metadata_reference(constant, CHECK_OK); + *((narrowKlass*) dest) = record_narrow_metadata_reference(_constants, dest, constant, CHECK_OK); #else JVMCI_ERROR_OK("unexpected compressed Klass* in 32-bit mode"); #endif } else { - *((void**) dest) = record_metadata_reference(constant, CHECK_OK); + *((void**) dest) = record_metadata_reference(_constants, dest, constant, CHECK_OK); } } else if (constant->is_a(HotSpotObjectConstantImpl::klass())) { Handle obj = HotSpotObjectConstantImpl::object(constant); diff -r 578189b0f230 -r 94ef14db8a20 hotspot/src/share/vm/jvmci/jvmciCodeInstaller.hpp --- a/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.hpp Wed Sep 28 10:11:40 2016 -0700 +++ b/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.hpp Thu Sep 29 10:00:56 2016 -0700 @@ -189,9 +189,9 @@ ScopeValue* get_scope_value(Handle value, BasicType type, GrowableArray* objects, ScopeValue* &second, TRAPS); MonitorValue* get_monitor_value(Handle value, GrowableArray* objects, TRAPS); - void* record_metadata_reference(Handle constant, TRAPS); + void* record_metadata_reference(CodeSection* section, address dest, Handle constant, TRAPS); #ifdef _LP64 - narrowKlass record_narrow_metadata_reference(Handle constant, TRAPS); + narrowKlass record_narrow_metadata_reference(CodeSection* section, address dest, Handle constant, TRAPS); #endif // extract the fields of the HotSpotCompiledCode