179 return -18;
180 #endif
181 }
182
183 static NativeNMethodCmpBarrier* native_nmethod_barrier(nmethod* nm) {
184 address barrier_address;
185 #if INCLUDE_JVMCI
186 if (nm->is_compiled_by_jvmci()) {
187 barrier_address = nm->code_begin() + nm->jvmci_nmethod_data()->nmethod_entry_patch_offset();
188 } else
189 #endif
190 {
191 barrier_address = nm->code_begin() + nm->frame_complete_offset() + entry_barrier_offset(nm);
192 }
193
194 NativeNMethodCmpBarrier* barrier = reinterpret_cast<NativeNMethodCmpBarrier*>(barrier_address);
195 barrier->verify();
196 return barrier;
197 }
198
199 void BarrierSetNMethod::set_guard_value(nmethod* nm, int value) {
200 if (!supports_entry_barrier(nm)) {
201 return;
202 }
203
204 NativeNMethodCmpBarrier* cmp = native_nmethod_barrier(nm);
205 cmp->set_immediate(value);
206 }
207
208 int BarrierSetNMethod::guard_value(nmethod* nm) {
209 if (!supports_entry_barrier(nm)) {
210 return disarmed_guard_value();
211 }
212
213 NativeNMethodCmpBarrier* cmp = native_nmethod_barrier(nm);
214 return cmp->get_immediate();
215 }
216
217
218 #if INCLUDE_JVMCI
219 bool BarrierSetNMethod::verify_barrier(nmethod* nm, err_msg& msg) {
220 NativeNMethodCmpBarrier* barrier = native_nmethod_barrier(nm);
221 return barrier->check_barrier(msg);
222 }
223 #endif
|
179 return -18;
180 #endif
181 }
182
183 static NativeNMethodCmpBarrier* native_nmethod_barrier(nmethod* nm) {
184 address barrier_address;
185 #if INCLUDE_JVMCI
186 if (nm->is_compiled_by_jvmci()) {
187 barrier_address = nm->code_begin() + nm->jvmci_nmethod_data()->nmethod_entry_patch_offset();
188 } else
189 #endif
190 {
191 barrier_address = nm->code_begin() + nm->frame_complete_offset() + entry_barrier_offset(nm);
192 }
193
194 NativeNMethodCmpBarrier* barrier = reinterpret_cast<NativeNMethodCmpBarrier*>(barrier_address);
195 barrier->verify();
196 return barrier;
197 }
198
199 static void set_immediate(nmethod* nm, jint val) {
200 NativeNMethodCmpBarrier* cmp1 = native_nmethod_barrier(nm);
201 cmp1->set_immediate(val);
202
203 if (!nm->is_osr_method() && nm->method()->has_scalarized_args()) {
204 // nmethods with scalarized arguments have multiple entry points that each have an own nmethod entry barrier
205 assert(nm->verified_entry_point() != nm->verified_inline_entry_point(), "scalarized entry point not found");
206 address method_body = nm->is_compiled_by_c1() ? nm->verified_inline_entry_point() : nm->verified_entry_point();
207 address entry_point2 = nm->is_compiled_by_c1() ? nm->verified_entry_point() : nm->verified_inline_entry_point();
208
209 int barrier_offset = reinterpret_cast<address>(cmp1) - method_body;
210 NativeNMethodCmpBarrier* cmp2 = reinterpret_cast<NativeNMethodCmpBarrier*>(entry_point2 + barrier_offset);
211 assert(cmp1 != cmp2, "sanity");
212 debug_only(cmp2->verify());
213 cmp2->set_immediate(val);
214
215 if (method_body != nm->verified_inline_ro_entry_point() && entry_point2 != nm->verified_inline_ro_entry_point()) {
216 NativeNMethodCmpBarrier* cmp3 = reinterpret_cast<NativeNMethodCmpBarrier*>(nm->verified_inline_ro_entry_point() + barrier_offset);
217 assert(cmp1 != cmp3 && cmp2 != cmp3, "sanity");
218 debug_only(cmp3->verify());
219 cmp3->set_immediate(val);
220 }
221 }
222 }
223
224 void BarrierSetNMethod::set_guard_value(nmethod* nm, int value) {
225 if (!supports_entry_barrier(nm)) {
226 return;
227 }
228
229 set_immediate(nm, value);
230 }
231
232 int BarrierSetNMethod::guard_value(nmethod* nm) {
233 if (!supports_entry_barrier(nm)) {
234 return disarmed_guard_value();
235 }
236
237 NativeNMethodCmpBarrier* cmp = native_nmethod_barrier(nm);
238 return cmp->get_immediate();
239 }
240
241
242 #if INCLUDE_JVMCI
243 bool BarrierSetNMethod::verify_barrier(nmethod* nm, err_msg& msg) {
244 NativeNMethodCmpBarrier* barrier = native_nmethod_barrier(nm);
245 return barrier->check_barrier(msg);
246 }
247 #endif
|