changeset 3657:47edfca346ab

Fix a safepoint bug in code installer.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Thu, 17 Nov 2011 16:40:14 +0100
parents 2a0cb564e470
children ac1f800e73af
files src/share/vm/ci/ciMethod.cpp src/share/vm/ci/ciObject.cpp src/share/vm/graal/graalCodeInstaller.cpp src/share/vm/graal/graalCodeInstaller.hpp
diffstat 4 files changed, 44 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/ci/ciMethod.cpp	Thu Nov 17 00:52:17 2011 +0100
+++ b/src/share/vm/ci/ciMethod.cpp	Thu Nov 17 16:40:14 2011 +0100
@@ -97,11 +97,12 @@
   ciEnv *env = CURRENT_ENV;
   if (env->jvmti_can_hotswap_or_post_breakpoint() && can_be_compiled()) {
     // 6328518 check hotswap conditions under the right lock.
-    MutexLocker locker(Compile_lock);
-    if (Dependencies::check_evol_method(h_m()) != NULL) {
-      _is_c1_compilable = false;
-      _is_c2_compilable = false;
-    }
+    // TODO(tw): Check if we need that.
+    //MutexLocker locker(Compile_lock);
+    //if (Dependencies::check_evol_method(h_m()) != NULL) {
+    //  _is_c1_compilable = false;
+    //  _is_c2_compilable = false;
+    //}
   } else {
     CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops());
   }
--- a/src/share/vm/ci/ciObject.cpp	Thu Nov 17 00:52:17 2011 +0100
+++ b/src/share/vm/ci/ciObject.cpp	Thu Nov 17 16:40:14 2011 +0100
@@ -73,12 +73,7 @@
 ciObject::ciObject(Handle h) {
   ASSERT_IN_VM;
   if (ciObjectFactory::is_initialized()) {
-    if (UseGraal) {
-      _handle = JNIHandles::make_global(h);
-      _temp_global = true;
-    } else {
-      _handle = JNIHandles::make_local(h());
-    }
+    _handle = JNIHandles::make_local(h());
   } else {
     _handle = JNIHandles::make_global(h);
   }
--- a/src/share/vm/graal/graalCodeInstaller.cpp	Thu Nov 17 00:52:17 2011 +0100
+++ b/src/share/vm/graal/graalCodeInstaller.cpp	Thu Nov 17 16:40:14 2011 +0100
@@ -250,8 +250,29 @@
   //CodeBuffer buffer("temp graal method", _total_size, _sites->length() * relocInfo::length_limit);
   GraalCompiler::initialize_buffer_blob();
   CodeBuffer buffer(JavaThread::current()->get_buffer_blob());
-  initialize_buffer(buffer);
-  process_exception_handlers();
+  { 
+    No_Safepoint_Verifier no_safepoint;
+    initialize_buffer(buffer);
+    process_exception_handlers();
+  }
+
+  
+  if (_assumptions != NULL) {
+    objArrayHandle assumptions = (objArrayOop)_assumptions;
+    for (int i = 0; i < assumptions->length(); ++i) {
+      Handle assumption = assumptions->obj_at(i);
+      if (!assumption.is_null()) {
+        if (assumption->is_a(CiAssumptions_ConcreteSubtype::klass())) {
+          assumption_ConcreteSubtype(assumption);
+        } else if (assumption->is_a(CiAssumptions_ConcreteMethod::klass())) {
+          assumption_ConcreteMethod(assumption);
+        } else {
+          assumption->print();
+          fatal("unexpected Assumption subclass");
+        }
+      }
+    }
+  }
 
   int stack_slots = (_frame_size / HeapWordSize) + 2; // conversion to words, need to add two slots for ret address and frame pointer
   ThreadToNativeFromVM t((JavaThread*) Thread::current());
@@ -352,32 +373,14 @@
       fatal("unexpected Site subclass");
     }
   }
-
-
-  if (_assumptions != NULL) {
-    oop* assumptions = (oop*) _assumptions->base(T_OBJECT);
-    for (int i = 0; i < _assumptions->length(); ++i) {
-      oop assumption = assumptions[i];
-      if (assumption != NULL) {
-        if (assumption->is_a(CiAssumptions_ConcreteSubtype::klass())) {
-          assumption_ConcreteSubtype(assumption);
-        } else if (assumption->is_a(CiAssumptions_ConcreteMethod::klass())) {
-          assumption_ConcreteMethod(assumption);
-        } else {
-          assumption->print();
-          fatal("unexpected Assumption subclass");
-        }
-      }
-    }
-  }
 }
 
-void CodeInstaller::assumption_ConcreteSubtype(oop assumption) {
-  oop context_oop = CiAssumptions_ConcreteSubtype::context(assumption);
-  oop type_oop = CiAssumptions_ConcreteSubtype::subtype(assumption);
+void CodeInstaller::assumption_ConcreteSubtype(Handle assumption) {
+  Handle context_handle = CiAssumptions_ConcreteSubtype::context(assumption);
+  Handle type_handle = CiAssumptions_ConcreteSubtype::subtype(assumption);
 
-  ciKlass* context = (ciKlass*) CURRENT_ENV->get_object(java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(context_oop)));
-  ciKlass* type = (ciKlass*) CURRENT_ENV->get_object(java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(type_oop)));
+  ciKlass* context = (ciKlass*) CURRENT_ENV->get_object(java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(context_handle)));
+  ciKlass* type = (ciKlass*) CURRENT_ENV->get_object(java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(type_handle)));
 
   _dependencies->assert_leaf_type(type);
   if (context != type) {
@@ -387,14 +390,14 @@
   }
 }
 
-void CodeInstaller::assumption_ConcreteMethod(oop assumption) {
-  oop context_oop = CiAssumptions_ConcreteMethod::context(assumption);
-  oop method_oop = CiAssumptions_ConcreteMethod::method(assumption);
-  methodOop method = getMethodFromHotSpotMethod(method_oop);
-  methodOop context = getMethodFromHotSpotMethod(context_oop);
+void CodeInstaller::assumption_ConcreteMethod(Handle assumption) {
+  Handle context_handle = CiAssumptions_ConcreteMethod::context(assumption);
+  Handle method_handle = CiAssumptions_ConcreteMethod::method(assumption);
+  methodHandle method = getMethodFromHotSpotMethod(method_handle());
+  methodHandle context = getMethodFromHotSpotMethod(context_handle());
 
-  ciMethod* m = (ciMethod*) CURRENT_ENV->get_object(method);
-  ciMethod* c = (ciMethod*) CURRENT_ENV->get_object(context);
+  ciMethod* m = (ciMethod*) CURRENT_ENV->get_object(method());
+  ciMethod* c = (ciMethod*) CURRENT_ENV->get_object(context());
   ciKlass* context_klass = c->holder();
   {
     ThreadToNativeFromVM trans(JavaThread::current());
--- a/src/share/vm/graal/graalCodeInstaller.hpp	Thu Nov 17 00:52:17 2011 +0100
+++ b/src/share/vm/graal/graalCodeInstaller.hpp	Thu Nov 17 16:40:14 2011 +0100
@@ -97,8 +97,8 @@
   // perform data and call relocation on the CodeBuffer
   void initialize_buffer(CodeBuffer& buffer);
 
-  void assumption_ConcreteSubtype(oop assumption);
-  void assumption_ConcreteMethod(oop assumption);
+  void assumption_ConcreteSubtype(Handle assumption);
+  void assumption_ConcreteMethod(Handle assumption);
 
   void site_Safepoint(CodeBuffer& buffer, jint pc_offset, oop site);
   void site_Call(CodeBuffer& buffer, jint pc_offset, oop site);