mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 06:45:07 +02:00
8223794: applications/kitchensink/Kitchensink.java crash bad oop with Graal
Added new nmethod::oop_at_phantom() method for JVMCI to notify GC that oop should be kept alive Reviewed-by: dlong, eosterlund
This commit is contained in:
parent
4934681f19
commit
2ccecc495c
5 changed files with 20 additions and 8 deletions
|
@ -1473,6 +1473,13 @@ oop nmethod::oop_at(int index) const {
|
|||
return NativeAccess<AS_NO_KEEPALIVE>::oop_load(oop_addr_at(index));
|
||||
}
|
||||
|
||||
oop nmethod::oop_at_phantom(int index) const {
|
||||
if (index == 0) {
|
||||
return NULL;
|
||||
}
|
||||
return NativeAccess<ON_PHANTOM_OOP_REF>::oop_load(oop_addr_at(index));
|
||||
}
|
||||
|
||||
//
|
||||
// Notify all classes this nmethod is dependent on that it is no
|
||||
// longer dependent. This should only be called in two situations.
|
||||
|
|
|
@ -392,6 +392,7 @@ class nmethod : public CompiledMethod {
|
|||
// Support for oops in scopes and relocs:
|
||||
// Note: index 0 is reserved for null.
|
||||
oop oop_at(int index) const;
|
||||
oop oop_at_phantom(int index) const; // phantom reference
|
||||
oop* oop_addr_at(int index) const { // for GC
|
||||
// relocation indexes are biased by 1 (because 0 is reserved)
|
||||
assert(index > 0 && index <= oops_count(), "must be a valid non-zero index");
|
||||
|
|
|
@ -2416,7 +2416,7 @@ C2V_VMENTRY_0(jlong, translate, (JNIEnv* env, jobject, jobject obj_handle))
|
|||
if (peerEnv->is_hotspot()) {
|
||||
// Only the mirror in the HotSpot heap is accessible
|
||||
// through JVMCINMethodData
|
||||
oop nmethod_mirror = data->get_nmethod_mirror(nm);
|
||||
oop nmethod_mirror = data->get_nmethod_mirror(nm, /* phantom_ref */ true);
|
||||
if (nmethod_mirror != NULL) {
|
||||
result = HotSpotJVMCI::wrap(nmethod_mirror);
|
||||
}
|
||||
|
@ -2443,7 +2443,7 @@ C2V_VMENTRY_0(jlong, translate, (JNIEnv* env, jobject, jobject obj_handle))
|
|||
if (data == NULL) {
|
||||
JVMCI_THROW_MSG_0(IllegalArgumentException, "Cannot set HotSpotNmethod mirror for default nmethod");
|
||||
}
|
||||
if (data->get_nmethod_mirror(nm) != NULL) {
|
||||
if (data->get_nmethod_mirror(nm, /* phantom_ref */ false) != NULL) {
|
||||
JVMCI_THROW_MSG_0(IllegalArgumentException, "Cannot overwrite existing HotSpotNmethod mirror for nmethod");
|
||||
}
|
||||
oop nmethod_mirror = HotSpotJVMCI::resolve(result);
|
||||
|
|
|
@ -700,11 +700,15 @@ void JVMCINMethodData::add_failed_speculation(nmethod* nm, jlong speculation) {
|
|||
FailedSpeculation::add_failed_speculation(nm, _failed_speculations, data, length);
|
||||
}
|
||||
|
||||
oop JVMCINMethodData::get_nmethod_mirror(nmethod* nm) {
|
||||
oop JVMCINMethodData::get_nmethod_mirror(nmethod* nm, bool phantom_ref) {
|
||||
if (_nmethod_mirror_index == -1) {
|
||||
return NULL;
|
||||
}
|
||||
if (phantom_ref) {
|
||||
return nm->oop_at_phantom(_nmethod_mirror_index);
|
||||
} else {
|
||||
return nm->oop_at(_nmethod_mirror_index);
|
||||
}
|
||||
}
|
||||
|
||||
void JVMCINMethodData::set_nmethod_mirror(nmethod* nm, oop new_mirror) {
|
||||
|
@ -728,7 +732,7 @@ void JVMCINMethodData::clear_nmethod_mirror(nmethod* nm) {
|
|||
}
|
||||
|
||||
void JVMCINMethodData::invalidate_nmethod_mirror(nmethod* nm) {
|
||||
oop nmethod_mirror = get_nmethod_mirror(nm);
|
||||
oop nmethod_mirror = get_nmethod_mirror(nm, /* phantom_ref */ true);
|
||||
if (nmethod_mirror == NULL) {
|
||||
return;
|
||||
}
|
||||
|
@ -1530,7 +1534,7 @@ JVMCI::CodeInstallResult JVMCIRuntime::register_method(JVMCIEnv* JVMCIENV,
|
|||
JVMCINMethodData* data = nm->jvmci_nmethod_data();
|
||||
assert(data != NULL, "must be");
|
||||
if (install_default) {
|
||||
assert(!nmethod_mirror.is_hotspot() || data->get_nmethod_mirror(nm) == NULL, "must be");
|
||||
assert(!nmethod_mirror.is_hotspot() || data->get_nmethod_mirror(nm, /* phantom_ref */ false) == NULL, "must be");
|
||||
if (entry_bci == InvocationEntryBci) {
|
||||
if (TieredCompilation) {
|
||||
// If there is an old version we're done with it
|
||||
|
@ -1565,7 +1569,7 @@ JVMCI::CodeInstallResult JVMCIRuntime::register_method(JVMCIEnv* JVMCIENV,
|
|||
InstanceKlass::cast(method->method_holder())->add_osr_nmethod(nm);
|
||||
}
|
||||
} else {
|
||||
assert(!nmethod_mirror.is_hotspot() || data->get_nmethod_mirror(nm) == HotSpotJVMCI::resolve(nmethod_mirror), "must be");
|
||||
assert(!nmethod_mirror.is_hotspot() || data->get_nmethod_mirror(nm, /* phantom_ref */ false) == HotSpotJVMCI::resolve(nmethod_mirror), "must be");
|
||||
}
|
||||
nm->make_in_use();
|
||||
}
|
||||
|
|
|
@ -74,7 +74,7 @@ public:
|
|||
void invalidate_nmethod_mirror(nmethod* nm);
|
||||
|
||||
// Gets the mirror from nm's oops table.
|
||||
oop get_nmethod_mirror(nmethod* nm);
|
||||
oop get_nmethod_mirror(nmethod* nm, bool phantom_ref);
|
||||
|
||||
// Sets the mirror in nm's oops table.
|
||||
void set_nmethod_mirror(nmethod* nm, oop mirror);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue