# HG changeset patch # User Roland Schatz # Date 1442840473 -7200 # Node ID 3f6488b29c1ae49f0f695ddc00822a16e8c418f7 # Parent ca8e46278bae95fac5929e3e45df15a7a397fec3 Remove rawValue from HotSpotMetaspaceConstantImpl, patch raw pointer at code installation time. diff -r ca8e46278bae -r 3f6488b29c1a jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotCodeCacheProvider.java --- a/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotCodeCacheProvider.java Mon Sep 21 11:48:40 2015 +0200 +++ b/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotCodeCacheProvider.java Mon Sep 21 15:01:13 2015 +0200 @@ -187,15 +187,9 @@ if (constant instanceof VMConstant) { VMConstant vmConstant = (VMConstant) constant; boolean compressed; - long raw; - if (constant instanceof HotSpotObjectConstant) { - HotSpotObjectConstant c = (HotSpotObjectConstant) vmConstant; + if (constant instanceof HotSpotConstant) { + HotSpotConstant c = (HotSpotConstant) vmConstant; compressed = c.isCompressed(); - raw = 0xDEADDEADDEADDEADL; - } else if (constant instanceof HotSpotMetaspaceConstant) { - HotSpotMetaspaceConstant meta = (HotSpotMetaspaceConstant) constant; - compressed = meta.isCompressed(); - raw = meta.rawValue(); } else { throw new JVMCIError(String.valueOf(constant)); } @@ -204,13 +198,13 @@ if (size == 4) { builder = (buffer, patch) -> { patch.accept(new DataPatch(buffer.position(), new ConstantReference(vmConstant))); - buffer.putInt((int) raw); + buffer.putInt(0xDEADDEAD); }; } else { assert size == 8; builder = (buffer, patch) -> { patch.accept(new DataPatch(buffer.position(), new ConstantReference(vmConstant))); - buffer.putLong(raw); + buffer.putLong(0xDEADDEADDEADDEADL); }; } } else if (JavaConstant.isNull(constant)) { diff -r ca8e46278bae -r 3f6488b29c1a jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotCompressedNullConstant.java --- a/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotCompressedNullConstant.java Mon Sep 21 11:48:40 2015 +0200 +++ b/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotCompressedNullConstant.java Mon Sep 21 15:01:13 2015 +0200 @@ -22,6 +22,7 @@ */ package jdk.internal.jvmci.hotspot; +import jdk.internal.jvmci.meta.Constant; import jdk.internal.jvmci.meta.JavaConstant; import jdk.internal.jvmci.meta.JavaKind; @@ -49,6 +50,14 @@ return true; } + public Constant compress() { + throw new IllegalArgumentException(); + } + + public Constant uncompress() { + return NULL_POINTER; + } + @Override public boolean isDefaultForKind() { return true; diff -r ca8e46278bae -r 3f6488b29c1a jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotConstant.java --- a/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotConstant.java Mon Sep 21 11:48:40 2015 +0200 +++ b/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotConstant.java Mon Sep 21 15:01:13 2015 +0200 @@ -30,4 +30,8 @@ public interface HotSpotConstant extends Constant { boolean isCompressed(); + + Constant compress(); + + Constant uncompress(); } diff -r ca8e46278bae -r 3f6488b29c1a jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotConstantReflectionProvider.java --- a/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotConstantReflectionProvider.java Mon Sep 21 11:48:40 2015 +0200 +++ b/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotConstantReflectionProvider.java Mon Sep 21 15:01:13 2015 +0200 @@ -224,7 +224,7 @@ } } if (constant instanceof HotSpotMetaspaceConstant) { - Object obj = HotSpotMetaspaceConstantImpl.getMetaspaceObject(constant); + MetaspaceWrapperObject obj = HotSpotMetaspaceConstantImpl.getMetaspaceObject(constant); if (obj instanceof HotSpotResolvedObjectTypeImpl) { return (ResolvedJavaType) obj; } diff -r ca8e46278bae -r 3f6488b29c1a jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotMemoryAccessProviderImpl.java --- a/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotMemoryAccessProviderImpl.java Mon Sep 21 11:48:40 2015 +0200 +++ b/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotMemoryAccessProviderImpl.java Mon Sep 21 15:01:13 2015 +0200 @@ -52,7 +52,7 @@ private boolean isValidObjectFieldDisplacement(Constant base, long displacement) { if (base instanceof HotSpotMetaspaceConstant) { - Object metaspaceObject = HotSpotMetaspaceConstantImpl.getMetaspaceObject(base); + MetaspaceWrapperObject metaspaceObject = HotSpotMetaspaceConstantImpl.getMetaspaceObject(base); if (metaspaceObject instanceof HotSpotResolvedObjectTypeImpl) { if (displacement == runtime.getConfig().classMirrorOffset) { // Klass::_java_mirror is valid for all Klass* values @@ -69,8 +69,9 @@ } private static long asRawPointer(Constant base) { - if (base instanceof HotSpotMetaspaceConstant) { - return ((HotSpotMetaspaceConstant) base).rawValue(); + if (base instanceof HotSpotMetaspaceConstantImpl) { + MetaspaceWrapperObject meta = HotSpotMetaspaceConstantImpl.getMetaspaceObject(base); + return meta.getMetaspacePointer(); } else if (base instanceof PrimitiveConstant) { PrimitiveConstant prim = (PrimitiveConstant) base; if (prim.getJavaKind().isNumericInteger()) { @@ -120,7 +121,7 @@ } } if (base instanceof HotSpotMetaspaceConstant) { - Object metaspaceObject = HotSpotMetaspaceConstantImpl.getMetaspaceObject(base); + MetaspaceWrapperObject metaspaceObject = HotSpotMetaspaceConstantImpl.getMetaspaceObject(base); if (metaspaceObject instanceof HotSpotResolvedObjectTypeImpl) { if (displacement == runtime.getConfig().classMirrorOffset) { assert expected == ((HotSpotResolvedObjectTypeImpl) metaspaceObject).mirror(); @@ -214,7 +215,7 @@ if (klass == null) { return JavaConstant.NULL_POINTER; } - return HotSpotMetaspaceConstantImpl.forMetaspaceObject(klass.getMetaspaceKlass(), klass, false); + return HotSpotMetaspaceConstantImpl.forMetaspaceObject(klass, false); } @Override @@ -223,7 +224,7 @@ if (klass == null) { return HotSpotCompressedNullConstant.COMPRESSED_NULL; } - return HotSpotMetaspaceConstantImpl.forMetaspaceObject(encoding.compress(klass.getMetaspaceKlass()), klass, true); + return HotSpotMetaspaceConstantImpl.forMetaspaceObject(klass, true); } @Override @@ -231,6 +232,6 @@ assert (base instanceof HotSpotObjectConstantImpl); Object baseObject = ((HotSpotObjectConstantImpl) base).object(); HotSpotResolvedJavaMethodImpl method = runtime.getCompilerToVM().getResolvedJavaMethod(baseObject, displacement); - return HotSpotMetaspaceConstantImpl.forMetaspaceObject(method.getMetaspaceMethod(), method, false); + return HotSpotMetaspaceConstantImpl.forMetaspaceObject(method, false); } } diff -r ca8e46278bae -r 3f6488b29c1a jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotMetaspaceConstant.java --- a/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotMetaspaceConstant.java Mon Sep 21 11:48:40 2015 +0200 +++ b/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotMetaspaceConstant.java Mon Sep 21 15:01:13 2015 +0200 @@ -22,19 +22,11 @@ */ package jdk.internal.jvmci.hotspot; -import jdk.internal.jvmci.hotspot.HotSpotVMConfig.CompressEncoding; -import jdk.internal.jvmci.meta.Constant; import jdk.internal.jvmci.meta.VMConstant; public interface HotSpotMetaspaceConstant extends HotSpotConstant, VMConstant { - Constant compress(CompressEncoding encoding); - - Constant uncompress(CompressEncoding encoding); - HotSpotResolvedObjectType asResolvedJavaType(); HotSpotResolvedJavaMethod asResolvedJavaMethod(); - - long rawValue(); } diff -r ca8e46278bae -r 3f6488b29c1a jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotMetaspaceConstantImpl.java --- a/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotMetaspaceConstantImpl.java Mon Sep 21 11:48:40 2015 +0200 +++ b/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotMetaspaceConstantImpl.java Mon Sep 21 15:01:13 2015 +0200 @@ -24,33 +24,30 @@ import java.util.Objects; -import jdk.internal.jvmci.hotspot.HotSpotVMConfig.CompressEncoding; import jdk.internal.jvmci.meta.Constant; import jdk.internal.jvmci.meta.VMConstant; public final class HotSpotMetaspaceConstantImpl implements HotSpotMetaspaceConstant, VMConstant, HotSpotProxified { - static HotSpotMetaspaceConstantImpl forMetaspaceObject(long rawValue, Object metaspaceObject, boolean compressed) { - return new HotSpotMetaspaceConstantImpl(rawValue, metaspaceObject, compressed); + static HotSpotMetaspaceConstantImpl forMetaspaceObject(MetaspaceWrapperObject metaspaceObject, boolean compressed) { + return new HotSpotMetaspaceConstantImpl(metaspaceObject, compressed); } - static Object getMetaspaceObject(Constant constant) { + static MetaspaceWrapperObject getMetaspaceObject(Constant constant) { return ((HotSpotMetaspaceConstantImpl) constant).metaspaceObject; } - private final Object metaspaceObject; - private final long rawValue; + private final MetaspaceWrapperObject metaspaceObject; private final boolean compressed; - private HotSpotMetaspaceConstantImpl(long rawValue, Object metaspaceObject, boolean compressed) { + private HotSpotMetaspaceConstantImpl(MetaspaceWrapperObject metaspaceObject, boolean compressed) { this.metaspaceObject = metaspaceObject; - this.rawValue = rawValue; this.compressed = compressed; } @Override public int hashCode() { - return System.identityHashCode(metaspaceObject) ^ (int) (rawValue ^ (rawValue >>> 32)) ^ (compressed ? 1 : 2); + return System.identityHashCode(metaspaceObject) ^ (compressed ? 1 : 2); } @Override @@ -63,12 +60,12 @@ } HotSpotMetaspaceConstantImpl other = (HotSpotMetaspaceConstantImpl) o; - return Objects.equals(this.metaspaceObject, other.metaspaceObject) && this.rawValue == other.rawValue && this.compressed == other.compressed; + return Objects.equals(this.metaspaceObject, other.metaspaceObject) && this.compressed == other.compressed; } @Override public String toValueString() { - return String.format("meta[%08x]{%s%s}", rawValue, metaspaceObject, compressed ? ";compressed" : ""); + return String.format("meta{%s%s}", metaspaceObject, compressed ? ";compressed" : ""); } @Override @@ -77,23 +74,23 @@ } public boolean isDefaultForKind() { - return rawValue == 0; + return false; } public boolean isCompressed() { return compressed; } - public Constant compress(CompressEncoding encoding) { + public Constant compress() { assert !isCompressed(); - HotSpotMetaspaceConstantImpl res = HotSpotMetaspaceConstantImpl.forMetaspaceObject(encoding.compress(rawValue), metaspaceObject, true); + HotSpotMetaspaceConstantImpl res = HotSpotMetaspaceConstantImpl.forMetaspaceObject(metaspaceObject, true); assert res.isCompressed(); return res; } - public Constant uncompress(CompressEncoding encoding) { + public Constant uncompress() { assert isCompressed(); - HotSpotMetaspaceConstantImpl res = HotSpotMetaspaceConstantImpl.forMetaspaceObject(encoding.uncompress((int) rawValue), metaspaceObject, false); + HotSpotMetaspaceConstantImpl res = HotSpotMetaspaceConstantImpl.forMetaspaceObject(metaspaceObject, false); assert !res.isCompressed(); return res; } @@ -111,8 +108,4 @@ } return null; } - - public long rawValue() { - return rawValue; - } } diff -r ca8e46278bae -r 3f6488b29c1a jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotResolvedJavaMethodImpl.java --- a/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotResolvedJavaMethodImpl.java Mon Sep 21 11:48:40 2015 +0200 +++ b/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotResolvedJavaMethodImpl.java Mon Sep 21 15:01:13 2015 +0200 @@ -202,7 +202,7 @@ * Gets the address of the C++ Method object for this method. */ public Constant getMetaspaceMethodConstant() { - return HotSpotMetaspaceConstantImpl.forMetaspaceObject(metaspaceMethod, this, false); + return HotSpotMetaspaceConstantImpl.forMetaspaceObject(this, false); } public long getMetaspaceMethod() { diff -r ca8e46278bae -r 3f6488b29c1a jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotResolvedObjectTypeImpl.java --- a/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotResolvedObjectTypeImpl.java Mon Sep 21 11:48:40 2015 +0200 +++ b/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/HotSpotResolvedObjectTypeImpl.java Mon Sep 21 15:01:13 2015 +0200 @@ -805,7 +805,7 @@ * Gets the metaspace Klass boxed in a {@link JavaConstant}. */ public Constant klass() { - return HotSpotMetaspaceConstantImpl.forMetaspaceObject(getMetaspaceKlass(), this, false); + return HotSpotMetaspaceConstantImpl.forMetaspaceObject(this, false); } public boolean isPrimaryType() { diff -r ca8e46278bae -r 3f6488b29c1a jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/MetaspaceWrapperObject.java --- a/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/MetaspaceWrapperObject.java Mon Sep 21 11:48:40 2015 +0200 +++ b/jvmci/jdk.internal.jvmci.hotspot/src/jdk/internal/jvmci/hotspot/MetaspaceWrapperObject.java Mon Sep 21 15:01:13 2015 +0200 @@ -28,7 +28,7 @@ * It would preferable if this were the base class containing the pointer but that would require * mixins since most of the wrapper types have complex supertype hierarchies. */ -public interface MetaspaceWrapperObject { +interface MetaspaceWrapperObject { long getMetaspacePointer(); } diff -r ca8e46278bae -r 3f6488b29c1a src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp --- a/src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp Mon Sep 21 11:48:40 2015 +0200 +++ b/src/cpu/sparc/vm/jvmciCodeInstaller_sparc.cpp Mon Sep 21 15:01:13 2015 +0200 @@ -64,6 +64,11 @@ } } +void CodeInstaller::pd_patch_MetaspaceConstant(int pc_offset, Handle& constant) { + address pc = _instructions->start() + pc_offset; + fatal(err_msg("unexpected inline metaspace constant at %p (+%d)", pc, pc_offset)); +} + void CodeInstaller::pd_patch_DataSectionReference(int pc_offset, int data_offset) { address pc = _instructions->start() + pc_offset; NativeInstruction* inst = nativeInstruction_at(pc); diff -r ca8e46278bae -r 3f6488b29c1a src/cpu/x86/vm/jvmciCodeInstaller_x86.cpp --- a/src/cpu/x86/vm/jvmciCodeInstaller_x86.cpp Mon Sep 21 11:48:40 2015 +0200 +++ b/src/cpu/x86/vm/jvmciCodeInstaller_x86.cpp Mon Sep 21 15:01:13 2015 +0200 @@ -83,6 +83,23 @@ } } +void CodeInstaller::pd_patch_MetaspaceConstant(int pc_offset, Handle& constant) { + address pc = _instructions->start() + pc_offset; + if (HotSpotMetaspaceConstantImpl::compressed(constant)) { +#ifdef _LP64 + address operand = Assembler::locate_operand(pc, Assembler::narrow_oop_operand); + *((narrowKlass*) operand) = record_narrow_metadata_reference(constant); + TRACE_jvmci_3("relocating (narrow metaspace constant) at %p/%p", pc, operand); +#else + fatal("compressed Klass* on 32bit"); +#endif + } else { + address operand = Assembler::locate_operand(pc, Assembler::imm_operand); + *((Metadata**) operand) = record_metadata_reference(constant); + TRACE_jvmci_3("relocating (metaspace constant) at %p/%p", pc, operand); + } +} + void CodeInstaller::pd_patch_DataSectionReference(int pc_offset, int data_offset) { address pc = _instructions->start() + pc_offset; diff -r ca8e46278bae -r 3f6488b29c1a src/share/vm/jvmci/jvmciCodeInstaller.cpp --- a/src/share/vm/jvmci/jvmciCodeInstaller.cpp Mon Sep 21 11:48:40 2015 +0200 +++ b/src/share/vm/jvmci/jvmciCodeInstaller.cpp Mon Sep 21 15:01:13 2015 +0200 @@ -140,42 +140,37 @@ 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, err_msg("%s @ " INTPTR_FORMAT " != " PTR64_FORMAT, klass->name()->as_C_string(), p2i(klass), prim)); - } else { - assert((Klass*) prim == klass, err_msg("%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), err_msg("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, err_msg("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), err_msg("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), - err_msg("unexpected metadata reference (%s) for constant " JLONG_FORMAT " (" PTR64_FORMAT ")", obj->klass()->name()->as_C_string(), prim, prim)); + fatal(err_msg("unexpected metadata reference for constant of type %s", obj->klass()->name()->as_C_string())); } } -// 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 raw = HotSpotMetaspaceConstantImpl::rawValue(constant); - assert(obj != NULL, "must have an object"); - assert(raw != 0, "must have a raw value"); +#ifdef _LP64 +narrowKlass CodeInstaller::record_narrow_metadata_reference(Handle& constant) { + oop obj = HotSpotMetaspaceConstantImpl::metaspaceObject(constant); + assert(HotSpotMetaspaceConstantImpl::compressed(constant), err_msg("unexpected uncompressed pointer")); + assert(obj->is_a(HotSpotResolvedObjectTypeImpl::klass()), err_msg("unexpected compressed pointer of type %s", obj->klass()->name()->as_C_string())); - record_metadata_reference(obj, raw, false, 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); } - -static void record_metadata_in_patch(Handle& constant, OopRecorder* oop_recorder) { - record_metadata_reference(HotSpotMetaspaceConstantImpl::metaspaceObject(constant), HotSpotMetaspaceConstantImpl::rawValue(constant), HotSpotMetaspaceConstantImpl::compressed(constant), oop_recorder); -} +#endif Location::Type CodeInstaller::get_oop_type(oop value) { oop lirKind = Value::lirKind(value); @@ -251,7 +246,6 @@ } 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); @@ -545,14 +539,22 @@ Handle reference = CompilationResult_DataPatch::reference(patch); assert(reference->is_a(CompilationResult_ConstantReference::klass()), err_msg("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); @@ -899,7 +901,7 @@ 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 { fatal("unknown constant type in data patch"); } diff -r ca8e46278bae -r 3f6488b29c1a src/share/vm/jvmci/jvmciCodeInstaller.hpp --- a/src/share/vm/jvmci/jvmciCodeInstaller.hpp Mon Sep 21 11:48:40 2015 +0200 +++ b/src/share/vm/jvmci/jvmciCodeInstaller.hpp Mon Sep 21 15:01:13 2015 +0200 @@ -93,6 +93,7 @@ jint pd_next_offset(NativeInstruction* inst, jint pc_offset, oop method); void pd_patch_OopConstant(int pc_offset, Handle& constant); + void pd_patch_MetaspaceConstant(int pc_offset, Handle& constant); void pd_patch_DataSectionReference(int pc_offset, int data_offset); void pd_relocate_CodeBlob(CodeBlob* cb, NativeInstruction* inst); void pd_relocate_ForeignCall(NativeInstruction* inst, jlong foreign_call_destination); @@ -124,6 +125,11 @@ ScopeValue* get_scope_value(oop value, BasicType type, GrowableArray* objects, ScopeValue* &second); MonitorValue* get_monitor_value(oop value, GrowableArray* objects); + Metadata* record_metadata_reference(Handle& constant); +#ifdef _LP64 + narrowKlass record_narrow_metadata_reference(Handle& constant); +#endif + // extract the fields of the CompilationResult void initialize_fields(oop target, oop target_method); void initialize_dependencies(oop target_method); diff -r ca8e46278bae -r 3f6488b29c1a src/share/vm/jvmci/jvmciJavaClasses.hpp --- a/src/share/vm/jvmci/jvmciJavaClasses.hpp Mon Sep 21 11:48:40 2015 +0200 +++ b/src/share/vm/jvmci/jvmciJavaClasses.hpp Mon Sep 21 15:01:13 2015 +0200 @@ -210,8 +210,7 @@ boolean_field(HotSpotObjectConstantImpl, compressed) \ end_class \ start_class(HotSpotMetaspaceConstantImpl) \ - oop_field(HotSpotMetaspaceConstantImpl, metaspaceObject, "Ljava/lang/Object;") \ - long_field(HotSpotMetaspaceConstantImpl, rawValue) \ + oop_field(HotSpotMetaspaceConstantImpl, metaspaceObject, "Ljdk/internal/jvmci/hotspot/MetaspaceWrapperObject;") \ boolean_field(HotSpotMetaspaceConstantImpl, compressed) \ end_class \ start_class(JavaKind) \