8199739: Use HeapAccess when loading oops from static fields in javaClasses.cpp

Reviewed-by: kbarrett, eosterlund
This commit is contained in:
Roman Kennke 2018-03-21 16:00:41 +01:00
parent 383a921aac
commit d4d5ea316b
4 changed files with 17 additions and 31 deletions

View File

@ -1866,12 +1866,8 @@ void java_lang_Throwable::serialize(SerializeClosure* f) {
oop java_lang_Throwable::unassigned_stacktrace() { oop java_lang_Throwable::unassigned_stacktrace() {
InstanceKlass* ik = SystemDictionary::Throwable_klass(); InstanceKlass* ik = SystemDictionary::Throwable_klass();
address addr = ik->static_field_addr(static_unassigned_stacktrace_offset); oop base = ik->static_field_base_raw();
if (UseCompressedOops) { return base->obj_field(static_unassigned_stacktrace_offset);
return oopDesc::load_decode_heap_oop((narrowOop *)addr);
} else {
return oopDesc::load_decode_heap_oop((oop*)addr);
}
} }
oop java_lang_Throwable::backtrace(oop throwable) { oop java_lang_Throwable::backtrace(oop throwable) {
@ -3547,14 +3543,14 @@ jlong java_lang_ref_SoftReference::timestamp(oop ref) {
jlong java_lang_ref_SoftReference::clock() { jlong java_lang_ref_SoftReference::clock() {
InstanceKlass* ik = SystemDictionary::SoftReference_klass(); InstanceKlass* ik = SystemDictionary::SoftReference_klass();
jlong* offset = (jlong*)ik->static_field_addr(static_clock_offset); oop base = ik->static_field_base_raw();
return *offset; return base->long_field(static_clock_offset);
} }
void java_lang_ref_SoftReference::set_clock(jlong value) { void java_lang_ref_SoftReference::set_clock(jlong value) {
InstanceKlass* ik = SystemDictionary::SoftReference_klass(); InstanceKlass* ik = SystemDictionary::SoftReference_klass();
jlong* offset = (jlong*)ik->static_field_addr(static_clock_offset); oop base = ik->static_field_base_raw();
*offset = value; base->long_field_put(static_clock_offset, value);
} }
// Support for java_lang_invoke_DirectMethodHandle // Support for java_lang_invoke_DirectMethodHandle
@ -4133,12 +4129,8 @@ int java_lang_System::err_offset_in_bytes() { return static_err_offset; }
bool java_lang_System::has_security_manager() { bool java_lang_System::has_security_manager() {
InstanceKlass* ik = SystemDictionary::System_klass(); InstanceKlass* ik = SystemDictionary::System_klass();
address addr = ik->static_field_addr(static_security_offset); oop base = ik->static_field_base_raw();
if (UseCompressedOops) { return !oopDesc::is_null(base->obj_field(static_security_offset));
return oopDesc::load_decode_heap_oop((narrowOop *)addr) != NULL;
} else {
return oopDesc::load_decode_heap_oop((oop*)addr) != NULL;
}
} }
int java_lang_Class::_klass_offset; int java_lang_Class::_klass_offset;

View File

@ -353,30 +353,30 @@ class name : AllStatic {
static type name() { \ static type name() { \
assert(klassName::klass() != NULL && klassName::klass()->is_linked(), "Class not yet linked: " #klassName); \ assert(klassName::klass() != NULL && klassName::klass()->is_linked(), "Class not yet linked: " #klassName); \
InstanceKlass* ik = klassName::klass(); \ InstanceKlass* ik = klassName::klass(); \
address addr = ik->static_field_addr(_##name##_offset); \ oop base = ik->static_field_base_raw(); \
oop result = HeapAccess<>::oop_load((HeapWord*)addr); \ oop result = HeapAccess<>::oop_load_at(base, _##name##_offset); \
return type(result); \ return type(result); \
} \ } \
static void set_##name(type x) { \ static void set_##name(type x) { \
assert(klassName::klass() != NULL && klassName::klass()->is_linked(), "Class not yet linked: " #klassName); \ assert(klassName::klass() != NULL && klassName::klass()->is_linked(), "Class not yet linked: " #klassName); \
assert(klassName::klass() != NULL, "Class not yet loaded: " #klassName); \ assert(klassName::klass() != NULL, "Class not yet loaded: " #klassName); \
InstanceKlass* ik = klassName::klass(); \ InstanceKlass* ik = klassName::klass(); \
address addr = ik->static_field_addr(_##name##_offset); \ oop base = ik->static_field_base_raw(); \
HeapAccess<>::oop_store((HeapWord*)addr, x); \ HeapAccess<>::oop_store_at(base, _##name##_offset, x); \
} }
#define STATIC_PRIMITIVE_FIELD(klassName, name, jtypename) \ #define STATIC_PRIMITIVE_FIELD(klassName, name, jtypename) \
static int _##name##_offset; \ static int _##name##_offset; \
static jtypename name() { \ static jtypename name() { \
assert(klassName::klass() != NULL && klassName::klass()->is_linked(), "Class not yet linked: " #klassName); \ assert(klassName::klass() != NULL && klassName::klass()->is_linked(), "Class not yet linked: " #klassName); \
InstanceKlass* ik = klassName::klass(); \ InstanceKlass* ik = klassName::klass(); \
address addr = ik->static_field_addr(_##name##_offset); \ oop base = ik->static_field_base_raw(); \
return HeapAccess<>::load((jtypename*)addr); \ return HeapAccess<>::load_at(base, _##name##_offset); \
} \ } \
static void set_##name(jtypename x) { \ static void set_##name(jtypename x) { \
assert(klassName::klass() != NULL && klassName::klass()->is_linked(), "Class not yet linked: " #klassName); \ assert(klassName::klass() != NULL && klassName::klass()->is_linked(), "Class not yet linked: " #klassName); \
InstanceKlass* ik = klassName::klass(); \ InstanceKlass* ik = klassName::klass(); \
address addr = ik->static_field_addr(_##name##_offset); \ oop base = ik->static_field_base_raw(); \
HeapAccess<>::store((jtypename*)addr, x); \ HeapAccess<>::store_at(base, _##name##_offset, x); \
} }
#define STATIC_INT_FIELD(klassName, name) STATIC_PRIMITIVE_FIELD(klassName, name, jint) #define STATIC_INT_FIELD(klassName, name) STATIC_PRIMITIVE_FIELD(klassName, name, jint)

View File

@ -2255,12 +2255,6 @@ void InstanceKlass::set_source_debug_extension(const char* array, int length) {
} }
} }
address InstanceKlass::static_field_addr(int offset) {
assert(offset >= InstanceMirrorKlass::offset_of_static_fields(), "has already been adjusted");
return (address)(offset + cast_from_oop<intptr_t>(java_mirror()));
}
const char* InstanceKlass::signature_name() const { const char* InstanceKlass::signature_name() const {
int hash_len = 0; int hash_len = 0;
char hash_buf[40]; char hash_buf[40];

View File

@ -1070,7 +1070,7 @@ public:
int itable_offset_in_words() const { return start_of_itable() - (intptr_t*)this; } int itable_offset_in_words() const { return start_of_itable() - (intptr_t*)this; }
address static_field_addr(int offset); oop static_field_base_raw() { return java_mirror(); }
OopMapBlock* start_of_nonstatic_oop_maps() const { OopMapBlock* start_of_nonstatic_oop_maps() const {
return (OopMapBlock*)(start_of_itable() + itable_length()); return (OopMapBlock*)(start_of_itable() + itable_length());