From cd702a95fa001f0a855c083d42bfb8c55d87bd4a Mon Sep 17 00:00:00 2001 From: rraghavan Date: Mon, 27 Nov 2017 03:11:38 -0800 Subject: [PATCH] 8191227: issues with unsafe handle resolution Summary: added ThreadInVMfromNative or ThreadInVMfromUnknown support Reviewed-by: thartmann, vlivanov --- src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp | 7 ++++++- src/share/vm/code/debugInfo.cpp | 18 +++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp b/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp index b519b34da..0bd581aaf 100644 --- a/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp +++ b/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp @@ -509,8 +509,13 @@ void LIR_Assembler::jobject2reg(jobject o, Register reg) { if (o == NULL) { __ set(NULL_WORD, reg); } else { +#ifdef ASSERT + { + ThreadInVMfromNative tiv(JavaThread::current()); + assert(Universe::heap()->is_in_reserved(JNIHandles::resolve(o)), "should be real oop"); + } +#endif int oop_index = __ oop_recorder()->find_index(o); - assert(Universe::heap()->is_in_reserved(JNIHandles::resolve(o)), "should be real oop"); RelocationHolder rspec = oop_Relocation::spec(oop_index); __ set(NULL_WORD, reg, rspec); // Will be set when the nmethod is created } diff --git a/src/share/vm/code/debugInfo.cpp b/src/share/vm/code/debugInfo.cpp index 3b01884c6..f04d93f88 100644 --- a/src/share/vm/code/debugInfo.cpp +++ b/src/share/vm/code/debugInfo.cpp @@ -27,6 +27,8 @@ #include "code/debugInfoRec.hpp" #include "code/nmethod.hpp" #include "runtime/handles.inline.hpp" +#include "runtime/interfaceSupport.hpp" +#include "runtime/thread.hpp" PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC @@ -204,14 +206,24 @@ void ConstantDoubleValue::print_on(outputStream* st) const { // ConstantOopWriteValue void ConstantOopWriteValue::write_on(DebugInfoWriteStream* stream) { - assert(JNIHandles::resolve(value()) == NULL || - Universe::heap()->is_in_reserved(JNIHandles::resolve(value())), - "Should be in heap"); +#ifdef ASSERT + { + // cannot use ThreadInVMfromNative here since in case of JVMCI compiler, + // thread is already in VM state. + ThreadInVMfromUnknown tiv; + assert(JNIHandles::resolve(value()) == NULL || + Universe::heap()->is_in_reserved(JNIHandles::resolve(value())), + "Should be in heap"); + } +#endif stream->write_int(CONSTANT_OOP_CODE); stream->write_handle(value()); } void ConstantOopWriteValue::print_on(outputStream* st) const { + // using ThreadInVMfromUnknown here since in case of JVMCI compiler, + // thread is already in VM state. + ThreadInVMfromUnknown tiv; JNIHandles::resolve(value())->print_value_on(st); } -- GitLab