< 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 >