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
|