< prev index next >

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

Print this page

165     return -15;
166   }
167 }
168 
169 static NativeNMethodCmpBarrier* native_nmethod_barrier(nmethod* nm) {
170   address barrier_address;
171 #if INCLUDE_JVMCI
172   if (nm->is_compiled_by_jvmci()) {
173     barrier_address = nm->code_begin() + nm->jvmci_nmethod_data()->nmethod_entry_patch_offset();
174   } else
175 #endif
176     {
177       barrier_address = nm->code_begin() + nm->frame_complete_offset() + entry_barrier_offset(nm);
178     }
179 
180   NativeNMethodCmpBarrier* barrier = reinterpret_cast<NativeNMethodCmpBarrier*>(barrier_address);
181   barrier->verify();
182   return barrier;
183 }
184 

























185 void BarrierSetNMethod::set_guard_value(nmethod* nm, int value, int bit_mask) {
186   if (!supports_entry_barrier(nm)) {
187     return;
188   }
189 
190   NativeNMethodCmpBarrier* cmp = native_nmethod_barrier(nm);
191   cmp->set_immediate(value, bit_mask);
192 }
193 
194 int BarrierSetNMethod::guard_value(nmethod* nm) {
195   if (!supports_entry_barrier(nm)) {
196     return disarmed_guard_value();
197   }
198 
199   NativeNMethodCmpBarrier* cmp = native_nmethod_barrier(nm);
200   return cmp->get_immediate();
201 }
202 
203 
204 #if INCLUDE_JVMCI
205 bool BarrierSetNMethod::verify_barrier(nmethod* nm, err_msg& msg) {
206   NativeNMethodCmpBarrier* barrier = native_nmethod_barrier(nm);
207   return barrier->check_barrier(msg);
208 }
209 #endif

165     return -15;
166   }
167 }
168 
169 static NativeNMethodCmpBarrier* native_nmethod_barrier(nmethod* nm) {
170   address barrier_address;
171 #if INCLUDE_JVMCI
172   if (nm->is_compiled_by_jvmci()) {
173     barrier_address = nm->code_begin() + nm->jvmci_nmethod_data()->nmethod_entry_patch_offset();
174   } else
175 #endif
176     {
177       barrier_address = nm->code_begin() + nm->frame_complete_offset() + entry_barrier_offset(nm);
178     }
179 
180   NativeNMethodCmpBarrier* barrier = reinterpret_cast<NativeNMethodCmpBarrier*>(barrier_address);
181   barrier->verify();
182   return barrier;
183 }
184 
185 static void set_immediate(nmethod* nm, jint val, int bit_mask) {
186   NativeNMethodCmpBarrier* cmp1 = native_nmethod_barrier(nm);
187   cmp1->set_immediate(val, bit_mask);
188 
189   if (!nm->is_osr_method() && nm->method()->has_scalarized_args()) {
190     // nmethods with scalarized arguments have multiple entry points that each have an own nmethod entry barrier
191     assert(nm->verified_entry_point() != nm->verified_inline_entry_point(), "scalarized entry point not found");
192     address method_body = nm->is_compiled_by_c1() ? nm->verified_inline_entry_point() : nm->verified_entry_point();
193     address entry_point2 = nm->is_compiled_by_c1() ? nm->verified_entry_point() : nm->verified_inline_entry_point();
194 
195     int barrier_offset = reinterpret_cast<address>(cmp1) - method_body;
196     NativeNMethodCmpBarrier* cmp2 = reinterpret_cast<NativeNMethodCmpBarrier*>(entry_point2 + barrier_offset);
197     assert(cmp1 != cmp2, "sanity");
198     DEBUG_ONLY(cmp2->verify());
199     cmp2->set_immediate(val, bit_mask);
200 
201     if (method_body != nm->verified_inline_ro_entry_point() && entry_point2 != nm->verified_inline_ro_entry_point()) {
202       NativeNMethodCmpBarrier* cmp3 = reinterpret_cast<NativeNMethodCmpBarrier*>(nm->verified_inline_ro_entry_point() + barrier_offset);
203       assert(cmp1 != cmp3 && cmp2 != cmp3, "sanity");
204       DEBUG_ONLY(cmp3->verify());
205       cmp3->set_immediate(val, bit_mask);
206     }
207   }
208 }
209 
210 void BarrierSetNMethod::set_guard_value(nmethod* nm, int value, int bit_mask) {
211   if (!supports_entry_barrier(nm)) {
212     return;
213   }
214 
215   set_immediate(nm, value, bit_mask);

216 }
217 
218 int BarrierSetNMethod::guard_value(nmethod* nm) {
219   if (!supports_entry_barrier(nm)) {
220     return disarmed_guard_value();
221   }
222 
223   NativeNMethodCmpBarrier* cmp = native_nmethod_barrier(nm);
224   return cmp->get_immediate();
225 }
226 
227 
228 #if INCLUDE_JVMCI
229 bool BarrierSetNMethod::verify_barrier(nmethod* nm, err_msg& msg) {
230   NativeNMethodCmpBarrier* barrier = native_nmethod_barrier(nm);
231   return barrier->check_barrier(msg);
232 }
233 #endif
< prev index next >