diff -r 9e3267ffe6ec -r efb404beeefb hotspot/src/share/vm/runtime/deoptimization.cpp --- 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(®_map); + assert(caller_frame.cb()->as_nmethod_or_null() == cm, "expect top frame nmethod"); + Deoptimization::deoptimize(thread, caller_frame, ®_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(),