1.1 --- a/src/share/vm/runtime/frame.cpp Sun Jan 22 14:03:20 2012 -0800 1.2 +++ b/src/share/vm/runtime/frame.cpp Tue Jan 24 15:41:17 2012 +0100 1.3 @@ -1334,21 +1334,31 @@ 1.4 1.5 1.6 void frame::describe(FrameValues& values, int frame_no) { 1.7 - intptr_t* frame_pointer = real_fp(); 1.8 + // boundaries: sp and the 'real' frame pointer 1.9 + values.describe(-1, sp(), err_msg("sp for #%d", frame_no), 1); 1.10 + intptr_t* frame_pointer = real_fp(); // Note: may differ from fp() 1.11 + 1.12 + // print frame info at the highest boundary 1.13 + intptr_t* info_address = MAX2(sp(), frame_pointer); 1.14 + 1.15 + if (info_address != frame_pointer) { 1.16 + // print frame_pointer explicitly if not marked by the frame info 1.17 + values.describe(-1, frame_pointer, err_msg("frame pointer for #%d", frame_no), 1); 1.18 + } 1.19 + 1.20 if (is_entry_frame() || is_compiled_frame() || is_interpreted_frame() || is_native_frame()) { 1.21 // Label values common to most frames 1.22 values.describe(-1, unextended_sp(), err_msg("unextended_sp for #%d", frame_no)); 1.23 - values.describe(-1, sp(), err_msg("sp for #%d", frame_no)); 1.24 - values.describe(-1, frame_pointer, err_msg("frame pointer for #%d", frame_no)); 1.25 } 1.26 + 1.27 if (is_interpreted_frame()) { 1.28 methodOop m = interpreter_frame_method(); 1.29 int bci = interpreter_frame_bci(); 1.30 1.31 // Label the method and current bci 1.32 - values.describe(-1, MAX2(sp(), frame_pointer), 1.33 + values.describe(-1, info_address, 1.34 FormatBuffer<1024>("#%d method %s @ %d", frame_no, m->name_and_sig_as_C_string(), bci), 2); 1.35 - values.describe(-1, MAX2(sp(), frame_pointer), 1.36 + values.describe(-1, info_address, 1.37 err_msg("- %d locals %d max stack", m->max_locals(), m->max_stack()), 1); 1.38 if (m->max_locals() > 0) { 1.39 intptr_t* l0 = interpreter_frame_local_at(0); 1.40 @@ -1380,21 +1390,36 @@ 1.41 } 1.42 } else if (is_entry_frame()) { 1.43 // For now just label the frame 1.44 - values.describe(-1, MAX2(sp(), frame_pointer), err_msg("#%d entry frame", frame_no), 2); 1.45 + values.describe(-1, info_address, err_msg("#%d entry frame", frame_no), 2); 1.46 } else if (is_compiled_frame()) { 1.47 // For now just label the frame 1.48 nmethod* nm = cb()->as_nmethod_or_null(); 1.49 - values.describe(-1, MAX2(sp(), frame_pointer), 1.50 + values.describe(-1, info_address, 1.51 FormatBuffer<1024>("#%d nmethod " INTPTR_FORMAT " for method %s%s", frame_no, 1.52 nm, nm->method()->name_and_sig_as_C_string(), 1.53 - is_deoptimized_frame() ? " (deoptimized" : ""), 2); 1.54 + (_deopt_state == is_deoptimized) ? 1.55 + " (deoptimized)" : 1.56 + ((_deopt_state == unknown) ? " (state unknown)" : "")), 1.57 + 2); 1.58 } else if (is_native_frame()) { 1.59 // For now just label the frame 1.60 nmethod* nm = cb()->as_nmethod_or_null(); 1.61 - values.describe(-1, MAX2(sp(), frame_pointer), 1.62 + values.describe(-1, info_address, 1.63 FormatBuffer<1024>("#%d nmethod " INTPTR_FORMAT " for native method %s", frame_no, 1.64 nm, nm->method()->name_and_sig_as_C_string()), 2); 1.65 + } else if (is_ricochet_frame()) { 1.66 + values.describe(-1, info_address, err_msg("#%d ricochet frame", frame_no), 2); 1.67 + } else { 1.68 + // provide default info if not handled before 1.69 + char *info = (char *) "special frame"; 1.70 + if ((_cb != NULL) && 1.71 + (_cb->name() != NULL)) { 1.72 + info = (char *)_cb->name(); 1.73 + } 1.74 + values.describe(-1, info_address, err_msg("#%d <%s>", frame_no, info), 2); 1.75 } 1.76 + 1.77 + // platform dependent additional data 1.78 describe_pd(values, frame_no); 1.79 } 1.80