| 1 | /* | 
|---|
| 2 | * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved. | 
|---|
| 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 
|---|
| 4 | * | 
|---|
| 5 | * This code is free software; you can redistribute it and/or modify it | 
|---|
| 6 | * under the terms of the GNU General Public License version 2 only, as | 
|---|
| 7 | * published by the Free Software Foundation. | 
|---|
| 8 | * | 
|---|
| 9 | * This code is distributed in the hope that it will be useful, but WITHOUT | 
|---|
| 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
|---|
| 11 | * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License | 
|---|
| 12 | * version 2 for more details (a copy is included in the LICENSE file that | 
|---|
| 13 | * accompanied this code). | 
|---|
| 14 | * | 
|---|
| 15 | * You should have received a copy of the GNU General Public License version | 
|---|
| 16 | * 2 along with this work; if not, write to the Free Software Foundation, | 
|---|
| 17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | 
|---|
| 18 | * | 
|---|
| 19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | 
|---|
| 20 | * or visit www.oracle.com if you need additional information or have any | 
|---|
| 21 | * questions. | 
|---|
| 22 | * | 
|---|
| 23 | */ | 
|---|
| 24 |  | 
|---|
| 25 | #include "precompiled.hpp" | 
|---|
| 26 | #include "classfile/moduleEntry.hpp" | 
|---|
| 27 | #include "code/codeCache.hpp" | 
|---|
| 28 | #include "code/vmreg.inline.hpp" | 
|---|
| 29 | #include "compiler/abstractCompiler.hpp" | 
|---|
| 30 | #include "compiler/disassembler.hpp" | 
|---|
| 31 | #include "gc/shared/collectedHeap.inline.hpp" | 
|---|
| 32 | #include "interpreter/interpreter.hpp" | 
|---|
| 33 | #include "interpreter/oopMapCache.hpp" | 
|---|
| 34 | #include "memory/resourceArea.hpp" | 
|---|
| 35 | #include "memory/universe.hpp" | 
|---|
| 36 | #include "oops/markOop.hpp" | 
|---|
| 37 | #include "oops/method.hpp" | 
|---|
| 38 | #include "oops/methodData.hpp" | 
|---|
| 39 | #include "oops/oop.inline.hpp" | 
|---|
| 40 | #include "oops/verifyOopClosure.hpp" | 
|---|
| 41 | #include "prims/methodHandles.hpp" | 
|---|
| 42 | #include "runtime/frame.inline.hpp" | 
|---|
| 43 | #include "runtime/handles.inline.hpp" | 
|---|
| 44 | #include "runtime/javaCalls.hpp" | 
|---|
| 45 | #include "runtime/monitorChunk.hpp" | 
|---|
| 46 | #include "runtime/os.hpp" | 
|---|
| 47 | #include "runtime/sharedRuntime.hpp" | 
|---|
| 48 | #include "runtime/signature.hpp" | 
|---|
| 49 | #include "runtime/stubCodeGenerator.hpp" | 
|---|
| 50 | #include "runtime/stubRoutines.hpp" | 
|---|
| 51 | #include "runtime/thread.inline.hpp" | 
|---|
| 52 | #include "utilities/debug.hpp" | 
|---|
| 53 | #include "utilities/decoder.hpp" | 
|---|
| 54 | #include "utilities/formatBuffer.hpp" | 
|---|
| 55 |  | 
|---|
| 56 | RegisterMap::RegisterMap(JavaThread *thread, bool update_map) { | 
|---|
| 57 | _thread         = thread; | 
|---|
| 58 | _update_map     = update_map; | 
|---|
| 59 | clear(); | 
|---|
| 60 | debug_only(_update_for_id = NULL;) | 
|---|
| 61 | #ifndef PRODUCT | 
|---|
| 62 | for (int i = 0; i < reg_count ; i++ ) _location[i] = NULL; | 
|---|
| 63 | #endif /* PRODUCT */ | 
|---|
| 64 | } | 
|---|
| 65 |  | 
|---|
| 66 | RegisterMap::RegisterMap(const RegisterMap* map) { | 
|---|
| 67 | assert(map != this, "bad initialization parameter"); | 
|---|
| 68 | assert(map != NULL, "RegisterMap must be present"); | 
|---|
| 69 | _thread                = map->thread(); | 
|---|
| 70 | _update_map            = map->update_map(); | 
|---|
| 71 | _include_argument_oops = map->include_argument_oops(); | 
|---|
| 72 | debug_only(_update_for_id = map->_update_for_id;) | 
|---|
| 73 | pd_initialize_from(map); | 
|---|
| 74 | if (update_map()) { | 
|---|
| 75 | for(int i = 0; i < location_valid_size; i++) { | 
|---|
| 76 | LocationValidType bits = !update_map() ? 0 : map->_location_valid[i]; | 
|---|
| 77 | _location_valid[i] = bits; | 
|---|
| 78 | // for whichever bits are set, pull in the corresponding map->_location | 
|---|
| 79 | int j = i*location_valid_type_size; | 
|---|
| 80 | while (bits != 0) { | 
|---|
| 81 | if ((bits & 1) != 0) { | 
|---|
| 82 | assert(0 <= j && j < reg_count, "range check"); | 
|---|
| 83 | _location[j] = map->_location[j]; | 
|---|
| 84 | } | 
|---|
| 85 | bits >>= 1; | 
|---|
| 86 | j += 1; | 
|---|
| 87 | } | 
|---|
| 88 | } | 
|---|
| 89 | } | 
|---|
| 90 | } | 
|---|
| 91 |  | 
|---|
| 92 | void RegisterMap::clear() { | 
|---|
| 93 | set_include_argument_oops(true); | 
|---|
| 94 | if (_update_map) { | 
|---|
| 95 | for(int i = 0; i < location_valid_size; i++) { | 
|---|
| 96 | _location_valid[i] = 0; | 
|---|
| 97 | } | 
|---|
| 98 | pd_clear(); | 
|---|
| 99 | } else { | 
|---|
| 100 | pd_initialize(); | 
|---|
| 101 | } | 
|---|
| 102 | } | 
|---|
| 103 |  | 
|---|
| 104 | #ifndef PRODUCT | 
|---|
| 105 |  | 
|---|
| 106 | void RegisterMap::print_on(outputStream* st) const { | 
|---|
| 107 | st->print_cr( "Register map"); | 
|---|
| 108 | for(int i = 0; i < reg_count; i++) { | 
|---|
| 109 |  | 
|---|
| 110 | VMReg r = VMRegImpl::as_VMReg(i); | 
|---|
| 111 | intptr_t* src = (intptr_t*) location(r); | 
|---|
| 112 | if (src != NULL) { | 
|---|
| 113 |  | 
|---|
| 114 | r->print_on(st); | 
|---|
| 115 | st->print( " ["INTPTR_FORMAT "] = ", p2i(src)); | 
|---|
| 116 | if (((uintptr_t)src & (sizeof(*src)-1)) != 0) { | 
|---|
| 117 | st->print_cr( "<misaligned>"); | 
|---|
| 118 | } else { | 
|---|
| 119 | st->print_cr(INTPTR_FORMAT, *src); | 
|---|
| 120 | } | 
|---|
| 121 | } | 
|---|
| 122 | } | 
|---|
| 123 | } | 
|---|
| 124 |  | 
|---|
| 125 | void RegisterMap::print() const { | 
|---|
| 126 | print_on(tty); | 
|---|
| 127 | } | 
|---|
| 128 |  | 
|---|
| 129 | #endif | 
|---|
| 130 | // This returns the pc that if you were in the debugger you'd see. Not | 
|---|
| 131 | // the idealized value in the frame object. This undoes the magic conversion | 
|---|
| 132 | // that happens for deoptimized frames. In addition it makes the value the | 
|---|
| 133 | // hardware would want to see in the native frame. The only user (at this point) | 
|---|
| 134 | // is deoptimization. It likely no one else should ever use it. | 
|---|
| 135 |  | 
|---|
| 136 | address frame::raw_pc() const { | 
|---|
| 137 | if (is_deoptimized_frame()) { | 
|---|
| 138 | CompiledMethod* cm = cb()->as_compiled_method_or_null(); | 
|---|
| 139 | if (cm->is_method_handle_return(pc())) | 
|---|
| 140 | return cm->deopt_mh_handler_begin() - pc_return_offset; | 
|---|
| 141 | else | 
|---|
| 142 | return cm->deopt_handler_begin() - pc_return_offset; | 
|---|
| 143 | } else { | 
|---|
| 144 | return (pc() - pc_return_offset); | 
|---|
| 145 | } | 
|---|
| 146 | } | 
|---|
| 147 |  | 
|---|
| 148 | // Change the pc in a frame object. This does not change the actual pc in | 
|---|
| 149 | // actual frame. To do that use patch_pc. | 
|---|
| 150 | // | 
|---|
| 151 | void frame::set_pc(address   newpc ) { | 
|---|
| 152 | #ifdef ASSERT | 
|---|
| 153 | if (_cb != NULL && _cb->is_nmethod()) { | 
|---|
| 154 | assert(!((nmethod*)_cb)->is_deopt_pc(_pc), "invariant violation"); | 
|---|
| 155 | } | 
|---|
| 156 | #endif // ASSERT | 
|---|
| 157 |  | 
|---|
| 158 | // Unsafe to use the is_deoptimzed tester after changing pc | 
|---|
| 159 | _deopt_state = unknown; | 
|---|
| 160 | _pc = newpc; | 
|---|
| 161 | _cb = CodeCache::find_blob_unsafe(_pc); | 
|---|
| 162 |  | 
|---|
| 163 | } | 
|---|
| 164 |  | 
|---|
| 165 | // type testers | 
|---|
| 166 | bool frame::is_ignored_frame() const { | 
|---|
| 167 | return false;  // FIXME: some LambdaForm frames should be ignored | 
|---|
| 168 | } | 
|---|
| 169 | bool frame::is_deoptimized_frame() const { | 
|---|
| 170 | assert(_deopt_state != unknown, "not answerable"); | 
|---|
| 171 | return _deopt_state == is_deoptimized; | 
|---|
| 172 | } | 
|---|
| 173 |  | 
|---|
| 174 | bool frame::is_native_frame() const { | 
|---|
| 175 | return (_cb != NULL && | 
|---|
| 176 | _cb->is_nmethod() && | 
|---|
| 177 | ((nmethod*)_cb)->is_native_method()); | 
|---|
| 178 | } | 
|---|
| 179 |  | 
|---|
| 180 | bool frame::is_java_frame() const { | 
|---|
| 181 | if (is_interpreted_frame()) return true; | 
|---|
| 182 | if (is_compiled_frame())    return true; | 
|---|
| 183 | return false; | 
|---|
| 184 | } | 
|---|
| 185 |  | 
|---|
| 186 |  | 
|---|
| 187 | bool frame::is_compiled_frame() const { | 
|---|
| 188 | if (_cb != NULL && | 
|---|
| 189 | _cb->is_compiled() && | 
|---|
| 190 | ((CompiledMethod*)_cb)->is_java_method()) { | 
|---|
| 191 | return true; | 
|---|
| 192 | } | 
|---|
| 193 | return false; | 
|---|
| 194 | } | 
|---|
| 195 |  | 
|---|
| 196 |  | 
|---|
| 197 | bool frame::is_runtime_frame() const { | 
|---|
| 198 | return (_cb != NULL && _cb->is_runtime_stub()); | 
|---|
| 199 | } | 
|---|
| 200 |  | 
|---|
| 201 | bool frame::is_safepoint_blob_frame() const { | 
|---|
| 202 | return (_cb != NULL && _cb->is_safepoint_stub()); | 
|---|
| 203 | } | 
|---|
| 204 |  | 
|---|
| 205 | // testers | 
|---|
| 206 |  | 
|---|
| 207 | bool frame::is_first_java_frame() const { | 
|---|
| 208 | RegisterMap map(JavaThread::current(), false); // No update | 
|---|
| 209 | frame s; | 
|---|
| 210 | for (s = sender(&map); !(s.is_java_frame() || s.is_first_frame()); s = s.sender(&map)); | 
|---|
| 211 | return s.is_first_frame(); | 
|---|
| 212 | } | 
|---|
| 213 |  | 
|---|
| 214 |  | 
|---|
| 215 | bool frame::entry_frame_is_first() const { | 
|---|
| 216 | return entry_frame_call_wrapper()->is_first_frame(); | 
|---|
| 217 | } | 
|---|
| 218 |  | 
|---|
| 219 | JavaCallWrapper* frame::entry_frame_call_wrapper_if_safe(JavaThread* thread) const { | 
|---|
| 220 | JavaCallWrapper** jcw = entry_frame_call_wrapper_addr(); | 
|---|
| 221 | address addr = (address) jcw; | 
|---|
| 222 |  | 
|---|
| 223 | // addr must be within the usable part of the stack | 
|---|
| 224 | if (thread->is_in_usable_stack(addr)) { | 
|---|
| 225 | return *jcw; | 
|---|
| 226 | } | 
|---|
| 227 |  | 
|---|
| 228 | return NULL; | 
|---|
| 229 | } | 
|---|
| 230 |  | 
|---|
| 231 | bool frame::is_entry_frame_valid(JavaThread* thread) const { | 
|---|
| 232 | // Validate the JavaCallWrapper an entry frame must have | 
|---|
| 233 | address jcw = (address)entry_frame_call_wrapper(); | 
|---|
| 234 | bool jcw_safe = (jcw < thread->stack_base()) && (jcw > (address)fp()); // less than stack base | 
|---|
| 235 | if (!jcw_safe) { | 
|---|
| 236 | return false; | 
|---|
| 237 | } | 
|---|
| 238 |  | 
|---|
| 239 | // Validate sp saved in the java frame anchor | 
|---|
| 240 | JavaFrameAnchor* jfa = entry_frame_call_wrapper()->anchor(); | 
|---|
| 241 | return (jfa->last_Java_sp() > sp()); | 
|---|
| 242 | } | 
|---|
| 243 |  | 
|---|
| 244 | bool frame::should_be_deoptimized() const { | 
|---|
| 245 | if (_deopt_state == is_deoptimized || | 
|---|
| 246 | !is_compiled_frame() ) return false; | 
|---|
| 247 | assert(_cb != NULL && _cb->is_compiled(), "must be an nmethod"); | 
|---|
| 248 | CompiledMethod* nm = (CompiledMethod *)_cb; | 
|---|
| 249 | if (TraceDependencies) { | 
|---|
| 250 | tty->print( "checking (%s) ", nm->is_marked_for_deoptimization() ? "true": "false"); | 
|---|
| 251 | nm->print_value_on(tty); | 
|---|
| 252 | tty->cr(); | 
|---|
| 253 | } | 
|---|
| 254 |  | 
|---|
| 255 | if( !nm->is_marked_for_deoptimization() ) | 
|---|
| 256 | return false; | 
|---|
| 257 |  | 
|---|
| 258 | // If at the return point, then the frame has already been popped, and | 
|---|
| 259 | // only the return needs to be executed. Don't deoptimize here. | 
|---|
| 260 | return !nm->is_at_poll_return(pc()); | 
|---|
| 261 | } | 
|---|
| 262 |  | 
|---|
| 263 | bool frame::can_be_deoptimized() const { | 
|---|
| 264 | if (!is_compiled_frame()) return false; | 
|---|
| 265 | CompiledMethod* nm = (CompiledMethod*)_cb; | 
|---|
| 266 |  | 
|---|
| 267 | if( !nm->can_be_deoptimized() ) | 
|---|
| 268 | return false; | 
|---|
| 269 |  | 
|---|
| 270 | return !nm->is_at_poll_return(pc()); | 
|---|
| 271 | } | 
|---|
| 272 |  | 
|---|
| 273 | void frame::deoptimize(JavaThread* thread) { | 
|---|
| 274 | assert(thread->frame_anchor()->has_last_Java_frame() && | 
|---|
| 275 | thread->frame_anchor()->walkable(), "must be"); | 
|---|
| 276 | // Schedule deoptimization of an nmethod activation with this frame. | 
|---|
| 277 | assert(_cb != NULL && _cb->is_compiled(), "must be"); | 
|---|
| 278 |  | 
|---|
| 279 | // If the call site is a MethodHandle call site use the MH deopt | 
|---|
| 280 | // handler. | 
|---|
| 281 | CompiledMethod* cm = (CompiledMethod*) _cb; | 
|---|
| 282 | address deopt = cm->is_method_handle_return(pc()) ? | 
|---|
| 283 | cm->deopt_mh_handler_begin() : | 
|---|
| 284 | cm->deopt_handler_begin(); | 
|---|
| 285 |  | 
|---|
| 286 | // Save the original pc before we patch in the new one | 
|---|
| 287 | cm->set_original_pc(this, pc()); | 
|---|
| 288 | patch_pc(thread, deopt); | 
|---|
| 289 |  | 
|---|
| 290 | #ifdef ASSERT | 
|---|
| 291 | { | 
|---|
| 292 | RegisterMap map(thread, false); | 
|---|
| 293 | frame check = thread->last_frame(); | 
|---|
| 294 | while (id() != check.id()) { | 
|---|
| 295 | check = check.sender(&map); | 
|---|
| 296 | } | 
|---|
| 297 | assert(check.is_deoptimized_frame(), "missed deopt"); | 
|---|
| 298 | } | 
|---|
| 299 | #endif // ASSERT | 
|---|
| 300 | } | 
|---|
| 301 |  | 
|---|
| 302 | frame frame::java_sender() const { | 
|---|
| 303 | RegisterMap map(JavaThread::current(), false); | 
|---|
| 304 | frame s; | 
|---|
| 305 | for (s = sender(&map); !(s.is_java_frame() || s.is_first_frame()); s = s.sender(&map)) ; | 
|---|
| 306 | guarantee(s.is_java_frame(), "tried to get caller of first java frame"); | 
|---|
| 307 | return s; | 
|---|
| 308 | } | 
|---|
| 309 |  | 
|---|
| 310 | frame frame::real_sender(RegisterMap* map) const { | 
|---|
| 311 | frame result = sender(map); | 
|---|
| 312 | while (result.is_runtime_frame() || | 
|---|
| 313 | result.is_ignored_frame()) { | 
|---|
| 314 | result = result.sender(map); | 
|---|
| 315 | } | 
|---|
| 316 | return result; | 
|---|
| 317 | } | 
|---|
| 318 |  | 
|---|
| 319 | // Interpreter frames | 
|---|
| 320 |  | 
|---|
| 321 |  | 
|---|
| 322 | void frame::interpreter_frame_set_locals(intptr_t* locs)  { | 
|---|
| 323 | assert(is_interpreted_frame(), "Not an interpreted frame"); | 
|---|
| 324 | *interpreter_frame_locals_addr() = locs; | 
|---|
| 325 | } | 
|---|
| 326 |  | 
|---|
| 327 | Method* frame::interpreter_frame_method() const { | 
|---|
| 328 | assert(is_interpreted_frame(), "interpreted frame expected"); | 
|---|
| 329 | Method* m = *interpreter_frame_method_addr(); | 
|---|
| 330 | assert(m->is_method(), "not a Method*"); | 
|---|
| 331 | return m; | 
|---|
| 332 | } | 
|---|
| 333 |  | 
|---|
| 334 | void frame::interpreter_frame_set_method(Method* method) { | 
|---|
| 335 | assert(is_interpreted_frame(), "interpreted frame expected"); | 
|---|
| 336 | *interpreter_frame_method_addr() = method; | 
|---|
| 337 | } | 
|---|
| 338 |  | 
|---|
| 339 | void frame::interpreter_frame_set_mirror(oop mirror) { | 
|---|
| 340 | assert(is_interpreted_frame(), "interpreted frame expected"); | 
|---|
| 341 | *interpreter_frame_mirror_addr() = mirror; | 
|---|
| 342 | } | 
|---|
| 343 |  | 
|---|
| 344 | jint frame::interpreter_frame_bci() const { | 
|---|
| 345 | assert(is_interpreted_frame(), "interpreted frame expected"); | 
|---|
| 346 | address bcp = interpreter_frame_bcp(); | 
|---|
| 347 | return interpreter_frame_method()->bci_from(bcp); | 
|---|
| 348 | } | 
|---|
| 349 |  | 
|---|
| 350 | address frame::interpreter_frame_bcp() const { | 
|---|
| 351 | assert(is_interpreted_frame(), "interpreted frame expected"); | 
|---|
| 352 | address bcp = (address)*interpreter_frame_bcp_addr(); | 
|---|
| 353 | return interpreter_frame_method()->bcp_from(bcp); | 
|---|
| 354 | } | 
|---|
| 355 |  | 
|---|
| 356 | void frame::interpreter_frame_set_bcp(address bcp) { | 
|---|
| 357 | assert(is_interpreted_frame(), "interpreted frame expected"); | 
|---|
| 358 | *interpreter_frame_bcp_addr() = (intptr_t)bcp; | 
|---|
| 359 | } | 
|---|
| 360 |  | 
|---|
| 361 | address frame::interpreter_frame_mdp() const { | 
|---|
| 362 | assert(ProfileInterpreter, "must be profiling interpreter"); | 
|---|
| 363 | assert(is_interpreted_frame(), "interpreted frame expected"); | 
|---|
| 364 | return (address)*interpreter_frame_mdp_addr(); | 
|---|
| 365 | } | 
|---|
| 366 |  | 
|---|
| 367 | void frame::interpreter_frame_set_mdp(address mdp) { | 
|---|
| 368 | assert(is_interpreted_frame(), "interpreted frame expected"); | 
|---|
| 369 | assert(ProfileInterpreter, "must be profiling interpreter"); | 
|---|
| 370 | *interpreter_frame_mdp_addr() = (intptr_t)mdp; | 
|---|
| 371 | } | 
|---|
| 372 |  | 
|---|
| 373 | BasicObjectLock* frame::next_monitor_in_interpreter_frame(BasicObjectLock* current) const { | 
|---|
| 374 | assert(is_interpreted_frame(), "Not an interpreted frame"); | 
|---|
| 375 | #ifdef ASSERT | 
|---|
| 376 | interpreter_frame_verify_monitor(current); | 
|---|
| 377 | #endif | 
|---|
| 378 | BasicObjectLock* next = (BasicObjectLock*) (((intptr_t*) current) + interpreter_frame_monitor_size()); | 
|---|
| 379 | return next; | 
|---|
| 380 | } | 
|---|
| 381 |  | 
|---|
| 382 | BasicObjectLock* frame::previous_monitor_in_interpreter_frame(BasicObjectLock* current) const { | 
|---|
| 383 | assert(is_interpreted_frame(), "Not an interpreted frame"); | 
|---|
| 384 | #ifdef ASSERT | 
|---|
| 385 | //   // This verification needs to be checked before being enabled | 
|---|
| 386 | //   interpreter_frame_verify_monitor(current); | 
|---|
| 387 | #endif | 
|---|
| 388 | BasicObjectLock* previous = (BasicObjectLock*) (((intptr_t*) current) - interpreter_frame_monitor_size()); | 
|---|
| 389 | return previous; | 
|---|
| 390 | } | 
|---|
| 391 |  | 
|---|
| 392 | // Interpreter locals and expression stack locations. | 
|---|
| 393 |  | 
|---|
| 394 | intptr_t* frame::interpreter_frame_local_at(int index) const { | 
|---|
| 395 | const int n = Interpreter::local_offset_in_bytes(index)/wordSize; | 
|---|
| 396 | return &((*interpreter_frame_locals_addr())[n]); | 
|---|
| 397 | } | 
|---|
| 398 |  | 
|---|
| 399 | intptr_t* frame::interpreter_frame_expression_stack_at(jint offset) const { | 
|---|
| 400 | const int i = offset * interpreter_frame_expression_stack_direction(); | 
|---|
| 401 | const int n = i * Interpreter::stackElementWords; | 
|---|
| 402 | return &(interpreter_frame_expression_stack()[n]); | 
|---|
| 403 | } | 
|---|
| 404 |  | 
|---|
| 405 | jint frame::interpreter_frame_expression_stack_size() const { | 
|---|
| 406 | // Number of elements on the interpreter expression stack | 
|---|
| 407 | // Callers should span by stackElementWords | 
|---|
| 408 | int element_size = Interpreter::stackElementWords; | 
|---|
| 409 | size_t stack_size = 0; | 
|---|
| 410 | if (frame::interpreter_frame_expression_stack_direction() < 0) { | 
|---|
| 411 | stack_size = (interpreter_frame_expression_stack() - | 
|---|
| 412 | interpreter_frame_tos_address() + 1)/element_size; | 
|---|
| 413 | } else { | 
|---|
| 414 | stack_size = (interpreter_frame_tos_address() - | 
|---|
| 415 | interpreter_frame_expression_stack() + 1)/element_size; | 
|---|
| 416 | } | 
|---|
| 417 | assert( stack_size <= (size_t)max_jint, "stack size too big"); | 
|---|
| 418 | return ((jint)stack_size); | 
|---|
| 419 | } | 
|---|
| 420 |  | 
|---|
| 421 |  | 
|---|
| 422 | // (frame::interpreter_frame_sender_sp accessor is in frame_<arch>.cpp) | 
|---|
| 423 |  | 
|---|
| 424 | const char* frame::print_name() const { | 
|---|
| 425 | if (is_native_frame())      return "Native"; | 
|---|
| 426 | if (is_interpreted_frame()) return "Interpreted"; | 
|---|
| 427 | if (is_compiled_frame()) { | 
|---|
| 428 | if (is_deoptimized_frame()) return "Deoptimized"; | 
|---|
| 429 | return "Compiled"; | 
|---|
| 430 | } | 
|---|
| 431 | if (sp() == NULL)            return "Empty"; | 
|---|
| 432 | return "C"; | 
|---|
| 433 | } | 
|---|
| 434 |  | 
|---|
| 435 | void frame::print_value_on(outputStream* st, JavaThread *thread) const { | 
|---|
| 436 | NOT_PRODUCT(address begin = pc()-40;) | 
|---|
| 437 | NOT_PRODUCT(address end   = NULL;) | 
|---|
| 438 |  | 
|---|
| 439 | st->print( "%s frame (sp="INTPTR_FORMAT " unextended sp="INTPTR_FORMAT, print_name(), p2i(sp()), p2i(unextended_sp())); | 
|---|
| 440 | if (sp() != NULL) | 
|---|
| 441 | st->print( ", fp="INTPTR_FORMAT ", real_fp="INTPTR_FORMAT ", pc="INTPTR_FORMAT, | 
|---|
| 442 | p2i(fp()), p2i(real_fp()), p2i(pc())); | 
|---|
| 443 |  | 
|---|
| 444 | if (StubRoutines::contains(pc())) { | 
|---|
| 445 | st->print_cr( ")"); | 
|---|
| 446 | st->print( "("); | 
|---|
| 447 | StubCodeDesc* desc = StubCodeDesc::desc_for(pc()); | 
|---|
| 448 | st->print( "~Stub::%s", desc->name()); | 
|---|
| 449 | NOT_PRODUCT(begin = desc->begin(); end = desc->end();) | 
|---|
| 450 | } else if (Interpreter::contains(pc())) { | 
|---|
| 451 | st->print_cr( ")"); | 
|---|
| 452 | st->print( "("); | 
|---|
| 453 | InterpreterCodelet* desc = Interpreter::codelet_containing(pc()); | 
|---|
| 454 | if (desc != NULL) { | 
|---|
| 455 | st->print( "~"); | 
|---|
| 456 | desc->print_on(st); | 
|---|
| 457 | NOT_PRODUCT(begin = desc->code_begin(); end = desc->code_end();) | 
|---|
| 458 | } else { | 
|---|
| 459 | st->print( "~interpreter"); | 
|---|
| 460 | } | 
|---|
| 461 | } | 
|---|
| 462 | st->print_cr( ")"); | 
|---|
| 463 |  | 
|---|
| 464 | if (_cb != NULL) { | 
|---|
| 465 | st->print( "     "); | 
|---|
| 466 | _cb->print_value_on(st); | 
|---|
| 467 | st->cr(); | 
|---|
| 468 | #ifndef PRODUCT | 
|---|
| 469 | if (end == NULL) { | 
|---|
| 470 | begin = _cb->code_begin(); | 
|---|
| 471 | end   = _cb->code_end(); | 
|---|
| 472 | } | 
|---|
| 473 | #endif | 
|---|
| 474 | } | 
|---|
| 475 | NOT_PRODUCT(if (WizardMode && Verbose) Disassembler::decode(begin, end);) | 
|---|
| 476 | } | 
|---|
| 477 |  | 
|---|
| 478 |  | 
|---|
| 479 | void frame::print_on(outputStream* st) const { | 
|---|
| 480 | print_value_on(st,NULL); | 
|---|
| 481 | if (is_interpreted_frame()) { | 
|---|
| 482 | interpreter_frame_print_on(st); | 
|---|
| 483 | } | 
|---|
| 484 | } | 
|---|
| 485 |  | 
|---|
| 486 |  | 
|---|
| 487 | void frame::interpreter_frame_print_on(outputStream* st) const { | 
|---|
| 488 | #ifndef PRODUCT | 
|---|
| 489 | assert(is_interpreted_frame(), "Not an interpreted frame"); | 
|---|
| 490 | jint i; | 
|---|
| 491 | for (i = 0; i < interpreter_frame_method()->max_locals(); i++ ) { | 
|---|
| 492 | intptr_t x = *interpreter_frame_local_at(i); | 
|---|
| 493 | st->print( " - local  ["INTPTR_FORMAT "]", x); | 
|---|
| 494 | st->fill_to(23); | 
|---|
| 495 | st->print_cr( "; #%d", i); | 
|---|
| 496 | } | 
|---|
| 497 | for (i = interpreter_frame_expression_stack_size() - 1; i >= 0; --i ) { | 
|---|
| 498 | intptr_t x = *interpreter_frame_expression_stack_at(i); | 
|---|
| 499 | st->print( " - stack  ["INTPTR_FORMAT "]", x); | 
|---|
| 500 | st->fill_to(23); | 
|---|
| 501 | st->print_cr( "; #%d", i); | 
|---|
| 502 | } | 
|---|
| 503 | // locks for synchronization | 
|---|
| 504 | for (BasicObjectLock* current = interpreter_frame_monitor_end(); | 
|---|
| 505 | current < interpreter_frame_monitor_begin(); | 
|---|
| 506 | current = next_monitor_in_interpreter_frame(current)) { | 
|---|
| 507 | st->print( " - obj    ["); | 
|---|
| 508 | current->obj()->print_value_on(st); | 
|---|
| 509 | st->print_cr( "]"); | 
|---|
| 510 | st->print( " - lock   ["); | 
|---|
| 511 | current->lock()->print_on(st); | 
|---|
| 512 | st->print_cr( "]"); | 
|---|
| 513 | } | 
|---|
| 514 | // monitor | 
|---|
| 515 | st->print_cr( " - monitor["INTPTR_FORMAT "]", p2i(interpreter_frame_monitor_begin())); | 
|---|
| 516 | // bcp | 
|---|
| 517 | st->print( " - bcp    ["INTPTR_FORMAT "]", p2i(interpreter_frame_bcp())); | 
|---|
| 518 | st->fill_to(23); | 
|---|
| 519 | st->print_cr( "; @%d", interpreter_frame_bci()); | 
|---|
| 520 | // locals | 
|---|
| 521 | st->print_cr( " - locals ["INTPTR_FORMAT "]", p2i(interpreter_frame_local_at(0))); | 
|---|
| 522 | // method | 
|---|
| 523 | st->print( " - method ["INTPTR_FORMAT "]", p2i(interpreter_frame_method())); | 
|---|
| 524 | st->fill_to(23); | 
|---|
| 525 | st->print( "; "); | 
|---|
| 526 | interpreter_frame_method()->print_name(st); | 
|---|
| 527 | st->cr(); | 
|---|
| 528 | #endif | 
|---|
| 529 | } | 
|---|
| 530 |  | 
|---|
| 531 | // Print whether the frame is in the VM or OS indicating a HotSpot problem. | 
|---|
| 532 | // Otherwise, it's likely a bug in the native library that the Java code calls, | 
|---|
| 533 | // hopefully indicating where to submit bugs. | 
|---|
| 534 | void frame::print_C_frame(outputStream* st, char* buf, int buflen, address pc) { | 
|---|
| 535 | // C/C++ frame | 
|---|
| 536 | bool in_vm = os::address_is_in_vm(pc); | 
|---|
| 537 | st->print(in_vm ? "V": "C"); | 
|---|
| 538 |  | 
|---|
| 539 | int offset; | 
|---|
| 540 | bool found; | 
|---|
| 541 |  | 
|---|
| 542 | // libname | 
|---|
| 543 | found = os::dll_address_to_library_name(pc, buf, buflen, &offset); | 
|---|
| 544 | if (found) { | 
|---|
| 545 | // skip directory names | 
|---|
| 546 | const char *p1, *p2; | 
|---|
| 547 | p1 = buf; | 
|---|
| 548 | int len = (int)strlen(os::file_separator()); | 
|---|
| 549 | while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len; | 
|---|
| 550 | st->print( "  [%s+0x%x]", p1, offset); | 
|---|
| 551 | } else { | 
|---|
| 552 | st->print( "  "PTR_FORMAT, p2i(pc)); | 
|---|
| 553 | } | 
|---|
| 554 |  | 
|---|
| 555 | found = os::dll_address_to_function_name(pc, buf, buflen, &offset); | 
|---|
| 556 | if (found) { | 
|---|
| 557 | st->print( "  %s+0x%x", buf, offset); | 
|---|
| 558 | } | 
|---|
| 559 | } | 
|---|
| 560 |  | 
|---|
| 561 | // frame::print_on_error() is called by fatal error handler. Notice that we may | 
|---|
| 562 | // crash inside this function if stack frame is corrupted. The fatal error | 
|---|
| 563 | // handler can catch and handle the crash. Here we assume the frame is valid. | 
|---|
| 564 | // | 
|---|
| 565 | // First letter indicates type of the frame: | 
|---|
| 566 | //    J: Java frame (compiled) | 
|---|
| 567 | //    A: Java frame (aot compiled) | 
|---|
| 568 | //    j: Java frame (interpreted) | 
|---|
| 569 | //    V: VM frame (C/C++) | 
|---|
| 570 | //    v: Other frames running VM generated code (e.g. stubs, adapters, etc.) | 
|---|
| 571 | //    C: C/C++ frame | 
|---|
| 572 | // | 
|---|
| 573 | // We don't need detailed frame type as that in frame::print_name(). "C" | 
|---|
| 574 | // suggests the problem is in user lib; everything else is likely a VM bug. | 
|---|
| 575 |  | 
|---|
| 576 | void frame::print_on_error(outputStream* st, char* buf, int buflen, bool verbose) const { | 
|---|
| 577 | if (_cb != NULL) { | 
|---|
| 578 | if (Interpreter::contains(pc())) { | 
|---|
| 579 | Method* m = this->interpreter_frame_method(); | 
|---|
| 580 | if (m != NULL) { | 
|---|
| 581 | m->name_and_sig_as_C_string(buf, buflen); | 
|---|
| 582 | st->print( "j  %s", buf); | 
|---|
| 583 | st->print( "+%d", this->interpreter_frame_bci()); | 
|---|
| 584 | ModuleEntry* module = m->method_holder()->module(); | 
|---|
| 585 | if (module->is_named()) { | 
|---|
| 586 | module->name()->as_C_string(buf, buflen); | 
|---|
| 587 | st->print( " %s", buf); | 
|---|
| 588 | if (module->version() != NULL) { | 
|---|
| 589 | module->version()->as_C_string(buf, buflen); | 
|---|
| 590 | st->print( "@%s", buf); | 
|---|
| 591 | } | 
|---|
| 592 | } | 
|---|
| 593 | } else { | 
|---|
| 594 | st->print( "j  "PTR_FORMAT, p2i(pc())); | 
|---|
| 595 | } | 
|---|
| 596 | } else if (StubRoutines::contains(pc())) { | 
|---|
| 597 | StubCodeDesc* desc = StubCodeDesc::desc_for(pc()); | 
|---|
| 598 | if (desc != NULL) { | 
|---|
| 599 | st->print( "v  ~StubRoutines::%s", desc->name()); | 
|---|
| 600 | } else { | 
|---|
| 601 | st->print( "v  ~StubRoutines::"PTR_FORMAT, p2i(pc())); | 
|---|
| 602 | } | 
|---|
| 603 | } else if (_cb->is_buffer_blob()) { | 
|---|
| 604 | st->print( "v  ~BufferBlob::%s", ((BufferBlob *)_cb)->name()); | 
|---|
| 605 | } else if (_cb->is_compiled()) { | 
|---|
| 606 | CompiledMethod* cm = (CompiledMethod*)_cb; | 
|---|
| 607 | Method* m = cm->method(); | 
|---|
| 608 | if (m != NULL) { | 
|---|
| 609 | if (cm->is_aot()) { | 
|---|
| 610 | st->print( "A %d ", cm->compile_id()); | 
|---|
| 611 | } else if (cm->is_nmethod()) { | 
|---|
| 612 | nmethod* nm = cm->as_nmethod(); | 
|---|
| 613 | st->print( "J %d%s", nm->compile_id(), (nm->is_osr_method() ? "%": "")); | 
|---|
| 614 | st->print( " %s", nm->compiler_name()); | 
|---|
| 615 | } | 
|---|
| 616 | m->name_and_sig_as_C_string(buf, buflen); | 
|---|
| 617 | st->print( " %s", buf); | 
|---|
| 618 | ModuleEntry* module = m->method_holder()->module(); | 
|---|
| 619 | if (module->is_named()) { | 
|---|
| 620 | module->name()->as_C_string(buf, buflen); | 
|---|
| 621 | st->print( " %s", buf); | 
|---|
| 622 | if (module->version() != NULL) { | 
|---|
| 623 | module->version()->as_C_string(buf, buflen); | 
|---|
| 624 | st->print( "@%s", buf); | 
|---|
| 625 | } | 
|---|
| 626 | } | 
|---|
| 627 | st->print( " (%d bytes) @ "PTR_FORMAT " ["PTR_FORMAT "+"INTPTR_FORMAT "]", | 
|---|
| 628 | m->code_size(), p2i(_pc), p2i(_cb->code_begin()), _pc - _cb->code_begin()); | 
|---|
| 629 | #if INCLUDE_JVMCI | 
|---|
| 630 | if (cm->is_nmethod()) { | 
|---|
| 631 | nmethod* nm = cm->as_nmethod(); | 
|---|
| 632 | const char* jvmciName = nm->jvmci_name(); | 
|---|
| 633 | if (jvmciName != NULL) { | 
|---|
| 634 | st->print( " (%s)", jvmciName); | 
|---|
| 635 | } | 
|---|
| 636 | } | 
|---|
| 637 | #endif | 
|---|
| 638 | } else { | 
|---|
| 639 | st->print( "J  "PTR_FORMAT, p2i(pc())); | 
|---|
| 640 | } | 
|---|
| 641 | } else if (_cb->is_runtime_stub()) { | 
|---|
| 642 | st->print( "v  ~RuntimeStub::%s", ((RuntimeStub *)_cb)->name()); | 
|---|
| 643 | } else if (_cb->is_deoptimization_stub()) { | 
|---|
| 644 | st->print( "v  ~DeoptimizationBlob"); | 
|---|
| 645 | } else if (_cb->is_exception_stub()) { | 
|---|
| 646 | st->print( "v  ~ExceptionBlob"); | 
|---|
| 647 | } else if (_cb->is_safepoint_stub()) { | 
|---|
| 648 | st->print( "v  ~SafepointBlob"); | 
|---|
| 649 | } else if (_cb->is_adapter_blob()) { | 
|---|
| 650 | st->print( "v  ~AdapterBlob"); | 
|---|
| 651 | } else if (_cb->is_vtable_blob()) { | 
|---|
| 652 | st->print( "v  ~VtableBlob"); | 
|---|
| 653 | } else if (_cb->is_method_handles_adapter_blob()) { | 
|---|
| 654 | st->print( "v  ~MethodHandlesAdapterBlob"); | 
|---|
| 655 | } else if (_cb->is_uncommon_trap_stub()) { | 
|---|
| 656 | st->print( "v  ~UncommonTrapBlob"); | 
|---|
| 657 | } else { | 
|---|
| 658 | st->print( "v  blob "PTR_FORMAT, p2i(pc())); | 
|---|
| 659 | } | 
|---|
| 660 | } else { | 
|---|
| 661 | print_C_frame(st, buf, buflen, pc()); | 
|---|
| 662 | } | 
|---|
| 663 | } | 
|---|
| 664 |  | 
|---|
| 665 |  | 
|---|
| 666 | /* | 
|---|
| 667 | The interpreter_frame_expression_stack_at method in the case of SPARC needs the | 
|---|
| 668 | max_stack value of the method in order to compute the expression stack address. | 
|---|
| 669 | It uses the Method* in order to get the max_stack value but during GC this | 
|---|
| 670 | Method* value saved on the frame is changed by reverse_and_push and hence cannot | 
|---|
| 671 | be used. So we save the max_stack value in the FrameClosure object and pass it | 
|---|
| 672 | down to the interpreter_frame_expression_stack_at method | 
|---|
| 673 | */ | 
|---|
| 674 | class InterpreterFrameClosure : public OffsetClosure { | 
|---|
| 675 | private: | 
|---|
| 676 | frame* _fr; | 
|---|
| 677 | OopClosure* _f; | 
|---|
| 678 | int    _max_locals; | 
|---|
| 679 | int    _max_stack; | 
|---|
| 680 |  | 
|---|
| 681 | public: | 
|---|
| 682 | InterpreterFrameClosure(frame* fr, int max_locals, int max_stack, | 
|---|
| 683 | OopClosure* f) { | 
|---|
| 684 | _fr         = fr; | 
|---|
| 685 | _max_locals = max_locals; | 
|---|
| 686 | _max_stack  = max_stack; | 
|---|
| 687 | _f          = f; | 
|---|
| 688 | } | 
|---|
| 689 |  | 
|---|
| 690 | void offset_do(int offset) { | 
|---|
| 691 | oop* addr; | 
|---|
| 692 | if (offset < _max_locals) { | 
|---|
| 693 | addr = (oop*) _fr->interpreter_frame_local_at(offset); | 
|---|
| 694 | assert((intptr_t*)addr >= _fr->sp(), "must be inside the frame"); | 
|---|
| 695 | _f->do_oop(addr); | 
|---|
| 696 | } else { | 
|---|
| 697 | addr = (oop*) _fr->interpreter_frame_expression_stack_at((offset - _max_locals)); | 
|---|
| 698 | // In case of exceptions, the expression stack is invalid and the esp will be reset to express | 
|---|
| 699 | // this condition. Therefore, we call f only if addr is 'inside' the stack (i.e., addr >= esp for Intel). | 
|---|
| 700 | bool in_stack; | 
|---|
| 701 | if (frame::interpreter_frame_expression_stack_direction() > 0) { | 
|---|
| 702 | in_stack = (intptr_t*)addr <= _fr->interpreter_frame_tos_address(); | 
|---|
| 703 | } else { | 
|---|
| 704 | in_stack = (intptr_t*)addr >= _fr->interpreter_frame_tos_address(); | 
|---|
| 705 | } | 
|---|
| 706 | if (in_stack) { | 
|---|
| 707 | _f->do_oop(addr); | 
|---|
| 708 | } | 
|---|
| 709 | } | 
|---|
| 710 | } | 
|---|
| 711 |  | 
|---|
| 712 | int max_locals()  { return _max_locals; } | 
|---|
| 713 | frame* fr()       { return _fr; } | 
|---|
| 714 | }; | 
|---|
| 715 |  | 
|---|
| 716 |  | 
|---|
| 717 | class InterpretedArgumentOopFinder: public SignatureInfo { | 
|---|
| 718 | private: | 
|---|
| 719 | OopClosure* _f;        // Closure to invoke | 
|---|
| 720 | int    _offset;        // TOS-relative offset, decremented with each argument | 
|---|
| 721 | bool   _has_receiver;  // true if the callee has a receiver | 
|---|
| 722 | frame* _fr; | 
|---|
| 723 |  | 
|---|
| 724 | void set(int size, BasicType type) { | 
|---|
| 725 | _offset -= size; | 
|---|
| 726 | if (type == T_OBJECT || type == T_ARRAY) oop_offset_do(); | 
|---|
| 727 | } | 
|---|
| 728 |  | 
|---|
| 729 | void oop_offset_do() { | 
|---|
| 730 | oop* addr; | 
|---|
| 731 | addr = (oop*)_fr->interpreter_frame_tos_at(_offset); | 
|---|
| 732 | _f->do_oop(addr); | 
|---|
| 733 | } | 
|---|
| 734 |  | 
|---|
| 735 | public: | 
|---|
| 736 | InterpretedArgumentOopFinder(Symbol* signature, bool has_receiver, frame* fr, OopClosure* f) : SignatureInfo(signature), _has_receiver(has_receiver) { | 
|---|
| 737 | // compute size of arguments | 
|---|
| 738 | int args_size = ArgumentSizeComputer(signature).size() + (has_receiver ? 1 : 0); | 
|---|
| 739 | assert(!fr->is_interpreted_frame() || | 
|---|
| 740 | args_size <= fr->interpreter_frame_expression_stack_size(), | 
|---|
| 741 | "args cannot be on stack anymore"); | 
|---|
| 742 | // initialize InterpretedArgumentOopFinder | 
|---|
| 743 | _f         = f; | 
|---|
| 744 | _fr        = fr; | 
|---|
| 745 | _offset    = args_size; | 
|---|
| 746 | } | 
|---|
| 747 |  | 
|---|
| 748 | void oops_do() { | 
|---|
| 749 | if (_has_receiver) { | 
|---|
| 750 | --_offset; | 
|---|
| 751 | oop_offset_do(); | 
|---|
| 752 | } | 
|---|
| 753 | iterate_parameters(); | 
|---|
| 754 | } | 
|---|
| 755 | }; | 
|---|
| 756 |  | 
|---|
| 757 |  | 
|---|
| 758 | // Entry frame has following form (n arguments) | 
|---|
| 759 | //         +-----------+ | 
|---|
| 760 | //   sp -> |  last arg | | 
|---|
| 761 | //         +-----------+ | 
|---|
| 762 | //         :    :::    : | 
|---|
| 763 | //         +-----------+ | 
|---|
| 764 | // (sp+n)->|  first arg| | 
|---|
| 765 | //         +-----------+ | 
|---|
| 766 |  | 
|---|
| 767 |  | 
|---|
| 768 |  | 
|---|
| 769 | // visits and GC's all the arguments in entry frame | 
|---|
| 770 | class EntryFrameOopFinder: public SignatureInfo { | 
|---|
| 771 | private: | 
|---|
| 772 | bool   _is_static; | 
|---|
| 773 | int    _offset; | 
|---|
| 774 | frame* _fr; | 
|---|
| 775 | OopClosure* _f; | 
|---|
| 776 |  | 
|---|
| 777 | void set(int size, BasicType type) { | 
|---|
| 778 | assert (_offset >= 0, "illegal offset"); | 
|---|
| 779 | if (type == T_OBJECT || type == T_ARRAY) oop_at_offset_do(_offset); | 
|---|
| 780 | _offset -= size; | 
|---|
| 781 | } | 
|---|
| 782 |  | 
|---|
| 783 | void oop_at_offset_do(int offset) { | 
|---|
| 784 | assert (offset >= 0, "illegal offset"); | 
|---|
| 785 | oop* addr = (oop*) _fr->entry_frame_argument_at(offset); | 
|---|
| 786 | _f->do_oop(addr); | 
|---|
| 787 | } | 
|---|
| 788 |  | 
|---|
| 789 | public: | 
|---|
| 790 | EntryFrameOopFinder(frame* frame, Symbol* signature, bool is_static) : SignatureInfo(signature) { | 
|---|
| 791 | _f = NULL; // will be set later | 
|---|
| 792 | _fr = frame; | 
|---|
| 793 | _is_static = is_static; | 
|---|
| 794 | _offset = ArgumentSizeComputer(signature).size() - 1; // last parameter is at index 0 | 
|---|
| 795 | } | 
|---|
| 796 |  | 
|---|
| 797 | void arguments_do(OopClosure* f) { | 
|---|
| 798 | _f = f; | 
|---|
| 799 | if (!_is_static) oop_at_offset_do(_offset+1); // do the receiver | 
|---|
| 800 | iterate_parameters(); | 
|---|
| 801 | } | 
|---|
| 802 |  | 
|---|
| 803 | }; | 
|---|
| 804 |  | 
|---|
| 805 | oop* frame::interpreter_callee_receiver_addr(Symbol* signature) { | 
|---|
| 806 | ArgumentSizeComputer asc(signature); | 
|---|
| 807 | int size = asc.size(); | 
|---|
| 808 | return (oop *)interpreter_frame_tos_at(size); | 
|---|
| 809 | } | 
|---|
| 810 |  | 
|---|
| 811 |  | 
|---|
| 812 | void frame::oops_interpreted_do(OopClosure* f, const RegisterMap* map, bool query_oop_map_cache) { | 
|---|
| 813 | assert(is_interpreted_frame(), "Not an interpreted frame"); | 
|---|
| 814 | assert(map != NULL, "map must be set"); | 
|---|
| 815 | Thread *thread = Thread::current(); | 
|---|
| 816 | methodHandle m (thread, interpreter_frame_method()); | 
|---|
| 817 | jint      bci = interpreter_frame_bci(); | 
|---|
| 818 |  | 
|---|
| 819 | assert(!Universe::heap()->is_in(m()), | 
|---|
| 820 | "must be valid oop"); | 
|---|
| 821 | assert(m->is_method(), "checking frame value"); | 
|---|
| 822 | assert((m->is_native() && bci == 0)  || | 
|---|
| 823 | (!m->is_native() && bci >= 0 && bci < m->code_size()), | 
|---|
| 824 | "invalid bci value"); | 
|---|
| 825 |  | 
|---|
| 826 | // Handle the monitor elements in the activation | 
|---|
| 827 | for ( | 
|---|
| 828 | BasicObjectLock* current = interpreter_frame_monitor_end(); | 
|---|
| 829 | current < interpreter_frame_monitor_begin(); | 
|---|
| 830 | current = next_monitor_in_interpreter_frame(current) | 
|---|
| 831 | ) { | 
|---|
| 832 | #ifdef ASSERT | 
|---|
| 833 | interpreter_frame_verify_monitor(current); | 
|---|
| 834 | #endif | 
|---|
| 835 | current->oops_do(f); | 
|---|
| 836 | } | 
|---|
| 837 |  | 
|---|
| 838 | if (m->is_native()) { | 
|---|
| 839 | f->do_oop(interpreter_frame_temp_oop_addr()); | 
|---|
| 840 | } | 
|---|
| 841 |  | 
|---|
| 842 | // The method pointer in the frame might be the only path to the method's | 
|---|
| 843 | // klass, and the klass needs to be kept alive while executing. The GCs | 
|---|
| 844 | // don't trace through method pointers, so the mirror of the method's klass | 
|---|
| 845 | // is installed as a GC root. | 
|---|
| 846 | f->do_oop(interpreter_frame_mirror_addr()); | 
|---|
| 847 |  | 
|---|
| 848 | int max_locals = m->is_native() ? m->size_of_parameters() : m->max_locals(); | 
|---|
| 849 |  | 
|---|
| 850 | Symbol* signature = NULL; | 
|---|
| 851 | bool has_receiver = false; | 
|---|
| 852 |  | 
|---|
| 853 | // Process a callee's arguments if we are at a call site | 
|---|
| 854 | // (i.e., if we are at an invoke bytecode) | 
|---|
| 855 | // This is used sometimes for calling into the VM, not for another | 
|---|
| 856 | // interpreted or compiled frame. | 
|---|
| 857 | if (!m->is_native()) { | 
|---|
| 858 | Bytecode_invoke call = Bytecode_invoke_check(m, bci); | 
|---|
| 859 | if (call.is_valid()) { | 
|---|
| 860 | signature = call.signature(); | 
|---|
| 861 | has_receiver = call.has_receiver(); | 
|---|
| 862 | if (map->include_argument_oops() && | 
|---|
| 863 | interpreter_frame_expression_stack_size() > 0) { | 
|---|
| 864 | ResourceMark rm(thread);  // is this right ??? | 
|---|
| 865 | // we are at a call site & the expression stack is not empty | 
|---|
| 866 | // => process callee's arguments | 
|---|
| 867 | // | 
|---|
| 868 | // Note: The expression stack can be empty if an exception | 
|---|
| 869 | //       occurred during method resolution/execution. In all | 
|---|
| 870 | //       cases we empty the expression stack completely be- | 
|---|
| 871 | //       fore handling the exception (the exception handling | 
|---|
| 872 | //       code in the interpreter calls a blocking runtime | 
|---|
| 873 | //       routine which can cause this code to be executed). | 
|---|
| 874 | //       (was bug gri 7/27/98) | 
|---|
| 875 | oops_interpreted_arguments_do(signature, has_receiver, f); | 
|---|
| 876 | } | 
|---|
| 877 | } | 
|---|
| 878 | } | 
|---|
| 879 |  | 
|---|
| 880 | InterpreterFrameClosure blk(this, max_locals, m->max_stack(), f); | 
|---|
| 881 |  | 
|---|
| 882 | // process locals & expression stack | 
|---|
| 883 | InterpreterOopMap mask; | 
|---|
| 884 | if (query_oop_map_cache) { | 
|---|
| 885 | m->mask_for(bci, &mask); | 
|---|
| 886 | } else { | 
|---|
| 887 | OopMapCache::compute_one_oop_map(m, bci, &mask); | 
|---|
| 888 | } | 
|---|
| 889 | mask.iterate_oop(&blk); | 
|---|
| 890 | } | 
|---|
| 891 |  | 
|---|
| 892 |  | 
|---|
| 893 | void frame::oops_interpreted_arguments_do(Symbol* signature, bool has_receiver, OopClosure* f) { | 
|---|
| 894 | InterpretedArgumentOopFinder finder(signature, has_receiver, this, f); | 
|---|
| 895 | finder.oops_do(); | 
|---|
| 896 | } | 
|---|
| 897 |  | 
|---|
| 898 | void frame::oops_code_blob_do(OopClosure* f, CodeBlobClosure* cf, const RegisterMap* reg_map) { | 
|---|
| 899 | assert(_cb != NULL, "sanity check"); | 
|---|
| 900 | if (_cb->oop_maps() != NULL) { | 
|---|
| 901 | OopMapSet::oops_do(this, reg_map, f); | 
|---|
| 902 |  | 
|---|
| 903 | // Preserve potential arguments for a callee. We handle this by dispatching | 
|---|
| 904 | // on the codeblob. For c2i, we do | 
|---|
| 905 | if (reg_map->include_argument_oops()) { | 
|---|
| 906 | _cb->preserve_callee_argument_oops(*this, reg_map, f); | 
|---|
| 907 | } | 
|---|
| 908 | } | 
|---|
| 909 | // In cases where perm gen is collected, GC will want to mark | 
|---|
| 910 | // oops referenced from nmethods active on thread stacks so as to | 
|---|
| 911 | // prevent them from being collected. However, this visit should be | 
|---|
| 912 | // restricted to certain phases of the collection only. The | 
|---|
| 913 | // closure decides how it wants nmethods to be traced. | 
|---|
| 914 | if (cf != NULL) | 
|---|
| 915 | cf->do_code_blob(_cb); | 
|---|
| 916 | } | 
|---|
| 917 |  | 
|---|
| 918 | class CompiledArgumentOopFinder: public SignatureInfo { | 
|---|
| 919 | protected: | 
|---|
| 920 | OopClosure*     _f; | 
|---|
| 921 | int             _offset;        // the current offset, incremented with each argument | 
|---|
| 922 | bool            _has_receiver;  // true if the callee has a receiver | 
|---|
| 923 | bool            _has_appendix;  // true if the call has an appendix | 
|---|
| 924 | frame           _fr; | 
|---|
| 925 | RegisterMap*    _reg_map; | 
|---|
| 926 | int             _arg_size; | 
|---|
| 927 | VMRegPair*      _regs;        // VMReg list of arguments | 
|---|
| 928 |  | 
|---|
| 929 | void set(int size, BasicType type) { | 
|---|
| 930 | if (type == T_OBJECT || type == T_ARRAY) handle_oop_offset(); | 
|---|
| 931 | _offset += size; | 
|---|
| 932 | } | 
|---|
| 933 |  | 
|---|
| 934 | virtual void handle_oop_offset() { | 
|---|
| 935 | // Extract low order register number from register array. | 
|---|
| 936 | // In LP64-land, the high-order bits are valid but unhelpful. | 
|---|
| 937 | VMReg reg = _regs[_offset].first(); | 
|---|
| 938 | oop *loc = _fr.oopmapreg_to_location(reg, _reg_map); | 
|---|
| 939 | _f->do_oop(loc); | 
|---|
| 940 | } | 
|---|
| 941 |  | 
|---|
| 942 | public: | 
|---|
| 943 | CompiledArgumentOopFinder(Symbol* signature, bool has_receiver, bool has_appendix, OopClosure* f, frame fr,  const RegisterMap* reg_map) | 
|---|
| 944 | : SignatureInfo(signature) { | 
|---|
| 945 |  | 
|---|
| 946 | // initialize CompiledArgumentOopFinder | 
|---|
| 947 | _f         = f; | 
|---|
| 948 | _offset    = 0; | 
|---|
| 949 | _has_receiver = has_receiver; | 
|---|
| 950 | _has_appendix = has_appendix; | 
|---|
| 951 | _fr        = fr; | 
|---|
| 952 | _reg_map   = (RegisterMap*)reg_map; | 
|---|
| 953 | _arg_size  = ArgumentSizeComputer(signature).size() + (has_receiver ? 1 : 0) + (has_appendix ? 1 : 0); | 
|---|
| 954 |  | 
|---|
| 955 | int arg_size; | 
|---|
| 956 | _regs = SharedRuntime::find_callee_arguments(signature, has_receiver, has_appendix, &arg_size); | 
|---|
| 957 | assert(arg_size == _arg_size, "wrong arg size"); | 
|---|
| 958 | } | 
|---|
| 959 |  | 
|---|
| 960 | void oops_do() { | 
|---|
| 961 | if (_has_receiver) { | 
|---|
| 962 | handle_oop_offset(); | 
|---|
| 963 | _offset++; | 
|---|
| 964 | } | 
|---|
| 965 | iterate_parameters(); | 
|---|
| 966 | if (_has_appendix) { | 
|---|
| 967 | handle_oop_offset(); | 
|---|
| 968 | _offset++; | 
|---|
| 969 | } | 
|---|
| 970 | } | 
|---|
| 971 | }; | 
|---|
| 972 |  | 
|---|
| 973 | void frame::oops_compiled_arguments_do(Symbol* signature, bool has_receiver, bool has_appendix, | 
|---|
| 974 | const RegisterMap* reg_map, OopClosure* f) { | 
|---|
| 975 | ResourceMark rm; | 
|---|
| 976 | CompiledArgumentOopFinder finder(signature, has_receiver, has_appendix, f, *this, reg_map); | 
|---|
| 977 | finder.oops_do(); | 
|---|
| 978 | } | 
|---|
| 979 |  | 
|---|
| 980 |  | 
|---|
| 981 | // Get receiver out of callers frame, i.e. find parameter 0 in callers | 
|---|
| 982 | // frame.  Consult ADLC for where parameter 0 is to be found.  Then | 
|---|
| 983 | // check local reg_map for it being a callee-save register or argument | 
|---|
| 984 | // register, both of which are saved in the local frame.  If not found | 
|---|
| 985 | // there, it must be an in-stack argument of the caller. | 
|---|
| 986 | // Note: caller.sp() points to callee-arguments | 
|---|
| 987 | oop frame::retrieve_receiver(RegisterMap* reg_map) { | 
|---|
| 988 | frame caller = *this; | 
|---|
| 989 |  | 
|---|
| 990 | // First consult the ADLC on where it puts parameter 0 for this signature. | 
|---|
| 991 | VMReg reg = SharedRuntime::name_for_receiver(); | 
|---|
| 992 | oop* oop_adr = caller.oopmapreg_to_location(reg, reg_map); | 
|---|
| 993 | if (oop_adr == NULL) { | 
|---|
| 994 | guarantee(oop_adr != NULL, "bad register save location"); | 
|---|
| 995 | return NULL; | 
|---|
| 996 | } | 
|---|
| 997 | oop r = *oop_adr; | 
|---|
| 998 | assert(Universe::heap()->is_in_or_null(r), "bad receiver: "INTPTR_FORMAT " ("INTX_FORMAT ")", p2i(r), p2i(r)); | 
|---|
| 999 | return r; | 
|---|
| 1000 | } | 
|---|
| 1001 |  | 
|---|
| 1002 |  | 
|---|
| 1003 | BasicLock* frame::get_native_monitor() { | 
|---|
| 1004 | nmethod* nm = (nmethod*)_cb; | 
|---|
| 1005 | assert(_cb != NULL && _cb->is_nmethod() && nm->method()->is_native(), | 
|---|
| 1006 | "Should not call this unless it's a native nmethod"); | 
|---|
| 1007 | int byte_offset = in_bytes(nm->native_basic_lock_sp_offset()); | 
|---|
| 1008 | assert(byte_offset >= 0, "should not see invalid offset"); | 
|---|
| 1009 | return (BasicLock*) &sp()[byte_offset / wordSize]; | 
|---|
| 1010 | } | 
|---|
| 1011 |  | 
|---|
| 1012 | oop frame::get_native_receiver() { | 
|---|
| 1013 | nmethod* nm = (nmethod*)_cb; | 
|---|
| 1014 | assert(_cb != NULL && _cb->is_nmethod() && nm->method()->is_native(), | 
|---|
| 1015 | "Should not call this unless it's a native nmethod"); | 
|---|
| 1016 | int byte_offset = in_bytes(nm->native_receiver_sp_offset()); | 
|---|
| 1017 | assert(byte_offset >= 0, "should not see invalid offset"); | 
|---|
| 1018 | oop owner = ((oop*) sp())[byte_offset / wordSize]; | 
|---|
| 1019 | assert( Universe::heap()->is_in(owner), "bad receiver"); | 
|---|
| 1020 | return owner; | 
|---|
| 1021 | } | 
|---|
| 1022 |  | 
|---|
| 1023 | void frame::oops_entry_do(OopClosure* f, const RegisterMap* map) { | 
|---|
| 1024 | assert(map != NULL, "map must be set"); | 
|---|
| 1025 | if (map->include_argument_oops()) { | 
|---|
| 1026 | // must collect argument oops, as nobody else is doing it | 
|---|
| 1027 | Thread *thread = Thread::current(); | 
|---|
| 1028 | methodHandle m (thread, entry_frame_call_wrapper()->callee_method()); | 
|---|
| 1029 | EntryFrameOopFinder finder(this, m->signature(), m->is_static()); | 
|---|
| 1030 | finder.arguments_do(f); | 
|---|
| 1031 | } | 
|---|
| 1032 | // Traverse the Handle Block saved in the entry frame | 
|---|
| 1033 | entry_frame_call_wrapper()->oops_do(f); | 
|---|
| 1034 | } | 
|---|
| 1035 |  | 
|---|
| 1036 |  | 
|---|
| 1037 | void frame::oops_do_internal(OopClosure* f, CodeBlobClosure* cf, RegisterMap* map, bool use_interpreter_oop_map_cache) { | 
|---|
| 1038 | #ifndef PRODUCT | 
|---|
| 1039 | #if defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5140 | 
|---|
| 1040 | #pragma error_messages(off, SEC_NULL_PTR_DEREF) | 
|---|
| 1041 | #endif | 
|---|
| 1042 | // simulate GC crash here to dump java thread in error report | 
|---|
| 1043 | if (CrashGCForDumpingJavaThread) { | 
|---|
| 1044 | char *t = NULL; | 
|---|
| 1045 | *t = 'c'; | 
|---|
| 1046 | } | 
|---|
| 1047 | #endif | 
|---|
| 1048 | if (is_interpreted_frame()) { | 
|---|
| 1049 | oops_interpreted_do(f, map, use_interpreter_oop_map_cache); | 
|---|
| 1050 | } else if (is_entry_frame()) { | 
|---|
| 1051 | oops_entry_do(f, map); | 
|---|
| 1052 | } else if (CodeCache::contains(pc())) { | 
|---|
| 1053 | oops_code_blob_do(f, cf, map); | 
|---|
| 1054 | } else { | 
|---|
| 1055 | ShouldNotReachHere(); | 
|---|
| 1056 | } | 
|---|
| 1057 | } | 
|---|
| 1058 |  | 
|---|
| 1059 | void frame::nmethods_do(CodeBlobClosure* cf) { | 
|---|
| 1060 | if (_cb != NULL && _cb->is_nmethod()) { | 
|---|
| 1061 | cf->do_code_blob(_cb); | 
|---|
| 1062 | } | 
|---|
| 1063 | } | 
|---|
| 1064 |  | 
|---|
| 1065 |  | 
|---|
| 1066 | // Call f closure on the interpreted Method*s in the stack. | 
|---|
| 1067 | void frame::metadata_do(MetadataClosure* f) { | 
|---|
| 1068 | ResourceMark rm; | 
|---|
| 1069 | if (is_interpreted_frame()) { | 
|---|
| 1070 | Method* m = this->interpreter_frame_method(); | 
|---|
| 1071 | assert(m != NULL, "expecting a method in this frame"); | 
|---|
| 1072 | f->do_metadata(m); | 
|---|
| 1073 | } | 
|---|
| 1074 | } | 
|---|
| 1075 |  | 
|---|
| 1076 | void frame::verify(const RegisterMap* map) { | 
|---|
| 1077 | // for now make sure receiver type is correct | 
|---|
| 1078 | if (is_interpreted_frame()) { | 
|---|
| 1079 | Method* method = interpreter_frame_method(); | 
|---|
| 1080 | guarantee(method->is_method(), "method is wrong in frame::verify"); | 
|---|
| 1081 | if (!method->is_static()) { | 
|---|
| 1082 | // fetch the receiver | 
|---|
| 1083 | oop* p = (oop*) interpreter_frame_local_at(0); | 
|---|
| 1084 | // make sure we have the right receiver type | 
|---|
| 1085 | } | 
|---|
| 1086 | } | 
|---|
| 1087 | #if COMPILER2_OR_JVMCI | 
|---|
| 1088 | assert(DerivedPointerTable::is_empty(), "must be empty before verify"); | 
|---|
| 1089 | #endif | 
|---|
| 1090 | oops_do_internal(&VerifyOopClosure::verify_oop, NULL, (RegisterMap*)map, false); | 
|---|
| 1091 | } | 
|---|
| 1092 |  | 
|---|
| 1093 |  | 
|---|
| 1094 | #ifdef ASSERT | 
|---|
| 1095 | bool frame::verify_return_pc(address x) { | 
|---|
| 1096 | if (StubRoutines::returns_to_call_stub(x)) { | 
|---|
| 1097 | return true; | 
|---|
| 1098 | } | 
|---|
| 1099 | if (CodeCache::contains(x)) { | 
|---|
| 1100 | return true; | 
|---|
| 1101 | } | 
|---|
| 1102 | if (Interpreter::contains(x)) { | 
|---|
| 1103 | return true; | 
|---|
| 1104 | } | 
|---|
| 1105 | return false; | 
|---|
| 1106 | } | 
|---|
| 1107 | #endif | 
|---|
| 1108 |  | 
|---|
| 1109 | #ifdef ASSERT | 
|---|
| 1110 | void frame::interpreter_frame_verify_monitor(BasicObjectLock* value) const { | 
|---|
| 1111 | assert(is_interpreted_frame(), "Not an interpreted frame"); | 
|---|
| 1112 | // verify that the value is in the right part of the frame | 
|---|
| 1113 | address low_mark  = (address) interpreter_frame_monitor_end(); | 
|---|
| 1114 | address high_mark = (address) interpreter_frame_monitor_begin(); | 
|---|
| 1115 | address current   = (address) value; | 
|---|
| 1116 |  | 
|---|
| 1117 | const int monitor_size = frame::interpreter_frame_monitor_size(); | 
|---|
| 1118 | guarantee((high_mark - current) % monitor_size  ==  0         , "Misaligned top of BasicObjectLock*"); | 
|---|
| 1119 | guarantee( high_mark > current                                , "Current BasicObjectLock* higher than high_mark"); | 
|---|
| 1120 |  | 
|---|
| 1121 | guarantee((current - low_mark) % monitor_size  ==  0         , "Misaligned bottom of BasicObjectLock*"); | 
|---|
| 1122 | guarantee( current >= low_mark                               , "Current BasicObjectLock* below than low_mark"); | 
|---|
| 1123 | } | 
|---|
| 1124 | #endif | 
|---|
| 1125 |  | 
|---|
| 1126 | #ifndef PRODUCT | 
|---|
| 1127 | void frame::describe(FrameValues& values, int frame_no) { | 
|---|
| 1128 | // boundaries: sp and the 'real' frame pointer | 
|---|
| 1129 | values.describe(-1, sp(), err_msg( "sp for #%d", frame_no), 1); | 
|---|
| 1130 | intptr_t* frame_pointer = real_fp(); // Note: may differ from fp() | 
|---|
| 1131 |  | 
|---|
| 1132 | // print frame info at the highest boundary | 
|---|
| 1133 | intptr_t* info_address = MAX2(sp(), frame_pointer); | 
|---|
| 1134 |  | 
|---|
| 1135 | if (info_address != frame_pointer) { | 
|---|
| 1136 | // print frame_pointer explicitly if not marked by the frame info | 
|---|
| 1137 | values.describe(-1, frame_pointer, err_msg( "frame pointer for #%d", frame_no), 1); | 
|---|
| 1138 | } | 
|---|
| 1139 |  | 
|---|
| 1140 | if (is_entry_frame() || is_compiled_frame() || is_interpreted_frame() || is_native_frame()) { | 
|---|
| 1141 | // Label values common to most frames | 
|---|
| 1142 | values.describe(-1, unextended_sp(), err_msg( "unextended_sp for #%d", frame_no)); | 
|---|
| 1143 | } | 
|---|
| 1144 |  | 
|---|
| 1145 | if (is_interpreted_frame()) { | 
|---|
| 1146 | Method* m = interpreter_frame_method(); | 
|---|
| 1147 | int bci = interpreter_frame_bci(); | 
|---|
| 1148 |  | 
|---|
| 1149 | // Label the method and current bci | 
|---|
| 1150 | values.describe(-1, info_address, | 
|---|
| 1151 | FormatBuffer<1024>( "#%d method %s @ %d", frame_no, m->name_and_sig_as_C_string(), bci), 2); | 
|---|
| 1152 | values.describe(-1, info_address, | 
|---|
| 1153 | err_msg( "- %d locals %d max stack", m->max_locals(), m->max_stack()), 1); | 
|---|
| 1154 | if (m->max_locals() > 0) { | 
|---|
| 1155 | intptr_t* l0 = interpreter_frame_local_at(0); | 
|---|
| 1156 | intptr_t* ln = interpreter_frame_local_at(m->max_locals() - 1); | 
|---|
| 1157 | values.describe(-1, MAX2(l0, ln), err_msg( "locals for #%d", frame_no), 1); | 
|---|
| 1158 | // Report each local and mark as owned by this frame | 
|---|
| 1159 | for (int l = 0; l < m->max_locals(); l++) { | 
|---|
| 1160 | intptr_t* l0 = interpreter_frame_local_at(l); | 
|---|
| 1161 | values.describe(frame_no, l0, err_msg( "local %d", l)); | 
|---|
| 1162 | } | 
|---|
| 1163 | } | 
|---|
| 1164 |  | 
|---|
| 1165 | // Compute the actual expression stack size | 
|---|
| 1166 | InterpreterOopMap mask; | 
|---|
| 1167 | OopMapCache::compute_one_oop_map(m, bci, &mask); | 
|---|
| 1168 | intptr_t* tos = NULL; | 
|---|
| 1169 | // Report each stack element and mark as owned by this frame | 
|---|
| 1170 | for (int e = 0; e < mask.expression_stack_size(); e++) { | 
|---|
| 1171 | tos = MAX2(tos, interpreter_frame_expression_stack_at(e)); | 
|---|
| 1172 | values.describe(frame_no, interpreter_frame_expression_stack_at(e), | 
|---|
| 1173 | err_msg( "stack %d", e)); | 
|---|
| 1174 | } | 
|---|
| 1175 | if (tos != NULL) { | 
|---|
| 1176 | values.describe(-1, tos, err_msg( "expression stack for #%d", frame_no), 1); | 
|---|
| 1177 | } | 
|---|
| 1178 | if (interpreter_frame_monitor_begin() != interpreter_frame_monitor_end()) { | 
|---|
| 1179 | values.describe(frame_no, (intptr_t*)interpreter_frame_monitor_begin(), "monitors begin"); | 
|---|
| 1180 | values.describe(frame_no, (intptr_t*)interpreter_frame_monitor_end(), "monitors end"); | 
|---|
| 1181 | } | 
|---|
| 1182 | } else if (is_entry_frame()) { | 
|---|
| 1183 | // For now just label the frame | 
|---|
| 1184 | values.describe(-1, info_address, err_msg( "#%d entry frame", frame_no), 2); | 
|---|
| 1185 | } else if (is_compiled_frame()) { | 
|---|
| 1186 | // For now just label the frame | 
|---|
| 1187 | CompiledMethod* cm = (CompiledMethod*)cb(); | 
|---|
| 1188 | values.describe(-1, info_address, | 
|---|
| 1189 | FormatBuffer<1024>( "#%d nmethod "INTPTR_FORMAT " for method %s%s%s", frame_no, | 
|---|
| 1190 | p2i(cm), | 
|---|
| 1191 | (cm->is_aot() ? "A ": "J "), | 
|---|
| 1192 | cm->method()->name_and_sig_as_C_string(), | 
|---|
| 1193 | (_deopt_state == is_deoptimized) ? | 
|---|
| 1194 | " (deoptimized)": | 
|---|
| 1195 | ((_deopt_state == unknown) ? " (state unknown)": "")), | 
|---|
| 1196 | 2); | 
|---|
| 1197 | } else if (is_native_frame()) { | 
|---|
| 1198 | // For now just label the frame | 
|---|
| 1199 | nmethod* nm = cb()->as_nmethod_or_null(); | 
|---|
| 1200 | values.describe(-1, info_address, | 
|---|
| 1201 | FormatBuffer<1024>( "#%d nmethod "INTPTR_FORMAT " for native method %s", frame_no, | 
|---|
| 1202 | p2i(nm), nm->method()->name_and_sig_as_C_string()), 2); | 
|---|
| 1203 | } else { | 
|---|
| 1204 | // provide default info if not handled before | 
|---|
| 1205 | char *info = (char *) "special frame"; | 
|---|
| 1206 | if ((_cb != NULL) && | 
|---|
| 1207 | (_cb->name() != NULL)) { | 
|---|
| 1208 | info = (char *)_cb->name(); | 
|---|
| 1209 | } | 
|---|
| 1210 | values.describe(-1, info_address, err_msg( "#%d <%s>", frame_no, info), 2); | 
|---|
| 1211 | } | 
|---|
| 1212 |  | 
|---|
| 1213 | // platform dependent additional data | 
|---|
| 1214 | describe_pd(values, frame_no); | 
|---|
| 1215 | } | 
|---|
| 1216 |  | 
|---|
| 1217 | #endif | 
|---|
| 1218 |  | 
|---|
| 1219 |  | 
|---|
| 1220 | //----------------------------------------------------------------------------------- | 
|---|
| 1221 | // StackFrameStream implementation | 
|---|
| 1222 |  | 
|---|
| 1223 | StackFrameStream::StackFrameStream(JavaThread *thread, bool update) : _reg_map(thread, update) { | 
|---|
| 1224 | assert(thread->has_last_Java_frame(), "sanity check"); | 
|---|
| 1225 | _fr = thread->last_frame(); | 
|---|
| 1226 | _is_done = false; | 
|---|
| 1227 | } | 
|---|
| 1228 |  | 
|---|
| 1229 |  | 
|---|
| 1230 | #ifndef PRODUCT | 
|---|
| 1231 |  | 
|---|
| 1232 | void FrameValues::describe(int owner, intptr_t* location, const char* description, int priority) { | 
|---|
| 1233 | FrameValue fv; | 
|---|
| 1234 | fv.location = location; | 
|---|
| 1235 | fv.owner = owner; | 
|---|
| 1236 | fv.priority = priority; | 
|---|
| 1237 | fv.description = NEW_RESOURCE_ARRAY(char, strlen(description) + 1); | 
|---|
| 1238 | strcpy(fv.description, description); | 
|---|
| 1239 | _values.append(fv); | 
|---|
| 1240 | } | 
|---|
| 1241 |  | 
|---|
| 1242 |  | 
|---|
| 1243 | #ifdef ASSERT | 
|---|
| 1244 | void FrameValues::validate() { | 
|---|
| 1245 | _values.sort(compare); | 
|---|
| 1246 | bool error = false; | 
|---|
| 1247 | FrameValue prev; | 
|---|
| 1248 | prev.owner = -1; | 
|---|
| 1249 | for (int i = _values.length() - 1; i >= 0; i--) { | 
|---|
| 1250 | FrameValue fv = _values.at(i); | 
|---|
| 1251 | if (fv.owner == -1) continue; | 
|---|
| 1252 | if (prev.owner == -1) { | 
|---|
| 1253 | prev = fv; | 
|---|
| 1254 | continue; | 
|---|
| 1255 | } | 
|---|
| 1256 | if (prev.location == fv.location) { | 
|---|
| 1257 | if (fv.owner != prev.owner) { | 
|---|
| 1258 | tty->print_cr( "overlapping storage"); | 
|---|
| 1259 | tty->print_cr( " "INTPTR_FORMAT ": "INTPTR_FORMAT " %s", p2i(prev.location), *prev.location, prev.description); | 
|---|
| 1260 | tty->print_cr( " "INTPTR_FORMAT ": "INTPTR_FORMAT " %s", p2i(fv.location), *fv.location, fv.description); | 
|---|
| 1261 | error = true; | 
|---|
| 1262 | } | 
|---|
| 1263 | } else { | 
|---|
| 1264 | prev = fv; | 
|---|
| 1265 | } | 
|---|
| 1266 | } | 
|---|
| 1267 | assert(!error, "invalid layout"); | 
|---|
| 1268 | } | 
|---|
| 1269 | #endif // ASSERT | 
|---|
| 1270 |  | 
|---|
| 1271 | void FrameValues::print(JavaThread* thread) { | 
|---|
| 1272 | _values.sort(compare); | 
|---|
| 1273 |  | 
|---|
| 1274 | // Sometimes values like the fp can be invalid values if the | 
|---|
| 1275 | // register map wasn't updated during the walk.  Trim out values | 
|---|
| 1276 | // that aren't actually in the stack of the thread. | 
|---|
| 1277 | int min_index = 0; | 
|---|
| 1278 | int max_index = _values.length() - 1; | 
|---|
| 1279 | intptr_t* v0 = _values.at(min_index).location; | 
|---|
| 1280 | intptr_t* v1 = _values.at(max_index).location; | 
|---|
| 1281 |  | 
|---|
| 1282 | if (thread == Thread::current()) { | 
|---|
| 1283 | while (!thread->is_in_stack((address)v0)) { | 
|---|
| 1284 | v0 = _values.at(++min_index).location; | 
|---|
| 1285 | } | 
|---|
| 1286 | while (!thread->is_in_stack((address)v1)) { | 
|---|
| 1287 | v1 = _values.at(--max_index).location; | 
|---|
| 1288 | } | 
|---|
| 1289 | } else { | 
|---|
| 1290 | while (!thread->on_local_stack((address)v0)) { | 
|---|
| 1291 | v0 = _values.at(++min_index).location; | 
|---|
| 1292 | } | 
|---|
| 1293 | while (!thread->on_local_stack((address)v1)) { | 
|---|
| 1294 | v1 = _values.at(--max_index).location; | 
|---|
| 1295 | } | 
|---|
| 1296 | } | 
|---|
| 1297 | intptr_t* min = MIN2(v0, v1); | 
|---|
| 1298 | intptr_t* max = MAX2(v0, v1); | 
|---|
| 1299 | intptr_t* cur = max; | 
|---|
| 1300 | intptr_t* last = NULL; | 
|---|
| 1301 | for (int i = max_index; i >= min_index; i--) { | 
|---|
| 1302 | FrameValue fv = _values.at(i); | 
|---|
| 1303 | while (cur > fv.location) { | 
|---|
| 1304 | tty->print_cr( " "INTPTR_FORMAT ": "INTPTR_FORMAT, p2i(cur), *cur); | 
|---|
| 1305 | cur--; | 
|---|
| 1306 | } | 
|---|
| 1307 | if (last == fv.location) { | 
|---|
| 1308 | const char* spacer = "          "LP64_ONLY( "        "); | 
|---|
| 1309 | tty->print_cr( " %s  %s %s", spacer, spacer, fv.description); | 
|---|
| 1310 | } else { | 
|---|
| 1311 | tty->print_cr( " "INTPTR_FORMAT ": "INTPTR_FORMAT " %s", p2i(fv.location), *fv.location, fv.description); | 
|---|
| 1312 | last = fv.location; | 
|---|
| 1313 | cur--; | 
|---|
| 1314 | } | 
|---|
| 1315 | } | 
|---|
| 1316 | } | 
|---|
| 1317 |  | 
|---|
| 1318 | #endif // ndef PRODUCT | 
|---|
| 1319 |  | 
|---|