# HG changeset patch # Parent bc1a4ffbfb0a6ae2e6438da17d4e5fad7ddac68d diff -r bc1a4ffbfb0a -r c4f5b1fbb773 src/hotspot/cpu/aarch64/gc/shared/barrierSetAssembler_aarch64.hpp --- a/src/hotspot/cpu/aarch64/gc/shared/barrierSetAssembler_aarch64.hpp Fri Jun 22 09:28:28 2018 -0400 +++ b/src/hotspot/cpu/aarch64/gc/shared/barrierSetAssembler_aarch64.hpp Fri Jun 22 09:59:16 2018 -0400 @@ -48,6 +48,14 @@ virtual void obj_equals(MacroAssembler* masm, Register obj1, Register obj2); + virtual void resolve_for_read(MacroAssembler* masm, DecoratorSet decorators, Register obj) { + // Default implementation does not need to do anything. + } + + virtual void resolve_for_write(MacroAssembler* masm, DecoratorSet decorators, Register obj) { + // Default implementation does not need to do anything. + } + virtual void try_resolve_jobject_in_native(MacroAssembler* masm, Register jni_env, Register obj, Register tmp, Label& slowpath); diff -r bc1a4ffbfb0a -r c4f5b1fbb773 src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp Fri Jun 22 09:28:28 2018 -0400 +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp Fri Jun 22 09:59:16 2018 -0400 @@ -3984,6 +3984,16 @@ } } +void MacroAssembler::resolve_for_read(DecoratorSet decorators, Register obj) { + BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler(); + return bs->resolve_for_read(this, decorators, obj); +} + +void MacroAssembler::resolve_for_write(DecoratorSet decorators, Register obj) { + BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler(); + return bs->resolve_for_write(this, decorators, obj); +} + void MacroAssembler::load_heap_oop(Register dst, Address src, Register tmp1, Register thread_tmp, DecoratorSet decorators) { access_load_at(T_OBJECT, IN_HEAP | decorators, dst, src, tmp1, thread_tmp); diff -r bc1a4ffbfb0a -r c4f5b1fbb773 src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp Fri Jun 22 09:28:28 2018 -0400 +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp Fri Jun 22 09:59:16 2018 -0400 @@ -795,6 +795,14 @@ void access_store_at(BasicType type, DecoratorSet decorators, Address dst, Register src, Register tmp1, Register tmp_thread); + // Resolves obj for read access. Result is placed in the same register. + // All other registers are preserved. + void resolve_for_read(DecoratorSet decorators, Register obj); + + // Resolves obj for write access. Result is placed in the same register. + // All other registers are preserved. + void resolve_for_write(DecoratorSet decorators, Register obj); + void load_heap_oop(Register dst, Address src, Register tmp1 = noreg, Register thread_tmp = noreg, DecoratorSet decorators = 0); diff -r bc1a4ffbfb0a -r c4f5b1fbb773 src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp --- a/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp Fri Jun 22 09:28:28 2018 -0400 +++ b/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp Fri Jun 22 09:59:16 2018 -0400 @@ -1839,6 +1839,8 @@ // Load the oop from the handle __ ldr(obj_reg, Address(oop_handle_reg, 0)); + __ resolve_for_write(OOP_NOT_NULL, obj_reg); + if (UseBiasedLocking) { __ biased_locking_enter(lock_reg, obj_reg, swap_reg, tmp, false, lock_done, &slow_path_lock); } @@ -2001,6 +2003,8 @@ // Get locked oop from the handle we passed to jni __ ldr(obj_reg, Address(oop_handle_reg, 0)); + __ resolve_for_write(OOP_NOT_NULL, obj_reg); + Label done; if (UseBiasedLocking) { diff -r bc1a4ffbfb0a -r c4f5b1fbb773 src/hotspot/cpu/aarch64/templateInterpreterGenerator_aarch64.cpp --- a/src/hotspot/cpu/aarch64/templateInterpreterGenerator_aarch64.cpp Fri Jun 22 09:28:28 2018 -0400 +++ b/src/hotspot/cpu/aarch64/templateInterpreterGenerator_aarch64.cpp Fri Jun 22 09:59:16 2018 -0400 @@ -808,6 +808,7 @@ #endif // ASSERT __ bind(done); + __ resolve_for_write(OOP_NOT_NULL, r0); } // add space for monitor & lock @@ -1034,6 +1035,7 @@ __ ldrw(crc, Address(esp, 4*wordSize)); // Initial CRC } else { __ ldr(buf, Address(esp, 2*wordSize)); // byte[] array + __ resolve_for_read(OOP_NOT_NULL, buf); __ add(buf, buf, arrayOopDesc::base_offset_in_bytes(T_BYTE)); // + header size __ ldrw(off, Address(esp, wordSize)); // offset __ add(buf, buf, off); // + offset @@ -1078,6 +1080,9 @@ __ ldrw(off, Address(esp, wordSize)); // int offset __ sub(len, end, off); __ ldr(buf, Address(esp, 2*wordSize)); // byte[] buf | long buf + if (kind == Interpreter::java_util_zip_CRC32C_updateBytes) { + __ resolve_for_read(OOP_NOT_NULL, buf); + } __ add(buf, buf, off); // + offset if (kind == Interpreter::java_util_zip_CRC32C_updateDirectByteBuffer) { __ ldrw(crc, Address(esp, 4*wordSize)); // long crc diff -r bc1a4ffbfb0a -r c4f5b1fbb773 src/hotspot/cpu/aarch64/templateTable_aarch64.cpp --- a/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp Fri Jun 22 09:28:28 2018 -0400 +++ b/src/hotspot/cpu/aarch64/templateTable_aarch64.cpp Fri Jun 22 09:59:16 2018 -0400 @@ -3817,6 +3817,8 @@ // check for NULL object __ null_check(r0); + __ resolve_for_write(OOP_NOT_NULL, r0); + const Address monitor_block_top( rfp, frame::interpreter_frame_monitor_block_top_offset * wordSize); const Address monitor_block_bot( @@ -3916,6 +3918,8 @@ // check for NULL object __ null_check(r0); + __ resolve_for_write(OOP_NOT_NULL, r0); + const Address monitor_block_top( rfp, frame::interpreter_frame_monitor_block_top_offset * wordSize); const Address monitor_block_bot(