31
32 class ZBarrierSet : public BarrierSet {
33 private:
34 static zpointer store_good(oop obj);
35
36 public:
37 ZBarrierSet();
38
39 static ZBarrierSetAssembler* assembler();
40 static bool barrier_needed(DecoratorSet decorators, BasicType type);
41
42 virtual void on_thread_create(Thread* thread);
43 virtual void on_thread_destroy(Thread* thread);
44 virtual void on_thread_attach(Thread* thread);
45 virtual void on_thread_detach(Thread* thread);
46
47 virtual void on_slowpath_allocation_exit(JavaThread* thread, oop new_obj);
48
49 virtual void print_on(outputStream* st) const;
50
51 template <DecoratorSet decorators, typename BarrierSetT = ZBarrierSet>
52 class AccessBarrier : public BarrierSet::AccessBarrier<decorators, BarrierSetT> {
53 private:
54 typedef BarrierSet::AccessBarrier<decorators, BarrierSetT> Raw;
55
56 template <DecoratorSet expected>
57 static void verify_decorators_present();
58
59 template <DecoratorSet expected>
60 static void verify_decorators_absent();
61
62 static zpointer* field_addr(oop base, ptrdiff_t offset);
63
64 static zaddress load_barrier(zpointer* p, zpointer o);
65 static zaddress load_barrier_on_unknown_oop_ref(oop base, ptrdiff_t offset, zpointer* p, zpointer o);
66
67 static void store_barrier_heap_with_healing(zpointer* p);
68 static void store_barrier_heap_without_healing(zpointer* p);
69 static void no_keep_alive_store_barrier_heap(zpointer* p);
70
71 static void store_barrier_native_with_healing(zpointer* p);
72 static void store_barrier_native_without_healing(zpointer* p);
73
74 static void unsupported();
75 static zaddress load_barrier(narrowOop* p, zpointer o) { unsupported(); return zaddress::null; }
76 static zaddress load_barrier_on_unknown_oop_ref(oop base, ptrdiff_t offset, narrowOop* p, zpointer o) { unsupported(); return zaddress::null; }
77 static void store_barrier_heap_with_healing(narrowOop* p) { unsupported(); }
78 static void store_barrier_heap_without_healing(narrowOop* p) { unsupported(); }
79 static void no_keep_alive_store_barrier_heap(narrowOop* p) { unsupported(); }
80 static void store_barrier_native_with_healing(narrowOop* p) { unsupported(); }
81 static void store_barrier_native_without_healing(narrowOop* p) { unsupported(); }
82
83 static zaddress oop_copy_one_barriers(zpointer* dst, zpointer* src);
84 static bool oop_copy_one_check_cast(zpointer* dst, zpointer* src, Klass* dst_klass);
85 static void oop_copy_one(zpointer* dst, zpointer* src);
86
87 static bool oop_arraycopy_in_heap_check_cast(zpointer* dst, zpointer* src, size_t length, Klass* dst_klass);
88 static bool oop_arraycopy_in_heap_no_check_cast(zpointer* dst, zpointer* src, size_t length);
89
90 public:
91 //
92 // In heap
93 //
94 static oop oop_load_in_heap(zpointer* p);
95 static oop oop_load_in_heap(oop* p) { return oop_load_in_heap((zpointer*)p); };
96 static oop oop_load_in_heap(narrowOop* p) { unsupported(); return nullptr; }
97
98 static oop oop_load_in_heap_at(oop base, ptrdiff_t offset);
99
100 static void oop_store_in_heap(zpointer* p, oop value);
101 static void oop_store_in_heap(oop* p, oop value) { oop_store_in_heap((zpointer*)p, value); }
102 static void oop_store_in_heap(narrowOop* p, oop value) { unsupported(); }
103 static void oop_store_in_heap_at(oop base, ptrdiff_t offset, oop value);
104
105 static void oop_store_not_in_heap(zpointer* p, oop value);
106 static void oop_store_not_in_heap(oop* p, oop value) { oop_store_not_in_heap((zpointer*)p, value); }
107 static void oop_store_not_in_heap(narrowOop* p, oop value) { unsupported(); }
108 static void oop_store_not_in_heap_at(oop base, ptrdiff_t offset, oop value);
109
110 static oop oop_atomic_cmpxchg_in_heap(zpointer* p, oop compare_value, oop new_value);
111 static oop oop_atomic_cmpxchg_in_heap(oop* p, oop compare_value, oop new_value) { return oop_atomic_cmpxchg_in_heap((zpointer*)p, compare_value, new_value); }
112 static oop oop_atomic_cmpxchg_in_heap(narrowOop* p, oop compare_value, oop new_value) { unsupported(); return nullptr; }
113 static oop oop_atomic_cmpxchg_in_heap_at(oop base, ptrdiff_t offset, oop compare_value, oop new_value);
114
115 static oop oop_atomic_xchg_in_heap(zpointer* p, oop new_value);
116 static oop oop_atomic_xchg_in_heap(oop* p, oop new_value) { return oop_atomic_xchg_in_heap((zpointer*)p, new_value); }
117 static oop oop_atomic_xchg_in_heap(narrowOop* p, oop new_value) { unsupported(); return nullptr; }
118 static oop oop_atomic_xchg_in_heap_at(oop base, ptrdiff_t offset, oop new_value);
119
120 static bool oop_arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, zpointer* src_raw,
121 arrayOop dst_obj, size_t dst_offset_in_bytes, zpointer* dst_raw,
122 size_t length);
123 static bool oop_arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, oop* src_raw,
124 arrayOop dst_obj, size_t dst_offset_in_bytes, oop* dst_raw,
125 size_t length) {
126 return oop_arraycopy_in_heap(src_obj, src_offset_in_bytes, (zpointer*)src_raw,
127 dst_obj, dst_offset_in_bytes, (zpointer*)dst_raw,
128 length);
129 }
130 static bool oop_arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, narrowOop* src_raw,
131 arrayOop dst_obj, size_t dst_offset_in_bytes, narrowOop* dst_raw,
132 size_t length) { unsupported(); return false; }
133
134 static void clone_in_heap(oop src, oop dst, size_t size);
135
136 //
137 // Not in heap
138 //
139 static oop oop_load_not_in_heap(zpointer* p);
140 static oop oop_load_not_in_heap(oop* p);
141 static oop oop_load_not_in_heap(narrowOop* p) { unsupported(); return nullptr; }
142
143 static oop oop_atomic_cmpxchg_not_in_heap(zpointer* p, oop compare_value, oop new_value);
144 static oop oop_atomic_cmpxchg_not_in_heap(oop* p, oop compare_value, oop new_value) {
145 return oop_atomic_cmpxchg_not_in_heap((zpointer*)p, compare_value, new_value);
146 }
147 static oop oop_atomic_cmpxchg_not_in_heap(narrowOop* addr, oop compare_value, oop new_value) { unsupported(); return nullptr; }
148
149 static oop oop_atomic_xchg_not_in_heap(zpointer* p, oop new_value);
150 static oop oop_atomic_xchg_not_in_heap(oop* p, oop new_value) { return oop_atomic_xchg_not_in_heap((zpointer*)p, new_value); }
151 static oop oop_atomic_xchg_not_in_heap(narrowOop* p, oop new_value) { unsupported(); return nullptr; }
152 };
153 };
154
155 template<> struct BarrierSet::GetName<ZBarrierSet> {
|
31
32 class ZBarrierSet : public BarrierSet {
33 private:
34 static zpointer store_good(oop obj);
35
36 public:
37 ZBarrierSet();
38
39 static ZBarrierSetAssembler* assembler();
40 static bool barrier_needed(DecoratorSet decorators, BasicType type);
41
42 virtual void on_thread_create(Thread* thread);
43 virtual void on_thread_destroy(Thread* thread);
44 virtual void on_thread_attach(Thread* thread);
45 virtual void on_thread_detach(Thread* thread);
46
47 virtual void on_slowpath_allocation_exit(JavaThread* thread, oop new_obj);
48
49 virtual void print_on(outputStream* st) const;
50
51 enum OopCopyCheckStatus {
52 oop_copy_check_ok = 0, // oop array copy sucessful
53 oop_copy_check_class_cast = 1, // oop array copy failed subtype check (ARRAYCOPY_CHECKCAST)
54 oop_copy_check_null = 2 // oop array copy failed null check (ARRAYCOPY_NOTNULL)
55 };
56
57 template <DecoratorSet decorators, typename BarrierSetT = ZBarrierSet>
58 class AccessBarrier : public BarrierSet::AccessBarrier<decorators, BarrierSetT> {
59 private:
60 typedef BarrierSet::AccessBarrier<decorators, BarrierSetT> Raw;
61
62 template <DecoratorSet expected>
63 static void verify_decorators_present();
64
65 template <DecoratorSet expected>
66 static void verify_decorators_absent();
67
68 static zpointer* field_addr(oop base, ptrdiff_t offset);
69
70 static zaddress load_barrier(zpointer* p, zpointer o);
71 static zaddress load_barrier_on_unknown_oop_ref(oop base, ptrdiff_t offset, zpointer* p, zpointer o);
72
73 static void store_barrier_heap_with_healing(zpointer* p);
74 static void store_barrier_heap_without_healing(zpointer* p);
75 static void no_keep_alive_store_barrier_heap(zpointer* p);
76
77 static void store_barrier_native_with_healing(zpointer* p);
78 static void store_barrier_native_without_healing(zpointer* p);
79
80 static void unsupported();
81 static zaddress load_barrier(narrowOop* p, zpointer o) { unsupported(); return zaddress::null; }
82 static zaddress load_barrier_on_unknown_oop_ref(oop base, ptrdiff_t offset, narrowOop* p, zpointer o) { unsupported(); return zaddress::null; }
83 static void store_barrier_heap_with_healing(narrowOop* p) { unsupported(); }
84 static void store_barrier_heap_without_healing(narrowOop* p) { unsupported(); }
85 static void no_keep_alive_store_barrier_heap(narrowOop* p) { unsupported(); }
86 static void store_barrier_native_with_healing(narrowOop* p) { unsupported(); }
87 static void store_barrier_native_without_healing(narrowOop* p) { unsupported(); }
88
89 static zaddress oop_copy_one_barriers(zpointer* dst, zpointer* src);
90 static OopCopyCheckStatus oop_copy_one_check_cast(zpointer* dst, zpointer* src, Klass* dst_klass);
91 static OopCopyCheckStatus oop_copy_one(zpointer* dst, zpointer* src);
92
93 static OopCopyCheckStatus oop_arraycopy_in_heap_check_cast(zpointer* dst, zpointer* src, size_t length, Klass* dst_klass);
94 static OopCopyCheckStatus oop_arraycopy_in_heap_no_check_cast(zpointer* dst, zpointer* src, size_t length);
95
96 public:
97 //
98 // In heap
99 //
100 static oop oop_load_in_heap(zpointer* p);
101 static oop oop_load_in_heap(oop* p) { return oop_load_in_heap((zpointer*)p); };
102 static oop oop_load_in_heap(narrowOop* p) { unsupported(); return nullptr; }
103
104 static oop oop_load_in_heap_at(oop base, ptrdiff_t offset);
105
106 static void oop_store_in_heap(zpointer* p, oop value);
107 static void oop_store_in_heap(oop* p, oop value) { oop_store_in_heap((zpointer*)p, value); }
108 static void oop_store_in_heap(narrowOop* p, oop value) { unsupported(); }
109 static void oop_store_in_heap_at(oop base, ptrdiff_t offset, oop value);
110
111 static void oop_store_not_in_heap(zpointer* p, oop value);
112 static void oop_store_not_in_heap(oop* p, oop value) { oop_store_not_in_heap((zpointer*)p, value); }
113 static void oop_store_not_in_heap(narrowOop* p, oop value) { unsupported(); }
114 static void oop_store_not_in_heap_at(oop base, ptrdiff_t offset, oop value);
115
116 static oop oop_atomic_cmpxchg_in_heap(zpointer* p, oop compare_value, oop new_value);
117 static oop oop_atomic_cmpxchg_in_heap(oop* p, oop compare_value, oop new_value) { return oop_atomic_cmpxchg_in_heap((zpointer*)p, compare_value, new_value); }
118 static oop oop_atomic_cmpxchg_in_heap(narrowOop* p, oop compare_value, oop new_value) { unsupported(); return nullptr; }
119 static oop oop_atomic_cmpxchg_in_heap_at(oop base, ptrdiff_t offset, oop compare_value, oop new_value);
120
121 static oop oop_atomic_xchg_in_heap(zpointer* p, oop new_value);
122 static oop oop_atomic_xchg_in_heap(oop* p, oop new_value) { return oop_atomic_xchg_in_heap((zpointer*)p, new_value); }
123 static oop oop_atomic_xchg_in_heap(narrowOop* p, oop new_value) { unsupported(); return nullptr; }
124 static oop oop_atomic_xchg_in_heap_at(oop base, ptrdiff_t offset, oop new_value);
125
126 static void oop_arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, zpointer* src_raw,
127 arrayOop dst_obj, size_t dst_offset_in_bytes, zpointer* dst_raw,
128 size_t length);
129 static void oop_arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, oop* src_raw,
130 arrayOop dst_obj, size_t dst_offset_in_bytes, oop* dst_raw,
131 size_t length) {
132 oop_arraycopy_in_heap(src_obj, src_offset_in_bytes, (zpointer*)src_raw,
133 dst_obj, dst_offset_in_bytes, (zpointer*)dst_raw,
134 length);
135 }
136 static void oop_arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, narrowOop* src_raw,
137 arrayOop dst_obj, size_t dst_offset_in_bytes, narrowOop* dst_raw,
138 size_t length) { unsupported(); }
139
140 static void clone_in_heap(oop src, oop dst, size_t size);
141
142 static void value_copy_in_heap(void* src, void* dst, InlineKlass* md);
143
144 //
145 // Not in heap
146 //
147 static oop oop_load_not_in_heap(zpointer* p);
148 static oop oop_load_not_in_heap(oop* p);
149 static oop oop_load_not_in_heap(narrowOop* p) { unsupported(); return nullptr; }
150
151 static oop oop_atomic_cmpxchg_not_in_heap(zpointer* p, oop compare_value, oop new_value);
152 static oop oop_atomic_cmpxchg_not_in_heap(oop* p, oop compare_value, oop new_value) {
153 return oop_atomic_cmpxchg_not_in_heap((zpointer*)p, compare_value, new_value);
154 }
155 static oop oop_atomic_cmpxchg_not_in_heap(narrowOop* addr, oop compare_value, oop new_value) { unsupported(); return nullptr; }
156
157 static oop oop_atomic_xchg_not_in_heap(zpointer* p, oop new_value);
158 static oop oop_atomic_xchg_not_in_heap(oop* p, oop new_value) { return oop_atomic_xchg_not_in_heap((zpointer*)p, new_value); }
159 static oop oop_atomic_xchg_not_in_heap(narrowOop* p, oop new_value) { unsupported(); return nullptr; }
160 };
161 };
162
163 template<> struct BarrierSet::GetName<ZBarrierSet> {
|