# HG changeset patch # User Thomas Wuerthinger # Date 1363562407 -3600 # Node ID 37977d1dcedc09ddbcdf203c895e6b330b926fa3 # Parent 38be33a1c28d638319517477d21aa033cdb22951 Transmit deoptimization reason in thread local. diff -r 38be33a1c28d -r 37977d1dcedc graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64DeoptimizeOp.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64DeoptimizeOp.java Mon Mar 18 00:12:00 2013 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64DeoptimizeOp.java Mon Mar 18 00:20:07 2013 +0100 @@ -27,6 +27,7 @@ import com.oracle.graal.api.code.RuntimeCallTarget.Descriptor; import com.oracle.graal.api.meta.*; import com.oracle.graal.asm.amd64.*; +import com.oracle.graal.hotspot.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.LIRInstruction.*; import com.oracle.graal.lir.amd64.*; @@ -40,18 +41,18 @@ private DeoptimizationAction action; private DeoptimizationReason reason; @State private LIRFrameState info; - @Temp protected RegisterValue deoptimizationReason; AMD64DeoptimizeOp(DeoptimizationAction action, DeoptimizationReason reason, LIRFrameState info) { this.action = action; this.reason = reason; this.info = info; - this.deoptimizationReason = AMD64.r10.asValue(Kind.Int); } @Override public void emitCode(TargetMethodAssembler tasm, AMD64MacroAssembler masm) { - masm.movl(deoptimizationReason.getRegister(), tasm.runtime.encodeDeoptActionAndReason(action, reason)); + HotSpotGraalRuntime runtime = HotSpotGraalRuntime.getInstance(); + Register thread = runtime.getRuntime().threadRegister(); + masm.movl(new AMD64Address(thread, runtime.getConfig().pendingDeoptimizationOffset), tasm.runtime.encodeDeoptActionAndReason(action, reason)); AMD64Call.directCall(tasm, masm, tasm.runtime.lookupRuntimeCall(DEOPTIMIZE), null, false, info); } } diff -r 38be33a1c28d -r 37977d1dcedc graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Mon Mar 18 00:12:00 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Mon Mar 18 00:20:07 2013 +0100 @@ -169,6 +169,11 @@ public int uninitializedIdentityHashCodeValue; /** + * Offset of the pending deoptimization field. + */ + public int pendingDeoptimizationOffset; + + /** * Mark word right shift to get identity hash code. */ public int identityHashCodeShift; diff -r 38be33a1c28d -r 37977d1dcedc src/cpu/x86/vm/sharedRuntime_x86_64.cpp --- a/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Mon Mar 18 00:12:00 2013 +0100 +++ b/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Mon Mar 18 00:20:07 2013 +0100 @@ -3408,8 +3408,8 @@ __ jmp(cont); int implicit_exception_uncommon_trap_offset = __ pc() - start; + // pc where the exception happened is in ScratchA __ pushptr(Address(r15_thread, in_bytes(JavaThread::ScratchA_offset()))); - __ movptr(rscratch1, Address(r15_thread, in_bytes(JavaThread::ScratchB_offset()))); int uncommon_trap_offset = __ pc() - start; @@ -3418,8 +3418,8 @@ // fetch_unroll_info needs to call last_java_frame() __ set_last_Java_frame(noreg, noreg, NULL); - assert(r10 == rscratch1, "scratch register should be r10"); - __ movl(c_rarg1, Address(rsp, RegisterSaver::r10_offset_in_bytes())); + __ movl(c_rarg1, Address(r15_thread, in_bytes(ThreadShadow::pending_deoptimization_offset()))); + __ movl(Address(r15_thread, in_bytes(ThreadShadow::pending_deoptimization_offset())), 0); __ movl(r14, (int32_t)Deoptimization::Unpack_reexecute); __ mov(c_rarg0, r15_thread); diff -r 38be33a1c28d -r 37977d1dcedc src/share/vm/graal/graalCompilerToVM.cpp --- a/src/share/vm/graal/graalCompilerToVM.cpp Mon Mar 18 00:12:00 2013 +0100 +++ b/src/share/vm/graal/graalCompilerToVM.cpp Mon Mar 18 00:20:07 2013 +0100 @@ -662,6 +662,9 @@ assert((Klass::_lh_array_tag_obj_value & Klass::_lh_array_tag_type_value & 0x80000000) != 0, "obj_array and type_array must have first bit set"); set_int("arrayKlassComponentMirrorOffset", in_bytes(ArrayKlass::component_mirror_offset())); + + set_int("pendingDeoptimizationOffset", in_bytes(ThreadShadow::pending_deoptimization_offset())); + set_int("metaspaceArrayLengthOffset", Array::length_offset_in_bytes()); set_int("metaspaceArrayBaseOffset", Array::base_offset_in_bytes()); set_int("methodDataOopDataOffset", in_bytes(MethodData::data_offset())); diff -r 38be33a1c28d -r 37977d1dcedc src/share/vm/runtime/sharedRuntime.cpp --- a/src/share/vm/runtime/sharedRuntime.cpp Mon Mar 18 00:12:00 2013 +0100 +++ b/src/share/vm/runtime/sharedRuntime.cpp Mon Mar 18 00:20:07 2013 +0100 @@ -774,7 +774,7 @@ 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"); thread->_ScratchA = (intptr_t)pc; - thread->_ScratchB = Deoptimization::make_trap_request((Deoptimization::DeoptReason)deopt_reason, Deoptimization::Action_reinterpret); + thread->set_pending_deoptimization(Deoptimization::make_trap_request((Deoptimization::DeoptReason)deopt_reason, Deoptimization::Action_reinterpret)); return (SharedRuntime::deopt_blob()->implicit_exception_uncommon_trap()); } #endif diff -r 38be33a1c28d -r 37977d1dcedc src/share/vm/utilities/exceptions.hpp --- a/src/share/vm/utilities/exceptions.hpp Mon Mar 18 00:12:00 2013 +0100 +++ b/src/share/vm/utilities/exceptions.hpp Mon Mar 18 00:20:07 2013 +0100 @@ -61,6 +61,7 @@ friend class VMStructs; protected: + int _pending_deoptimization; bool _pending_monitorenter; oop _pending_exception; // Thread has gc actions. const char* _exception_file; // file information for exception (debugging only) @@ -77,16 +78,19 @@ public: oop pending_exception() const { return _pending_exception; } + int pending_deoptimization() const { return _pending_deoptimization; } bool has_pending_exception() const { return _pending_exception != NULL; } const char* exception_file() const { return _exception_file; } int exception_line() const { return _exception_line; } bool has_pending_monitorenter() const { return _pending_monitorenter; } // Code generation support + static ByteSize pending_deoptimization_offset() { return byte_offset_of(ThreadShadow, _pending_deoptimization); } static ByteSize pending_exception_offset() { return byte_offset_of(ThreadShadow, _pending_exception); } static ByteSize pending_monitorenter_offset() { return byte_offset_of(ThreadShadow, _pending_monitorenter); } - bool set_pending_monitorenter(bool b) { return _pending_monitorenter = b; } + void set_pending_monitorenter(bool b) { _pending_monitorenter = b; } + void set_pending_deoptimization(int reason) { _pending_deoptimization = reason; } // use THROW whenever possible! void set_pending_exception(oop exception, const char* file, int line); @@ -95,7 +99,7 @@ void clear_pending_exception(); ThreadShadow() : _pending_exception(NULL), - _exception_file(NULL), _exception_line(0), _pending_monitorenter(false) {} + _exception_file(NULL), _exception_line(0), _pending_monitorenter(false), _pending_deoptimization(-1) {} };