# HG changeset patch # User Thomas Wuerthinger # Date 1321544414 -3600 # Node ID 47edfca346ab457fe176303a97c1a997fbeb1050 # Parent 2a0cb564e470bbb2f95ad1125fb2da1d46c0eedf Fix a safepoint bug in code installer. diff -r 2a0cb564e470 -r 47edfca346ab src/share/vm/ci/ciMethod.cpp --- 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()); } diff -r 2a0cb564e470 -r 47edfca346ab src/share/vm/ci/ciObject.cpp --- 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); } diff -r 2a0cb564e470 -r 47edfca346ab src/share/vm/graal/graalCodeInstaller.cpp --- 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()); diff -r 2a0cb564e470 -r 47edfca346ab src/share/vm/graal/graalCodeInstaller.hpp --- 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);