Skip to content
This repository was archived by the owner on May 29, 2024. It is now read-only.

Commit 7eea82d

Browse files
committed
[GR-45212] Missing barriers in CompilerToVM.readFieldValue for Reference.referent
PullRequest: labsjdk-ce-17/110
2 parents 51a5808 + 97b0336 commit 7eea82d

File tree

4 files changed

+18
-7
lines changed

4 files changed

+18
-7
lines changed

src/hotspot/share/jvmci/jvmciCompilerToVM.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2097,14 +2097,14 @@ static jobject read_field_value(Handle obj, long displacement, jchar type_char,
20972097
// folding Unsafe.get* methods with volatile semantics.
20982098

20992099
switch (basic_type) {
2100-
case T_BOOLEAN: value = obj->bool_field_acquire(displacement); break;
2101-
case T_BYTE: value = obj->byte_field_acquire(displacement); break;
2102-
case T_SHORT: value = obj->short_field_acquire(displacement); break;
2103-
case T_CHAR: value = obj->char_field_acquire(displacement); break;
2100+
case T_BOOLEAN: value = HeapAccess<MO_SEQ_CST>::load(obj->field_addr_of_type<jboolean>(displacement)); break;
2101+
case T_BYTE: value = HeapAccess<MO_SEQ_CST>::load(obj->field_addr_of_type<jbyte>(displacement)); break;
2102+
case T_SHORT: value = HeapAccess<MO_SEQ_CST>::load(obj->field_addr_of_type<jshort>(displacement)); break;
2103+
case T_CHAR: value = HeapAccess<MO_SEQ_CST>::load(obj->field_addr_of_type<jchar>(displacement)); break;
21042104
case T_FLOAT:
2105-
case T_INT: value = obj->int_field_acquire(displacement); break;
2105+
case T_INT: value = HeapAccess<MO_SEQ_CST>::load(obj->field_addr_of_type<jint>(displacement)); break;
21062106
case T_DOUBLE:
2107-
case T_LONG: value = obj->long_field_acquire(displacement); break;
2107+
case T_LONG: value = HeapAccess<MO_SEQ_CST>::load(obj->field_addr_of_type<jlong>(displacement)); break;
21082108

21092109
case T_OBJECT: {
21102110
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,
21142114
return JVMCIENV->get_jobject(JVMCIENV->get_JavaConstant_NULL_POINTER());
21152115
}
21162116

2117-
oop value = obj->obj_field_acquire(displacement);
2117+
// Perform the read including any barriers required to make the reference strongly reachable
2118+
// since it will be wrapped as a JavaConstant.
2119+
oop value = obj->obj_field_access<MO_SEQ_CST | ON_UNKNOWN_OOP_REF>(displacement);
21182120

21192121
if (value == nullptr) {
21202122
return JVMCIENV->get_jobject(JVMCIENV->get_JavaConstant_NULL_POINTER());

src/hotspot/share/jvmci/jvmciRuntime.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -941,7 +941,9 @@ int JVMCIRuntime::release_cleared_oop_handles() {
941941
// Example: to_release: 2
942942

943943
// Bulk release the handles with a null referent
944+
if (to_release != 0) {
944945
object_handles()->release(_oop_handles.adr_at(num_alive), to_release);
946+
}
945947

946948
// Truncate oop handles to only those with a non-null referent
947949
JVMCI_event_1("compacted oop handles in JVMCI runtime %d from %d to %d", _id, _oop_handles.length(), num_alive);

src/hotspot/share/oops/oop.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ class oopDesc {
117117
// field addresses in oop
118118
inline void* field_addr(int offset) const;
119119

120+
// Backport of templating version of field_addr
121+
template<typename T>
122+
inline T* field_addr_of_type(int offset) const;
123+
120124
// Need this as public for garbage collection.
121125
template <class T> inline T* obj_field_addr(int offset) const;
122126

src/hotspot/share/oops/oop.inline.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,9 @@ void* oopDesc::field_addr(int offset) const { return reinterpret_cast<voi
211211
template <class T>
212212
T* oopDesc::obj_field_addr(int offset) const { return (T*) field_addr(offset); }
213213

214+
template<typename T>
215+
T* oopDesc::field_addr_of_type(int offset) const { return reinterpret_cast<T*>(cast_from_oop<intptr_t>(as_oop()) + offset); }
216+
214217
template <typename T>
215218
size_t oopDesc::field_offset(T* p) const { return pointer_delta((void*)p, (void*)this, 1); }
216219

0 commit comments

Comments
 (0)