437 |
437 |
438 //------------------------------------------------------------------------------ |
438 //------------------------------------------------------------------------------ |
439 // frame::sender_for_compiled_frame |
439 // frame::sender_for_compiled_frame |
440 frame frame::sender_for_compiled_frame(RegisterMap* map) const { |
440 frame frame::sender_for_compiled_frame(RegisterMap* map) const { |
441 assert(map != NULL, "map must be set"); |
441 assert(map != NULL, "map must be set"); |
442 assert(!is_ricochet_frame(), "caller must handle this"); |
|
443 |
442 |
444 // frame owned by optimizing compiler |
443 // frame owned by optimizing compiler |
445 assert(_cb->frame_size() >= 0, "must have non-zero frame size"); |
444 assert(_cb->frame_size() >= 0, "must have non-zero frame size"); |
446 intptr_t* sender_sp = unextended_sp() + _cb->frame_size(); |
445 intptr_t* sender_sp = unextended_sp() + _cb->frame_size(); |
447 intptr_t* unextended_sp = sender_sp; |
446 intptr_t* unextended_sp = sender_sp; |
481 map->set_include_argument_oops(false); |
480 map->set_include_argument_oops(false); |
482 |
481 |
483 if (is_entry_frame()) return sender_for_entry_frame(map); |
482 if (is_entry_frame()) return sender_for_entry_frame(map); |
484 if (is_interpreted_frame()) return sender_for_interpreter_frame(map); |
483 if (is_interpreted_frame()) return sender_for_interpreter_frame(map); |
485 assert(_cb == CodeCache::find_blob(pc()),"Must be the same"); |
484 assert(_cb == CodeCache::find_blob(pc()),"Must be the same"); |
486 if (is_ricochet_frame()) return sender_for_ricochet_frame(map); |
|
487 |
485 |
488 if (_cb != NULL) { |
486 if (_cb != NULL) { |
489 return sender_for_compiled_frame(map); |
487 return sender_for_compiled_frame(map); |
490 } |
488 } |
491 // Must be native-compiled frame, i.e. the marshaling code for native |
489 // Must be native-compiled frame, i.e. the marshaling code for native |
656 |
654 |
657 #define DESCRIBE_FP_OFFSET(name) \ |
655 #define DESCRIBE_FP_OFFSET(name) \ |
658 values.describe(frame_no, fp() + frame::name##_offset, #name) |
656 values.describe(frame_no, fp() + frame::name##_offset, #name) |
659 |
657 |
660 void frame::describe_pd(FrameValues& values, int frame_no) { |
658 void frame::describe_pd(FrameValues& values, int frame_no) { |
661 if (is_ricochet_frame()) { |
659 if (is_interpreted_frame()) { |
662 MethodHandles::RicochetFrame::describe(this, values, frame_no); |
|
663 } else if (is_interpreted_frame()) { |
|
664 DESCRIBE_FP_OFFSET(interpreter_frame_sender_sp); |
660 DESCRIBE_FP_OFFSET(interpreter_frame_sender_sp); |
665 DESCRIBE_FP_OFFSET(interpreter_frame_last_sp); |
661 DESCRIBE_FP_OFFSET(interpreter_frame_last_sp); |
666 DESCRIBE_FP_OFFSET(interpreter_frame_method); |
662 DESCRIBE_FP_OFFSET(interpreter_frame_method); |
667 DESCRIBE_FP_OFFSET(interpreter_frame_mdx); |
663 DESCRIBE_FP_OFFSET(interpreter_frame_mdx); |
668 DESCRIBE_FP_OFFSET(interpreter_frame_cache); |
664 DESCRIBE_FP_OFFSET(interpreter_frame_cache); |
680 |
676 |
681 intptr_t* frame::real_fp() const { |
677 intptr_t* frame::real_fp() const { |
682 if (_cb != NULL) { |
678 if (_cb != NULL) { |
683 // use the frame size if valid |
679 // use the frame size if valid |
684 int size = _cb->frame_size(); |
680 int size = _cb->frame_size(); |
685 if ((size > 0) && |
681 if (size > 0) { |
686 (! is_ricochet_frame())) { |
|
687 // Work-around: ricochet explicitly excluded because frame size is not |
|
688 // constant for the ricochet blob but its frame_size could not, for |
|
689 // some reasons, be declared as <= 0. This potentially confusing |
|
690 // size declaration should be fixed as another CR. |
|
691 return unextended_sp() + size; |
682 return unextended_sp() + size; |
692 } |
683 } |
693 } |
684 } |
694 // else rely on fp() |
685 // else rely on fp() |
695 assert(! is_compiled_frame(), "unknown compiled frame size"); |
686 assert(! is_compiled_frame(), "unknown compiled frame size"); |