changeset 8337:37977d1dcedc

Transmit deoptimization reason in thread local.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Mon, 18 Mar 2013 00:20:07 +0100
parents 38be33a1c28d
children 16e34a47039b
files graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64DeoptimizeOp.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java src/cpu/x86/vm/sharedRuntime_x86_64.cpp src/share/vm/graal/graalCompilerToVM.cpp src/share/vm/runtime/sharedRuntime.cpp src/share/vm/utilities/exceptions.hpp
diffstat 6 files changed, 22 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- 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);
     }
 }
--- 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;
--- 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);
--- 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<Klass*>::length_offset_in_bytes());
   set_int("metaspaceArrayBaseOffset", Array<Klass*>::base_offset_in_bytes());
   set_int("methodDataOopDataOffset", in_bytes(MethodData::data_offset()));
--- 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
--- 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) {}
 };