# HG changeset patch # User twisti # Date 1388032079 28800 # Node ID 606959535fd481eb4d846b515520ea73171aa3a1 # Parent fe03864a2c7281c66800c87b13855cfc6e89e393 remove Graal mirror from Class diff -r fe03864a2c72 -r 606959535fd4 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java Wed Dec 25 12:14:29 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java Wed Dec 25 20:27:59 2013 -0800 @@ -190,15 +190,22 @@ protected final HotSpotVMConfig config; private final HotSpotBackend hostBackend; - public final HotSpotResolvedPrimitiveType typeBoolean; - public final HotSpotResolvedPrimitiveType typeByte; - public final HotSpotResolvedPrimitiveType typeChar; - public final HotSpotResolvedPrimitiveType typeShort; - public final HotSpotResolvedPrimitiveType typeInt; - public final HotSpotResolvedPrimitiveType typeLong; - public final HotSpotResolvedPrimitiveType typeFloat; - public final HotSpotResolvedPrimitiveType typeDouble; - public final HotSpotResolvedPrimitiveType typeVoid; + /** + * Graal mirrors are stored as a {@link ClassValue} associated with the {@link Class} of the + * type. This data structure stores both {@link HotSpotResolvedObjectType} and + * {@link HotSpotResolvedPrimitiveType} types. + */ + private final ClassValue graalMirrors = new ClassValue() { + @Override + protected ResolvedJavaType computeValue(Class javaClass) { + if (javaClass.isPrimitive()) { + Kind kind = Kind.fromJavaClass(javaClass); + return new HotSpotResolvedPrimitiveType(kind); + } else { + return new HotSpotResolvedObjectType(javaClass); + } + } + }; private final Map, HotSpotBackend> backends = new HashMap<>(); @@ -212,26 +219,6 @@ vmToCompiler = toCompiler; config = new HotSpotVMConfig(compilerToVm); - typeBoolean = new HotSpotResolvedPrimitiveType(Kind.Boolean); - typeByte = new HotSpotResolvedPrimitiveType(Kind.Byte); - typeChar = new HotSpotResolvedPrimitiveType(Kind.Char); - typeShort = new HotSpotResolvedPrimitiveType(Kind.Short); - typeInt = new HotSpotResolvedPrimitiveType(Kind.Int); - typeLong = new HotSpotResolvedPrimitiveType(Kind.Long); - typeFloat = new HotSpotResolvedPrimitiveType(Kind.Float); - typeDouble = new HotSpotResolvedPrimitiveType(Kind.Double); - typeVoid = new HotSpotResolvedPrimitiveType(Kind.Void); - - initMirror(typeBoolean); - initMirror(typeByte); - initMirror(typeChar); - initMirror(typeShort); - initMirror(typeInt); - initMirror(typeLong); - initMirror(typeFloat); - initMirror(typeDouble); - initMirror(typeVoid); - CompileTheWorld.Options.overrideWithNativeOptions(config); // Only set HotSpotPrintCompilation and HotSpotPrintInlining if they still have their @@ -264,13 +251,6 @@ } } - private void initMirror(HotSpotResolvedPrimitiveType type) { - Class mirror = type.mirror(); - final long offset = config.graalMirrorInClassOffset; - unsafe.putObject(mirror, offset, type); - assert unsafe.getObject(mirror, offset) == type; - } - private HotSpotBackend registerBackend(HotSpotBackend backend) { Class arch = backend.getTarget().arch.getClass(); HotSpotBackend oldValue = backends.put(arch, backend); @@ -279,6 +259,15 @@ } /** + * Gets the Graal mirror for a {@link Class} object. + * + * @return the {@link HotSpotResolvedJavaType} corresponding to {@code javaClass} + */ + public ResolvedJavaType fromClass(Class javaClass) { + return graalMirrors.get(javaClass); + } + + /** * Gets the host architecture name for the purpose of finding the corresponding * {@linkplain HotSpotBackendFactory backend}. */ @@ -353,32 +342,10 @@ } public JavaType lookupType(String name, HotSpotResolvedObjectType accessingClass, boolean eagerResolve) { + // If the name represents a primitive type we can short-circuit the lookup. if (name.length() == 1) { Kind kind = Kind.fromPrimitiveOrVoidTypeChar(name.charAt(0)); - switch (kind) { - case Boolean: - return typeBoolean; - case Byte: - return typeByte; - case Char: - return typeChar; - case Short: - return typeShort; - case Int: - return typeInt; - case Long: - return typeLong; - case Float: - return typeFloat; - case Double: - return typeDouble; - case Void: - return typeVoid; - case Object: - break; - case Illegal: - break; - } + return HotSpotResolvedPrimitiveType.fromKind(kind); } return compilerToVm.lookupType(name, accessingClass, eagerResolve); } diff -r fe03864a2c72 -r 606959535fd4 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Wed Dec 25 12:14:29 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Wed Dec 25 20:27:59 2013 -0800 @@ -1041,7 +1041,6 @@ @HotSpotVMField(name = "java_lang_Class::_klass_offset", type = "int", get = HotSpotVMField.Type.VALUE) @Stable public int klassOffset; @HotSpotVMField(name = "java_lang_Class::_array_klass_offset", type = "int", get = HotSpotVMField.Type.VALUE) @Stable public int arrayKlassOffset; - @HotSpotVMField(name = "java_lang_Class::_graal_mirror_offset", type = "int", get = HotSpotVMField.Type.VALUE) @Stable public int graalMirrorInClassOffset; @HotSpotVMField(name = "Method::_method_data", type = "MethodData*", get = HotSpotVMField.Type.OFFSET) @Stable public int methodDataOffset; @HotSpotVMField(name = "Method::_from_compiled_entry", type = "address", get = HotSpotVMField.Type.OFFSET) @Stable public int methodCompiledEntryOffset; diff -r fe03864a2c72 -r 606959535fd4 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompilerImpl.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompilerImpl.java Wed Dec 25 12:14:29 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompilerImpl.java Wed Dec 25 20:27:59 2013 -0800 @@ -604,28 +604,39 @@ @Override public ResolvedJavaType createPrimitiveJavaType(int basicType) { + Class javaClass; switch (basicType) { case 4: - return runtime.typeBoolean; + javaClass = boolean.class; + break; case 5: - return runtime.typeChar; + javaClass = char.class; + break; case 6: - return runtime.typeFloat; + javaClass = float.class; + break; case 7: - return runtime.typeDouble; + javaClass = double.class; + break; case 8: - return runtime.typeByte; + javaClass = byte.class; + break; case 9: - return runtime.typeShort; + javaClass = short.class; + break; case 10: - return runtime.typeInt; + javaClass = int.class; + break; case 11: - return runtime.typeLong; + javaClass = long.class; + break; case 14: - return runtime.typeVoid; + javaClass = void.class; + break; default: throw new IllegalArgumentException("Unknown basic type: " + basicType); } + return HotSpotResolvedPrimitiveType.fromClass(javaClass); } @Override diff -r fe03864a2c72 -r 606959535fd4 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java Wed Dec 25 12:14:29 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java Wed Dec 25 20:27:59 2013 -0800 @@ -22,12 +22,23 @@ */ package com.oracle.graal.hotspot.meta; +import static com.oracle.graal.hotspot.HotSpotGraalRuntime.*; + import com.oracle.graal.api.meta.*; public abstract class HotSpotResolvedJavaType extends HotSpotJavaType implements ResolvedJavaType { private static final long serialVersionUID = -6410840212023428347L; + /** + * Gets the Graal mirror for a {@link Class} object. + * + * @return the {@link HotSpotResolvedJavaType} corresponding to {@code javaClass} + */ + public static ResolvedJavaType fromClass(Class javaClass) { + return runtime().fromClass(javaClass); + } + public HotSpotResolvedJavaType(String name) { super(name); } diff -r fe03864a2c72 -r 606959535fd4 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType.java Wed Dec 25 12:14:29 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType.java Wed Dec 25 20:27:59 2013 -0800 @@ -85,40 +85,17 @@ } /** - * Gets the Graal mirror from a {@link Class} object. - * - * @return the {@link HotSpotResolvedObjectType} corresponding to {@code javaClass} - */ - public static ResolvedJavaType fromClass(Class javaClass) { - assert javaClass != null; - HotSpotGraalRuntime runtime = runtime(); - ResolvedJavaType type = (ResolvedJavaType) unsafe.getObject(javaClass, (long) runtime.getConfig().graalMirrorInClassOffset); - if (type == null) { - assert !javaClass.isPrimitive() : "primitive type " + javaClass + " should have its mirror initialized"; - type = new HotSpotResolvedObjectType(javaClass); - - // Install the Graal mirror in the Class object. - final long offset = runtime().getConfig().graalMirrorInClassOffset; - if (!unsafe.compareAndSwapObject(javaClass, offset, null, type)) { - // lost the race - return the existing value instead - type = (HotSpotResolvedObjectType) unsafe.getObject(javaClass, offset); - } - - assert type != null; - } - return type; - } - - /** * Creates the Graal mirror for a {@link Class} object. * *

- * NOTE: Creating a Graal mirror does not install the mirror in the {@link Class} object. + * NOTE: Creating an instance of this class does not install the mirror for the + * {@link Class} type. Use {@link #fromClass(Class)}, {@link #fromMetaspaceKlass(Constant)} or + * {@link #fromMetaspaceKlass(long)} instead. *

* * @param javaClass the Class to create the mirror for */ - private HotSpotResolvedObjectType(Class javaClass) { + public HotSpotResolvedObjectType(Class javaClass) { super(getSignatureName(javaClass)); this.javaClass = javaClass; assert getName().charAt(0) != '[' || isArray() : getName(); diff -r fe03864a2c72 -r 606959535fd4 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedPrimitiveType.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedPrimitiveType.java Wed Dec 25 12:14:29 2013 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedPrimitiveType.java Wed Dec 25 20:27:59 2013 -0800 @@ -39,11 +39,32 @@ private final Class javaMirror; private final Class javaArrayMirror; + /** + * Gets the Graal mirror for a {@link Kind}. + * + * @return the {@link HotSpotResolvedObjectType} corresponding to {@code kind} + */ + public static ResolvedJavaType fromKind(Kind kind) { + Class javaClass = kind.toJavaClass(); + return fromClass(javaClass); + } + + /** + * Creates the Graal mirror for a primitive {@link Kind}. + * + *

+ * NOTE: Creating an instance of this class does not install the mirror for the + * {@link Class} type. Use {@link #fromKind(Kind)} or {@link #fromClass(Class)} instead. + *

+ * + * @param kind the Kind to create the mirror for + */ public HotSpotResolvedPrimitiveType(Kind kind) { super(String.valueOf(Character.toUpperCase(kind.getTypeChar()))); this.kind = kind; this.javaMirror = kind.toJavaClass(); this.javaArrayMirror = kind == Kind.Void ? null : Array.newInstance(javaMirror, 0).getClass(); + assert javaMirror.isPrimitive() : javaMirror + " not a primitive type"; } @Override diff -r fe03864a2c72 -r 606959535fd4 src/share/vm/classfile/javaClasses.cpp --- a/src/share/vm/classfile/javaClasses.cpp Wed Dec 25 12:14:29 2013 -0800 +++ b/src/share/vm/classfile/javaClasses.cpp Wed Dec 25 20:27:59 2013 -0800 @@ -674,13 +674,6 @@ return java_class; } -#ifdef GRAAL -oop java_lang_Class::graal_mirror(oop java_class) { - assert(_graal_mirror_offset != 0, "must be set"); - return java_class->obj_field(_graal_mirror_offset); -} -#endif - Klass* java_lang_Class::as_Klass(oop java_class) { //%note memory_2 assert(java_lang_Class::is_instance(java_class), "must be a Class object"); @@ -3065,9 +3058,6 @@ int java_lang_Class::_protection_domain_offset; int java_lang_Class::_init_lock_offset; int java_lang_Class::_signers_offset; -#ifdef GRAAL -int java_lang_Class::_graal_mirror_offset; -#endif GrowableArray* java_lang_Class::_fixup_mirror_list = NULL; int java_lang_Throwable::backtrace_offset; int java_lang_Throwable::detailMessage_offset; diff -r fe03864a2c72 -r 606959535fd4 src/share/vm/classfile/javaClasses.hpp --- a/src/share/vm/classfile/javaClasses.hpp Wed Dec 25 12:14:29 2013 -0800 +++ b/src/share/vm/classfile/javaClasses.hpp Wed Dec 25 20:27:59 2013 -0800 @@ -207,7 +207,6 @@ #define CLASS_INJECTED_FIELDS(macro) \ macro(java_lang_Class, klass, intptr_signature, false) \ - GRAAL_ONLY(macro(java_lang_Class, graal_mirror, object_signature, false))\ macro(java_lang_Class, array_klass, intptr_signature, false) \ macro(java_lang_Class, oop_size, int_signature, false) \ macro(java_lang_Class, static_oop_field_count, int_signature, false) \ @@ -226,9 +225,6 @@ static int _oop_size_offset; static int _static_oop_field_count_offset; -#ifdef GRAAL - static int _graal_mirror_offset; -#endif static int _protection_domain_offset; static int _init_lock_offset; @@ -287,11 +283,6 @@ static int static_oop_field_count(oop java_class); static void set_static_oop_field_count(oop java_class, int size); -#ifdef GRAAL - static oop graal_mirror(oop java_class); - static int graal_mirror_offset_in_bytes() { return _graal_mirror_offset; } -#endif - static GrowableArray* fixup_mirror_list() { return _fixup_mirror_list; } diff -r fe03864a2c72 -r 606959535fd4 src/share/vm/graal/graalCompiler.cpp --- a/src/share/vm/graal/graalCompiler.cpp Wed Dec 25 12:14:29 2013 -0800 +++ b/src/share/vm/graal/graalCompiler.cpp Wed Dec 25 20:27:59 2013 -0800 @@ -229,7 +229,7 @@ Handle signature_string = java_lang_String::create_from_symbol(signature, CHECK_NH); return VMToCompiler::createUnresolvedJavaType(signature_string, CHECK_NH); } else { - return createHotSpotResolvedObjectType(klass, CHECK_NH); + return VMToCompiler::createResolvedJavaType(klass->java_mirror(), CHECK_NH); } } else { return VMToCompiler::createPrimitiveJavaType(field_type, CHECK_NH); @@ -252,7 +252,7 @@ if (tag.is_klass()) { // The klass has been inserted into the constant pool // very recently. - return GraalCompiler::createHotSpotResolvedObjectType(cp->resolved_klass_at(index), CHECK_NH); + return VMToCompiler::createResolvedJavaType(cp->resolved_klass_at(index)->java_mirror(), CHECK_NH); } else if (tag.is_symbol()) { klass_name = cp->symbol_at(index); } else { @@ -263,7 +263,7 @@ Handle klass_name_string = java_lang_String::create_from_symbol(klass_name, CHECK_NH); return VMToCompiler::createUnresolvedJavaType(klass_name_string, CHECK_NH); } else { - return GraalCompiler::createHotSpotResolvedObjectType(klass, CHECK_NH); + return VMToCompiler::createResolvedJavaType(klass->java_mirror(), CHECK_NH); } } @@ -272,16 +272,6 @@ return VMToCompiler::createJavaField(field_holder, name, field_type, offset, flags, false, CHECK_NH); } -Handle GraalCompiler::createHotSpotResolvedObjectType(KlassHandle klass, TRAPS) { - oop java_class = klass->java_mirror(); - oop graal_mirror = java_lang_Class::graal_mirror(java_class); - if (graal_mirror != NULL) { - assert(graal_mirror->is_a(HotSpotResolvedObjectType::klass()), "unexpected class..."); - return graal_mirror; - } - return VMToCompiler::createResolvedJavaType(java_class, CHECK_NH); -} - BasicType GraalCompiler::kindToBasicType(jchar ch) { switch(ch) { case 'z': return T_BOOLEAN; diff -r fe03864a2c72 -r 606959535fd4 src/share/vm/graal/graalCompiler.hpp --- a/src/share/vm/graal/graalCompiler.hpp Wed Dec 25 12:14:29 2013 -0800 +++ b/src/share/vm/graal/graalCompiler.hpp Wed Dec 25 20:27:59 2013 -0800 @@ -75,8 +75,6 @@ static Handle get_JavaType(constantPoolHandle cp, int index, KlassHandle accessor, TRAPS); static Handle get_JavaField(int offset, int flags, Symbol* field_name, Handle field_holder, Handle field_type, TRAPS); - static Handle createHotSpotResolvedObjectType(KlassHandle klass, TRAPS); - void exit(); static BasicType kindToBasicType(jchar ch); diff -r fe03864a2c72 -r 606959535fd4 src/share/vm/graal/graalCompilerToVM.cpp --- a/src/share/vm/graal/graalCompilerToVM.cpp Wed Dec 25 12:14:29 2013 -0800 +++ b/src/share/vm/graal/graalCompilerToVM.cpp Wed Dec 25 20:27:59 2013 -0800 @@ -235,7 +235,7 @@ Handle type = VMToCompiler::createUnresolvedJavaType(name, THREAD); result = type(); } else { - Handle type = GraalCompiler::createHotSpotResolvedObjectType(resolved_type, CHECK_NULL); + Handle type = VMToCompiler::createResolvedJavaType(resolved_type->java_mirror(), CHECK_NULL); result = type(); } } @@ -280,7 +280,7 @@ methodHandle method = GraalEnv::get_method_by_index(cp, cp_index, bc, pool_holder); if (!method.is_null()) { - Handle holder = GraalCompiler::createHotSpotResolvedObjectType(method->method_holder(), CHECK_NULL); + Handle holder = VMToCompiler::createResolvedJavaType(method->method_holder()->java_mirror(), CHECK_NULL); return JNIHandles::make_local(THREAD, VMToCompiler::createResolvedJavaMethod(holder, method(), THREAD)); } else { // Get the method's name and signature. @@ -355,7 +355,7 @@ flags = result.access_flags(); holder_klass = result.field_holder(); basic_type = result.field_type(); - holder = GraalCompiler::createHotSpotResolvedObjectType(holder_klass, CHECK_NULL); + holder = VMToCompiler::createResolvedJavaType(holder_klass->java_mirror(), CHECK_NULL); } } diff -r fe03864a2c72 -r 606959535fd4 src/share/vm/graal/vmStructs_graal.hpp --- a/src/share/vm/graal/vmStructs_graal.hpp Wed Dec 25 12:14:29 2013 -0800 +++ b/src/share/vm/graal/vmStructs_graal.hpp Wed Dec 25 20:27:59 2013 -0800 @@ -29,7 +29,6 @@ #include "graal/graalEnv.hpp" #define VM_STRUCTS_GRAAL(nonstatic_field, static_field) \ - static_field(java_lang_Class, _graal_mirror_offset, int) \ nonstatic_field(ThreadShadow, _pending_deoptimization, int) \ #define VM_TYPES_GRAAL(declare_type, declare_toplevel_type) \