hotspot/src/share/vm/runtime/sharedRuntime.cpp
changeset 22858 f4a6f0eba875
parent 22838 82c7497fbad4
parent 21726 3533814ab107
child 22872 b6902ee5bc8d
equal deleted inserted replaced
22857:2167396cfc83 22858:f4a6f0eba875
    82 #include "c1/c1_Runtime1.hpp"
    82 #include "c1/c1_Runtime1.hpp"
    83 #endif
    83 #endif
    84 
    84 
    85 // Shared stub locations
    85 // Shared stub locations
    86 RuntimeStub*        SharedRuntime::_wrong_method_blob;
    86 RuntimeStub*        SharedRuntime::_wrong_method_blob;
       
    87 RuntimeStub*        SharedRuntime::_wrong_method_abstract_blob;
    87 RuntimeStub*        SharedRuntime::_ic_miss_blob;
    88 RuntimeStub*        SharedRuntime::_ic_miss_blob;
    88 RuntimeStub*        SharedRuntime::_resolve_opt_virtual_call_blob;
    89 RuntimeStub*        SharedRuntime::_resolve_opt_virtual_call_blob;
    89 RuntimeStub*        SharedRuntime::_resolve_virtual_call_blob;
    90 RuntimeStub*        SharedRuntime::_resolve_virtual_call_blob;
    90 RuntimeStub*        SharedRuntime::_resolve_static_call_blob;
    91 RuntimeStub*        SharedRuntime::_resolve_static_call_blob;
    91 
    92 
    99 #endif // COMPILER2
   100 #endif // COMPILER2
   100 
   101 
   101 
   102 
   102 //----------------------------generate_stubs-----------------------------------
   103 //----------------------------generate_stubs-----------------------------------
   103 void SharedRuntime::generate_stubs() {
   104 void SharedRuntime::generate_stubs() {
   104   _wrong_method_blob                   = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::handle_wrong_method),         "wrong_method_stub");
   105   _wrong_method_blob                   = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::handle_wrong_method),          "wrong_method_stub");
   105   _ic_miss_blob                        = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::handle_wrong_method_ic_miss), "ic_miss_stub");
   106   _wrong_method_abstract_blob          = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::handle_wrong_method_abstract), "wrong_method_abstract_stub");
   106   _resolve_opt_virtual_call_blob       = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_opt_virtual_call_C),  "resolve_opt_virtual_call");
   107   _ic_miss_blob                        = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::handle_wrong_method_ic_miss),  "ic_miss_stub");
   107   _resolve_virtual_call_blob           = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_virtual_call_C),      "resolve_virtual_call");
   108   _resolve_opt_virtual_call_blob       = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_opt_virtual_call_C),   "resolve_opt_virtual_call");
   108   _resolve_static_call_blob            = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_static_call_C),       "resolve_static_call");
   109   _resolve_virtual_call_blob           = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_virtual_call_C),       "resolve_virtual_call");
       
   110   _resolve_static_call_blob            = generate_resolve_blob(CAST_FROM_FN_PTR(address, SharedRuntime::resolve_static_call_C),        "resolve_static_call");
   109 
   111 
   110 #ifdef COMPILER2
   112 #ifdef COMPILER2
   111   // Vectors are generated only by C2.
   113   // Vectors are generated only by C2.
   112   if (is_wide_vector(MaxVectorSize)) {
   114   if (is_wide_vector(MaxVectorSize)) {
   113     _polling_page_vectors_safepoint_handler_blob = generate_handler_blob(CAST_FROM_FN_PTR(address, SafepointSynchronize::handle_polling_page_exception), POLL_AT_VECTOR_LOOP);
   115     _polling_page_vectors_safepoint_handler_blob = generate_handler_blob(CAST_FROM_FN_PTR(address, SafepointSynchronize::handle_polling_page_exception), POLL_AT_VECTOR_LOOP);
  1341     thread->set_vm_result_2(callee_method());
  1343     thread->set_vm_result_2(callee_method());
  1342   JRT_BLOCK_END
  1344   JRT_BLOCK_END
  1343   // return compiled code entry point after potential safepoints
  1345   // return compiled code entry point after potential safepoints
  1344   assert(callee_method->verified_code_entry() != NULL, " Jump to zero!");
  1346   assert(callee_method->verified_code_entry() != NULL, " Jump to zero!");
  1345   return callee_method->verified_code_entry();
  1347   return callee_method->verified_code_entry();
       
  1348 JRT_END
       
  1349 
       
  1350 // Handle abstract method call
       
  1351 JRT_BLOCK_ENTRY(address, SharedRuntime::handle_wrong_method_abstract(JavaThread* thread))
       
  1352   return StubRoutines::throw_AbstractMethodError_entry();
  1346 JRT_END
  1353 JRT_END
  1347 
  1354 
  1348 
  1355 
  1349 // resolve a static call and patch code
  1356 // resolve a static call and patch code
  1350 JRT_BLOCK_ENTRY(address, SharedRuntime::resolve_static_call_C(JavaThread *thread ))
  1357 JRT_BLOCK_ENTRY(address, SharedRuntime::resolve_static_call_C(JavaThread *thread ))
  2339   if (_adapters != NULL) return;
  2346   if (_adapters != NULL) return;
  2340   _adapters = new AdapterHandlerTable();
  2347   _adapters = new AdapterHandlerTable();
  2341 
  2348 
  2342   // Create a special handler for abstract methods.  Abstract methods
  2349   // Create a special handler for abstract methods.  Abstract methods
  2343   // are never compiled so an i2c entry is somewhat meaningless, but
  2350   // are never compiled so an i2c entry is somewhat meaningless, but
  2344   // fill it in with something appropriate just in case.  Pass handle
  2351   // throw AbstractMethodError just in case.
  2345   // wrong method for the c2i transitions.
  2352   // Pass wrong_method_abstract for the c2i transitions to return
  2346   address wrong_method = SharedRuntime::get_handle_wrong_method_stub();
  2353   // AbstractMethodError for invalid invocations.
       
  2354   address wrong_method_abstract = SharedRuntime::get_handle_wrong_method_abstract_stub();
  2347   _abstract_method_handler = AdapterHandlerLibrary::new_entry(new AdapterFingerPrint(0, NULL),
  2355   _abstract_method_handler = AdapterHandlerLibrary::new_entry(new AdapterFingerPrint(0, NULL),
  2348                                                               StubRoutines::throw_AbstractMethodError_entry(),
  2356                                                               StubRoutines::throw_AbstractMethodError_entry(),
  2349                                                               wrong_method, wrong_method);
  2357                                                               wrong_method_abstract, wrong_method_abstract);
  2350 }
  2358 }
  2351 
  2359 
  2352 AdapterHandlerEntry* AdapterHandlerLibrary::new_entry(AdapterFingerPrint* fingerprint,
  2360 AdapterHandlerEntry* AdapterHandlerLibrary::new_entry(AdapterFingerPrint* fingerprint,
  2353                                                       address i2c_entry,
  2361                                                       address i2c_entry,
  2354                                                       address c2i_entry,
  2362                                                       address c2i_entry,