# HG changeset patch # User Christian Haeubl # Date 1331854471 25200 # Node ID 422c979ff3927f7894ff469026bac8692225002c # Parent 0ebca2e35ca5a992243f3a0e03c8583e5238f80e fixed two cases where DeoptAction was invalid diff -r 0ebca2e35ca5 -r 422c979ff392 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64DeoptimizationStub.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64DeoptimizationStub.java Thu Mar 15 15:31:34 2012 -0700 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64DeoptimizationStub.java Thu Mar 15 16:34:31 2012 -0700 @@ -70,7 +70,7 @@ AMD64Call.shouldNotReachHere(tasm, masm); } - // TODO (ch) this is HotSpot specific -> move it somewhere else + // TODO (chaeubl) this is HotSpot specific -> move it somewhere else public static int encodeDeoptActionAndReason(DeoptAction action, DeoptReason reason) { final int actionShift = 0; final int reasonShift = 3; @@ -80,7 +80,7 @@ return (~(((reasonValue) << reasonShift) + ((actionValue) << actionShift))); } - // TODO (ch) this is HotSpot specific -> move it somewhere else + // TODO (chaeubl) this is HotSpot specific -> move it somewhere else private static int getDeoptActionValue(DeoptAction action) { switch(action) { case None: return 0; @@ -92,7 +92,7 @@ } } - // TODO (ch) this is HotSpot specific -> move it somewhere else + // TODO (chaeubl) this is HotSpot specific -> move it somewhere else private static int getDeoptReasonValue(DeoptReason reason) { switch(reason) { case None: return 0; diff -r 0ebca2e35ca5 -r 422c979ff392 src/cpu/x86/vm/c1_Runtime1_x86.cpp --- a/src/cpu/x86/vm/c1_Runtime1_x86.cpp Thu Mar 15 15:31:34 2012 -0700 +++ b/src/cpu/x86/vm/c1_Runtime1_x86.cpp Thu Mar 15 16:34:31 2012 -0700 @@ -101,7 +101,7 @@ restore_live_registers(this, false); movptr(Address(thread, Thread::pending_exception_offset()), NULL_WORD); leave(); - movl(rscratch1, 2); // InvalidateRecompile + movl(rscratch1, Deoptimization::make_trap_request(Deoptimization::Reason_constraint, Deoptimization::Action_reinterpret)); jump(RuntimeAddress(SharedRuntime::deopt_blob()->uncommon_trap())); bind(L); } diff -r 0ebca2e35ca5 -r 422c979ff392 src/cpu/x86/vm/sharedRuntime_x86_64.cpp --- a/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Thu Mar 15 15:31:34 2012 -0700 +++ b/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Thu Mar 15 16:34:31 2012 -0700 @@ -3015,9 +3015,9 @@ #ifdef GRAAL __ jmp(cont); - int jmp_uncommon_trap_offset = __ pc() - start; + int implicit_exception_uncommon_trap_offset = __ pc() - start; __ pushptr(Address(r15_thread, in_bytes(JavaThread::ScratchA_offset()))); - __ movptr(rscratch1, 2); // InvalidateRecompile + __ movptr(rscratch1, Address(r15_thread, in_bytes(JavaThread::ScratchB_offset()))); int uncommon_trap_offset = __ pc() - start; @@ -3244,7 +3244,7 @@ _deopt_blob->set_unpack_with_exception_in_tls_offset(exception_in_tls_offset); #ifdef GRAAL _deopt_blob->set_uncommon_trap_offset(uncommon_trap_offset); - _deopt_blob->set_jmp_uncommon_trap_offset(jmp_uncommon_trap_offset); + _deopt_blob->set_implicit_exception_uncommon_trap_offset(implicit_exception_uncommon_trap_offset); #endif } diff -r 0ebca2e35ca5 -r 422c979ff392 src/share/vm/code/codeBlob.hpp --- a/src/share/vm/code/codeBlob.hpp Thu Mar 15 15:31:34 2012 -0700 +++ b/src/share/vm/code/codeBlob.hpp Thu Mar 15 16:34:31 2012 -0700 @@ -407,7 +407,7 @@ // (thomaswue) Offset when graal calls uncommon_trap. int _uncommon_trap_offset; - int _jmp_uncommon_trap_offset; + int _implicit_exception_uncommon_trap_offset; // Creation support @@ -469,11 +469,11 @@ assert(contains(code_begin() + _uncommon_trap_offset), "must be PC inside codeblob"); } address uncommon_trap() const { return code_begin() + _uncommon_trap_offset; } - void set_jmp_uncommon_trap_offset(int offset) { - _jmp_uncommon_trap_offset = offset; - assert(contains(code_begin() + _jmp_uncommon_trap_offset), "must be PC inside codeblob"); + void set_implicit_exception_uncommon_trap_offset(int offset) { + _implicit_exception_uncommon_trap_offset = offset; + assert(contains(code_begin() + _implicit_exception_uncommon_trap_offset), "must be PC inside codeblob"); } - address jmp_uncommon_trap() const { return code_begin() + _jmp_uncommon_trap_offset; } + address implicit_exception_uncommon_trap() const { return code_begin() + _implicit_exception_uncommon_trap_offset; } }; diff -r 0ebca2e35ca5 -r 422c979ff392 src/share/vm/oops/methodDataOop.hpp --- a/src/share/vm/oops/methodDataOop.hpp Thu Mar 15 15:31:34 2012 -0700 +++ b/src/share/vm/oops/methodDataOop.hpp Thu Mar 15 16:34:31 2012 -0700 @@ -1206,7 +1206,11 @@ // Whole-method sticky bits and flags public: enum { +#ifdef GRAAL + _trap_hist_limit = 13, // decoupled from Deoptimization::Reason_LIMIT +#else _trap_hist_limit = 17, // decoupled from Deoptimization::Reason_LIMIT +#endif _trap_hist_mask = max_jubyte, _extra_data_count = 4 // extra DataLayout headers, for trap history }; // Public flag values diff -r 0ebca2e35ca5 -r 422c979ff392 src/share/vm/runtime/sharedRuntime.cpp --- a/src/share/vm/runtime/sharedRuntime.cpp Thu Mar 15 15:31:34 2012 -0700 +++ b/src/share/vm/runtime/sharedRuntime.cpp Thu Mar 15 16:34:31 2012 -0700 @@ -789,13 +789,14 @@ throw_and_post_jvmti_exception(thread, exception); JRT_END -address SharedRuntime::deoptimization_continuation(JavaThread* thread, address pc, nmethod* nm) -{ +address SharedRuntime::deoptimize_for_implicit_exception(JavaThread* thread, address pc, nmethod* nm, int deopt_reason) { + assert(deopt_reason > Deoptimization::Reason_none && deopt_reason < Deoptimization::Reason_LIMIT, "invalid deopt reason"); if (TraceSignals) { tty->print_cr(err_msg("Deoptimizing on implicit exception at relative pc=%d in method %s", pc - nm->entry_point(), nm->method()->name()->as_C_string())); } thread->_ScratchA = (intptr_t)pc; - return (SharedRuntime::deopt_blob()->jmp_uncommon_trap()); + thread->_ScratchB = Deoptimization::make_trap_request((Deoptimization::DeoptReason)deopt_reason, Deoptimization::Action_reinterpret); + return (SharedRuntime::deopt_blob()->implicit_exception_uncommon_trap()); } JRT_ENTRY(void, SharedRuntime::throw_WrongMethodTypeException(JavaThread* thread, oopDesc* required, oopDesc* actual)) @@ -891,7 +892,7 @@ _implicit_null_throws++; #endif #ifdef GRAAL - target_pc = deoptimization_continuation(thread, pc, nm); + target_pc = deoptimize_for_implicit_exception(thread, pc, nm, Deoptimization::Reason_null_check); #else target_pc = nm->continuation_for_implicit_exception(pc); #endif @@ -914,7 +915,7 @@ if (TraceSignals) { tty->print_cr("graal implicit div0"); } - target_pc = deoptimization_continuation(thread, pc, nm); + target_pc = deoptimize_for_implicit_exception(thread, pc, nm, Deoptimization::Reason_div0_check); #else target_pc = nm->continuation_for_implicit_exception(pc); #endif diff -r 0ebca2e35ca5 -r 422c979ff392 src/share/vm/runtime/sharedRuntime.hpp --- a/src/share/vm/runtime/sharedRuntime.hpp Thu Mar 15 15:31:34 2012 -0700 +++ b/src/share/vm/runtime/sharedRuntime.hpp Thu Mar 15 16:34:31 2012 -0700 @@ -187,7 +187,7 @@ static void throw_NullPointerException(JavaThread* thread); static void throw_NullPointerException_at_call(JavaThread* thread); static void throw_StackOverflowError(JavaThread* thread); - static address deoptimization_continuation(JavaThread* thread, address pc, nmethod* nm); + static address deoptimize_for_implicit_exception(JavaThread* thread, address pc, nmethod* nm, int deopt_reason); static void throw_WrongMethodTypeException(JavaThread* thread, oopDesc* required, oopDesc* actual); static address continuation_for_implicit_exception(JavaThread* thread, address faulting_pc, diff -r 0ebca2e35ca5 -r 422c979ff392 src/share/vm/runtime/thread.cpp --- a/src/share/vm/runtime/thread.cpp Thu Mar 15 15:31:34 2012 -0700 +++ b/src/share/vm/runtime/thread.cpp Thu Mar 15 16:34:31 2012 -0700 @@ -2490,7 +2490,7 @@ trace_frames(); trace_stack(); } - Deoptimization::deoptimize(this, *fst.current(), fst.register_map()); + Deoptimization::deoptimize(this, *fst.current(), fst.register_map(), Deoptimization::Reason_constraint); } } diff -r 0ebca2e35ca5 -r 422c979ff392 src/share/vm/runtime/vm_operations.cpp --- a/src/share/vm/runtime/vm_operations.cpp Thu Mar 15 15:31:34 2012 -0700 +++ b/src/share/vm/runtime/vm_operations.cpp Thu Mar 15 16:34:31 2012 -0700 @@ -125,7 +125,7 @@ void VM_DeoptimizeFrame::doit() { - assert(_reason > Deoptimization::Reason_none && _reason < Deoptimization::DeoptReason.Reason_LIMIT, "invalid deopt reason"); + assert(_reason > Deoptimization::Reason_none && _reason < Deoptimization::Reason_LIMIT, "invalid deopt reason"); Deoptimization::deoptimize_frame_internal(_thread, _id, (Deoptimization::DeoptReason)_reason); } @@ -158,7 +158,7 @@ if (fst.current()->can_be_deoptimized()) { if (fcount++ == fnum) { fcount = 0; - Deoptimization::deoptimize(thread, *fst.current(), fst.register_map()); + Deoptimization::deoptimize(thread, *fst.current(), fst.register_map(), Deoptimization::Reason_constraint); } } }