45 } 46 } 47 48 template <DecoratorSet decorators, typename BarrierSetT> 49 inline oop* ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::field_addr(oop base, ptrdiff_t offset) { 50 assert(base != NULL, "Invalid base"); 51 return reinterpret_cast<oop*>(reinterpret_cast<intptr_t>((void*)base) + offset); 52 } 53 54 template <DecoratorSet decorators, typename BarrierSetT> 55 template <typename T> 56 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::load_barrier_on_oop_field_preloaded(T* addr, oop o) { 57 verify_decorators_absent<ON_UNKNOWN_OOP_REF>(); 58 59 if (HasDecorator<decorators, AS_NO_KEEPALIVE>::value) { 60 if (HasDecorator<decorators, ON_STRONG_OOP_REF>::value) { 61 return ZBarrier::weak_load_barrier_on_oop_field_preloaded(addr, o); 62 } else if (HasDecorator<decorators, ON_WEAK_OOP_REF>::value) { 63 return ZBarrier::weak_load_barrier_on_weak_oop_field_preloaded(addr, o); 64 } else { 65 return ZBarrier::weak_load_barrier_on_phantom_oop_field_preloaded(addr, o); 66 } 67 } else { 68 if (HasDecorator<decorators, ON_STRONG_OOP_REF>::value) { 69 return ZBarrier::load_barrier_on_oop_field_preloaded(addr, o); 70 } else if (HasDecorator<decorators, ON_WEAK_OOP_REF>::value) { 71 return ZBarrier::load_barrier_on_weak_oop_field_preloaded(addr, o); 72 } else { 73 return ZBarrier::load_barrier_on_phantom_oop_field_preloaded(addr, o); 74 } 75 } 76 } 77 78 template <DecoratorSet decorators, typename BarrierSetT> 79 template <typename T> 80 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::load_barrier_on_unknown_oop_field_preloaded(oop base, ptrdiff_t offset, T* addr, oop o) { 81 verify_decorators_present<ON_UNKNOWN_OOP_REF>(); 82 83 const DecoratorSet decorators_known_strength = 84 AccessBarrierSupport::resolve_possibly_unknown_oop_ref_strength<decorators>(base, offset); 85 86 if (HasDecorator<decorators, AS_NO_KEEPALIVE>::value) { 87 if (decorators_known_strength & ON_STRONG_OOP_REF) { 88 return ZBarrier::weak_load_barrier_on_oop_field_preloaded(addr, o); 89 } else if (decorators_known_strength & ON_WEAK_OOP_REF) { 90 return ZBarrier::weak_load_barrier_on_weak_oop_field_preloaded(addr, o); 91 } else { 92 return ZBarrier::weak_load_barrier_on_phantom_oop_field_preloaded(addr, o); 93 } 94 } else { 95 if (decorators_known_strength & ON_STRONG_OOP_REF) { 96 return ZBarrier::load_barrier_on_oop_field_preloaded(addr, o); 97 } else if (decorators_known_strength & ON_WEAK_OOP_REF) { 98 return ZBarrier::load_barrier_on_weak_oop_field_preloaded(addr, o); 99 } else { 100 return ZBarrier::load_barrier_on_phantom_oop_field_preloaded(addr, o); 101 } 102 } 103 } 104 105 // 106 // In heap 107 // 108 template <DecoratorSet decorators, typename BarrierSetT> 109 template <typename T> 110 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_in_heap(T* addr) { 111 verify_decorators_absent<ON_UNKNOWN_OOP_REF>(); 112 113 const oop o = Raw::oop_load_in_heap(addr); 114 return load_barrier_on_oop_field_preloaded(addr, o); 115 } 116 117 template <DecoratorSet decorators, typename BarrierSetT> 118 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_in_heap_at(oop base, ptrdiff_t offset) { 119 oop* const addr = field_addr(base, offset); | 45 } 46 } 47 48 template <DecoratorSet decorators, typename BarrierSetT> 49 inline oop* ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::field_addr(oop base, ptrdiff_t offset) { 50 assert(base != NULL, "Invalid base"); 51 return reinterpret_cast<oop*>(reinterpret_cast<intptr_t>((void*)base) + offset); 52 } 53 54 template <DecoratorSet decorators, typename BarrierSetT> 55 template <typename T> 56 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::load_barrier_on_oop_field_preloaded(T* addr, oop o) { 57 verify_decorators_absent<ON_UNKNOWN_OOP_REF>(); 58 59 if (HasDecorator<decorators, AS_NO_KEEPALIVE>::value) { 60 if (HasDecorator<decorators, ON_STRONG_OOP_REF>::value) { 61 return ZBarrier::weak_load_barrier_on_oop_field_preloaded(addr, o); 62 } else if (HasDecorator<decorators, ON_WEAK_OOP_REF>::value) { 63 return ZBarrier::weak_load_barrier_on_weak_oop_field_preloaded(addr, o); 64 } else { 65 assert((HasDecorator<decorators, ON_PHANTOM_OOP_REF>::value), "Must be"); 66 return ZBarrier::weak_load_barrier_on_phantom_oop_field_preloaded(addr, o); 67 } 68 } else { 69 if (HasDecorator<decorators, ON_STRONG_OOP_REF>::value) { 70 return ZBarrier::load_barrier_on_oop_field_preloaded(addr, o); 71 } else if (HasDecorator<decorators, ON_WEAK_OOP_REF>::value) { 72 return ZBarrier::load_barrier_on_weak_oop_field_preloaded(addr, o); 73 } else { 74 assert((HasDecorator<decorators, ON_PHANTOM_OOP_REF>::value), "Must be"); 75 return ZBarrier::load_barrier_on_phantom_oop_field_preloaded(addr, o); 76 } 77 } 78 } 79 80 template <DecoratorSet decorators, typename BarrierSetT> 81 template <typename T> 82 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::load_barrier_on_unknown_oop_field_preloaded(oop base, ptrdiff_t offset, T* addr, oop o) { 83 verify_decorators_present<ON_UNKNOWN_OOP_REF>(); 84 85 const DecoratorSet decorators_known_strength = 86 AccessBarrierSupport::resolve_possibly_unknown_oop_ref_strength<decorators>(base, offset); 87 88 if (HasDecorator<decorators, AS_NO_KEEPALIVE>::value) { 89 if (decorators_known_strength & ON_STRONG_OOP_REF) { 90 return ZBarrier::weak_load_barrier_on_oop_field_preloaded(addr, o); 91 } else if (decorators_known_strength & ON_WEAK_OOP_REF) { 92 return ZBarrier::weak_load_barrier_on_weak_oop_field_preloaded(addr, o); 93 } else { 94 assert(decorators_known_strength & ON_PHANTOM_OOP_REF, "Must be"); 95 return ZBarrier::weak_load_barrier_on_phantom_oop_field_preloaded(addr, o); 96 } 97 } else { 98 if (decorators_known_strength & ON_STRONG_OOP_REF) { 99 return ZBarrier::load_barrier_on_oop_field_preloaded(addr, o); 100 } else if (decorators_known_strength & ON_WEAK_OOP_REF) { 101 return ZBarrier::load_barrier_on_weak_oop_field_preloaded(addr, o); 102 } else { 103 assert(decorators_known_strength & ON_PHANTOM_OOP_REF, "Must be"); 104 return ZBarrier::load_barrier_on_phantom_oop_field_preloaded(addr, o); 105 } 106 } 107 } 108 109 // 110 // In heap 111 // 112 template <DecoratorSet decorators, typename BarrierSetT> 113 template <typename T> 114 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_in_heap(T* addr) { 115 verify_decorators_absent<ON_UNKNOWN_OOP_REF>(); 116 117 const oop o = Raw::oop_load_in_heap(addr); 118 return load_barrier_on_oop_field_preloaded(addr, o); 119 } 120 121 template <DecoratorSet decorators, typename BarrierSetT> 122 inline oop ZBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_in_heap_at(oop base, ptrdiff_t offset) { 123 oop* const addr = field_addr(base, offset); |