hotspot/src/share/vm/interpreter/interpreter.cpp
changeset 3600 27aa4477d039
parent 2534 08dac9ce0cd7
child 4429 d7eb4e2099aa
equal deleted inserted replaced
3599:35bb709f2c62 3600:27aa4477d039
   282 
   282 
   283 
   283 
   284 //------------------------------------------------------------------------------------------------------------------------
   284 //------------------------------------------------------------------------------------------------------------------------
   285 // Deoptimization support
   285 // Deoptimization support
   286 
   286 
   287 // If deoptimization happens, this method returns the point where to continue in
   287 // If deoptimization happens, this function returns the point of next bytecode to continue execution
   288 // interpreter. For calls (invokexxxx, newxxxx) the continuation is at next
   288 address AbstractInterpreter::deopt_continue_after_entry(methodOop method, address bcp, int callee_parameters, bool is_top_frame) {
   289 // bci and the top of stack is in eax/edx/FPU tos.
       
   290 // For putfield/getfield, put/getstatic, the continuation is at the same
       
   291 // bci and the TOS is on stack.
       
   292 
       
   293 // Note: deopt_entry(type, 0) means reexecute bytecode
       
   294 //       deopt_entry(type, length) means continue at next bytecode
       
   295 
       
   296 address AbstractInterpreter::continuation_for(methodOop method, address bcp, int callee_parameters, bool is_top_frame, bool& use_next_mdp) {
       
   297   assert(method->contains(bcp), "just checkin'");
   289   assert(method->contains(bcp), "just checkin'");
   298   Bytecodes::Code code   = Bytecodes::java_code_at(bcp);
   290   Bytecodes::Code code   = Bytecodes::java_code_at(bcp);
       
   291   assert(!Interpreter::bytecode_should_reexecute(code), "should not reexecute");
   299   int             bci    = method->bci_from(bcp);
   292   int             bci    = method->bci_from(bcp);
   300   int             length = -1; // initial value for debugging
   293   int             length = -1; // initial value for debugging
   301   // compute continuation length
   294   // compute continuation length
   302   length = Bytecodes::length_at(bcp);
   295   length = Bytecodes::length_at(bcp);
   303   // compute result type
   296   // compute result type
   304   BasicType type = T_ILLEGAL;
   297   BasicType type = T_ILLEGAL;
   305   // when continuing after a compiler safepoint, re-execute the bytecode
   298 
   306   // (an invoke is continued after the safepoint)
   299   switch (code) {
   307   use_next_mdp = true;
   300     case Bytecodes::_invokevirtual  :
       
   301     case Bytecodes::_invokespecial  :
       
   302     case Bytecodes::_invokestatic   :
       
   303     case Bytecodes::_invokeinterface: {
       
   304       Thread *thread = Thread::current();
       
   305       ResourceMark rm(thread);
       
   306       methodHandle mh(thread, method);
       
   307       type = Bytecode_invoke_at(mh, bci)->result_type(thread);
       
   308       // since the cache entry might not be initialized:
       
   309       // (NOT needed for the old calling convension)
       
   310       if (!is_top_frame) {
       
   311         int index = Bytes::get_native_u2(bcp+1);
       
   312         method->constants()->cache()->entry_at(index)->set_parameter_size(callee_parameters);
       
   313       }
       
   314       break;
       
   315     }
       
   316 
       
   317     case Bytecodes::_ldc   :
       
   318       type = constant_pool_type( method, *(bcp+1) );
       
   319       break;
       
   320 
       
   321     case Bytecodes::_ldc_w : // fall through
       
   322     case Bytecodes::_ldc2_w:
       
   323       type = constant_pool_type( method, Bytes::get_Java_u2(bcp+1) );
       
   324       break;
       
   325 
       
   326     default:
       
   327       type = Bytecodes::result_type(code);
       
   328       break;
       
   329   }
       
   330 
       
   331   // return entry point for computed continuation state & bytecode length
       
   332   return
       
   333     is_top_frame
       
   334     ? Interpreter::deopt_entry (as_TosState(type), length)
       
   335     : Interpreter::return_entry(as_TosState(type), length);
       
   336 }
       
   337 
       
   338 // If deoptimization happens, this function returns the point where the interpreter reexecutes
       
   339 // the bytecode.
       
   340 // Note: Bytecodes::_athrow is a special case in that it does not return
       
   341 //       Interpreter::deopt_entry(vtos, 0) like others
       
   342 address AbstractInterpreter::deopt_reexecute_entry(methodOop method, address bcp) {
       
   343   assert(method->contains(bcp), "just checkin'");
       
   344   Bytecodes::Code code   = Bytecodes::java_code_at(bcp);
       
   345 #ifdef COMPILER1
       
   346   if(code == Bytecodes::_athrow ) {
       
   347     return Interpreter::rethrow_exception_entry();
       
   348   }
       
   349 #endif /* COMPILER1 */
       
   350   return Interpreter::deopt_entry(vtos, 0);
       
   351 }
       
   352 
       
   353 // If deoptimization happens, the interpreter should reexecute these bytecodes.
       
   354 // This function mainly helps the compilers to set up the reexecute bit.
       
   355 bool AbstractInterpreter::bytecode_should_reexecute(Bytecodes::Code code) {
   308   switch (code) {
   356   switch (code) {
   309     case Bytecodes::_lookupswitch:
   357     case Bytecodes::_lookupswitch:
   310     case Bytecodes::_tableswitch:
   358     case Bytecodes::_tableswitch:
   311     case Bytecodes::_fast_binaryswitch:
   359     case Bytecodes::_fast_binaryswitch:
   312     case Bytecodes::_fast_linearswitch:
   360     case Bytecodes::_fast_linearswitch:
   338     case Bytecodes::_getfield  :
   386     case Bytecodes::_getfield  :
   339     case Bytecodes::_putfield  :
   387     case Bytecodes::_putfield  :
   340     case Bytecodes::_getstatic :
   388     case Bytecodes::_getstatic :
   341     case Bytecodes::_putstatic :
   389     case Bytecodes::_putstatic :
   342     case Bytecodes::_aastore   :
   390     case Bytecodes::_aastore   :
   343       // reexecute the operation and TOS value is on stack
       
   344       assert(is_top_frame, "must be top frame");
       
   345       use_next_mdp = false;
       
   346       return Interpreter::deopt_entry(vtos, 0);
       
   347       break;
       
   348 
       
   349 #ifdef COMPILER1
   391 #ifdef COMPILER1
       
   392     //special case of reexecution
   350     case Bytecodes::_athrow    :
   393     case Bytecodes::_athrow    :
   351       assert(is_top_frame, "must be top frame");
   394 #endif
   352       use_next_mdp = false;
   395       return true;
   353       return Interpreter::rethrow_exception_entry();
       
   354       break;
       
   355 #endif /* COMPILER1 */
       
   356 
       
   357     case Bytecodes::_invokevirtual  :
       
   358     case Bytecodes::_invokespecial  :
       
   359     case Bytecodes::_invokestatic   :
       
   360     case Bytecodes::_invokeinterface: {
       
   361       Thread *thread = Thread::current();
       
   362       ResourceMark rm(thread);
       
   363       methodHandle mh(thread, method);
       
   364       type = Bytecode_invoke_at(mh, bci)->result_type(thread);
       
   365       // since the cache entry might not be initialized:
       
   366       // (NOT needed for the old calling convension)
       
   367       if (!is_top_frame) {
       
   368         int index = Bytes::get_native_u2(bcp+1);
       
   369         method->constants()->cache()->entry_at(index)->set_parameter_size(callee_parameters);
       
   370       }
       
   371       break;
       
   372     }
       
   373 
       
   374     case Bytecodes::_ldc   :
       
   375       type = constant_pool_type( method, *(bcp+1) );
       
   376       break;
       
   377 
       
   378     case Bytecodes::_ldc_w : // fall through
       
   379     case Bytecodes::_ldc2_w:
       
   380       type = constant_pool_type( method, Bytes::get_Java_u2(bcp+1) );
       
   381       break;
       
   382 
   396 
   383     default:
   397     default:
   384       type = Bytecodes::result_type(code);
   398       return false;
   385       break;
   399   }
   386   }
       
   387 
       
   388   // return entry point for computed continuation state & bytecode length
       
   389   return
       
   390     is_top_frame
       
   391     ? Interpreter::deopt_entry (as_TosState(type), length)
       
   392     : Interpreter::return_entry(as_TosState(type), length);
       
   393 }
   400 }
   394 
   401 
   395 void AbstractInterpreterGenerator::bang_stack_shadow_pages(bool native_call) {
   402 void AbstractInterpreterGenerator::bang_stack_shadow_pages(bool native_call) {
   396   // Quick & dirty stack overflow checking: bang the stack & handle trap.
   403   // Quick & dirty stack overflow checking: bang the stack & handle trap.
   397   // Note that we do the banging after the frame is setup, since the exception
   404   // Note that we do the banging after the frame is setup, since the exception