diff -r 3243c42d737d -r 92ab031d6540 src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.cpp --- a/src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.cpp Thu Jul 11 06:56:51 2019 +0200 +++ b/src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.cpp Thu Jul 04 17:31:03 2019 +0200 @@ -27,6 +27,7 @@ #include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp" #include "gc/shenandoah/shenandoahHeap.hpp" #include "gc/shenandoah/shenandoahHeapRegion.hpp" +#include "gc/shenandoah/shenandoahRuntime.hpp" #include "gc/shenandoah/shenandoahThreadLocalData.hpp" #include "gc/shenandoah/c1/shenandoahBarrierSetC1.hpp" @@ -183,7 +184,21 @@ return; } - LIRGenerator *gen = access.gen(); + LIRGenerator* gen = access.gen(); + + DecoratorSet decorators = access.decorators(); + if ((decorators & IN_NATIVE) != 0) { + assert(access.is_oop(), "IN_NATIVE access only for oop values"); + BarrierSetC1::load_at_resolved(access, result); + LIR_OprList* args = new LIR_OprList(); + args->append(result); + BasicTypeList signature; + signature.append(T_OBJECT); + LIR_Opr call_result = gen->call_runtime(&signature, args, CAST_FROM_FN_PTR(address, ShenandoahRuntime::oop_load_from_native_barrier), + objectType, NULL); + __ move(call_result, result); + return; + } if (ShenandoahLoadRefBarrier) { LIR_Opr tmp = gen->new_register(T_OBJECT); @@ -195,7 +210,6 @@ } if (ShenandoahKeepAliveBarrier) { - DecoratorSet decorators = access.decorators(); bool is_weak = (decorators & ON_WEAK_OOP_REF) != 0; bool is_phantom = (decorators & ON_PHANTOM_OOP_REF) != 0; bool is_anonymous = (decorators & ON_UNKNOWN_OOP_REF) != 0; @@ -229,3 +243,10 @@ "shenandoah_pre_barrier_slow", false, &pre_code_gen_cl); } + +const char* ShenandoahBarrierSetC1::rtcall_name_for_address(address entry) { + if (entry == CAST_FROM_FN_PTR(address, ShenandoahRuntime::oop_load_from_native_barrier)) { + return "ShenandoahRuntime::oop_load_from_native_barrier"; + } + return NULL; +}