512 public:
513 intptr_t* _sp;
514 CodeBlob* _cb;
515 bool _callee_interpreted;
516 int _size;
517 int _argsize;
518 int _num_oops;
519 int _num_frames;
520 int _num_interpreted_frames;
521 int _num_i2c;
522
523 VerifyStackChunkFrameClosure(stackChunkOop chunk)
524 : _chunk(chunk), _sp(nullptr), _cb(nullptr), _callee_interpreted(false),
525 _size(0), _argsize(0), _num_oops(0), _num_frames(0), _num_interpreted_frames(0), _num_i2c(0) {}
526
527 template <ChunkFrames frame_kind, typename RegisterMapT>
528 bool do_frame(const StackChunkFrameStream<frame_kind>& f, const RegisterMapT* map) {
529 _sp = f.sp();
530 _cb = f.cb();
531
532 int fsize = f.frame_size() - ((f.is_interpreted() == _callee_interpreted) ? _argsize : 0);
533 int num_oops = f.num_oops(map);
534 assert(num_oops >= 0, "");
535
536 _argsize = f.stack_argsize() + frame::metadata_words_at_top;
537 _size += fsize;
538 _num_oops += num_oops;
539 if (f.is_interpreted()) {
540 _num_interpreted_frames++;
541 }
542
543 log_develop_trace(continuations)("debug_verify_stack_chunk frame: %d sp: " INTPTR_FORMAT " pc: " PTR_FORMAT " interpreted: %d size: %d argsize: %d oops: %d", _num_frames, f.sp() - _chunk->start_address(), p2i(f.pc()), f.is_interpreted(), fsize, _argsize, num_oops);
544 LogTarget(Trace, continuations) lt;
545 if (lt.develop_is_enabled()) {
546 LogStream ls(lt);
547 f.print_on(&ls);
548 }
549 assert(f.pc() != nullptr,
550 "young: %d num_frames: %d sp: " PTR_FORMAT " start: " PTR_FORMAT " end: " PTR_FORMAT,
551 !_chunk->requires_barriers(), _num_frames, p2i(f.sp()), p2i(_chunk->start_address()), p2i(_chunk->bottom_address()));
552
553 if (_num_frames == 0) {
554 assert(f.pc() == _chunk->pc(), "");
555 }
556
|
512 public:
513 intptr_t* _sp;
514 CodeBlob* _cb;
515 bool _callee_interpreted;
516 int _size;
517 int _argsize;
518 int _num_oops;
519 int _num_frames;
520 int _num_interpreted_frames;
521 int _num_i2c;
522
523 VerifyStackChunkFrameClosure(stackChunkOop chunk)
524 : _chunk(chunk), _sp(nullptr), _cb(nullptr), _callee_interpreted(false),
525 _size(0), _argsize(0), _num_oops(0), _num_frames(0), _num_interpreted_frames(0), _num_i2c(0) {}
526
527 template <ChunkFrames frame_kind, typename RegisterMapT>
528 bool do_frame(const StackChunkFrameStream<frame_kind>& f, const RegisterMapT* map) {
529 _sp = f.sp();
530 _cb = f.cb();
531
532 int fsize = f.frame_size();
533 int argsize = f.stack_argsize() + frame::metadata_words_at_top;
534 bool augmented = false;
535 if (f.is_compiled() && f.cb()->as_nmethod()->needs_stack_repair()) {
536 int real_frame_size = 0;
537 augmented = f.to_frame().was_augmented_on_entry(real_frame_size);
538 if (augmented) {
539 fsize = real_frame_size - (_callee_interpreted ? 0 : _argsize);
540 // The arguments reside inside the augmented frame.
541 argsize = 0;
542 }
543 }
544 if (!augmented) {
545 fsize -= (f.is_interpreted() == _callee_interpreted) ? _argsize : 0;
546 }
547 int num_oops = f.num_oops(map);
548 assert(num_oops >= 0, "");
549
550 _argsize = argsize;
551 _size += fsize;
552 _num_oops += num_oops;
553 if (f.is_interpreted()) {
554 _num_interpreted_frames++;
555 }
556
557 log_develop_trace(continuations)("debug_verify_stack_chunk frame: %d sp: " INTPTR_FORMAT " pc: " PTR_FORMAT " interpreted: %d size: %d argsize: %d oops: %d", _num_frames, f.sp() - _chunk->start_address(), p2i(f.pc()), f.is_interpreted(), fsize, _argsize, num_oops);
558 LogTarget(Trace, continuations) lt;
559 if (lt.develop_is_enabled()) {
560 LogStream ls(lt);
561 f.print_on(&ls);
562 }
563 assert(f.pc() != nullptr,
564 "young: %d num_frames: %d sp: " PTR_FORMAT " start: " PTR_FORMAT " end: " PTR_FORMAT,
565 !_chunk->requires_barriers(), _num_frames, p2i(f.sp()), p2i(_chunk->start_address()), p2i(_chunk->bottom_address()));
566
567 if (_num_frames == 0) {
568 assert(f.pc() == _chunk->pc(), "");
569 }
570
|