8191227: issues with unsafe handle resolution
Summary: added ThreadInVMfromNative or ThreadInVMfromUnknown support
Reviewed-by: thartmann, vlivanov
--- a/src/hotspot/cpu/sparc/c1_LIRAssembler_sparc.cpp Mon Nov 27 11:41:00 2017 +0100
+++ b/src/hotspot/cpu/sparc/c1_LIRAssembler_sparc.cpp Mon Nov 27 03:11:38 2017 -0800
@@ -398,8 +398,13 @@
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
}
--- a/src/hotspot/share/code/debugInfo.cpp Mon Nov 27 11:41:00 2017 +0100
+++ b/src/hotspot/share/code/debugInfo.cpp Mon Nov 27 03:11:38 2017 -0800
@@ -28,6 +28,8 @@
#include "code/nmethod.hpp"
#include "oops/oop.inline.hpp"
#include "runtime/handles.inline.hpp"
+#include "runtime/interfaceSupport.hpp"
+#include "runtime/thread.hpp"
// Constructors
@@ -209,14 +211,24 @@
// 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);
}