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
|