diff a/src/hotspot/share/gc/shared/barrierSetNMethod.cpp b/src/hotspot/share/gc/shared/barrierSetNMethod.cpp --- a/src/hotspot/share/gc/shared/barrierSetNMethod.cpp +++ b/src/hotspot/share/gc/shared/barrierSetNMethod.cpp @@ -30,17 +30,11 @@ #include "logging/log.hpp" #include "runtime/thread.hpp" #include "utilities/debug.hpp" int BarrierSetNMethod::disarmed_value() const { -#ifdef _LP64 - char* disarmed_addr = reinterpret_cast(Thread::current()); - disarmed_addr += in_bytes(thread_disarmed_offset()); - return *reinterpret_cast(disarmed_addr); -#else - return *reinterpret_cast(disarmed_value_address()); -#endif // _LP64 + return *disarmed_value_address(); } bool BarrierSetNMethod::supports_entry_barrier(nmethod* nm) { if (nm->method()->is_method_handle_intrinsic()) { return false; diff a/src/hotspot/share/gc/shared/barrierSetNMethod.hpp b/src/hotspot/share/gc/shared/barrierSetNMethod.hpp --- a/src/hotspot/share/gc/shared/barrierSetNMethod.hpp +++ b/src/hotspot/share/gc/shared/barrierSetNMethod.hpp @@ -32,21 +32,18 @@ class nmethod; class BarrierSetNMethod: public CHeapObj { bool supports_entry_barrier(nmethod* nm); void deoptimize(nmethod* nm, address* return_addr_ptr); + int disarmed_value() const; protected: - virtual int disarmed_value() const; virtual bool nmethod_entry_barrier(nmethod* nm) = 0; public: -#ifdef _LP64 virtual ByteSize thread_disarmed_offset() const = 0; -#else - virtual intptr_t disarmed_value_address() const = 0; -#endif + virtual int* disarmed_value_address() const = 0; static int nmethod_stub_entry_barrier(address* return_address_ptr); bool nmethod_osr_entry_barrier(nmethod* nm); bool is_armed(nmethod* nm); void disarm(nmethod* nm); diff a/src/hotspot/share/gc/z/zBarrierSetNMethod.cpp b/src/hotspot/share/gc/z/zBarrierSetNMethod.cpp --- a/src/hotspot/share/gc/z/zBarrierSetNMethod.cpp +++ b/src/hotspot/share/gc/z/zBarrierSetNMethod.cpp @@ -59,16 +59,14 @@ disarm(nm); return true; } -int ZBarrierSetNMethod::disarmed_value() const { - // We override the default BarrierSetNMethod::disarmed_value() since - // this can be called by GC threads, which doesn't keep an up to date - // address_bad_mask. - const uintptr_t disarmed_addr = ((uintptr_t)&ZAddressBadMask) + ZNMethodDisarmedOffset; - return *((int*)disarmed_addr); +int* ZBarrierSetNMethod::disarmed_value_address() const { + const uintptr_t mask_addr = reinterpret_cast(&ZAddressBadMask); + const uintptr_t disarmed_addr = mask_addr + ZNMethodDisarmedOffset; + return reinterpret_cast(disarmed_addr); } ByteSize ZBarrierSetNMethod::thread_disarmed_offset() const { return ZThreadLocalData::nmethod_disarmed_offset(); } diff a/src/hotspot/share/gc/z/zBarrierSetNMethod.hpp b/src/hotspot/share/gc/z/zBarrierSetNMethod.hpp --- a/src/hotspot/share/gc/z/zBarrierSetNMethod.hpp +++ b/src/hotspot/share/gc/z/zBarrierSetNMethod.hpp @@ -29,13 +29,13 @@ class nmethod; class ZBarrierSetNMethod : public BarrierSetNMethod { protected: - virtual int disarmed_value() const; virtual bool nmethod_entry_barrier(nmethod* nm); public: virtual ByteSize thread_disarmed_offset() const; + virtual int* disarmed_value_address() const; }; #endif // SHARE_GC_Z_ZBARRIERSETNMETHOD_HPP