< prev index next >

src/hotspot/share/runtime/javaCalls.cpp

Print this page




  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "classfile/systemDictionary.hpp"
  27 #include "classfile/vmSymbols.hpp"
  28 #include "code/nmethod.hpp"
  29 #include "compiler/compilationPolicy.hpp"
  30 #include "compiler/compileBroker.hpp"
  31 #include "interpreter/interpreter.hpp"
  32 #include "interpreter/linkResolver.hpp"



  33 #include "memory/universe.hpp"
  34 #include "oops/method.inline.hpp"
  35 #include "oops/oop.inline.hpp"
  36 #include "prims/jniCheck.hpp"
  37 #include "runtime/handles.inline.hpp"
  38 #include "runtime/interfaceSupport.inline.hpp"
  39 #include "runtime/javaCalls.hpp"
  40 #include "runtime/jniHandles.inline.hpp"
  41 #include "runtime/mutexLocker.hpp"
  42 #include "runtime/os.inline.hpp"
  43 #include "runtime/sharedRuntime.hpp"
  44 #include "runtime/signature.hpp"
  45 #include "runtime/stubRoutines.hpp"
  46 #include "runtime/thread.inline.hpp"
  47 
  48 // -----------------------------------------------------
  49 // Implementation of JavaCallWrapper
  50 
  51 JavaCallWrapper::JavaCallWrapper(const methodHandle& callee_method, Handle receiver, JavaValue* result, TRAPS) {
  52   JavaThread* thread = (JavaThread *)THREAD;


 329 // Implementation of JavaCalls (low level)
 330 
 331 
 332 void JavaCalls::call(JavaValue* result, const methodHandle& method, JavaCallArguments* args, TRAPS) {
 333   // Check if we need to wrap a potential OS exception handler around thread
 334   // This is used for e.g. Win32 structured exception handlers
 335   assert(THREAD->is_Java_thread(), "only JavaThreads can make JavaCalls");
 336   // Need to wrap each and every time, since there might be native code down the
 337   // stack that has installed its own exception handlers
 338   os::os_exception_wrapper(call_helper, result, method, args, THREAD);
 339 }
 340 
 341 void JavaCalls::call_helper(JavaValue* result, const methodHandle& method, JavaCallArguments* args, TRAPS) {
 342 
 343   JavaThread* thread = (JavaThread*)THREAD;
 344   assert(thread->is_Java_thread(), "must be called by a java thread");
 345   assert(method.not_null(), "must have a method to call");
 346   assert(!SafepointSynchronize::is_at_safepoint(), "call to Java code during VM operation");
 347   assert(!thread->handle_area()->no_handle_mark_active(), "cannot call out to Java here");
 348 
 349 #if INCLUDE_JVMCI
 350   // Gets the nmethod (if any) that should be called instead of normal target
 351   nmethod* alternative_target = args->alternative_target();
 352   if (alternative_target == NULL) {
 353 #endif
 354 // Verify the arguments
 355 
 356   if (CheckJNICalls)  {
 357     args->verify(method, result->get_type());
 358   }
 359   else debug_only(args->verify(method, result->get_type()));
 360 #if INCLUDE_JVMCI
 361   }
 362 #else
 363 
 364   // Ignore call if method is empty
 365   if (method->is_empty_method()) {
 366     assert(result->get_type() == T_VOID, "an empty method must return a void value");
 367     return;
 368   }
 369 #endif
 370 
 371 #ifdef ASSERT
 372   { InstanceKlass* holder = method->method_holder();
 373     // A klass might not be initialized since JavaCall's might be used during the executing of
 374     // the <clinit>. For example, a Thread.start might start executing on an object that is
 375     // not fully initialized! (bad Java programming style)
 376     assert(holder->is_linked(), "rewriting must have taken place");
 377   }
 378 #endif
 379 
 380   CompilationPolicy::compile_if_required(method, CHECK);
 381 
 382   // Since the call stub sets up like the interpreter we call the from_interpreted_entry
 383   // so we can go compiled via a i2c. Otherwise initial entry method will always
 384   // run interpreted.
 385   address entry_point = method->from_interpreted_entry();
 386   if (JvmtiExport::can_post_interpreter_events() && thread->is_interp_only_mode()) {
 387     entry_point = method->interpreter_entry();
 388   }
 389 


 397 
 398   // When we reenter Java, we need to reenable the reserved/yellow zone which
 399   // might already be disabled when we are in VM.
 400   if (!thread->stack_guards_enabled()) {
 401     thread->reguard_stack();
 402   }
 403 
 404   // Check that there are shadow pages available before changing thread state
 405   // to Java. Calculate current_stack_pointer here to make sure
 406   // stack_shadow_pages_available() and bang_stack_shadow_pages() use the same sp.
 407   address sp = os::current_stack_pointer();
 408   if (!os::stack_shadow_pages_available(THREAD, method, sp)) {
 409     // Throw stack overflow exception with preinitialized exception.
 410     Exceptions::throw_stack_overflow_exception(THREAD, __FILE__, __LINE__, method);
 411     return;
 412   } else {
 413     // Touch pages checked if the OS needs them to be touched to be mapped.
 414     os::map_stack_shadow_pages(sp);
 415   }
 416 
 417 #if INCLUDE_JVMCI
 418   if (alternative_target != NULL) {
 419     if (alternative_target->is_alive() && !alternative_target->is_unloading()) {
 420       thread->set_jvmci_alternate_call_target(alternative_target->verified_entry_point());
 421       entry_point = method->adapter()->get_i2c_entry();
 422     } else {
 423       THROW(vmSymbols::jdk_vm_ci_code_InvalidInstalledCodeException());
 424     }
 425   }
 426 #endif
 427 
 428   // do call
 429   { JavaCallWrapper link(method, receiver, result, CHECK);
 430     { HandleMark hm(thread);  // HandleMark used by HandleMarkCleaner
 431 
 432       // NOTE: if we move the computation of the result_val_address inside
 433       // the call to call_stub, the optimizer produces wrong code.
 434       intptr_t* result_val_address = (intptr_t*)(result->get_value_addr());
 435       intptr_t* parameter_address = args->parameters();
 436 













 437       StubRoutines::call_stub()(
 438         (address)&link,
 439         // (intptr_t*)&(result->_value), // see NOTE above (compiler problem)
 440         result_val_address,          // see NOTE above (compiler problem)
 441         result_type,
 442         method(),
 443         entry_point,
 444         parameter_address,
 445         args->size_of_parameters(),
 446         CHECK
 447       );
 448 
 449       result = link.result();  // circumvent MS C++ 5.0 compiler bug (result is clobbered across call)
 450       // Preserve oop return value across possible gc points
 451       if (oop_result_flag) {
 452         thread->set_vm_result((oop) result->get_jobject());
 453       }
 454     }
 455   } // Exit JavaCallWrapper (can block - potential return oop must be preserved)
 456 




  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "classfile/systemDictionary.hpp"
  27 #include "classfile/vmSymbols.hpp"
  28 #include "code/nmethod.hpp"
  29 #include "compiler/compilationPolicy.hpp"
  30 #include "compiler/compileBroker.hpp"
  31 #include "interpreter/interpreter.hpp"
  32 #include "interpreter/linkResolver.hpp"
  33 #if INCLUDE_JVMCI
  34 #include "jvmci/jvmciJavaClasses.hpp"
  35 #endif
  36 #include "memory/universe.hpp"
  37 #include "oops/method.inline.hpp"
  38 #include "oops/oop.inline.hpp"
  39 #include "prims/jniCheck.hpp"
  40 #include "runtime/handles.inline.hpp"
  41 #include "runtime/interfaceSupport.inline.hpp"
  42 #include "runtime/javaCalls.hpp"
  43 #include "runtime/jniHandles.inline.hpp"
  44 #include "runtime/mutexLocker.hpp"
  45 #include "runtime/os.inline.hpp"
  46 #include "runtime/sharedRuntime.hpp"
  47 #include "runtime/signature.hpp"
  48 #include "runtime/stubRoutines.hpp"
  49 #include "runtime/thread.inline.hpp"
  50 
  51 // -----------------------------------------------------
  52 // Implementation of JavaCallWrapper
  53 
  54 JavaCallWrapper::JavaCallWrapper(const methodHandle& callee_method, Handle receiver, JavaValue* result, TRAPS) {
  55   JavaThread* thread = (JavaThread *)THREAD;


 332 // Implementation of JavaCalls (low level)
 333 
 334 
 335 void JavaCalls::call(JavaValue* result, const methodHandle& method, JavaCallArguments* args, TRAPS) {
 336   // Check if we need to wrap a potential OS exception handler around thread
 337   // This is used for e.g. Win32 structured exception handlers
 338   assert(THREAD->is_Java_thread(), "only JavaThreads can make JavaCalls");
 339   // Need to wrap each and every time, since there might be native code down the
 340   // stack that has installed its own exception handlers
 341   os::os_exception_wrapper(call_helper, result, method, args, THREAD);
 342 }
 343 
 344 void JavaCalls::call_helper(JavaValue* result, const methodHandle& method, JavaCallArguments* args, TRAPS) {
 345 
 346   JavaThread* thread = (JavaThread*)THREAD;
 347   assert(thread->is_Java_thread(), "must be called by a java thread");
 348   assert(method.not_null(), "must have a method to call");
 349   assert(!SafepointSynchronize::is_at_safepoint(), "call to Java code during VM operation");
 350   assert(!thread->handle_area()->no_handle_mark_active(), "cannot call out to Java here");
 351 
 352   // Verify the arguments
 353   if (JVMCI_ONLY(args->alternative_target().is_null() &&) (DEBUG_ONLY(true ||) CheckJNICalls)) {






 354     args->verify(method, result->get_type());
 355   }





 356   // Ignore call if method is empty
 357   if (JVMCI_ONLY(args->alternative_target().is_null() &&) method->is_empty_method()) {
 358     assert(result->get_type() == T_VOID, "an empty method must return a void value");
 359     return;
 360   }

 361 
 362 #ifdef ASSERT
 363   { InstanceKlass* holder = method->method_holder();
 364     // A klass might not be initialized since JavaCall's might be used during the executing of
 365     // the <clinit>. For example, a Thread.start might start executing on an object that is
 366     // not fully initialized! (bad Java programming style)
 367     assert(holder->is_linked(), "rewriting must have taken place");
 368   }
 369 #endif
 370 
 371   CompilationPolicy::compile_if_required(method, CHECK);
 372 
 373   // Since the call stub sets up like the interpreter we call the from_interpreted_entry
 374   // so we can go compiled via a i2c. Otherwise initial entry method will always
 375   // run interpreted.
 376   address entry_point = method->from_interpreted_entry();
 377   if (JvmtiExport::can_post_interpreter_events() && thread->is_interp_only_mode()) {
 378     entry_point = method->interpreter_entry();
 379   }
 380 


 388 
 389   // When we reenter Java, we need to reenable the reserved/yellow zone which
 390   // might already be disabled when we are in VM.
 391   if (!thread->stack_guards_enabled()) {
 392     thread->reguard_stack();
 393   }
 394 
 395   // Check that there are shadow pages available before changing thread state
 396   // to Java. Calculate current_stack_pointer here to make sure
 397   // stack_shadow_pages_available() and bang_stack_shadow_pages() use the same sp.
 398   address sp = os::current_stack_pointer();
 399   if (!os::stack_shadow_pages_available(THREAD, method, sp)) {
 400     // Throw stack overflow exception with preinitialized exception.
 401     Exceptions::throw_stack_overflow_exception(THREAD, __FILE__, __LINE__, method);
 402     return;
 403   } else {
 404     // Touch pages checked if the OS needs them to be touched to be mapped.
 405     os::map_stack_shadow_pages(sp);
 406   }
 407 











 408   // do call
 409   { JavaCallWrapper link(method, receiver, result, CHECK);
 410     { HandleMark hm(thread);  // HandleMark used by HandleMarkCleaner
 411 
 412       // NOTE: if we move the computation of the result_val_address inside
 413       // the call to call_stub, the optimizer produces wrong code.
 414       intptr_t* result_val_address = (intptr_t*)(result->get_value_addr());
 415       intptr_t* parameter_address = args->parameters();
 416 #if INCLUDE_JVMCI
 417       // Gets the alternative target (if any) that should be called
 418       Handle alternative_target = args->alternative_target();
 419       if (!alternative_target.is_null()) {
 420         // Must extract verified entry point from HotSpotNmethod after VM to Java
 421         // transition in JavaCallWrapper constructor so that it is safe with
 422         // respect to nmethod sweeping.
 423         address verified_entry_point = (address) HotSpotJVMCI::InstalledCode::entryPoint(NULL, alternative_target());
 424         if (verified_entry_point != NULL) {
 425           thread->set_jvmci_alternate_call_target(verified_entry_point);
 426           entry_point = method->adapter()->get_i2c_entry();
 427         }
 428       }
 429 #endif
 430       StubRoutines::call_stub()(
 431         (address)&link,
 432         // (intptr_t*)&(result->_value), // see NOTE above (compiler problem)
 433         result_val_address,          // see NOTE above (compiler problem)
 434         result_type,
 435         method(),
 436         entry_point,
 437         parameter_address,
 438         args->size_of_parameters(),
 439         CHECK
 440       );
 441 
 442       result = link.result();  // circumvent MS C++ 5.0 compiler bug (result is clobbered across call)
 443       // Preserve oop return value across possible gc points
 444       if (oop_result_flag) {
 445         thread->set_vm_result((oop) result->get_jobject());
 446       }
 447     }
 448   } // Exit JavaCallWrapper (can block - potential return oop must be preserved)
 449 


< prev index next >