src/cpu/x86/vm/frame_x86.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File hotspot Sdiff src/cpu/x86/vm

src/cpu/x86/vm/frame_x86.cpp

Print this page




 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
src/cpu/x86/vm/frame_x86.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File