< prev index next >

src/hotspot/share/code/compiledMethod.cpp

Print this page

        

*** 23,32 **** --- 23,33 ---- */ #include "precompiled.hpp" #include "code/compiledIC.hpp" #include "code/compiledMethod.inline.hpp" + #include "code/exceptionHandlerTable.hpp" #include "code/scopeDesc.hpp" #include "code/codeCache.hpp" #include "code/icBuffer.hpp" #include "gc/shared/barrierSet.hpp" #include "gc/shared/gcBehaviours.hpp"
*** 35,46 **** --- 36,49 ---- #include "logging/logTag.hpp" #include "memory/resourceArea.hpp" #include "oops/methodData.hpp" #include "oops/method.inline.hpp" #include "prims/methodHandles.hpp" + #include "runtime/deoptimization.hpp" #include "runtime/handles.inline.hpp" #include "runtime/mutexLocker.hpp" + #include "runtime/sharedRuntime.hpp" CompiledMethod::CompiledMethod(Method* method, const char* name, CompilerType type, const CodeBlobLayout& layout, int frame_complete_offset, int frame_size, ImmutableOopMapSet* oop_maps, bool caller_must_gc_arguments) : CodeBlob(name, type, layout, frame_complete_offset, frame_size, oop_maps, caller_must_gc_arguments),
*** 636,645 **** --- 639,688 ---- os::is_readable_pointer(method) && os::is_readable_pointer(method->constants()) && os::is_readable_pointer(method->signature()); } + address CompiledMethod::continuation_for_implicit_exception(address pc, bool for_div0_check) { + // Exception happened outside inline-cache check code => we are inside + // an active nmethod => use cpc to determine a return address + int exception_offset = pc - code_begin(); + int cont_offset = ImplicitExceptionTable(this).continuation_offset( exception_offset ); + #ifdef ASSERT + if (cont_offset == 0) { + Thread* thread = Thread::current(); + ResetNoHandleMark rnm; // Might be called from LEAF/QUICK ENTRY + HandleMark hm(thread); + ResourceMark rm(thread); + CodeBlob* cb = CodeCache::find_blob(pc); + assert(cb != NULL && cb == this, ""); + ttyLocker ttyl; + tty->print_cr("implicit exception happened at " INTPTR_FORMAT, p2i(pc)); + print(); + method()->print_codes(); + print_code(); + print_pcs(); + } + #endif + if (cont_offset == 0) { + // Let the normal error handling report the exception + return NULL; + } + if (cont_offset == exception_offset) { + #if INCLUDE_JVMCI + Deoptimization::DeoptReason deopt_reason = for_div0_check ? Deoptimization::Reason_div0_check : Deoptimization::Reason_null_check; + JavaThread *thread = JavaThread::current(); + thread->set_jvmci_implicit_exception_pc(pc); + thread->set_pending_deoptimization(Deoptimization::make_trap_request(deopt_reason, + Deoptimization::Action_reinterpret)); + return (SharedRuntime::deopt_blob()->implicit_exception_uncommon_trap()); + #else + ShouldNotReachHere(); + #endif + } + return code_begin() + cont_offset; + } + class HasEvolDependency : public MetadataClosure { bool _has_evol_dependency; public: HasEvolDependency() : _has_evol_dependency(false) {} void do_metadata(Metadata* md) {
< prev index next >