Skip to content
Permalink
Browse files

8235262: Move c2i_entry_barrier for x86_32 to shared

Reviewed-by: rkennke, eosterlund
  • Loading branch information
zhengyu123 committed Dec 8, 2019
1 parent 36bd09d commit ee140f7f816dc6f8cb73cb52b1a499e1074499c0
@@ -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 @@ class ShenandoahBarrierSetAssembler: public BarrierSetAssembler {
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();

};

0 comments on commit ee140f7

Please sign in to comment.
You can’t perform that action at this time.