src/share/vm/runtime/frame.cpp

changeset 3445
82e5a84b7436
parent 3433
eaa9557116a2
child 3451
5dbed2f542ff
     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  

mercurial