8235262: Move c2i_entry_barrier for x86_32 to shared
Reviewed-by: rkennke, eosterlund
This commit is contained in:
parent
36bd09dead
commit
ee140f7f81
@ -374,22 +374,41 @@ void BarrierSetAssembler::c2i_entry_barrier(MacroAssembler* masm) {
|
||||
__ cmpptr(rbx, 0); // rbx contains the incoming method for c2i adapters.
|
||||
__ jcc(Assembler::equal, bad_call);
|
||||
|
||||
#ifdef _LP64
|
||||
Register tmp1 = rscratch1;
|
||||
Register tmp2 = rscratch2;
|
||||
#else
|
||||
Register tmp1 = rax;
|
||||
Register tmp2 = rcx;
|
||||
__ push(tmp1);
|
||||
__ push(tmp2);
|
||||
#endif // _LP64
|
||||
|
||||
// Pointer chase to the method holder to find out if the method is concurrently unloading.
|
||||
Label method_live;
|
||||
__ load_method_holder_cld(rscratch1, rbx);
|
||||
__ load_method_holder_cld(tmp1, rbx);
|
||||
|
||||
// Is it a strong CLD?
|
||||
__ movl(rscratch2, Address(rscratch1, ClassLoaderData::keep_alive_offset()));
|
||||
__ cmpptr(rscratch2, 0);
|
||||
// Is it a strong CLD?
|
||||
__ cmpl(Address(tmp1, ClassLoaderData::keep_alive_offset()), 0);
|
||||
__ jcc(Assembler::greater, method_live);
|
||||
|
||||
// Is it a weak but alive CLD?
|
||||
__ movptr(rscratch1, Address(rscratch1, ClassLoaderData::holder_offset()));
|
||||
__ resolve_weak_handle(rscratch1, rscratch2);
|
||||
__ cmpptr(rscratch1, 0);
|
||||
// Is it a weak but alive CLD?
|
||||
__ movptr(tmp1, Address(tmp1, ClassLoaderData::holder_offset()));
|
||||
__ resolve_weak_handle(tmp1, tmp2);
|
||||
__ cmpptr(tmp1, 0);
|
||||
__ jcc(Assembler::notEqual, method_live);
|
||||
|
||||
#ifndef _LP64
|
||||
__ pop(tmp2);
|
||||
__ pop(tmp1);
|
||||
#endif
|
||||
|
||||
__ bind(bad_call);
|
||||
__ jump(RuntimeAddress(SharedRuntime::get_handle_wrong_method_stub()));
|
||||
__ bind(method_live);
|
||||
|
||||
#ifndef _LP64
|
||||
__ pop(tmp2);
|
||||
__ pop(tmp1);
|
||||
#endif
|
||||
}
|
||||
|
@ -395,52 +395,6 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier_native(MacroAssembler
|
||||
__ block_comment("load_reference_barrier_native { ");
|
||||
}
|
||||
|
||||
#ifdef _LP64
|
||||
void ShenandoahBarrierSetAssembler::c2i_entry_barrier(MacroAssembler* masm) {
|
||||
// Use default version
|
||||
BarrierSetAssembler::c2i_entry_barrier(masm);
|
||||
}
|
||||
#else
|
||||
void ShenandoahBarrierSetAssembler::c2i_entry_barrier(MacroAssembler* masm) {
|
||||
BarrierSetNMethod* bs = BarrierSet::barrier_set()->barrier_set_nmethod();
|
||||
if (bs == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
Label bad_call;
|
||||
__ cmpptr(rbx, 0); // rbx contains the incoming method for c2i adapters.
|
||||
__ jcc(Assembler::equal, bad_call);
|
||||
|
||||
Register tmp1 = rax;
|
||||
Register tmp2 = rcx;
|
||||
|
||||
__ push(tmp1);
|
||||
__ push(tmp2);
|
||||
|
||||
// Pointer chase to the method holder to find out if the method is concurrently unloading.
|
||||
Label method_live;
|
||||
__ load_method_holder_cld(tmp1, rbx);
|
||||
|
||||
// Is it a strong CLD?
|
||||
__ cmpl(Address(tmp1, ClassLoaderData::keep_alive_offset()), 0);
|
||||
__ jcc(Assembler::greater, method_live);
|
||||
|
||||
// Is it a weak but alive CLD?
|
||||
__ movptr(tmp1, Address(tmp1, ClassLoaderData::holder_offset()));
|
||||
__ resolve_weak_handle(tmp1, tmp2);
|
||||
__ cmpptr(tmp1, 0);
|
||||
__ jcc(Assembler::notEqual, method_live);
|
||||
__ pop(tmp2);
|
||||
__ pop(tmp1);
|
||||
|
||||
__ bind(bad_call);
|
||||
__ jump(RuntimeAddress(SharedRuntime::get_handle_wrong_method_stub()));
|
||||
__ bind(method_live);
|
||||
__ pop(tmp2);
|
||||
__ pop(tmp1);
|
||||
}
|
||||
#endif
|
||||
|
||||
void ShenandoahBarrierSetAssembler::storeval_barrier(MacroAssembler* masm, Register dst, Register tmp) {
|
||||
if (ShenandoahStoreValEnqueueBarrier) {
|
||||
storeval_barrier_impl(masm, dst, tmp);
|
||||
|
@ -86,8 +86,6 @@ public:
|
||||
Address dst, Register val, Register tmp1, Register tmp2);
|
||||
virtual void try_resolve_jobject_in_native(MacroAssembler* masm, Register jni_env,
|
||||
Register obj, Register tmp, Label& slowpath);
|
||||
virtual void c2i_entry_barrier(MacroAssembler* masm);
|
||||
|
||||
virtual void barrier_stubs_init();
|
||||
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user