Mercurial > hg > graal-jvmci-8
diff src/share/vm/c1/c1_Runtime1.cpp @ 4137:04b9a2566eec
Merge with hsx23/hotspot.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Sat, 17 Dec 2011 21:40:27 +0100 |
parents | 82f88223fcff cec1757a0134 |
children | 723df37192d6 |
line wrap: on
line diff
--- a/src/share/vm/c1/c1_Runtime1.cpp Sat Dec 17 20:50:09 2011 +0100 +++ b/src/share/vm/c1/c1_Runtime1.cpp Sat Dec 17 21:40:27 2011 +0100 @@ -383,16 +383,10 @@ JRT_END -JRT_ENTRY(void, Runtime1::post_jvmti_exception_throw(JavaThread* thread)) - if (JvmtiExport::can_post_on_exceptions()) { - vframeStream vfst(thread, true); - address bcp = vfst.method()->bcp_from(vfst.bci()); - JvmtiExport::post_exception_throw(thread, vfst.method(), bcp, thread->exception_oop()); - } -JRT_END - -// This is a helper to allow us to safepoint but allow the outer entry -// to be safepoint free if we need to do an osr +// counter_overflow() is called from within C1-compiled methods. The enclosing method is the method +// associated with the top activation record. The inlinee (that is possibly included in the enclosing +// method) method oop is passed as an argument. In order to do that it is embedded in the code as +// a constant. static nmethod* counter_overflow_helper(JavaThread* THREAD, int branch_bci, methodOopDesc* m) { nmethod* osr_nm = NULL; methodHandle method(THREAD, m); @@ -428,7 +422,7 @@ bci = branch_bci + offset; } - osr_nm = CompilationPolicy::policy()->event(enclosing_method, method, branch_bci, bci, level, THREAD); + osr_nm = CompilationPolicy::policy()->event(enclosing_method, method, branch_bci, bci, level, nm, THREAD); return osr_nm; } @@ -789,6 +783,23 @@ } JRT_END +// Cf. OptoRuntime::deoptimize_caller_frame +JRT_ENTRY(void, Runtime1::deoptimize(JavaThread* thread)) + // Called from within the owner thread, so no need for safepoint + RegisterMap reg_map(thread, false); + frame stub_frame = thread->last_frame(); + assert(stub_frame.is_runtime_frame(), "sanity check"); + frame caller_frame = stub_frame.sender(®_map); + + // We are coming from a compiled method; check this is true. + assert(CodeCache::find_nmethod(caller_frame.pc()) != NULL, "sanity"); + + // Deoptimize the caller frame. + Deoptimization::deoptimize_frame(thread, caller_frame.id()); + + // Return to the now deoptimized frame. +JRT_END + static klassOop resolve_field_return_klass(methodHandle caller, int bci, TRAPS) { Bytecode_field field_access(caller, bci);