hotspot/src/cpu/aarch64/vm/frame_aarch64.cpp
changeset 35214 d86005e0b4c2
parent 35201 996db89f378e
child 35232 76aed99c0ddd
equal deleted inserted replaced
35211:3771329165d4 35214:d86005e0b4c2
   312   // Entry frame's arguments are always in relation to unextended_sp()
   312   // Entry frame's arguments are always in relation to unextended_sp()
   313   return &unextended_sp()[index];
   313   return &unextended_sp()[index];
   314 }
   314 }
   315 
   315 
   316 // sender_sp
   316 // sender_sp
   317 #ifdef CC_INTERP
       
   318 intptr_t* frame::interpreter_frame_sender_sp() const {
       
   319   assert(is_interpreted_frame(), "interpreted frame expected");
       
   320   // QQQ why does this specialize method exist if frame::sender_sp() does same thing?
       
   321   // seems odd and if we always know interpreted vs. non then sender_sp() is really
       
   322   // doing too much work.
       
   323   return get_interpreterState()->sender_sp();
       
   324 }
       
   325 
       
   326 // monitor elements
       
   327 
       
   328 BasicObjectLock* frame::interpreter_frame_monitor_begin() const {
       
   329   return get_interpreterState()->monitor_base();
       
   330 }
       
   331 
       
   332 BasicObjectLock* frame::interpreter_frame_monitor_end() const {
       
   333   return (BasicObjectLock*) get_interpreterState()->stack_base();
       
   334 }
       
   335 
       
   336 #else // CC_INTERP
       
   337 
       
   338 intptr_t* frame::interpreter_frame_sender_sp() const {
   317 intptr_t* frame::interpreter_frame_sender_sp() const {
   339   assert(is_interpreted_frame(), "interpreted frame expected");
   318   assert(is_interpreted_frame(), "interpreted frame expected");
   340   return (intptr_t*) at(interpreter_frame_sender_sp_offset);
   319   return (intptr_t*) at(interpreter_frame_sender_sp_offset);
   341 }
   320 }
   342 
   321 
   366 
   345 
   367 // Used by template based interpreter deoptimization
   346 // Used by template based interpreter deoptimization
   368 void frame::interpreter_frame_set_last_sp(intptr_t* sp) {
   347 void frame::interpreter_frame_set_last_sp(intptr_t* sp) {
   369     *((intptr_t**)addr_at(interpreter_frame_last_sp_offset)) = sp;
   348     *((intptr_t**)addr_at(interpreter_frame_last_sp_offset)) = sp;
   370 }
   349 }
   371 #endif // CC_INTERP
       
   372 
   350 
   373 frame frame::sender_for_entry_frame(RegisterMap* map) const {
   351 frame frame::sender_for_entry_frame(RegisterMap* map) const {
   374   assert(map != NULL, "map must be set");
   352   assert(map != NULL, "map must be set");
   375   // Java frame called from C; skip all C frames and return top C
   353   // Java frame called from C; skip all C frames and return top C
   376   // frame of that chunk as the sender
   354   // frame of that chunk as the sender
   526   // methods that exists in the core system.
   504   // methods that exists in the core system.
   527   return frame(sender_sp(), link(), sender_pc());
   505   return frame(sender_sp(), link(), sender_pc());
   528 }
   506 }
   529 
   507 
   530 bool frame::is_interpreted_frame_valid(JavaThread* thread) const {
   508 bool frame::is_interpreted_frame_valid(JavaThread* thread) const {
   531 // QQQ
       
   532 #ifdef CC_INTERP
       
   533 #else
       
   534   assert(is_interpreted_frame(), "Not an interpreted frame");
   509   assert(is_interpreted_frame(), "Not an interpreted frame");
   535   // These are reasonable sanity checks
   510   // These are reasonable sanity checks
   536   if (fp() == 0 || (intptr_t(fp()) & (wordSize-1)) != 0) {
   511   if (fp() == 0 || (intptr_t(fp()) & (wordSize-1)) != 0) {
   537     return false;
   512     return false;
   538   }
   513   }
   582   address locals =  (address) *interpreter_frame_locals_addr();
   557   address locals =  (address) *interpreter_frame_locals_addr();
   583 
   558 
   584   if (locals > thread->stack_base() || locals < (address) fp()) return false;
   559   if (locals > thread->stack_base() || locals < (address) fp()) return false;
   585 
   560 
   586   // We'd have to be pretty unlucky to be mislead at this point
   561   // We'd have to be pretty unlucky to be mislead at this point
   587 
       
   588 #endif // CC_INTERP
       
   589   return true;
   562   return true;
   590 }
   563 }
   591 
   564 
   592 BasicType frame::interpreter_frame_result(oop* oop_result, jvalue* value_result) {
   565 BasicType frame::interpreter_frame_result(oop* oop_result, jvalue* value_result) {
   593 #ifdef CC_INTERP
       
   594   // Needed for JVMTI. The result should always be in the
       
   595   // interpreterState object
       
   596   interpreterState istate = get_interpreterState();
       
   597 #endif // CC_INTERP
       
   598   assert(is_interpreted_frame(), "interpreted frame expected");
   566   assert(is_interpreted_frame(), "interpreted frame expected");
   599   Method* method = interpreter_frame_method();
   567   Method* method = interpreter_frame_method();
   600   BasicType type = method->result_type();
   568   BasicType type = method->result_type();
   601 
   569 
   602   intptr_t* tos_addr;
   570   intptr_t* tos_addr;
   618   switch (type) {
   586   switch (type) {
   619     case T_OBJECT  :
   587     case T_OBJECT  :
   620     case T_ARRAY   : {
   588     case T_ARRAY   : {
   621       oop obj;
   589       oop obj;
   622       if (method->is_native()) {
   590       if (method->is_native()) {
   623 #ifdef CC_INTERP
       
   624         obj = istate->_oop_temp;
       
   625 #else
       
   626         obj = cast_to_oop(at(interpreter_frame_oop_temp_offset));
   591         obj = cast_to_oop(at(interpreter_frame_oop_temp_offset));
   627 #endif // CC_INTERP
       
   628       } else {
   592       } else {
   629         oop* obj_p = (oop*)tos_addr;
   593         oop* obj_p = (oop*)tos_addr;
   630         obj = (obj_p == NULL) ? (oop)NULL : *obj_p;
   594         obj = (obj_p == NULL) ? (oop)NULL : *obj_p;
   631       }
   595       }
   632       assert(obj == NULL || Universe::heap()->is_in(obj), "sanity check");
   596       assert(obj == NULL || Universe::heap()->is_in(obj), "sanity check");