hotspot/src/share/vm/runtime/deoptimization.cpp
changeset 46998 efb404beeefb
parent 46968 9119841280f4
--- a/hotspot/src/share/vm/runtime/deoptimization.cpp	Mon Aug 28 14:07:07 2017 +0000
+++ b/hotspot/src/share/vm/runtime/deoptimization.cpp	Mon Aug 28 15:21:47 2017 +0000
@@ -1373,6 +1373,30 @@
 
 }
 
+#if INCLUDE_JVMCI
+address Deoptimization::deoptimize_for_missing_exception_handler(CompiledMethod* cm) {
+  // there is no exception handler for this pc => deoptimize
+  cm->make_not_entrant();
+
+  // Use Deoptimization::deoptimize for all of its side-effects:
+  // revoking biases of monitors, gathering traps statistics, logging...
+  // it also patches the return pc but we do not care about that
+  // since we return a continuation to the deopt_blob below.
+  JavaThread* thread = JavaThread::current();
+  RegisterMap reg_map(thread, UseBiasedLocking);
+  frame runtime_frame = thread->last_frame();
+  frame caller_frame = runtime_frame.sender(&reg_map);
+  assert(caller_frame.cb()->as_nmethod_or_null() == cm, "expect top frame nmethod");
+  Deoptimization::deoptimize(thread, caller_frame, &reg_map, Deoptimization::Reason_not_compiled_exception_handler);
+
+  MethodData* trap_mdo = get_method_data(thread, cm->method(), true);
+  if (trap_mdo != NULL) {
+    trap_mdo->inc_trap_count(Deoptimization::Reason_not_compiled_exception_handler);
+  }
+
+  return SharedRuntime::deopt_blob()->unpack_with_exception_in_tls();
+}
+#endif
 
 void Deoptimization::deoptimize_frame_internal(JavaThread* thread, intptr_t* id, DeoptReason reason) {
   assert(thread == Thread::current() || SafepointSynchronize::is_at_safepoint(),