< prev index next >

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

Print this page

142     return -15;
143   }
144 }
145 
146 static NativeNMethodCmpBarrier* native_nmethod_barrier(nmethod* nm) {
147   address barrier_address;
148 #if INCLUDE_JVMCI
149   if (nm->is_compiled_by_jvmci()) {
150     barrier_address = nm->code_begin() + nm->jvmci_nmethod_data()->nmethod_entry_patch_offset();
151   } else
152 #endif
153     {
154       barrier_address = nm->code_begin() + nm->frame_complete_offset() + entry_barrier_offset(nm);
155     }
156 
157   NativeNMethodCmpBarrier* barrier = reinterpret_cast<NativeNMethodCmpBarrier*>(barrier_address);
158   barrier->verify();
159   return barrier;
160 }
161 

























162 void BarrierSetNMethod::set_guard_value(nmethod* nm, int value) {
163   if (!supports_entry_barrier(nm)) {
164     return;
165   }
166 
167   NativeNMethodCmpBarrier* cmp = native_nmethod_barrier(nm);
168   cmp->set_immediate(value);
169 }
170 
171 int BarrierSetNMethod::guard_value(nmethod* nm) {
172   if (!supports_entry_barrier(nm)) {
173     return disarmed_guard_value();
174   }
175 
176   NativeNMethodCmpBarrier* cmp = native_nmethod_barrier(nm);
177   return cmp->get_immediate();
178 }
179 
180 
181 #if INCLUDE_JVMCI
182 bool BarrierSetNMethod::verify_barrier(nmethod* nm, err_msg& msg) {
183   NativeNMethodCmpBarrier* barrier = native_nmethod_barrier(nm);
184   return barrier->check_barrier(msg);
185 }
186 #endif

142     return -15;
143   }
144 }
145 
146 static NativeNMethodCmpBarrier* native_nmethod_barrier(nmethod* nm) {
147   address barrier_address;
148 #if INCLUDE_JVMCI
149   if (nm->is_compiled_by_jvmci()) {
150     barrier_address = nm->code_begin() + nm->jvmci_nmethod_data()->nmethod_entry_patch_offset();
151   } else
152 #endif
153     {
154       barrier_address = nm->code_begin() + nm->frame_complete_offset() + entry_barrier_offset(nm);
155     }
156 
157   NativeNMethodCmpBarrier* barrier = reinterpret_cast<NativeNMethodCmpBarrier*>(barrier_address);
158   barrier->verify();
159   return barrier;
160 }
161 
162 static void set_immediate(nmethod* nm, jint val) {
163   NativeNMethodCmpBarrier* cmp1 = native_nmethod_barrier(nm);
164   cmp1->set_immediate(val);
165 
166   if (!nm->is_osr_method() && nm->method()->has_scalarized_args()) {
167     // nmethods with scalarized arguments have multiple entry points that each have an own nmethod entry barrier
168     assert(nm->verified_entry_point() != nm->verified_inline_entry_point(), "scalarized entry point not found");
169     address method_body = nm->is_compiled_by_c1() ? nm->verified_inline_entry_point() : nm->verified_entry_point();
170     address entry_point2 = nm->is_compiled_by_c1() ? nm->verified_entry_point() : nm->verified_inline_entry_point();
171 
172     int barrier_offset = reinterpret_cast<address>(cmp1) - method_body;
173     NativeNMethodCmpBarrier* cmp2 = reinterpret_cast<NativeNMethodCmpBarrier*>(entry_point2 + barrier_offset);
174     assert(cmp1 != cmp2, "sanity");
175     debug_only(cmp2->verify());
176     cmp2->set_immediate(val);
177 
178     if (method_body != nm->verified_inline_ro_entry_point() && entry_point2 != nm->verified_inline_ro_entry_point()) {
179       NativeNMethodCmpBarrier* cmp3 = reinterpret_cast<NativeNMethodCmpBarrier*>(nm->verified_inline_ro_entry_point() + barrier_offset);
180       assert(cmp1 != cmp3 && cmp2 != cmp3, "sanity");
181       debug_only(cmp3->verify());
182       cmp3->set_immediate(val);
183     }
184   }
185 }
186 
187 void BarrierSetNMethod::set_guard_value(nmethod* nm, int value) {
188   if (!supports_entry_barrier(nm)) {
189     return;
190   }
191 
192   set_immediate(nm, value);

193 }
194 
195 int BarrierSetNMethod::guard_value(nmethod* nm) {
196   if (!supports_entry_barrier(nm)) {
197     return disarmed_guard_value();
198   }
199 
200   NativeNMethodCmpBarrier* cmp = native_nmethod_barrier(nm);
201   return cmp->get_immediate();
202 }
203 
204 
205 #if INCLUDE_JVMCI
206 bool BarrierSetNMethod::verify_barrier(nmethod* nm, err_msg& msg) {
207   NativeNMethodCmpBarrier* barrier = native_nmethod_barrier(nm);
208   return barrier->check_barrier(msg);
209 }
210 #endif
< prev index next >