# HG changeset patch # User Roland Schatz # Date 1458582907 -3600 # Node ID 83b296a07c33eaec020ef88b295450e7ed99affa # Parent bc5552dc384b7e07dc02529cd16ebaca712b0302 Fix wrong pointer cast. diff -r bc5552dc384b -r 83b296a07c33 src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp --- a/src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp Mon Mar 21 13:52:18 2016 +0100 +++ b/src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp Mon Mar 21 18:55:07 2016 +0100 @@ -77,7 +77,7 @@ #endif } else { NativeMovConstReg* move = nativeMovConstReg_at(pc); - MetaspaceObj* reference = record_metadata_reference(constant, CHECK); + void* reference = record_metadata_reference(constant, CHECK); move->set_data((intptr_t)reference); TRACE_jvmci_3("relocating (metaspace constant) at %p/%p", pc, reference); } diff -r bc5552dc384b -r 83b296a07c33 src/cpu/x86/vm/jvmciCodeInstaller_x86.cpp --- a/src/cpu/x86/vm/jvmciCodeInstaller_x86.cpp Mon Mar 21 13:52:18 2016 +0100 +++ b/src/cpu/x86/vm/jvmciCodeInstaller_x86.cpp Mon Mar 21 18:55:07 2016 +0100 @@ -94,7 +94,7 @@ #endif } else { address operand = Assembler::locate_operand(pc, Assembler::imm_operand); - *((MetaspaceObj**) operand) = record_metadata_reference(constant, CHECK); + *((void**) operand) = record_metadata_reference(constant, CHECK); TRACE_jvmci_3("relocating (metaspace constant) at %p/%p", pc, operand); } } diff -r bc5552dc384b -r 83b296a07c33 src/share/vm/jvmci/jvmciCodeInstaller.cpp --- a/src/share/vm/jvmci/jvmciCodeInstaller.cpp Mon Mar 21 13:52:18 2016 +0100 +++ b/src/share/vm/jvmci/jvmciCodeInstaller.cpp Mon Mar 21 18:55:07 2016 +0100 @@ -159,7 +159,13 @@ return map; } -MetaspaceObj* CodeInstaller::record_metadata_reference(Handle constant, TRAPS) { +void* CodeInstaller::record_metadata_reference(Handle constant, TRAPS) { + /* + * This method needs to return a raw (untyped) pointer, since the value of a pointer to the base + * class is in general not equal to the pointer of the subclass. When patching metaspace pointers, + * the compiler expects a direct pointer to the subclass (Klass*, Method* or Symbol*), not a + * pointer to the base class (Metadata* or MetaspaceObj*). + */ oop obj = HotSpotMetaspaceConstantImpl::metaspaceObject(constant); if (obj->is_a(HotSpotResolvedObjectTypeImpl::klass())) { Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectTypeImpl::javaClass(obj)); @@ -177,7 +183,7 @@ Symbol* symbol = (Symbol*) (address) HotSpotSymbol::pointer(obj); assert(!HotSpotMetaspaceConstantImpl::compressed(constant), err_msg("unexpected compressed symbol pointer %s @ " INTPTR_FORMAT, symbol->as_C_string(), p2i(symbol))); TRACE_jvmci_3("symbol = %s", symbol->as_C_string()); - return (MetaspaceObj*) symbol; + return symbol; } else { JVMCI_ERROR_NULL("unexpected metadata reference for constant of type %s", obj->klass()->signature_name()); } @@ -612,7 +618,7 @@ JVMCI_ERROR_OK("unexpected compressed Klass* in 32-bit mode"); #endif } else { - *((MetaspaceObj**) dest) = record_metadata_reference(constant, CHECK_OK); + *((void**) dest) = record_metadata_reference(constant, CHECK_OK); } } else if (constant->is_a(HotSpotObjectConstantImpl::klass())) { Handle obj = HotSpotObjectConstantImpl::object(constant); diff -r bc5552dc384b -r 83b296a07c33 src/share/vm/jvmci/jvmciCodeInstaller.hpp --- a/src/share/vm/jvmci/jvmciCodeInstaller.hpp Mon Mar 21 13:52:18 2016 +0100 +++ b/src/share/vm/jvmci/jvmciCodeInstaller.hpp Mon Mar 21 18:55:07 2016 +0100 @@ -123,7 +123,7 @@ ScopeValue* get_scope_value(Handle value, BasicType type, GrowableArray* objects, ScopeValue* &second, TRAPS); MonitorValue* get_monitor_value(Handle value, GrowableArray* objects, TRAPS); - MetaspaceObj* record_metadata_reference(Handle constant, TRAPS); + void* record_metadata_reference(Handle constant, TRAPS); #ifdef _LP64 narrowKlass record_narrow_metadata_reference(Handle constant, TRAPS); #endif