8166869: [JVMCI] record metadata relocations for metadata references
Reviewed-by: kvn
This commit is contained in:
parent
f99a7c05c4
commit
146d0563d9
@ -71,7 +71,7 @@ void CodeInstaller::pd_patch_MetaspaceConstant(int pc_offset, Handle constant, T
|
|||||||
if (HotSpotMetaspaceConstantImpl::compressed(constant)) {
|
if (HotSpotMetaspaceConstantImpl::compressed(constant)) {
|
||||||
#ifdef _LP64
|
#ifdef _LP64
|
||||||
NativeMovConstReg32* move = nativeMovConstReg32_at(pc);
|
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);
|
move->set_data((intptr_t)narrowOop);
|
||||||
TRACE_jvmci_3("relocating (narrow metaspace constant) at " PTR_FORMAT "/0x%x", p2i(pc), narrowOop);
|
TRACE_jvmci_3("relocating (narrow metaspace constant) at " PTR_FORMAT "/0x%x", p2i(pc), narrowOop);
|
||||||
#else
|
#else
|
||||||
@ -79,7 +79,7 @@ void CodeInstaller::pd_patch_MetaspaceConstant(int pc_offset, Handle constant, T
|
|||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
NativeMovConstReg* move = nativeMovConstReg_at(pc);
|
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);
|
move->set_data((intptr_t)reference);
|
||||||
TRACE_jvmci_3("relocating (metaspace constant) at " PTR_FORMAT "/" PTR_FORMAT, p2i(pc), p2i(reference));
|
TRACE_jvmci_3("relocating (metaspace constant) at " PTR_FORMAT "/" PTR_FORMAT, p2i(pc), p2i(reference));
|
||||||
}
|
}
|
||||||
|
@ -89,14 +89,14 @@ void CodeInstaller::pd_patch_MetaspaceConstant(int pc_offset, Handle constant, T
|
|||||||
if (HotSpotMetaspaceConstantImpl::compressed(constant)) {
|
if (HotSpotMetaspaceConstantImpl::compressed(constant)) {
|
||||||
#ifdef _LP64
|
#ifdef _LP64
|
||||||
address operand = Assembler::locate_operand(pc, Assembler::narrow_oop_operand);
|
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));
|
TRACE_jvmci_3("relocating (narrow metaspace constant) at " PTR_FORMAT "/" PTR_FORMAT, p2i(pc), p2i(operand));
|
||||||
#else
|
#else
|
||||||
JVMCI_ERROR("compressed Klass* on 32bit");
|
JVMCI_ERROR("compressed Klass* on 32bit");
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
address operand = Assembler::locate_operand(pc, Assembler::imm_operand);
|
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));
|
TRACE_jvmci_3("relocating (metaspace constant) at " PTR_FORMAT "/" PTR_FORMAT, p2i(pc), p2i(operand));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -172,7 +172,7 @@ OopMap* CodeInstaller::create_oop_map(Handle debug_info, TRAPS) {
|
|||||||
return map;
|
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
|
* 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,
|
* class is in general not equal to the pointer of the subclass. When patching metaspace pointers,
|
||||||
@ -184,12 +184,14 @@ void* CodeInstaller::record_metadata_reference(Handle constant, TRAPS) {
|
|||||||
Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectTypeImpl::javaClass(obj));
|
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));
|
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);
|
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());
|
TRACE_jvmci_3("metadata[%d of %d] = %s", index, _oop_recorder->metadata_count(), klass->name()->as_C_string());
|
||||||
return klass;
|
return klass;
|
||||||
} else if (obj->is_a(HotSpotResolvedJavaMethodImpl::klass())) {
|
} else if (obj->is_a(HotSpotResolvedJavaMethodImpl::klass())) {
|
||||||
Method* method = (Method*) (address) HotSpotResolvedJavaMethodImpl::metaspaceMethod(obj);
|
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));
|
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);
|
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());
|
TRACE_jvmci_3("metadata[%d of %d] = %s", index, _oop_recorder->metadata_count(), method->name()->as_C_string());
|
||||||
return method;
|
return method;
|
||||||
} else {
|
} else {
|
||||||
@ -198,7 +200,7 @@ void* CodeInstaller::record_metadata_reference(Handle constant, TRAPS) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _LP64
|
#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);
|
oop obj = HotSpotMetaspaceConstantImpl::metaspaceObject(constant);
|
||||||
assert(HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected uncompressed pointer");
|
assert(HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected uncompressed pointer");
|
||||||
|
|
||||||
@ -208,6 +210,7 @@ narrowKlass CodeInstaller::record_narrow_metadata_reference(Handle constant, TRA
|
|||||||
|
|
||||||
Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectTypeImpl::javaClass(obj));
|
Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectTypeImpl::javaClass(obj));
|
||||||
int index = _oop_recorder->find_index(klass);
|
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());
|
TRACE_jvmci_3("narrowKlass[%d of %d] = %s", index, _oop_recorder->metadata_count(), klass->name()->as_C_string());
|
||||||
return Klass::encode_klass(klass);
|
return Klass::encode_klass(klass);
|
||||||
}
|
}
|
||||||
@ -701,12 +704,12 @@ JVMCIEnv::CodeInstallResult CodeInstaller::initialize_buffer(CodeBuffer& buffer,
|
|||||||
if (constant->is_a(HotSpotMetaspaceConstantImpl::klass())) {
|
if (constant->is_a(HotSpotMetaspaceConstantImpl::klass())) {
|
||||||
if (HotSpotMetaspaceConstantImpl::compressed(constant)) {
|
if (HotSpotMetaspaceConstantImpl::compressed(constant)) {
|
||||||
#ifdef _LP64
|
#ifdef _LP64
|
||||||
*((narrowKlass*) dest) = record_narrow_metadata_reference(constant, CHECK_OK);
|
*((narrowKlass*) dest) = record_narrow_metadata_reference(_constants, dest, constant, CHECK_OK);
|
||||||
#else
|
#else
|
||||||
JVMCI_ERROR_OK("unexpected compressed Klass* in 32-bit mode");
|
JVMCI_ERROR_OK("unexpected compressed Klass* in 32-bit mode");
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} 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())) {
|
} else if (constant->is_a(HotSpotObjectConstantImpl::klass())) {
|
||||||
Handle obj = HotSpotObjectConstantImpl::object(constant);
|
Handle obj = HotSpotObjectConstantImpl::object(constant);
|
||||||
|
@ -189,9 +189,9 @@ protected:
|
|||||||
ScopeValue* get_scope_value(Handle value, BasicType type, GrowableArray<ScopeValue*>* objects, ScopeValue* &second, TRAPS);
|
ScopeValue* get_scope_value(Handle value, BasicType type, GrowableArray<ScopeValue*>* objects, ScopeValue* &second, TRAPS);
|
||||||
MonitorValue* get_monitor_value(Handle value, GrowableArray<ScopeValue*>* objects, TRAPS);
|
MonitorValue* get_monitor_value(Handle value, GrowableArray<ScopeValue*>* objects, TRAPS);
|
||||||
|
|
||||||
void* record_metadata_reference(Handle constant, TRAPS);
|
void* record_metadata_reference(CodeSection* section, address dest, Handle constant, TRAPS);
|
||||||
#ifdef _LP64
|
#ifdef _LP64
|
||||||
narrowKlass record_narrow_metadata_reference(Handle constant, TRAPS);
|
narrowKlass record_narrow_metadata_reference(CodeSection* section, address dest, Handle constant, TRAPS);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// extract the fields of the HotSpotCompiledCode
|
// extract the fields of the HotSpotCompiledCode
|
||||||
|
Loading…
x
Reference in New Issue
Block a user