441 // oopMaps seems to have the "H" regs at the same address and the 442 // vanilla register. 443 // XXXX make this go away 444 if (true) { 445 map->set_location(rbp->as_VMReg()->next(), (address) link_addr); 446 } 447 #endif // AMD64 448 } 449 450 451 //------------------------------------------------------------------------------ 452 // frame::sender_for_interpreter_frame 453 frame frame::sender_for_interpreter_frame(RegisterMap* map) const { 454 // SP is the raw SP from the sender after adapter or interpreter 455 // extension. 456 intptr_t* sender_sp = this->sender_sp(); 457 458 // This is the sp before any possible extension (adapter/locals). 459 intptr_t* unextended_sp = interpreter_frame_sender_sp(); 460 461 #ifdef COMPILER2 462 if (map->update_map()) { 463 update_map_with_saved_link(map, (intptr_t**) addr_at(link_offset)); 464 } 465 #endif // COMPILER2 466 467 return frame(sender_sp, unextended_sp, link(), sender_pc()); 468 } 469 470 471 //------------------------------------------------------------------------------ 472 // frame::sender_for_compiled_frame 473 frame frame::sender_for_compiled_frame(RegisterMap* map) const { 474 assert(map != NULL, "map must be set"); 475 476 // frame owned by optimizing compiler 477 assert(_cb->frame_size() >= 0, "must have non-zero frame size"); 478 intptr_t* sender_sp = unextended_sp() + _cb->frame_size(); 479 intptr_t* unextended_sp = sender_sp; 480 481 // On Intel the return_address is always the word on the stack 482 address sender_pc = (address) *(sender_sp-1); 483 484 // This is the saved value of EBP which may or may not really be an FP. 485 // It is only an FP if the sender is an interpreter frame (or C1?). 666 int index = (Interpreter::expr_offset_in_bytes(offset)/wordSize); 667 return &interpreter_frame_tos_address()[index]; 668 } 669 670 #ifndef PRODUCT 671 672 #define DESCRIBE_FP_OFFSET(name) \ 673 values.describe(frame_no, fp() + frame::name##_offset, #name) 674 675 void frame::describe_pd(FrameValues& values, int frame_no) { 676 if (is_interpreted_frame()) { 677 #ifndef CC_INTERP 678 DESCRIBE_FP_OFFSET(interpreter_frame_sender_sp); 679 DESCRIBE_FP_OFFSET(interpreter_frame_last_sp); 680 DESCRIBE_FP_OFFSET(interpreter_frame_method); 681 DESCRIBE_FP_OFFSET(interpreter_frame_mdp); 682 DESCRIBE_FP_OFFSET(interpreter_frame_cache); 683 DESCRIBE_FP_OFFSET(interpreter_frame_locals); 684 DESCRIBE_FP_OFFSET(interpreter_frame_bcp); 685 DESCRIBE_FP_OFFSET(interpreter_frame_initial_sp); 686 #endif 687 } 688 } 689 #endif 690 691 intptr_t *frame::initial_deoptimization_info() { 692 // used to reset the saved FP 693 return fp(); 694 } 695 696 intptr_t* frame::real_fp() const { 697 if (_cb != NULL) { 698 // use the frame size if valid 699 int size = _cb->frame_size(); 700 if (size > 0) { 701 return unextended_sp() + size; 702 } 703 } 704 // else rely on fp() 705 assert(! is_compiled_frame(), "unknown compiled frame size"); 706 return fp(); 707 } 708 709 #ifndef PRODUCT | 441 // oopMaps seems to have the "H" regs at the same address and the 442 // vanilla register. 443 // XXXX make this go away 444 if (true) { 445 map->set_location(rbp->as_VMReg()->next(), (address) link_addr); 446 } 447 #endif // AMD64 448 } 449 450 451 //------------------------------------------------------------------------------ 452 // frame::sender_for_interpreter_frame 453 frame frame::sender_for_interpreter_frame(RegisterMap* map) const { 454 // SP is the raw SP from the sender after adapter or interpreter 455 // extension. 456 intptr_t* sender_sp = this->sender_sp(); 457 458 // This is the sp before any possible extension (adapter/locals). 459 intptr_t* unextended_sp = interpreter_frame_sender_sp(); 460 461 #if defined(COMPILER2) || INCLUDE_JVMCI 462 if (map->update_map()) { 463 update_map_with_saved_link(map, (intptr_t**) addr_at(link_offset)); 464 } 465 #endif // COMPILER2 || INCLUDE_JVMCI 466 467 return frame(sender_sp, unextended_sp, link(), sender_pc()); 468 } 469 470 471 //------------------------------------------------------------------------------ 472 // frame::sender_for_compiled_frame 473 frame frame::sender_for_compiled_frame(RegisterMap* map) const { 474 assert(map != NULL, "map must be set"); 475 476 // frame owned by optimizing compiler 477 assert(_cb->frame_size() >= 0, "must have non-zero frame size"); 478 intptr_t* sender_sp = unextended_sp() + _cb->frame_size(); 479 intptr_t* unextended_sp = sender_sp; 480 481 // On Intel the return_address is always the word on the stack 482 address sender_pc = (address) *(sender_sp-1); 483 484 // This is the saved value of EBP which may or may not really be an FP. 485 // It is only an FP if the sender is an interpreter frame (or C1?). 666 int index = (Interpreter::expr_offset_in_bytes(offset)/wordSize); 667 return &interpreter_frame_tos_address()[index]; 668 } 669 670 #ifndef PRODUCT 671 672 #define DESCRIBE_FP_OFFSET(name) \ 673 values.describe(frame_no, fp() + frame::name##_offset, #name) 674 675 void frame::describe_pd(FrameValues& values, int frame_no) { 676 if (is_interpreted_frame()) { 677 #ifndef CC_INTERP 678 DESCRIBE_FP_OFFSET(interpreter_frame_sender_sp); 679 DESCRIBE_FP_OFFSET(interpreter_frame_last_sp); 680 DESCRIBE_FP_OFFSET(interpreter_frame_method); 681 DESCRIBE_FP_OFFSET(interpreter_frame_mdp); 682 DESCRIBE_FP_OFFSET(interpreter_frame_cache); 683 DESCRIBE_FP_OFFSET(interpreter_frame_locals); 684 DESCRIBE_FP_OFFSET(interpreter_frame_bcp); 685 DESCRIBE_FP_OFFSET(interpreter_frame_initial_sp); 686 #ifdef AMD64 687 } else if (is_entry_frame()) { 688 // This could be more descriptive if we use the enum in 689 // stubGenerator to map to real names but it's most important to 690 // claim these frame slots so the error checking works. 691 for (int i = 0; i < entry_frame_after_call_words; i++) { 692 values.describe(frame_no, fp() - i, err_msg("call_stub word fp - %d", i)); 693 } 694 #endif // AMD64 695 } 696 #endif 697 } 698 #endif // !PRODUCT 699 700 intptr_t *frame::initial_deoptimization_info() { 701 // used to reset the saved FP 702 return fp(); 703 } 704 705 intptr_t* frame::real_fp() const { 706 if (_cb != NULL) { 707 // use the frame size if valid 708 int size = _cb->frame_size(); 709 if (size > 0) { 710 return unextended_sp() + size; 711 } 712 } 713 // else rely on fp() 714 assert(! is_compiled_frame(), "unknown compiled frame size"); 715 return fp(); 716 } 717 718 #ifndef PRODUCT |