Skip to content
Closed
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/hotspot/cpu/aarch64/c1_MacroAssembler_aarch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register disp_hdr
if (DiagnoseSyncOnValueBasedClasses != 0) {
load_klass(hdr, obj);
ldrb(hdr, Address(hdr, Klass::misc_flags_offset()));
tstw(hdr, KlassFlags::_misc_is_value_based_class);
tst(hdr, KlassFlags::_misc_is_value_based_class);
br(Assembler::NE, slow_case);
}

Expand Down
4 changes: 2 additions & 2 deletions src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ void C2_MacroAssembler::fast_lock(Register objectReg, Register boxReg, Register
if (DiagnoseSyncOnValueBasedClasses != 0) {
load_klass(tmp, oop);
ldrb(tmp, Address(tmp, Klass::misc_flags_offset()));
tstw(tmp, KlassFlags::_misc_is_value_based_class);
tst(tmp, KlassFlags::_misc_is_value_based_class);
br(Assembler::NE, cont);
}

Expand Down Expand Up @@ -244,7 +244,7 @@ void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box, Regist
if (DiagnoseSyncOnValueBasedClasses != 0) {
load_klass(t1, obj);
ldrb(t1, Address(t1, Klass::misc_flags_offset()));
tstw(t1, KlassFlags::_misc_is_value_based_class);
tst(t1, KlassFlags::_misc_is_value_based_class);
br(Assembler::NE, slow_path);
}

Expand Down
2 changes: 1 addition & 1 deletion src/hotspot/cpu/aarch64/interp_masm_aarch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -691,7 +691,7 @@ void InterpreterMacroAssembler::lock_object(Register lock_reg)
if (DiagnoseSyncOnValueBasedClasses != 0) {
load_klass(tmp, obj_reg);
ldrb(tmp, Address(tmp, Klass::misc_flags_offset()));
tstw(tmp, KlassFlags::_misc_is_value_based_class);
tst(tmp, KlassFlags::_misc_is_value_based_class);
br(Assembler::NE, slow_case);
}

Expand Down
3 changes: 1 addition & 2 deletions src/hotspot/cpu/s390/c1_MacroAssembler_s390.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,7 @@ void C1_MacroAssembler::lock_object(Register Rmark, Register Roop, Register Rbox

if (DiagnoseSyncOnValueBasedClasses != 0) {
load_klass(tmp, Roop);
z_lb(tmp, Address(tmp, Klass::misc_flags_offset()));
testbit(tmp, exact_log2(KlassFlags::_misc_is_value_based_class));
z_tm(Address(tmp, Klass::misc_flags_offset()), KlassFlags::_misc_is_value_based_class);
branch_optimized(Assembler::bcondAllOne, slow_case);
}

Expand Down
3 changes: 1 addition & 2 deletions src/hotspot/cpu/s390/c1_Runtime1_s390.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -443,8 +443,7 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
// Load the klass and check the has finalizer flag.
Register klass = Z_ARG2;
__ load_klass(klass, Z_ARG1);
__ z_lb(klass, Address(klass, Klass::misc_flags_offset()));
__ testbit(klass, exact_log2(KlassFlags::_misc_has_finalizer));
__ z_tm(Address(klass, Klass::misc_flags_offset()), KlassFlags::_misc_has_finalizer);
__ z_bcr(Assembler::bcondAllZero, Z_R14); // Return if bit is not set.

OopMap* oop_map = save_live_registers(sasm);
Expand Down
3 changes: 1 addition & 2 deletions src/hotspot/cpu/s390/interp_masm_s390.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1007,8 +1007,7 @@ void InterpreterMacroAssembler::lock_object(Register monitor, Register object) {

if (DiagnoseSyncOnValueBasedClasses != 0) {
load_klass(tmp, object);
z_lb(tmp, Address(tmp, Klass::misc_flags_offset()));
testbit(tmp, exact_log2(KlassFlags::_misc_is_value_based_class));
z_tm(Address(tmp, Klass::misc_flags_offset()), KlassFlags::_misc_is_value_based_class);
z_btrue(slow_case);
}

Expand Down
6 changes: 2 additions & 4 deletions src/hotspot/cpu/s390/macroAssembler_s390.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3507,8 +3507,7 @@ void MacroAssembler::compiler_fast_lock_object(Register oop, Register box, Regis

if (DiagnoseSyncOnValueBasedClasses != 0) {
load_klass(temp, oop);
z_lb(temp, Address(temp, Klass::misc_flags_offset()));
testbit(temp, exact_log2(KlassFlags::_misc_is_value_based_class));
z_tm(Address(temp, Klass::misc_flags_offset()), KlassFlags::_misc_is_value_based_class);
z_brne(done);
}

Expand Down Expand Up @@ -6153,8 +6152,7 @@ void MacroAssembler::compiler_fast_lock_lightweight_object(Register obj, Registe

if (DiagnoseSyncOnValueBasedClasses != 0) {
load_klass(tmp1, obj);
z_lb(tmp1, Address(temp, Klass::misc_flags_offset()));
testbit(tmp1, exact_log2(KlassFlags::_misc_is_value_based_class));
z_tm(Address(tmp1, Klass::misc_flags_offset()), KlassFlags::_misc_is_value_based_class);
z_brne(slow_path);
}

Expand Down
3 changes: 1 addition & 2 deletions src/hotspot/cpu/s390/templateTable_s390.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2321,8 +2321,7 @@ void TemplateTable::_return(TosState state) {
assert(state == vtos, "only valid state");
__ z_lg(Rthis, aaddress(0));
__ load_klass(Rklass, Rthis);
__ z_lb(Rklass, Address(Rklass, Klass::misc_flags_offset()));
__ testbit(Rklass, exact_log2(KlassFlags::_misc_has_finalizer));
__ z_tm(Address(Rklass, Klass::misc_flags_offset()), KlassFlags::_misc_has_finalizer);
__ z_bfalse(skip_register_finalizer);
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), Rthis);
__ bind(skip_register_finalizer);
Expand Down
3 changes: 1 addition & 2 deletions src/hotspot/cpu/x86/c1_MacroAssembler_x86.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,7 @@ int C1_MacroAssembler::lock_object(Register hdr, Register obj, Register disp_hdr

if (DiagnoseSyncOnValueBasedClasses != 0) {
load_klass(hdr, obj, rscratch1);
movb(hdr, Address(hdr, Klass::misc_flags_offset()));
testl(hdr, KlassFlags::_misc_is_value_based_class);
testb(Address(hdr, Klass::misc_flags_offset()), KlassFlags::_misc_is_value_based_class);
jcc(Assembler::notZero, slow_case);
}

Expand Down
3 changes: 1 addition & 2 deletions src/hotspot/cpu/x86/c1_Runtime1_x86.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1166,8 +1166,7 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
Label register_finalizer;
Register t = rsi;
__ load_klass(t, rax, rscratch1);
__ movb(t, Address(t, Klass::misc_flags_offset()));
__ testl(t, KlassFlags::_misc_has_finalizer);
__ testb(Address(t, Klass::misc_flags_offset()), KlassFlags::_misc_has_finalizer);
__ jcc(Assembler::notZero, register_finalizer);
__ ret(0);

Expand Down
6 changes: 2 additions & 4 deletions src/hotspot/cpu/x86/c2_MacroAssembler_x86.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -277,8 +277,7 @@ void C2_MacroAssembler::fast_lock(Register objReg, Register boxReg, Register tmp

if (DiagnoseSyncOnValueBasedClasses != 0) {
load_klass(tmpReg, objReg, scrReg);
movb(tmpReg, Address(tmpReg, Klass::misc_flags_offset()));
testl(tmpReg, KlassFlags::_misc_is_value_based_class);
testb(Address(tmpReg, Klass::misc_flags_offset()), KlassFlags::_misc_is_value_based_class);
jcc(Assembler::notZero, DONE_LABEL);
}

Expand Down Expand Up @@ -597,8 +596,7 @@ void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box, Regist

if (DiagnoseSyncOnValueBasedClasses != 0) {
load_klass(rax_reg, obj, t);
movb(rax_reg, Address(rax_reg, Klass::misc_flags_offset()));
testl(rax_reg, KlassFlags::_misc_is_value_based_class);
testb(Address(rax_reg, Klass::misc_flags_offset()), KlassFlags::_misc_is_value_based_class);
jcc(Assembler::notZero, slow_path);
}

Expand Down
3 changes: 1 addition & 2 deletions src/hotspot/cpu/x86/interp_masm_x86.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1175,8 +1175,7 @@ void InterpreterMacroAssembler::lock_object(Register lock_reg) {

if (DiagnoseSyncOnValueBasedClasses != 0) {
load_klass(tmp_reg, obj_reg, rklass_decode_tmp);
movb(tmp_reg, Address(tmp_reg, Klass::misc_flags_offset()));
testl(tmp_reg, KlassFlags::_misc_is_value_based_class);
testb(Address(tmp_reg, Klass::misc_flags_offset()), KlassFlags::_misc_is_value_based_class);
jcc(Assembler::notZero, slow_case);
}

Expand Down
3 changes: 1 addition & 2 deletions src/hotspot/cpu/x86/templateTable_x86.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2579,8 +2579,7 @@ void TemplateTable::_return(TosState state) {
Register robj = LP64_ONLY(c_rarg1) NOT_LP64(rax);
__ movptr(robj, aaddress(0));
__ load_klass(rdi, robj, rscratch1);
__ movb(rdi, Address(rdi, Klass::misc_flags_offset()));
__ testl(rdi, KlassFlags::_misc_has_finalizer);
__ testb(Address(rdi, Klass::misc_flags_offset()), KlassFlags::_misc_has_finalizer);
Label skip_register_finalizer;
__ jcc(Assembler::zero, skip_register_finalizer);

Expand Down
2 changes: 1 addition & 1 deletion src/hotspot/share/ci/ciKlass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ jint ciKlass::access_flags() {

// ------------------------------------------------------------------
// ciKlass::misc_flags
jint ciKlass::misc_flags() {
klass_flags_t ciKlass::misc_flags() {
assert(is_loaded(), "not loaded");
GUARDED_VM_ENTRY(
return get_Klass()->misc_flags();
Expand Down
2 changes: 1 addition & 1 deletion src/hotspot/share/ci/ciKlass.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ class ciKlass : public ciType {
jint access_flags();

// Fetch Klass::misc_flags.
jint misc_flags();
klass_flags_t misc_flags();

// What kind of ciObject is this?
bool is_klass() const { return true; }
Expand Down
4 changes: 2 additions & 2 deletions src/hotspot/share/oops/klass.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -433,7 +433,7 @@ class Klass : public Metadata {
static ByteSize next_sibling_offset() { return byte_offset_of(Klass, _next_sibling); }
#endif
static ByteSize bitmap_offset() { return byte_offset_of(Klass, _bitmap); }
static ByteSize misc_flags_offset() { return byte_offset_of(Klass, _misc_flags); }
static ByteSize misc_flags_offset() { return byte_offset_of(Klass, _misc_flags._flags); }

// Unpacking layout_helper:
static const int _lh_neutral_value = 0; // neutral non-array non-instance value
Expand Down Expand Up @@ -705,7 +705,7 @@ class Klass : public Metadata {
bool is_value_based() const { return _misc_flags.is_value_based_class(); }
void set_is_value_based() { _misc_flags.set_is_value_based_class(true); }

u1 misc_flags() const { return _misc_flags.value(); }
klass_flags_t misc_flags() const { return _misc_flags.value(); }

inline bool is_non_strong_hidden() const;

Expand Down
6 changes: 4 additions & 2 deletions src/hotspot/share/oops/klassFlags.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ class outputStream;
// most apply to InstanceKlass, access is more straightforward through Klass pointers.
// These flags are JVM internal and not part of the AccessFlags classfile specification.

using klass_flags_t = u1;

class KlassFlags {
friend class VMStructs;
friend class JVMCIVMStructs;
Expand All @@ -53,12 +55,12 @@ class KlassFlags {

// These flags are write-once before the class is published and then read-only
// so don't require atomic updates.
u1 _flags;
klass_flags_t _flags;

public:
KlassFlags() : _flags(0) {}

u1 value() const { return _flags; }
klass_flags_t value() const { return _flags; }

// Create getters and setters for the flag values.
#define KLASS_FLAGS_GET_SET(name, ignore) \
Expand Down
15 changes: 5 additions & 10 deletions src/hotspot/share/opto/library_call.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3754,11 +3754,9 @@ Node* LibraryCallKit::load_klass_from_mirror_common(Node* mirror,
//--------------------(inline_native_Class_query helpers)---------------------
// Use this for JVM_ACC_INTERFACE.
// Fall through if (mods & mask) == bits, take the guard otherwise.
Node* LibraryCallKit::generate_access_flags_guard(Node* kls, int modifier_mask, int modifier_bits, RegionNode* region) {
Node* LibraryCallKit::generate_mods_flags_guard(Node* mods, int modifier_mask, int modifier_bits, RegionNode* region) {
// Branch around if the given klass has the given modifier bit set.
// Like generate_guard, adds a new path onto the region.
Node* modp = basic_plus_adr(kls, in_bytes(Klass::access_flags_offset()));
Node* mods = make_load(nullptr, modp, TypeInt::INT, T_INT, MemNode::unordered);
Node* mask = intcon(modifier_mask);
Node* bits = intcon(modifier_bits);
Node* mbit = _gvn.transform(new AndINode(mods, mask));
Expand All @@ -3767,19 +3765,16 @@ Node* LibraryCallKit::generate_access_flags_guard(Node* kls, int modifier_mask,
return generate_fair_guard(bol, region);
}
Node* LibraryCallKit::generate_interface_guard(Node* kls, RegionNode* region) {
return generate_access_flags_guard(kls, JVM_ACC_INTERFACE, 0, region);
Node* modp = basic_plus_adr(kls, in_bytes(Klass::access_flags_offset()));
Node* mods = make_load(nullptr, modp, TypeInt::INT, T_INT, MemNode::unordered);
return generate_mods_flags_guard(mods, JVM_ACC_INTERFACE, 0, region);
}

// Use this for testing if Klass is_hidden, has_finalizer, and is_cloneable_fast.
Node* LibraryCallKit::generate_misc_flags_guard(Node* kls, int modifier_mask, int modifier_bits, RegionNode* region) {
Node* p = basic_plus_adr(kls, in_bytes(Klass::misc_flags_offset()));
Node* mods = make_load(nullptr, p, TypeInt::UBYTE, T_BOOLEAN, MemNode::unordered);
Node* mask = intcon(modifier_mask);
Node* bits = intcon(modifier_bits);
Node* mbit = _gvn.transform(new AndINode(mods, mask));
Node* cmp = _gvn.transform(new CmpINode(mbit, bits));
Node* bol = _gvn.transform(new BoolNode(cmp, BoolTest::ne));
return generate_fair_guard(bol, region);
return generate_mods_flags_guard(mods, modifier_mask, modifier_bits, region);
}

Node* LibraryCallKit::generate_hidden_class_guard(Node* kls, RegionNode* region) {
Expand Down
6 changes: 3 additions & 3 deletions src/hotspot/share/opto/library_call.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -156,9 +156,9 @@ class LibraryCallKit : public GraphKit {
region, null_path,
offset);
}
Node* generate_access_flags_guard(Node* kls,
int modifier_mask, int modifier_bits,
RegionNode* region);
Node* generate_mods_flags_guard(Node* kls,
int modifier_mask, int modifier_bits,
RegionNode* region);
Node* generate_misc_flags_guard(Node* kls,
int modifier_mask, int modifier_bits,
RegionNode* region);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -373,8 +373,7 @@ public AssumptionResult<Boolean> hasFinalizableSubclass() {

@Override
public boolean hasFinalizer() {
HotSpotVMConfig config = config();
int miscFlags = UNSAFE.getByte(getKlassPointer() + config.klassMiscFlagsOffset);
int miscFlags = UNSAFE.getByte(getKlassPointer() + config().klassMiscFlagsOffset);
return (miscFlags & config().jvmAccHasFinalizer) != 0;
}

Expand Down Expand Up @@ -1112,8 +1111,7 @@ public ResolvedJavaField resolveField(UnresolvedJavaField unresolvedJavaField, R

@Override
public boolean isCloneableWithAllocation() {
HotSpotVMConfig config = config();
int miscFlags = UNSAFE.getByte(getKlassPointer() + config.klassMiscFlagsOffset);
int miscFlags = UNSAFE.getByte(getKlassPointer() + config().klassMiscFlagsOffset);
return (miscFlags & config().jvmAccIsCloneableFast) != 0;
}

Expand Down