< prev index next >

src/hotspot/cpu/x86/frame_x86.cpp

Print this page




 127       // which can be different from the sender unextended sp (the sp seen
 128       // by the sender) because of current frame local variables
 129       sender_sp = (intptr_t*) addr_at(sender_sp_offset);
 130       sender_unextended_sp = (intptr_t*) this->fp()[interpreter_frame_sender_sp_offset];
 131       saved_fp = (intptr_t*) this->fp()[link_offset];
 132 
 133     } else {
 134       // must be some sort of compiled/runtime frame
 135       // fp does not have to be safe (although it could be check for c1?)
 136 
 137       // check for a valid frame_size, otherwise we are unlikely to get a valid sender_pc
 138       if (_cb->frame_size() <= 0) {
 139         return false;
 140       }
 141 
 142       sender_sp = _unextended_sp + _cb->frame_size();
 143       // Is sender_sp safe?
 144       if ((address)sender_sp >= thread->stack_base()) {
 145         return false;
 146       }
 147       sender_unextended_sp = sender_sp;
 148       // On Intel the return_address is always the word on the stack
 149       sender_pc = (address) *(sender_sp-1);
 150       // Note: frame::sender_sp_offset is only valid for compiled frame
 151       saved_fp = (intptr_t*) *(sender_sp - frame::sender_sp_offset);
 152     }
 153 




 154 
 155     // If the potential sender is the interpreter then we can do some more checking
 156     if (Interpreter::contains(sender_pc)) {
 157 
 158       // ebp is always saved in a recognizable place in any code we generate. However
 159       // only if the sender is interpreted/call_stub (c1 too?) are we certain that the saved ebp
 160       // is really a frame pointer.
 161 
 162       bool saved_fp_safe = ((address)saved_fp < thread->stack_base()) && (saved_fp > sender_sp);
 163 
 164       if (!saved_fp_safe) {
 165         return false;
 166       }
 167 
 168       // construct the potential sender
 169 
 170       frame sender(sender_sp, sender_unextended_sp, saved_fp, sender_pc);
 171 
 172       return sender.is_interpreted_frame_valid(thread);
 173 


 437   intptr_t* unextended_sp = interpreter_frame_sender_sp();
 438 
 439 #if COMPILER2_OR_JVMCI
 440   if (map->update_map()) {
 441     update_map_with_saved_link(map, (intptr_t**) addr_at(link_offset));
 442   }
 443 #endif // COMPILER2_OR_JVMCI
 444 
 445   return frame(sender_sp, unextended_sp, link(), sender_pc());
 446 }
 447 
 448 
 449 //------------------------------------------------------------------------------
 450 // frame::sender_for_compiled_frame
 451 frame frame::sender_for_compiled_frame(RegisterMap* map) const {
 452   assert(map != NULL, "map must be set");
 453 
 454   // frame owned by optimizing compiler
 455   assert(_cb->frame_size() >= 0, "must have non-zero frame size");
 456   intptr_t* sender_sp = unextended_sp() + _cb->frame_size();
 457   intptr_t* unextended_sp = sender_sp;
 458 
 459   // On Intel the return_address is always the word on the stack
 460   address sender_pc = (address) *(sender_sp-1);
 461 
 462   // This is the saved value of EBP which may or may not really be an FP.
 463   // It is only an FP if the sender is an interpreter frame (or C1?).
 464   intptr_t** saved_fp_addr = (intptr_t**) (sender_sp - frame::sender_sp_offset);
 465 



 466   if (map->update_map()) {
 467     // Tell GC to use argument oopmaps for some runtime stubs that need it.
 468     // For C1, the runtime stub might not have oop maps, so set this flag
 469     // outside of update_register_map.
 470     map->set_include_argument_oops(_cb->caller_must_gc_arguments(map->thread()));
 471     if (_cb->oop_maps() != NULL) {
 472       OopMapSet::update_register_map(this, map);
 473     }
 474 
 475     // Since the prolog does the save and restore of EBP there is no oopmap
 476     // for it so we must fill in its location as if there was an oopmap entry
 477     // since if our caller was compiled code there could be live jvm state in it.
 478     update_map_with_saved_link(map, saved_fp_addr);
 479   }
 480 
 481   assert(sender_sp != sp(), "must have changed");
 482   return frame(sender_sp, unextended_sp, *saved_fp_addr, sender_pc);
 483 }
 484 
 485 
 486 //------------------------------------------------------------------------------
 487 // frame::sender
 488 frame frame::sender(RegisterMap* map) const {
 489   // Default is we done have to follow them. The sender_for_xxx will
 490   // update it accordingly
 491   map->set_include_argument_oops(false);
 492 
 493   if (is_entry_frame())       return sender_for_entry_frame(map);
 494   if (is_interpreted_frame()) return sender_for_interpreter_frame(map);
 495   assert(_cb == CodeCache::find_blob(pc()),"Must be the same");
 496 
 497   if (_cb != NULL) {
 498     return sender_for_compiled_frame(map);
 499   }
 500   // Must be native-compiled frame, i.e. the marshaling code for native
 501   // methods that exists in the core system.
 502   return frame(sender_sp(), link(), sender_pc());


 668   if (_cb != NULL) {
 669     // use the frame size if valid
 670     int size = _cb->frame_size();
 671     if (size > 0) {
 672       return unextended_sp() + size;
 673     }
 674   }
 675   // else rely on fp()
 676   assert(! is_compiled_frame(), "unknown compiled frame size");
 677   return fp();
 678 }
 679 
 680 #ifndef PRODUCT
 681 // This is a generic constructor which is only used by pns() in debug.cpp.
 682 frame::frame(void* sp, void* fp, void* pc) {
 683   init((intptr_t*)sp, (intptr_t*)fp, (address)pc);
 684 }
 685 
 686 void frame::pd_ps() {}
 687 #endif
















 688 
 689 void JavaFrameAnchor::make_walkable(JavaThread* thread) {
 690   // last frame set?
 691   if (last_Java_sp() == NULL) return;
 692   // already walkable?
 693   if (walkable()) return;
 694   vmassert(Thread::current() == (Thread*)thread, "not current thread");
 695   vmassert(last_Java_sp() != NULL, "not called from Java code?");
 696   vmassert(last_Java_pc() == NULL, "already walkable");
 697   capture_last_Java_pc();
 698   vmassert(walkable(), "something went wrong");
 699 }
 700 
 701 void JavaFrameAnchor::capture_last_Java_pc() {
 702   vmassert(_last_Java_sp != NULL, "no last frame set");
 703   vmassert(_last_Java_pc == NULL, "already walkable");
 704   _last_Java_pc = (address)_last_Java_sp[-1];
 705 }


 127       // which can be different from the sender unextended sp (the sp seen
 128       // by the sender) because of current frame local variables
 129       sender_sp = (intptr_t*) addr_at(sender_sp_offset);
 130       sender_unextended_sp = (intptr_t*) this->fp()[interpreter_frame_sender_sp_offset];
 131       saved_fp = (intptr_t*) this->fp()[link_offset];
 132 
 133     } else {
 134       // must be some sort of compiled/runtime frame
 135       // fp does not have to be safe (although it could be check for c1?)
 136 
 137       // check for a valid frame_size, otherwise we are unlikely to get a valid sender_pc
 138       if (_cb->frame_size() <= 0) {
 139         return false;
 140       }
 141 
 142       sender_sp = _unextended_sp + _cb->frame_size();
 143       // Is sender_sp safe?
 144       if ((address)sender_sp >= thread->stack_base()) {
 145         return false;
 146       }

 147       // On Intel the return_address is always the word on the stack
 148       sender_pc = (address) *(sender_sp-1);
 149       // Note: frame::sender_sp_offset is only valid for compiled frame
 150       intptr_t** saved_fp_addr = (intptr_t**) (sender_sp - frame::sender_sp_offset);
 151       saved_fp = *saved_fp_addr;
 152 
 153       // Repair the sender sp if this is a method with scalarized value type args
 154       sender_sp = repair_sender_sp(sender_sp, saved_fp_addr);
 155       sender_unextended_sp = sender_sp;
 156     }
 157 
 158     // If the potential sender is the interpreter then we can do some more checking
 159     if (Interpreter::contains(sender_pc)) {
 160 
 161       // ebp is always saved in a recognizable place in any code we generate. However
 162       // only if the sender is interpreted/call_stub (c1 too?) are we certain that the saved ebp
 163       // is really a frame pointer.
 164 
 165       bool saved_fp_safe = ((address)saved_fp < thread->stack_base()) && (saved_fp > sender_sp);
 166 
 167       if (!saved_fp_safe) {
 168         return false;
 169       }
 170 
 171       // construct the potential sender
 172 
 173       frame sender(sender_sp, sender_unextended_sp, saved_fp, sender_pc);
 174 
 175       return sender.is_interpreted_frame_valid(thread);
 176 


 440   intptr_t* unextended_sp = interpreter_frame_sender_sp();
 441 
 442 #if COMPILER2_OR_JVMCI
 443   if (map->update_map()) {
 444     update_map_with_saved_link(map, (intptr_t**) addr_at(link_offset));
 445   }
 446 #endif // COMPILER2_OR_JVMCI
 447 
 448   return frame(sender_sp, unextended_sp, link(), sender_pc());
 449 }
 450 
 451 
 452 //------------------------------------------------------------------------------
 453 // frame::sender_for_compiled_frame
 454 frame frame::sender_for_compiled_frame(RegisterMap* map) const {
 455   assert(map != NULL, "map must be set");
 456 
 457   // frame owned by optimizing compiler
 458   assert(_cb->frame_size() >= 0, "must have non-zero frame size");
 459   intptr_t* sender_sp = unextended_sp() + _cb->frame_size();

 460 
 461   // On Intel the return_address is always the word on the stack
 462   address sender_pc = (address) *(sender_sp-1);
 463 
 464   // This is the saved value of EBP which may or may not really be an FP.
 465   // It is only an FP if the sender is an interpreter frame (or C1?).
 466   intptr_t** saved_fp_addr = (intptr_t**) (sender_sp - frame::sender_sp_offset);
 467 
 468   // Repair the sender sp if this is a method with scalarized value type args
 469   sender_sp = repair_sender_sp(sender_sp, saved_fp_addr);
 470 
 471   if (map->update_map()) {
 472     // Tell GC to use argument oopmaps for some runtime stubs that need it.
 473     // For C1, the runtime stub might not have oop maps, so set this flag
 474     // outside of update_register_map.
 475     map->set_include_argument_oops(_cb->caller_must_gc_arguments(map->thread()));
 476     if (_cb->oop_maps() != NULL) {
 477       OopMapSet::update_register_map(this, map);
 478     }
 479 
 480     // Since the prolog does the save and restore of EBP there is no oopmap
 481     // for it so we must fill in its location as if there was an oopmap entry
 482     // since if our caller was compiled code there could be live jvm state in it.
 483     update_map_with_saved_link(map, saved_fp_addr);
 484   }
 485 
 486   assert(sender_sp != sp(), "must have changed");
 487   return frame(sender_sp, sender_sp, *saved_fp_addr, sender_pc);
 488 }
 489 
 490 
 491 //------------------------------------------------------------------------------
 492 // frame::sender
 493 frame frame::sender(RegisterMap* map) const {
 494   // Default is we done have to follow them. The sender_for_xxx will
 495   // update it accordingly
 496   map->set_include_argument_oops(false);
 497 
 498   if (is_entry_frame())       return sender_for_entry_frame(map);
 499   if (is_interpreted_frame()) return sender_for_interpreter_frame(map);
 500   assert(_cb == CodeCache::find_blob(pc()),"Must be the same");
 501 
 502   if (_cb != NULL) {
 503     return sender_for_compiled_frame(map);
 504   }
 505   // Must be native-compiled frame, i.e. the marshaling code for native
 506   // methods that exists in the core system.
 507   return frame(sender_sp(), link(), sender_pc());


 673   if (_cb != NULL) {
 674     // use the frame size if valid
 675     int size = _cb->frame_size();
 676     if (size > 0) {
 677       return unextended_sp() + size;
 678     }
 679   }
 680   // else rely on fp()
 681   assert(! is_compiled_frame(), "unknown compiled frame size");
 682   return fp();
 683 }
 684 
 685 #ifndef PRODUCT
 686 // This is a generic constructor which is only used by pns() in debug.cpp.
 687 frame::frame(void* sp, void* fp, void* pc) {
 688   init((intptr_t*)sp, (intptr_t*)fp, (address)pc);
 689 }
 690 
 691 void frame::pd_ps() {}
 692 #endif
 693 
 694 // Check for a method with scalarized value type arguments that needs
 695 // a stack repair and return the repaired sender stack pointer.
 696 intptr_t* frame::repair_sender_sp(intptr_t* sender_sp, intptr_t** saved_fp_addr) const {
 697   CompiledMethod* cm = _cb->as_compiled_method_or_null();
 698   if (cm != NULL && cm->method()->needs_stack_repair()) {
 699     // The stack increment resides just below the saved rbp on the stack
 700     // and does not account for the return address.
 701     intptr_t* sp_inc_addr = (intptr_t*) (saved_fp_addr - 1);
 702     int sp_inc = (*sp_inc_addr) / wordSize;
 703     int real_frame_size = sp_inc + 1; // Add size of return address
 704     assert(real_frame_size >= _cb->frame_size(), "invalid frame size");
 705     sender_sp = unextended_sp() + real_frame_size;
 706   }
 707   return sender_sp;
 708 }
 709 
 710 void JavaFrameAnchor::make_walkable(JavaThread* thread) {
 711   // last frame set?
 712   if (last_Java_sp() == NULL) return;
 713   // already walkable?
 714   if (walkable()) return;
 715   vmassert(Thread::current() == (Thread*)thread, "not current thread");
 716   vmassert(last_Java_sp() != NULL, "not called from Java code?");
 717   vmassert(last_Java_pc() == NULL, "already walkable");
 718   capture_last_Java_pc();
 719   vmassert(walkable(), "something went wrong");
 720 }
 721 
 722 void JavaFrameAnchor::capture_last_Java_pc() {
 723   vmassert(_last_Java_sp != NULL, "no last frame set");
 724   vmassert(_last_Java_pc == NULL, "already walkable");
 725   _last_Java_pc = (address)_last_Java_sp[-1];
 726 }
< prev index next >