1332 guarantee( current >= low_mark , "Current BasicObjectLock* below than low_mark"); |
1332 guarantee( current >= low_mark , "Current BasicObjectLock* below than low_mark"); |
1333 } |
1333 } |
1334 |
1334 |
1335 |
1335 |
1336 void frame::describe(FrameValues& values, int frame_no) { |
1336 void frame::describe(FrameValues& values, int frame_no) { |
1337 intptr_t* frame_pointer = real_fp(); |
1337 // boundaries: sp and the 'real' frame pointer |
|
1338 values.describe(-1, sp(), err_msg("sp for #%d", frame_no), 1); |
|
1339 intptr_t* frame_pointer = real_fp(); // Note: may differ from fp() |
|
1340 |
|
1341 // print frame info at the highest boundary |
|
1342 intptr_t* info_address = MAX2(sp(), frame_pointer); |
|
1343 |
|
1344 if (info_address != frame_pointer) { |
|
1345 // print frame_pointer explicitly if not marked by the frame info |
|
1346 values.describe(-1, frame_pointer, err_msg("frame pointer for #%d", frame_no), 1); |
|
1347 } |
|
1348 |
1338 if (is_entry_frame() || is_compiled_frame() || is_interpreted_frame() || is_native_frame()) { |
1349 if (is_entry_frame() || is_compiled_frame() || is_interpreted_frame() || is_native_frame()) { |
1339 // Label values common to most frames |
1350 // Label values common to most frames |
1340 values.describe(-1, unextended_sp(), err_msg("unextended_sp for #%d", frame_no)); |
1351 values.describe(-1, unextended_sp(), err_msg("unextended_sp for #%d", frame_no)); |
1341 values.describe(-1, sp(), err_msg("sp for #%d", frame_no)); |
1352 } |
1342 values.describe(-1, frame_pointer, err_msg("frame pointer for #%d", frame_no)); |
1353 |
1343 } |
|
1344 if (is_interpreted_frame()) { |
1354 if (is_interpreted_frame()) { |
1345 methodOop m = interpreter_frame_method(); |
1355 methodOop m = interpreter_frame_method(); |
1346 int bci = interpreter_frame_bci(); |
1356 int bci = interpreter_frame_bci(); |
1347 |
1357 |
1348 // Label the method and current bci |
1358 // Label the method and current bci |
1349 values.describe(-1, MAX2(sp(), frame_pointer), |
1359 values.describe(-1, info_address, |
1350 FormatBuffer<1024>("#%d method %s @ %d", frame_no, m->name_and_sig_as_C_string(), bci), 2); |
1360 FormatBuffer<1024>("#%d method %s @ %d", frame_no, m->name_and_sig_as_C_string(), bci), 2); |
1351 values.describe(-1, MAX2(sp(), frame_pointer), |
1361 values.describe(-1, info_address, |
1352 err_msg("- %d locals %d max stack", m->max_locals(), m->max_stack()), 1); |
1362 err_msg("- %d locals %d max stack", m->max_locals(), m->max_stack()), 1); |
1353 if (m->max_locals() > 0) { |
1363 if (m->max_locals() > 0) { |
1354 intptr_t* l0 = interpreter_frame_local_at(0); |
1364 intptr_t* l0 = interpreter_frame_local_at(0); |
1355 intptr_t* ln = interpreter_frame_local_at(m->max_locals() - 1); |
1365 intptr_t* ln = interpreter_frame_local_at(m->max_locals() - 1); |
1356 values.describe(-1, MAX2(l0, ln), err_msg("locals for #%d", frame_no), 1); |
1366 values.describe(-1, MAX2(l0, ln), err_msg("locals for #%d", frame_no), 1); |
1378 values.describe(frame_no, (intptr_t*)interpreter_frame_monitor_begin(), "monitors begin"); |
1388 values.describe(frame_no, (intptr_t*)interpreter_frame_monitor_begin(), "monitors begin"); |
1379 values.describe(frame_no, (intptr_t*)interpreter_frame_monitor_end(), "monitors end"); |
1389 values.describe(frame_no, (intptr_t*)interpreter_frame_monitor_end(), "monitors end"); |
1380 } |
1390 } |
1381 } else if (is_entry_frame()) { |
1391 } else if (is_entry_frame()) { |
1382 // For now just label the frame |
1392 // For now just label the frame |
1383 values.describe(-1, MAX2(sp(), frame_pointer), err_msg("#%d entry frame", frame_no), 2); |
1393 values.describe(-1, info_address, err_msg("#%d entry frame", frame_no), 2); |
1384 } else if (is_compiled_frame()) { |
1394 } else if (is_compiled_frame()) { |
1385 // For now just label the frame |
1395 // For now just label the frame |
1386 nmethod* nm = cb()->as_nmethod_or_null(); |
1396 nmethod* nm = cb()->as_nmethod_or_null(); |
1387 values.describe(-1, MAX2(sp(), frame_pointer), |
1397 values.describe(-1, info_address, |
1388 FormatBuffer<1024>("#%d nmethod " INTPTR_FORMAT " for method %s%s", frame_no, |
1398 FormatBuffer<1024>("#%d nmethod " INTPTR_FORMAT " for method %s%s", frame_no, |
1389 nm, nm->method()->name_and_sig_as_C_string(), |
1399 nm, nm->method()->name_and_sig_as_C_string(), |
1390 is_deoptimized_frame() ? " (deoptimized" : ""), 2); |
1400 (_deopt_state == is_deoptimized) ? |
|
1401 " (deoptimized)" : |
|
1402 ((_deopt_state == unknown) ? " (state unknown)" : "")), |
|
1403 2); |
1391 } else if (is_native_frame()) { |
1404 } else if (is_native_frame()) { |
1392 // For now just label the frame |
1405 // For now just label the frame |
1393 nmethod* nm = cb()->as_nmethod_or_null(); |
1406 nmethod* nm = cb()->as_nmethod_or_null(); |
1394 values.describe(-1, MAX2(sp(), frame_pointer), |
1407 values.describe(-1, info_address, |
1395 FormatBuffer<1024>("#%d nmethod " INTPTR_FORMAT " for native method %s", frame_no, |
1408 FormatBuffer<1024>("#%d nmethod " INTPTR_FORMAT " for native method %s", frame_no, |
1396 nm, nm->method()->name_and_sig_as_C_string()), 2); |
1409 nm, nm->method()->name_and_sig_as_C_string()), 2); |
1397 } |
1410 } else if (is_ricochet_frame()) { |
|
1411 values.describe(-1, info_address, err_msg("#%d ricochet frame", frame_no), 2); |
|
1412 } else { |
|
1413 // provide default info if not handled before |
|
1414 char *info = (char *) "special frame"; |
|
1415 if ((_cb != NULL) && |
|
1416 (_cb->name() != NULL)) { |
|
1417 info = (char *)_cb->name(); |
|
1418 } |
|
1419 values.describe(-1, info_address, err_msg("#%d <%s>", frame_no, info), 2); |
|
1420 } |
|
1421 |
|
1422 // platform dependent additional data |
1398 describe_pd(values, frame_no); |
1423 describe_pd(values, frame_no); |
1399 } |
1424 } |
1400 |
1425 |
1401 #endif |
1426 #endif |
1402 |
1427 |