diff src/share/vm/code/nmethod.cpp @ 13641:5a9afbf72714

Add a speculation oop for uncommon trap deoptimization. Save it in the SpeculationLog during deoptimization.
author Gilles Duboscq <duboscq@ssw.jku.at>
date Thu, 12 Dec 2013 15:13:02 +0100
parents 02f27ecb4f3a
children cd22c8dbda4f d8041d695d19
line wrap: on
line diff
--- a/src/share/vm/code/nmethod.cpp	Wed Jan 15 15:11:47 2014 +0100
+++ b/src/share/vm/code/nmethod.cpp	Thu Dec 12 15:13:02 2013 +0100
@@ -528,7 +528,7 @@
   _compiler                = NULL;
 #ifdef GRAAL
   _graal_installed_code   = NULL;
-  _triggered_deoptimizations = NULL;
+  _speculation_log        = NULL;
 #endif
 #ifdef HAVE_DTRACE_H
   _trap_offset             = 0;
@@ -627,7 +627,7 @@
   GrowableArray<jlong>* leaf_graph_ids
 #ifdef GRAAL
   , Handle installed_code,
-  Handle triggered_deoptimizations
+  Handle speculationLog
 #endif
 )
 {
@@ -656,7 +656,7 @@
             leaf_graph_ids
 #ifdef GRAAL
             , installed_code,
-            triggered_deoptimizations
+            speculationLog
 #endif
             );
 
@@ -885,7 +885,7 @@
   GrowableArray<jlong>* leaf_graph_ids
 #ifdef GRAAL
   , Handle installed_code,
-  Handle triggered_deoptimizations
+  Handle speculation_log
 #endif
   )
   : CodeBlob("nmethod", code_buffer, sizeof(nmethod),
@@ -913,7 +913,7 @@
 
 #ifdef GRAAL
     _graal_installed_code = installed_code();
-    _triggered_deoptimizations = (typeArrayOop)triggered_deoptimizations();
+    _speculation_log = (instanceOop)speculation_log();
 #endif
     if (compiler->is_graal()) {
       // Graal might not produce any stub sections
@@ -1762,6 +1762,12 @@
       }
     }
   }
+
+  if (_speculation_log != NULL) {
+    if (!is_alive->do_object_b(_speculation_log)) {
+      _speculation_log = NULL;
+    }
+  }
 #endif
 
   // Exception cache
@@ -1990,8 +1996,8 @@
   if (_graal_installed_code != NULL) {
     f->do_oop((oop*) &_graal_installed_code);
   }
-  if (_triggered_deoptimizations != NULL) {
-    f->do_oop((oop*) &_triggered_deoptimizations);
+  if (_speculation_log != NULL) {
+    f->do_oop((oop*) &_speculation_log);
   }
 #endif