Mercurial > hg > graal-jvmci-8
changeset 23734:2e17c65dddd7 jvmci-0.18
8163105: SIGSEGV: constantPoolHandle::constantPoolHandle(ConstantPool*)
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Thu, 04 Aug 2016 18:07:20 +0200 |
parents | b4838d622f3f |
children | 009dff60a086 |
files | jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java src/share/vm/jvmci/jvmciCompilerToVM.cpp |
diffstat | 4 files changed, 30 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
--- a/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java Tue Aug 02 17:25:40 2016 -0700 +++ b/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java Thu Aug 04 18:07:20 2016 +0200 @@ -552,20 +552,18 @@ native HotSpotResolvedJavaMethodImpl getResolvedJavaMethod(Object base, long displacement); /** - * Read a HotSpot ConstantPool* value from the memory location described by {@code base} plus - * {@code displacement} and return the {@link HotSpotConstantPool} wrapping it. This method does - * no checking that the memory location actually contains a valid pointer and may crash the VM - * if an invalid location is provided. If the {@code base} is null then {@code displacement} is - * used by itself. If {@code base} is a {@link HotSpotResolvedJavaMethodImpl}, - * {@link HotSpotConstantPool} or {@link HotSpotResolvedObjectTypeImpl} then the metaspace - * pointer is fetched from that object and added to {@code displacement}. Any other non-null - * object type causes an {@link IllegalArgumentException} to be thrown. + * Gets the {@code ConstantPool*} associated with {@code object} and returns a + * {@link HotSpotConstantPool} wrapping it. * - * @param base an object to read from or null - * @param displacement - * @return null or the resolved method for this location + * @param object a {@link HotSpotResolvedJavaMethodImpl} or + * {@link HotSpotResolvedObjectTypeImpl} object + * @return a {@link HotSpotConstantPool} wrapping the {@code ConstantPool*} associated with + * {@code object} + * @throws NullPointerException if {@code object == null} + * @throws IllegalArgumentException if {@code object} is neither a + * {@link HotSpotResolvedJavaMethodImpl} nor a {@link HotSpotResolvedObjectTypeImpl} */ - native HotSpotConstantPool getConstantPool(Object base, long displacement); + native HotSpotConstantPool getConstantPool(Object object); /** * Read a HotSpot Klass* value from the memory location described by {@code base} plus
--- a/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java Tue Aug 02 17:25:40 2016 -0700 +++ b/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java Thu Aug 04 18:07:20 2016 +0200 @@ -121,7 +121,7 @@ if (metaspaceConstantPool == holder.getConstantPool().getMetaspaceConstantPool()) { this.constantPool = holder.getConstantPool(); } else { - this.constantPool = compilerToVM().getConstantPool(null, constMethod + config.constMethodConstantsOffset); + this.constantPool = compilerToVM().getConstantPool(this); } final int nameIndex = UNSAFE.getChar(constMethod + config.constMethodNameIndexOffset);
--- a/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java Tue Aug 02 17:25:40 2016 -0700 +++ b/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java Thu Aug 04 18:07:20 2016 +0200 @@ -446,7 +446,7 @@ * operating on the latest one and that HotSpotResolvedJavaMethodImpls will be able to * use the shared copy instead of creating their own instance. */ - constantPool = compilerToVM().getConstantPool(this, config().instanceKlassConstantsOffset); + constantPool = compilerToVM().getConstantPool(this); } return constantPool; }
--- a/src/share/vm/jvmci/jvmciCompilerToVM.cpp Tue Aug 02 17:25:40 2016 -0700 +++ b/src/share/vm/jvmci/jvmciCompilerToVM.cpp Thu Aug 04 18:07:20 2016 +0200 @@ -451,31 +451,26 @@ return JNIHandles::make_local(THREAD, result); } -C2V_VMENTRY(jobject, getConstantPool, (JNIEnv *, jobject, jobject base, jlong offset)) +C2V_VMENTRY(jobject, getConstantPool, (JNIEnv *, jobject, jobject object_handle)) constantPoolHandle cp; - oop base_object = JNIHandles::resolve(base); - jlong base_address = 0; - if (base_object != NULL) { - if (base_object->is_a(SystemDictionary::HotSpotResolvedJavaMethodImpl_klass())) { - base_address = HotSpotResolvedJavaMethodImpl::metaspaceMethod(base_object); - } else if (base_object->is_a(SystemDictionary::HotSpotConstantPool_klass())) { - base_address = HotSpotConstantPool::metaspaceConstantPool(base_object); - } else if (base_object->is_a(SystemDictionary::HotSpotResolvedObjectTypeImpl_klass())) { - base_address = (jlong) CompilerToVM::asKlass(base_object); - } else { - THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), - err_msg("Unexpected type: %s", base_object->klass()->external_name())); - } + oop object = JNIHandles::resolve(object_handle); + if (object == NULL) { + THROW_0(vmSymbols::java_lang_NullPointerException()); } - cp = *((ConstantPool**) (intptr_t) (base_address + offset)); - if (!cp.is_null()) { - JavaValue method_result(T_OBJECT); - JavaCallArguments args; - args.push_long((jlong) (address) cp()); - JavaCalls::call_static(&method_result, SystemDictionary::HotSpotConstantPool_klass(), vmSymbols::fromMetaspace_name(), vmSymbols::constantPool_fromMetaspace_signature(), &args, CHECK_NULL); - return JNIHandles::make_local(THREAD, (oop)method_result.get_jobject()); + if (object->is_a(SystemDictionary::HotSpotResolvedJavaMethodImpl_klass())) { + cp = CompilerToVM::asMethod(object)->constMethod()->constants(); + } else if (object->is_a(SystemDictionary::HotSpotResolvedObjectTypeImpl_klass())) { + cp = InstanceKlass::cast(CompilerToVM::asKlass(object))->constants(); + } else { + THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), + err_msg("Unexpected type: %s", object->klass()->external_name())); } - return NULL; + assert(!cp.is_null(), "npe"); + JavaValue method_result(T_OBJECT); + JavaCallArguments args; + args.push_long((jlong) (address) cp()); + JavaCalls::call_static(&method_result, SystemDictionary::HotSpotConstantPool_klass(), vmSymbols::fromMetaspace_name(), vmSymbols::constantPool_fromMetaspace_signature(), &args, CHECK_NULL); + return JNIHandles::make_local(THREAD, (oop)method_result.get_jobject()); } C2V_VMENTRY(jobject, getResolvedJavaType, (JNIEnv *, jobject, jobject base, jlong offset, jboolean compressed)) @@ -1469,7 +1464,7 @@ {CC"getMaxCallTargetOffset", CC"(J)J", FN_PTR(getMaxCallTargetOffset)}, {CC"getResolvedJavaMethodAtSlot", CC"("CLASS"I)"HS_RESOLVED_METHOD, FN_PTR(getResolvedJavaMethodAtSlot)}, {CC"getResolvedJavaMethod", CC"(Ljava/lang/Object;J)"HS_RESOLVED_METHOD, FN_PTR(getResolvedJavaMethod)}, - {CC"getConstantPool", CC"(Ljava/lang/Object;J)"HS_CONSTANT_POOL, FN_PTR(getConstantPool)}, + {CC"getConstantPool", CC"(Ljava/lang/Object;)"HS_CONSTANT_POOL, FN_PTR(getConstantPool)}, {CC"getResolvedJavaType", CC"(Ljava/lang/Object;JZ)"HS_RESOLVED_KLASS, FN_PTR(getResolvedJavaType)}, {CC"readConfiguration", CC"()[Ljava/lang/Object;", FN_PTR(readConfiguration)}, {CC"installCode", CC"("TARGET_DESCRIPTION HS_COMPILED_CODE INSTALLED_CODE HS_SPECULATION_LOG")I", FN_PTR(installCode)},