hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp
changeset 36842 8f0d0faa51e2
parent 36329 06727ae6971e
child 38678 06d6c40ce33b
equal deleted inserted replaced
36840:29d9167ccc82 36842:8f0d0faa51e2
   175     }
   175     }
   176   }
   176   }
   177   return map;
   177   return map;
   178 }
   178 }
   179 
   179 
   180 Metadata* CodeInstaller::record_metadata_reference(Handle constant, TRAPS) {
   180 void* CodeInstaller::record_metadata_reference(Handle constant, TRAPS) {
       
   181   /*
       
   182    * This method needs to return a raw (untyped) pointer, since the value of a pointer to the base
       
   183    * class is in general not equal to the pointer of the subclass. When patching metaspace pointers,
       
   184    * the compiler expects a direct pointer to the subclass (Klass*, Method* or Symbol*), not a
       
   185    * pointer to the base class (Metadata* or MetaspaceObj*).
       
   186    */
   181   oop obj = HotSpotMetaspaceConstantImpl::metaspaceObject(constant);
   187   oop obj = HotSpotMetaspaceConstantImpl::metaspaceObject(constant);
   182   if (obj->is_a(HotSpotResolvedObjectTypeImpl::klass())) {
   188   if (obj->is_a(HotSpotResolvedObjectTypeImpl::klass())) {
   183     Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectTypeImpl::javaClass(obj));
   189     Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectTypeImpl::javaClass(obj));
   184     assert(!HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected compressed klass pointer %s @ " INTPTR_FORMAT, klass->name()->as_C_string(), p2i(klass));
   190     assert(!HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected compressed klass pointer %s @ " INTPTR_FORMAT, klass->name()->as_C_string(), p2i(klass));
   185     int index = _oop_recorder->find_index(klass);
   191     int index = _oop_recorder->find_index(klass);
   189     Method* method = (Method*) (address) HotSpotResolvedJavaMethodImpl::metaspaceMethod(obj);
   195     Method* method = (Method*) (address) HotSpotResolvedJavaMethodImpl::metaspaceMethod(obj);
   190     assert(!HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected compressed method pointer %s @ " INTPTR_FORMAT, method->name()->as_C_string(), p2i(method));
   196     assert(!HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected compressed method pointer %s @ " INTPTR_FORMAT, method->name()->as_C_string(), p2i(method));
   191     int index = _oop_recorder->find_index(method);
   197     int index = _oop_recorder->find_index(method);
   192     TRACE_jvmci_3("metadata[%d of %d] = %s", index, _oop_recorder->metadata_count(), method->name()->as_C_string());
   198     TRACE_jvmci_3("metadata[%d of %d] = %s", index, _oop_recorder->metadata_count(), method->name()->as_C_string());
   193     return method;
   199     return method;
       
   200   } else if (obj->is_a(HotSpotSymbol::klass())) {
       
   201     Symbol* symbol = (Symbol*) (address) HotSpotSymbol::pointer(obj);
       
   202     assert(!HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected compressed symbol pointer %s @ " INTPTR_FORMAT, symbol->as_C_string(), p2i(symbol));
       
   203     TRACE_jvmci_3("symbol = %s", symbol->as_C_string());
       
   204     return symbol;
   194   } else {
   205   } else {
   195     JVMCI_ERROR_NULL("unexpected metadata reference for constant of type %s", obj->klass()->signature_name());
   206     JVMCI_ERROR_NULL("unexpected metadata reference for constant of type %s", obj->klass()->signature_name());
   196   }
   207   }
   197 }
   208 }
   198 
   209 
   704         *((narrowKlass*) dest) = record_narrow_metadata_reference(constant, CHECK_OK);
   715         *((narrowKlass*) dest) = record_narrow_metadata_reference(constant, CHECK_OK);
   705 #else
   716 #else
   706         JVMCI_ERROR_OK("unexpected compressed Klass* in 32-bit mode");
   717         JVMCI_ERROR_OK("unexpected compressed Klass* in 32-bit mode");
   707 #endif
   718 #endif
   708       } else {
   719       } else {
   709         *((Metadata**) dest) = record_metadata_reference(constant, CHECK_OK);
   720         *((void**) dest) = record_metadata_reference(constant, CHECK_OK);
   710       }
   721       }
   711     } else if (constant->is_a(HotSpotObjectConstantImpl::klass())) {
   722     } else if (constant->is_a(HotSpotObjectConstantImpl::klass())) {
   712       Handle obj = HotSpotObjectConstantImpl::object(constant);
   723       Handle obj = HotSpotObjectConstantImpl::object(constant);
   713       jobject value = JNIHandles::make_local(obj());
   724       jobject value = JNIHandles::make_local(obj());
   714       int oop_index = _oop_recorder->find_index(value);
   725       int oop_index = _oop_recorder->find_index(value);