changeset 23330:83b296a07c33

Fix wrong pointer cast.
author Roland Schatz <roland.schatz@oracle.com>
date Mon, 21 Mar 2016 18:55:07 +0100
parents bc5552dc384b
children 459ec97bec01
files src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp src/cpu/x86/vm/jvmciCodeInstaller_x86.cpp src/share/vm/jvmci/jvmciCodeInstaller.cpp src/share/vm/jvmci/jvmciCodeInstaller.hpp
diffstat 4 files changed, 12 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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);
   }
--- 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);
   }
 }
--- 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);
--- 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<ScopeValue*>* objects, ScopeValue* &second, TRAPS);
   MonitorValue* get_monitor_value(Handle value, GrowableArray<ScopeValue*>* 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