changeset 13479:606959535fd4

remove Graal mirror from Class
author twisti
date Wed, 25 Dec 2013 20:27:59 -0800
parents fe03864a2c72
children 6215ff792647
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotGraalRuntime.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompilerImpl.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedPrimitiveType.java src/share/vm/classfile/javaClasses.cpp src/share/vm/classfile/javaClasses.hpp src/share/vm/graal/graalCompiler.cpp src/share/vm/graal/graalCompiler.hpp src/share/vm/graal/graalCompilerToVM.cpp src/share/vm/graal/vmStructs_graal.hpp
diffstat 12 files changed, 89 insertions(+), 135 deletions(-) [+]
line wrap: on
line diff
--- 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<ResolvedJavaType> graalMirrors = new ClassValue<ResolvedJavaType>() {
+        @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<Class<? extends Architecture>, 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<? extends Architecture> 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);
     }
--- 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;
--- 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
--- 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);
     }
--- 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.
      * 
      * <p>
-     * <b>NOTE</b>: Creating a Graal mirror does not install the mirror in the {@link Class} object.
+     * <b>NOTE</b>: 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.
      * </p>
      * 
      * @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();
--- 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}.
+     * 
+     * <p>
+     * <b>NOTE</b>: 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.
+     * </p>
+     * 
+     * @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
--- 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<Klass*>* java_lang_Class::_fixup_mirror_list = NULL;
 int java_lang_Throwable::backtrace_offset;
 int java_lang_Throwable::detailMessage_offset;
--- 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<Klass*>* fixup_mirror_list() {
     return _fixup_mirror_list;
   }
--- 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;
--- 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);
--- 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);
     }
   }
 
--- 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)                   \