< prev index next >
src/share/vm/jvmci/jvmciCodeInstaller.cpp
Print this page
@@ -140,46 +140,42 @@
}
}
return map;
}
-static void record_metadata_reference(oop obj, jlong prim, jboolean compressed, OopRecorder* oop_recorder) {
+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));
- 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());
+ 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(!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());
+ 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 {
- 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);
+ fatal("unexpected metadata reference for constant of type %s", obj->klass()->name()->as_C_string());
+ return NULL;
}
}
-// 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())) {
+#ifdef _LP64
+narrowKlass CodeInstaller::record_narrow_metadata_reference(Handle& constant) {
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");
+ 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());
- 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);
+ 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,11 +247,10 @@
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 {
@@ -377,20 +372,21 @@
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,11 +537,11 @@
oop arch = TargetDescription::arch(target);
_word_kind_handle = JNIHandles::make_local(Architecture::wordKind(arch));
}
int CodeInstaller::estimate_stubs_size() {
- // Return size for all stubs.
+ // 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,10 +558,11 @@
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,18 +601,26 @@
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())) {
- record_metadata_in_patch(constant, _oop_recorder);
+ 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);
- 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");
@@ -958,11 +963,11 @@
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);
+ 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,10 +1017,11 @@
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 >