< prev index next >

src/share/vm/jvmci/jvmciCodeInstaller.cpp

Print this page

        

*** 140,185 **** } } return map; } ! static void record_metadata_reference(oop obj, jlong prim, jboolean compressed, OopRecorder* oop_recorder) { if (obj->is_a(HotSpotResolvedObjectTypeImpl::klass())) { Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectTypeImpl::javaClass(obj)); ! if (compressed) { ! assert(Klass::decode_klass((narrowKlass) prim) == klass, "%s @ " INTPTR_FORMAT " != " PTR64_FORMAT, klass->name()->as_C_string(), p2i(klass), prim); ! } else { ! assert((Klass*) prim == klass, "%s @ " INTPTR_FORMAT " != " PTR64_FORMAT, klass->name()->as_C_string(), p2i(klass), prim); ! } ! int index = oop_recorder->find_index(klass); ! TRACE_jvmci_3("metadata[%d of %d] = %s", index, oop_recorder->metadata_count(), klass->name()->as_C_string()); } else if (obj->is_a(HotSpotResolvedJavaMethodImpl::klass())) { Method* method = (Method*) (address) HotSpotResolvedJavaMethodImpl::metaspaceMethod(obj); ! assert(!compressed, "unexpected compressed method pointer %s @ " INTPTR_FORMAT " = " PTR64_FORMAT, method->name()->as_C_string(), p2i(method), prim); ! int index = oop_recorder->find_index(method); ! TRACE_jvmci_3("metadata[%d of %d] = %s", index, oop_recorder->metadata_count(), method->name()->as_C_string()); } else { ! assert(java_lang_String::is_instance(obj), ! "unexpected metadata reference (%s) for constant " JLONG_FORMAT " (" PTR64_FORMAT ")", obj->klass()->name()->as_C_string(), prim, prim); } } ! // Records any Metadata values embedded in a Constant (e.g., the value returned by HotSpotResolvedObjectTypeImpl.klass()). ! static void record_metadata_in_constant(oop constant, OopRecorder* oop_recorder) { ! if (constant->is_a(HotSpotMetaspaceConstantImpl::klass())) { oop obj = HotSpotMetaspaceConstantImpl::metaspaceObject(constant); ! jlong prim = HotSpotMetaspaceConstantImpl::primitive(constant); ! assert(obj != NULL, "must have an object"); ! assert(prim != 0, "must have a primitive value"); ! record_metadata_reference(obj, prim, false, oop_recorder); ! } ! } ! ! static void record_metadata_in_patch(Handle& constant, OopRecorder* oop_recorder) { ! record_metadata_reference(HotSpotMetaspaceConstantImpl::metaspaceObject(constant), HotSpotMetaspaceConstantImpl::primitive(constant), HotSpotMetaspaceConstantImpl::compressed(constant), oop_recorder); } Location::Type CodeInstaller::get_oop_type(oop value) { oop lirKind = Value::lirKind(value); oop platformKind = LIRKind::platformKind(lirKind); assert(LIRKind::referenceMask(lirKind) == 1, "unexpected referenceMask"); --- 140,181 ---- } } return map; } ! Metadata* CodeInstaller::record_metadata_reference(Handle& constant) { ! oop obj = HotSpotMetaspaceConstantImpl::metaspaceObject(constant); if (obj->is_a(HotSpotResolvedObjectTypeImpl::klass())) { Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectTypeImpl::javaClass(obj)); ! assert(!HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected compressed klass pointer %s @ " INTPTR_FORMAT, klass->name()->as_C_string(), p2i(klass)); ! int index = _oop_recorder->find_index(klass); ! TRACE_jvmci_3("metadata[%d of %d] = %s", index, _oop_recorder->metadata_count(), klass->name()->as_C_string()); ! return klass; } else if (obj->is_a(HotSpotResolvedJavaMethodImpl::klass())) { Method* method = (Method*) (address) HotSpotResolvedJavaMethodImpl::metaspaceMethod(obj); ! assert(!HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected compressed method pointer %s @ " INTPTR_FORMAT, method->name()->as_C_string(), p2i(method)); ! int index = _oop_recorder->find_index(method); ! TRACE_jvmci_3("metadata[%d of %d] = %s", index, _oop_recorder->metadata_count(), method->name()->as_C_string()); ! return method; } else { ! fatal("unexpected metadata reference for constant of type %s", obj->klass()->name()->as_C_string()); ! return NULL; } } ! #ifdef _LP64 ! narrowKlass CodeInstaller::record_narrow_metadata_reference(Handle& constant) { oop obj = HotSpotMetaspaceConstantImpl::metaspaceObject(constant); ! assert(HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected uncompressed pointer"); ! assert(obj->is_a(HotSpotResolvedObjectTypeImpl::klass()), "unexpected compressed pointer of type %s", obj->klass()->name()->as_C_string()); ! Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectTypeImpl::javaClass(obj)); ! int index = _oop_recorder->find_index(klass); ! TRACE_jvmci_3("narrowKlass[%d of %d] = %s", index, _oop_recorder->metadata_count(), klass->name()->as_C_string()); ! return Klass::encode_klass(klass); } + #endif Location::Type CodeInstaller::get_oop_type(oop value) { oop lirKind = Value::lirKind(value); oop platformKind = LIRKind::platformKind(lirKind); assert(LIRKind::referenceMask(lirKind) == 1, "unexpected referenceMask");
*** 251,261 **** if (type == T_DOUBLE || type == T_LONG) { second = value; } return value; } else if (value->is_a(JavaConstant::klass())) { - record_metadata_in_constant(value, _oop_recorder); if (value->is_a(PrimitiveConstant::klass())) { if (value->is_a(RawConstant::klass())) { jlong prim = PrimitiveConstant::primitive(value); return new ConstantLongValue(prim); } else { --- 247,256 ----
*** 377,396 **** fatal("unexpected Assumption subclass"); } } } } objArrayHandle methods = HotSpotCompiledCode::methods(compiled_code); if (!methods.is_null()) { int length = methods->length(); for (int i = 0; i < length; ++i) { Handle method_handle = methods->obj_at(i); methodHandle method = getMethodFromHotSpotMethod(method_handle()); - _dependencies->assert_evol_method(method()); } } } RelocBuffer::~RelocBuffer() { if (_buffer != NULL) { FREE_C_HEAP_ARRAY(char, _buffer); --- 372,392 ---- fatal("unexpected Assumption subclass"); } } } } + if (JvmtiExport::can_hotswap_or_post_breakpoint()) { objArrayHandle methods = HotSpotCompiledCode::methods(compiled_code); if (!methods.is_null()) { int length = methods->length(); for (int i = 0; i < length; ++i) { Handle method_handle = methods->obj_at(i); methodHandle method = getMethodFromHotSpotMethod(method_handle()); _dependencies->assert_evol_method(method()); } } + } } RelocBuffer::~RelocBuffer() { if (_buffer != NULL) { FREE_C_HEAP_ARRAY(char, _buffer);
*** 541,551 **** oop arch = TargetDescription::arch(target); _word_kind_handle = JNIHandles::make_local(Architecture::wordKind(arch)); } int CodeInstaller::estimate_stubs_size() { ! // Return size for all stubs. int static_call_stubs = 0; objArrayOop sites = this->sites(); for (int i = 0; i < sites->length(); i++) { oop site = sites->obj_at(i); if (site->is_a(CompilationResult_Mark::klass())) { --- 537,547 ---- oop arch = TargetDescription::arch(target); _word_kind_handle = JNIHandles::make_local(Architecture::wordKind(arch)); } int CodeInstaller::estimate_stubs_size() { ! // Estimate the number of static call stubs that might be emitted. int static_call_stubs = 0; objArrayOop sites = this->sites(); for (int i = 0; i < sites->length(); i++) { oop site = sites->obj_at(i); if (site->is_a(CompilationResult_Mark::klass())) {
*** 562,571 **** --- 558,568 ---- return static_call_stubs * CompiledStaticCall::to_interp_stub_size(); } // perform data and call relocation on the CodeBuffer JVMCIEnv::CodeInstallResult CodeInstaller::initialize_buffer(CodeBuffer& buffer) { + HandleMark hm; objArrayHandle sites = this->sites(); int locs_buffer_size = sites->length() * (relocInfo::length_limit + sizeof(relocInfo)); // Allocate enough space in the stub section for the static call // stubs. Stubs have extra relocs but they are managed by the stub
*** 604,621 **** for (int i = 0; i < data_section_patches()->length(); i++) { Handle patch = data_section_patches()->obj_at(i); Handle reference = CompilationResult_DataPatch::reference(patch); assert(reference->is_a(CompilationResult_ConstantReference::klass()), "patch in data section must be a ConstantReference"); Handle constant = CompilationResult_ConstantReference::constant(reference); if (constant->is_a(HotSpotMetaspaceConstantImpl::klass())) { ! record_metadata_in_patch(constant, _oop_recorder); } else if (constant->is_a(HotSpotObjectConstantImpl::klass())) { Handle obj = HotSpotObjectConstantImpl::object(constant); jobject value = JNIHandles::make_local(obj()); int oop_index = _oop_recorder->find_index(value); - address dest = _constants->start() + CompilationResult_Site::pcOffset(patch); if (HotSpotObjectConstantImpl::compressed(constant)) { #ifdef _LP64 _constants->relocate(dest, oop_Relocation::spec(oop_index), relocInfo::narrow_oop_in_const); #else fatal("unexpected compressed oop in 32-bit mode"); --- 601,626 ---- for (int i = 0; i < data_section_patches()->length(); i++) { Handle patch = data_section_patches()->obj_at(i); Handle reference = CompilationResult_DataPatch::reference(patch); assert(reference->is_a(CompilationResult_ConstantReference::klass()), "patch in data section must be a ConstantReference"); Handle constant = CompilationResult_ConstantReference::constant(reference); + address dest = _constants->start() + CompilationResult_Site::pcOffset(patch); if (constant->is_a(HotSpotMetaspaceConstantImpl::klass())) { ! if (HotSpotMetaspaceConstantImpl::compressed(constant)) { ! #ifdef _LP64 ! *((narrowKlass*) dest) = record_narrow_metadata_reference(constant); ! #else ! fatal("unexpected compressed Klass* in 32-bit mode"); ! #endif ! } else { ! *((Metadata**) dest) = record_metadata_reference(constant); ! } } else if (constant->is_a(HotSpotObjectConstantImpl::klass())) { Handle obj = HotSpotObjectConstantImpl::object(constant); jobject value = JNIHandles::make_local(obj()); int oop_index = _oop_recorder->find_index(value); if (HotSpotObjectConstantImpl::compressed(constant)) { #ifdef _LP64 _constants->relocate(dest, oop_Relocation::spec(oop_index), relocInfo::narrow_oop_in_const); #else fatal("unexpected compressed oop in 32-bit mode");
*** 958,968 **** if (reference->is_a(CompilationResult_ConstantReference::klass())) { Handle constant = CompilationResult_ConstantReference::constant(reference); if (constant->is_a(HotSpotObjectConstantImpl::klass())) { pd_patch_OopConstant(pc_offset, constant); } else if (constant->is_a(HotSpotMetaspaceConstantImpl::klass())) { ! record_metadata_in_patch(constant, _oop_recorder); } else if (constant->is_a(HotSpotSentinelConstant::klass())) { fatal("sentinel constant unsupported"); } else { fatal("unknown constant type in data patch"); } --- 963,973 ---- if (reference->is_a(CompilationResult_ConstantReference::klass())) { Handle constant = CompilationResult_ConstantReference::constant(reference); if (constant->is_a(HotSpotObjectConstantImpl::klass())) { pd_patch_OopConstant(pc_offset, constant); } else if (constant->is_a(HotSpotMetaspaceConstantImpl::klass())) { ! pd_patch_MetaspaceConstant(pc_offset, constant); } else if (constant->is_a(HotSpotSentinelConstant::klass())) { fatal("sentinel constant unsupported"); } else { fatal("unknown constant type in data patch"); }
*** 1012,1021 **** --- 1017,1027 ---- case POLL_FAR: case POLL_RETURN_NEAR: case POLL_RETURN_FAR: pd_relocate_poll(pc, id); break; + case CARD_TABLE_SHIFT: case CARD_TABLE_ADDRESS: case HEAP_TOP_ADDRESS: case HEAP_END_ADDRESS: case NARROW_KLASS_BASE_ADDRESS: case CRC_TABLE_ADDRESS:
< prev index next >