changeset 5111:422c979ff392

fixed two cases where DeoptAction was invalid
author Christian Haeubl <christian.haeubl@oracle.com>
date Thu, 15 Mar 2012 16:34:31 -0700
parents 0ebca2e35ca5
children 88c339d1d617
files graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64DeoptimizationStub.java src/cpu/x86/vm/c1_Runtime1_x86.cpp src/cpu/x86/vm/sharedRuntime_x86_64.cpp src/share/vm/code/codeBlob.hpp src/share/vm/oops/methodDataOop.hpp src/share/vm/runtime/sharedRuntime.cpp src/share/vm/runtime/sharedRuntime.hpp src/share/vm/runtime/thread.cpp src/share/vm/runtime/vm_operations.cpp
diffstat 9 files changed, 26 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- 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;
--- 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);
   }
--- 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
 }
 
--- 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;     }
 
 };
 
--- 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
--- 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
--- 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,
--- 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);
     }
   }
 
--- 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);
               }
             }
           }