diff --git a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp index ef1871ed557..deec91245bc 100644 --- a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp +++ b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp @@ -2097,14 +2097,14 @@ static jobject read_field_value(Handle obj, long displacement, jchar type_char, // folding Unsafe.get* methods with volatile semantics. switch (basic_type) { - case T_BOOLEAN: value = obj->bool_field_acquire(displacement); break; - case T_BYTE: value = obj->byte_field_acquire(displacement); break; - case T_SHORT: value = obj->short_field_acquire(displacement); break; - case T_CHAR: value = obj->char_field_acquire(displacement); break; + case T_BOOLEAN: value = HeapAccess::load(obj->field_addr_of_type(displacement)); break; + case T_BYTE: value = HeapAccess::load(obj->field_addr_of_type(displacement)); break; + case T_SHORT: value = HeapAccess::load(obj->field_addr_of_type(displacement)); break; + case T_CHAR: value = HeapAccess::load(obj->field_addr_of_type(displacement)); break; case T_FLOAT: - case T_INT: value = obj->int_field_acquire(displacement); break; + case T_INT: value = HeapAccess::load(obj->field_addr_of_type(displacement)); break; case T_DOUBLE: - case T_LONG: value = obj->long_field_acquire(displacement); break; + case T_LONG: value = HeapAccess::load(obj->field_addr_of_type(displacement)); break; case T_OBJECT: { if (displacement == java_lang_Class::component_mirror_offset() && java_lang_Class::is_instance(obj()) && @@ -2114,7 +2114,9 @@ static jobject read_field_value(Handle obj, long displacement, jchar type_char, return JVMCIENV->get_jobject(JVMCIENV->get_JavaConstant_NULL_POINTER()); } - oop value = obj->obj_field_acquire(displacement); + // Perform the read including any barriers required to make the reference strongly reachable + // since it will be wrapped as a JavaConstant. + oop value = obj->obj_field_access(displacement); if (value == nullptr) { return JVMCIENV->get_jobject(JVMCIENV->get_JavaConstant_NULL_POINTER()); diff --git a/src/hotspot/share/jvmci/jvmciRuntime.cpp b/src/hotspot/share/jvmci/jvmciRuntime.cpp index 6fe8363dae8..9d1cf8d8324 100644 --- a/src/hotspot/share/jvmci/jvmciRuntime.cpp +++ b/src/hotspot/share/jvmci/jvmciRuntime.cpp @@ -941,7 +941,9 @@ int JVMCIRuntime::release_cleared_oop_handles() { // Example: to_release: 2 // Bulk release the handles with a null referent + if (to_release != 0) { object_handles()->release(_oop_handles.adr_at(num_alive), to_release); + } // Truncate oop handles to only those with a non-null referent JVMCI_event_1("compacted oop handles in JVMCI runtime %d from %d to %d", _id, _oop_handles.length(), num_alive); diff --git a/src/hotspot/share/oops/oop.hpp b/src/hotspot/share/oops/oop.hpp index c77b09adf0d..06347898bfe 100644 --- a/src/hotspot/share/oops/oop.hpp +++ b/src/hotspot/share/oops/oop.hpp @@ -117,6 +117,10 @@ class oopDesc { // field addresses in oop inline void* field_addr(int offset) const; + // Backport of templating version of field_addr + template + inline T* field_addr_of_type(int offset) const; + // Need this as public for garbage collection. template inline T* obj_field_addr(int offset) const; diff --git a/src/hotspot/share/oops/oop.inline.hpp b/src/hotspot/share/oops/oop.inline.hpp index 0b706f1aa3b..19bd7d99e89 100644 --- a/src/hotspot/share/oops/oop.inline.hpp +++ b/src/hotspot/share/oops/oop.inline.hpp @@ -211,6 +211,9 @@ void* oopDesc::field_addr(int offset) const { return reinterpret_cast T* oopDesc::obj_field_addr(int offset) const { return (T*) field_addr(offset); } +template +T* oopDesc::field_addr_of_type(int offset) const { return reinterpret_cast(cast_from_oop(as_oop()) + offset); } + template size_t oopDesc::field_offset(T* p) const { return pointer_delta((void*)p, (void*)this, 1); }