hotspot/src/cpu/aarch64/vm/frame_aarch64.cpp
changeset 30705 9104b426a3e8
parent 30552 ff209a4a81b5
child 31389 e0688be912e5
equal deleted inserted replaced
30704:addfa81a8448 30705:9104b426a3e8
   221     }
   221     }
   222 
   222 
   223     if (sender_blob->is_nmethod()) {
   223     if (sender_blob->is_nmethod()) {
   224         nmethod* nm = sender_blob->as_nmethod_or_null();
   224         nmethod* nm = sender_blob->as_nmethod_or_null();
   225         if (nm != NULL) {
   225         if (nm != NULL) {
   226             if (nm->is_deopt_mh_entry(sender_pc) || nm->is_deopt_entry(sender_pc)) {
   226             if (nm->is_deopt_mh_entry(sender_pc) || nm->is_deopt_entry(sender_pc) ||
       
   227                 nm->method()->is_method_handle_intrinsic()) {
   227                 return false;
   228                 return false;
   228             }
   229             }
   229         }
   230         }
   230     }
   231     }
   231 
   232 
   387 
   388 
   388 //------------------------------------------------------------------------------
   389 //------------------------------------------------------------------------------
   389 // frame::verify_deopt_original_pc
   390 // frame::verify_deopt_original_pc
   390 //
   391 //
   391 // Verifies the calculated original PC of a deoptimization PC for the
   392 // Verifies the calculated original PC of a deoptimization PC for the
   392 // given unextended SP.  The unextended SP might also be the saved SP
   393 // given unextended SP.
   393 // for MethodHandle call sites.
       
   394 #ifdef ASSERT
   394 #ifdef ASSERT
   395 void frame::verify_deopt_original_pc(nmethod* nm, intptr_t* unextended_sp, bool is_method_handle_return) {
   395 void frame::verify_deopt_original_pc(nmethod* nm, intptr_t* unextended_sp) {
   396   frame fr;
   396   frame fr;
   397 
   397 
   398   // This is ugly but it's better than to change {get,set}_original_pc
   398   // This is ugly but it's better than to change {get,set}_original_pc
   399   // to take an SP value as argument.  And it's only a debugging
   399   // to take an SP value as argument.  And it's only a debugging
   400   // method anyway.
   400   // method anyway.
   401   fr._unextended_sp = unextended_sp;
   401   fr._unextended_sp = unextended_sp;
   402 
   402 
   403   address original_pc = nm->get_original_pc(&fr);
   403   address original_pc = nm->get_original_pc(&fr);
   404   assert(nm->insts_contains(original_pc), "original PC must be in nmethod");
   404   assert(nm->insts_contains(original_pc), "original PC must be in nmethod");
   405   assert(nm->is_method_handle_return(original_pc) == is_method_handle_return, "must be");
       
   406 }
   405 }
   407 #endif
   406 #endif
   408 
   407 
   409 //------------------------------------------------------------------------------
   408 //------------------------------------------------------------------------------
   410 // frame::adjust_unextended_sp
   409 // frame::adjust_unextended_sp
   411 void frame::adjust_unextended_sp() {
   410 void frame::adjust_unextended_sp() {
   412   // If we are returning to a compiled MethodHandle call site, the
   411   // On aarch64, sites calling method handle intrinsics and lambda forms are treated
   413   // saved_fp will in fact be a saved value of the unextended SP.  The
   412   // as any other call site. Therefore, no special action is needed when we are
   414   // simplest way to tell whether we are returning to such a call site
   413   // returning to any of these call sites.
   415   // is as follows:
       
   416 
   414 
   417   nmethod* sender_nm = (_cb == NULL) ? NULL : _cb->as_nmethod_or_null();
   415   nmethod* sender_nm = (_cb == NULL) ? NULL : _cb->as_nmethod_or_null();
   418   if (sender_nm != NULL) {
   416   if (sender_nm != NULL) {
   419     // If the sender PC is a deoptimization point, get the original
   417     // If the sender PC is a deoptimization point, get the original PC.
   420     // PC.  For MethodHandle call site the unextended_sp is stored in
   418     if (sender_nm->is_deopt_entry(_pc) ||
   421     // saved_fp.
   419         sender_nm->is_deopt_mh_entry(_pc)) {
   422     if (sender_nm->is_deopt_mh_entry(_pc)) {
       
   423       DEBUG_ONLY(verify_deopt_mh_original_pc(sender_nm, _fp));
       
   424       _unextended_sp = _fp;
       
   425     }
       
   426     else if (sender_nm->is_deopt_entry(_pc)) {
       
   427       DEBUG_ONLY(verify_deopt_original_pc(sender_nm, _unextended_sp));
   420       DEBUG_ONLY(verify_deopt_original_pc(sender_nm, _unextended_sp));
   428     }
       
   429     else if (sender_nm->is_method_handle_return(_pc)) {
       
   430       _unextended_sp = _fp;
       
   431     }
   421     }
   432   }
   422   }
   433 }
   423 }
   434 
   424 
   435 //------------------------------------------------------------------------------
   425 //------------------------------------------------------------------------------