< prev index next >

src/hotspot/cpu/x86/gc/shared/barrierSetNMethod_x86.cpp

Print this page

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
< prev index next >