changeset 1941:79d04223b8a5

Added caching for resolved types and resolved fields. This is crucial, because the local load elimination will lead to wrong results, if field equality (of two RiField objects with the same object and the same RiType) is not given. The caching makes sure that the default equals implementation is sufficient.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Tue, 28 Dec 2010 18:33:26 +0100
parents e92a9a73324e
children 00bc9eaf0e24
files c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotField.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotSignature.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypePrimitive.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeResolved.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeUnresolved.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntries.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntriesNative.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExits.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExitsNative.java src/share/vm/c1x/c1x_CodeInstaller.cpp src/share/vm/c1x/c1x_Compiler.cpp src/share/vm/c1x/c1x_TargetMethod.hpp src/share/vm/c1x/c1x_VMEntries.cpp src/share/vm/c1x/c1x_VMExits.cpp src/share/vm/c1x/c1x_VMExits.hpp src/share/vm/classfile/vmSymbols.hpp src/share/vm/oops/klass.cpp src/share/vm/oops/klass.hpp src/share/vm/oops/klassKlass.cpp
diffstat 19 files changed, 150 insertions(+), 120 deletions(-) [+]
line wrap: on
line diff
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotField.java	Mon Dec 27 20:35:47 2010 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotField.java	Tue Dec 28 18:33:26 2010 +0100
@@ -67,6 +67,15 @@
     }
 
     @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof HotSpotField) {
+            HotSpotField other = (HotSpotField) obj;
+            return other.offset == offset && other.holder.equals(holder());
+        }
+        return false;
+    }
+
+    @Override
     public boolean isResolved() {
         return offset != -1;
     }
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotSignature.java	Mon Dec 27 20:35:47 2010 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotSignature.java	Tue Dec 28 18:33:26 2010 +0100
@@ -116,11 +116,7 @@
         }
         RiType type = argumentTypes[index];
         if (type == null) {
-            long accessor = 0;
-            if (accessingClass instanceof HotSpotTypeResolved) {
-                accessor = (Long) ((HotSpotTypeResolved) accessingClass).getVmId();
-            }
-            type = Compiler.getVMEntries().RiSignature_lookupType(arguments.get(index), accessor);
+            type = Compiler.getVMEntries().RiSignature_lookupType(arguments.get(index), (HotSpotTypeResolved) accessingClass);
             argumentTypes[index] = type;
         }
         return type;
@@ -139,11 +135,7 @@
     @Override
     public RiType returnType(RiType accessingClass) {
         if (returnTypeCache == null) {
-            long accessor = 0;
-            if (accessingClass instanceof HotSpotTypeResolved) {
-                accessor = (Long) ((HotSpotTypeResolved) accessingClass).getVmId();
-            }
-            returnTypeCache = Compiler.getVMEntries().RiSignature_lookupType(returnType, accessor);
+            returnTypeCache = Compiler.getVMEntries().RiSignature_lookupType(returnType, (HotSpotTypeResolved) accessingClass);
         }
         return returnTypeCache;
     }
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypePrimitive.java	Mon Dec 27 20:35:47 2010 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypePrimitive.java	Tue Dec 28 18:33:26 2010 +0100
@@ -28,11 +28,21 @@
  *
  * @author Thomas Wuerthinger, Lukas Stadler
  */
-public class HotSpotTypePrimitive implements HotSpotType {
+public final class HotSpotTypePrimitive implements HotSpotType {
 
     private CiKind kind;
 
-    public HotSpotTypePrimitive(CiKind kind) {
+    public static final HotSpotTypePrimitive Boolean = new HotSpotTypePrimitive(CiKind.Boolean);
+    public static final HotSpotTypePrimitive Char = new HotSpotTypePrimitive(CiKind.Char);
+    public static final HotSpotTypePrimitive Float = new HotSpotTypePrimitive(CiKind.Float);
+    public static final HotSpotTypePrimitive Double = new HotSpotTypePrimitive(CiKind.Double);
+    public static final HotSpotTypePrimitive Byte = new HotSpotTypePrimitive(CiKind.Byte);
+    public static final HotSpotTypePrimitive Short = new HotSpotTypePrimitive(CiKind.Short);
+    public static final HotSpotTypePrimitive Int = new HotSpotTypePrimitive(CiKind.Int);
+    public static final HotSpotTypePrimitive Long = new HotSpotTypePrimitive(CiKind.Long);
+    public static final HotSpotTypePrimitive Void = new HotSpotTypePrimitive(CiKind.Void);
+
+    private HotSpotTypePrimitive(CiKind kind) {
         this.kind = kind;
     }
 
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeResolved.java	Mon Dec 27 20:35:47 2010 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeResolved.java	Tue Dec 28 18:33:26 2010 +0100
@@ -21,6 +21,7 @@
 package com.sun.hotspot.c1x;
 
 import java.lang.reflect.*;
+import java.util.*;
 
 import com.sun.cri.ci.*;
 import com.sun.cri.ri.*;
@@ -33,7 +34,6 @@
  */
 public class HotSpotTypeResolved implements HotSpotType {
 
-    private long vmId;
     private Class javaMirror;
     private String name;
     private int accessFlags;
@@ -46,6 +46,7 @@
     private boolean isInterface;
     private int instanceSize;
     private RiType componentType;
+    private HashMap<Integer, RiField> fieldCache;
 
     @Override
     public int accessFlags() {
@@ -61,7 +62,7 @@
 
     @Override
     public RiType componentType() {
-        return Compiler.getVMEntries().RiType_componentType(vmId);
+        return Compiler.getVMEntries().RiType_componentType(this);
     }
 
     @Override
@@ -141,7 +142,7 @@
     @Override
     public boolean isSubtypeOf(RiType other) {
         if (other instanceof HotSpotTypeResolved) {
-            return Compiler.getVMEntries().RiType_isSubtypeOf(vmId, other);
+            return Compiler.getVMEntries().RiType_isSubtypeOf(this, other);
         }
         // No resolved type is a subtype of an unresolved type.
         return false;
@@ -170,7 +171,7 @@
     @Override
     public RiMethod resolveMethodImpl(RiMethod method) {
         assert method instanceof HotSpotMethod;
-        return Compiler.getVMEntries().RiType_resolveMethodImpl(vmId, method.name(), method.signature().asString());
+        return Compiler.getVMEntries().RiType_resolveMethodImpl(this, method.name(), method.signature().asString());
     }
 
     @Override
@@ -179,15 +180,29 @@
     }
 
     public RiConstantPool constantPool() {
-        return Compiler.getVMEntries().RiType_constantPool(vmId);
-    }
-
-    public long getVmId() {
-        return vmId;
+        return Compiler.getVMEntries().RiType_constantPool(this);
     }
 
     public int instanceSize() {
         return instanceSize;
     }
 
+    public RiField createRiField(String name, RiType type, int offset) {
+        RiField result = null;
+
+        // (tw) Must cache the fields, because the local load elimination only works if the objects from two field lookups are equal.
+        if (fieldCache == null) {
+            fieldCache = new HashMap<Integer, RiField>(8);
+        } else {
+            result = fieldCache.get(offset);
+        }
+
+        if (result == null) {
+            result = new HotSpotField(this, name, type, offset);
+            fieldCache.put(offset, result);
+        }
+
+        return result;
+    }
+
 }
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeUnresolved.java	Mon Dec 27 20:35:47 2010 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeUnresolved.java	Tue Dec 28 18:33:26 2010 +0100
@@ -32,12 +32,11 @@
 
     public final String name;
     public final int dimensions;
-    private final long accessingClassVmId;
 
     /**
      * Creates a new unresolved type for a specified type descriptor.
      */
-    public HotSpotTypeUnresolved(String name, long accessingClassVmId) {
+    public HotSpotTypeUnresolved(String name) {
         assert name.length() > 0 : "name cannot be empty";
 
         int dimensions = 0;
@@ -54,14 +53,12 @@
 
         this.name = name;
         this.dimensions = dimensions;
-        this.accessingClassVmId = accessingClassVmId;
     }
 
-    public HotSpotTypeUnresolved(String name, int dimensions, long accessingClassVmId) {
+    public HotSpotTypeUnresolved(String name, int dimensions) {
         assert dimensions >= 0;
         this.name = name;
         this.dimensions = dimensions;
-        this.accessingClassVmId = accessingClassVmId;
     }
 
     @Override
@@ -142,7 +139,7 @@
     @Override
     public RiType componentType() {
         assert isArrayClass() : "no array class" + name();
-        return new HotSpotTypeUnresolved(name, dimensions - 1, accessingClassVmId);
+        return new HotSpotTypeUnresolved(name, dimensions - 1);
     }
 
     @Override
@@ -152,7 +149,7 @@
 
     @Override
     public RiType arrayOf() {
-        return new HotSpotTypeUnresolved(name, dimensions + 1, accessingClassVmId);
+        return new HotSpotTypeUnresolved(name, dimensions + 1);
     }
 
     @Override
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntries.java	Mon Dec 27 20:35:47 2010 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntries.java	Tue Dec 28 18:33:26 2010 +0100
@@ -45,7 +45,7 @@
 
     int RiMethod_accessFlags(long vmId);
 
-    RiType RiSignature_lookupType(String returnType, long accessingClassVmId);
+    RiType RiSignature_lookupType(String returnType, HotSpotTypeResolved accessingClass);
 
     Object RiConstantPool_lookupConstant(long vmId, int cpi);
 
@@ -57,7 +57,7 @@
 
     RiField RiConstantPool_lookupField(long vmId, int cpi, byte byteCode);
 
-    RiConstantPool RiType_constantPool(long vmId);
+    RiConstantPool RiType_constantPool(HotSpotTypeResolved klass);
 
     void installMethod(HotSpotTargetMethod targetMethod);
 
@@ -67,15 +67,15 @@
 
     RiExceptionHandler[] RiMethod_exceptionHandlers(long vmId);
 
-    RiMethod RiType_resolveMethodImpl(long vmId, String name, String signature);
+    RiMethod RiType_resolveMethodImpl(HotSpotTypeResolved klass, String name, String signature);
 
-    boolean RiType_isSubtypeOf(long vmId, RiType other);
+    boolean RiType_isSubtypeOf(HotSpotTypeResolved klass, RiType other);
 
     RiType getPrimitiveArrayType(CiKind kind);
 
     RiType RiType_arrayOf(long vmId);
 
-    RiType RiType_componentType(long vmId);
+    RiType RiType_componentType(HotSpotTypeResolved klass);
 
     RiType getType(Class<?> javaClass);
 
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntriesNative.java	Mon Dec 27 20:35:47 2010 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMEntriesNative.java	Tue Dec 28 18:33:26 2010 +0100
@@ -51,7 +51,7 @@
     public native int RiMethod_accessFlags(long vmId);
 
     @Override
-    public native RiType RiSignature_lookupType(String returnType, long accessingClassVmId);
+    public native RiType RiSignature_lookupType(String returnType, HotSpotTypeResolved accessingClass);
 
     @Override
     public native Object RiConstantPool_lookupConstant(long vmId, int cpi);
@@ -69,7 +69,7 @@
     public native RiField RiConstantPool_lookupField(long vmId, int cpi, byte byteCode);
 
     @Override
-    public native RiConstantPool RiType_constantPool(long vmId);
+    public native RiConstantPool RiType_constantPool(HotSpotTypeResolved klass);
 
     @Override
     public native void installMethod(HotSpotTargetMethod targetMethod);
@@ -84,10 +84,10 @@
     public native RiExceptionHandler[] RiMethod_exceptionHandlers(long vmId);
 
     @Override
-    public native RiMethod RiType_resolveMethodImpl(long vmId, String name, String signature);
+    public native RiMethod RiType_resolveMethodImpl(HotSpotTypeResolved klass, String name, String signature);
 
     @Override
-    public native boolean RiType_isSubtypeOf(long vmId, RiType other);
+    public native boolean RiType_isSubtypeOf(HotSpotTypeResolved klass, RiType other);
 
     @Override
     public native RiType getPrimitiveArrayType(CiKind kind);
@@ -96,7 +96,7 @@
     public native RiType RiType_arrayOf(long vmId);
 
     @Override
-    public native RiType RiType_componentType(long vmId);
+    public native RiType RiType_componentType(HotSpotTypeResolved klass);
 
     @Override
     public native RiType getType(Class<?> javaClass);
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExits.java	Mon Dec 27 20:35:47 2010 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExits.java	Tue Dec 28 18:33:26 2010 +0100
@@ -47,7 +47,7 @@
 
     RiType createRiTypePrimitive(int basicType);
 
-    RiType createRiTypeUnresolved(String name, long accessingClassVmId);
+    RiType createRiTypeUnresolved(String name);
 
     RiConstantPool createRiConstantPool(long vmId);
 
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExitsNative.java	Mon Dec 27 20:35:47 2010 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExitsNative.java	Tue Dec 28 18:33:26 2010 +0100
@@ -182,6 +182,10 @@
 
     @Override
     public RiField createRiField(RiType holder, String name, RiType type, int offset) {
+        if (offset != -1) {
+            HotSpotTypeResolved resolved = (HotSpotTypeResolved) holder;
+            return resolved.createRiField(name, type, offset);
+        }
         return new HotSpotField(holder, name, type, offset);
     }
 
@@ -192,44 +196,33 @@
 
     @Override
     public RiType createRiTypePrimitive(int basicType) {
-        CiKind kind = null;
         switch (basicType) {
             case 4:
-                kind = CiKind.Boolean;
-                break;
+                return HotSpotTypePrimitive.Boolean;
             case 5:
-                kind = CiKind.Char;
-                break;
+                return HotSpotTypePrimitive.Char;
             case 6:
-                kind = CiKind.Float;
-                break;
+                return HotSpotTypePrimitive.Float;
             case 7:
-                kind = CiKind.Double;
-                break;
+                return HotSpotTypePrimitive.Double;
             case 8:
-                kind = CiKind.Byte;
-                break;
+                return HotSpotTypePrimitive.Byte;
             case 9:
-                kind = CiKind.Short;
-                break;
+                return HotSpotTypePrimitive.Short;
             case 10:
-                kind = CiKind.Int;
-                break;
+                return HotSpotTypePrimitive.Int;
             case 11:
-                kind = CiKind.Long;
-                break;
+                return HotSpotTypePrimitive.Long;
             case 14:
-                kind = CiKind.Void;
-                break;
+                return HotSpotTypePrimitive.Void;
             default:
                 throw new IllegalArgumentException("Unknown basic type: " + basicType);
         }
-        return new HotSpotTypePrimitive(kind);
     }
 
     @Override
-    public RiType createRiTypeUnresolved(String name, long accessingClassVmId) {
-        return new HotSpotTypeUnresolved(name, accessingClassVmId);
+    public RiType createRiTypeUnresolved(String name) {
+        return new HotSpotTypeUnresolved(name);
     }
 
     @Override
--- a/src/share/vm/c1x/c1x_CodeInstaller.cpp	Mon Dec 27 20:35:47 2010 +0100
+++ b/src/share/vm/c1x/c1x_CodeInstaller.cpp	Tue Dec 28 18:33:26 2010 +0100
@@ -559,7 +559,7 @@
       Handle obj = CiConstant::object(constant);
 
       if (obj->is_a(HotSpotTypeResolved::klass())) {
-        *((jobject*) operand) = JNIHandles::make_local(VmIds::get<klassOop>(HotSpotTypeResolved::vmId(obj)));
+        *((jobject*) operand) = JNIHandles::make_local(java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(obj)));
         _instructions->relocate(instruction, oop_Relocation::spec_for_immediate(), Assembler::imm_operand);
         TRACE_C1X_3("relocating (HotSpotType) at %016x/%016x", instruction, operand);
       } else {
--- a/src/share/vm/c1x/c1x_Compiler.cpp	Mon Dec 27 20:35:47 2010 +0100
+++ b/src/share/vm/c1x/c1x_Compiler.cpp	Tue Dec 28 18:33:26 2010 +0100
@@ -117,7 +117,7 @@
     return createHotSpotTypeResolved(klass, name, CHECK_NULL);
   } else {
     symbolOop name = ((ciKlass *) type)->name()->get_symbolOop();
-    return VMExits::createRiTypeUnresolved(VmIds::toString<Handle>(name, THREAD), VmIds::add<klassOop>(accessor()), THREAD);
+    return VMExits::createRiTypeUnresolved(VmIds::toString<Handle>(name, THREAD), THREAD);
   }
 }
 
@@ -133,10 +133,13 @@
 }
 
 oop C1XCompiler::createHotSpotTypeResolved(KlassHandle klass, Handle name, TRAPS) {
+  if (klass->c1x_mirror() != NULL) {
+    return klass->c1x_mirror();
+  }
+
   instanceKlass::cast(HotSpotTypeResolved::klass())->initialize(CHECK_NULL);
   oop obj = instanceKlass::cast(HotSpotTypeResolved::klass())->allocate_instance(CHECK_NULL);
 
-  HotSpotTypeResolved::set_vmId(obj, VmIds::add(klass, VmIds::CLASS));
   HotSpotTypeResolved::set_javaMirror(obj, klass->java_mirror());
   HotSpotTypeResolved::set_name(obj, name());
   HotSpotTypeResolved::set_accessFlags(obj, klass->access_flags().as_int());
@@ -158,6 +161,8 @@
   HotSpotTypeResolved::set_hasSubclass(obj, false);
   HotSpotTypeResolved::set_hasFinalizableSubclass(obj, false);
 
+  klass->set_c1x_mirror(obj);
+
   return obj;
 }
 
--- a/src/share/vm/c1x/c1x_TargetMethod.hpp	Mon Dec 27 20:35:47 2010 +0100
+++ b/src/share/vm/c1x/c1x_TargetMethod.hpp	Tue Dec 28 18:33:26 2010 +0100
@@ -44,7 +44,6 @@
 
 #define COMPILER_CLASSES_DO(start_class, end_class, char_field, int_field, boolean_field, long_field, oop_field, static_oop_field)   \
   start_class(HotSpotTypeResolved)                                                      \
-    long_field(HotSpotTypeResolved, vmId)                                               \
     oop_field(HotSpotTypeResolved, javaMirror, "Ljava/lang/Class;")                     \
     oop_field(HotSpotTypeResolved, name, "Ljava/lang/String;")                          \
     int_field(HotSpotTypeResolved, accessFlags)                                         \
--- a/src/share/vm/c1x/c1x_VMEntries.cpp	Mon Dec 27 20:35:47 2010 +0100
+++ b/src/share/vm/c1x/c1x_VMEntries.cpp	Tue Dec 28 18:33:26 2010 +0100
@@ -113,8 +113,8 @@
   return cimethod->has_balanced_monitors();
 }
 
-// public RiType RiSignature_lookupType(String returnType, long accessingClassVmId);
-JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiSignature_1lookupType(JNIEnv *env, jobject, jstring jname, jlong accessingClassVmId) {
+// public RiType RiSignature_lookupType(String returnType, HotSpotTypeResolved accessingClass);
+JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiSignature_1lookupType(JNIEnv *env, jobject, jstring jname, jobject accessingClass) {
   VM_ENTRY_MARK;
 
   symbolOop nameSymbol = VmIds::toSymbol(jname);
@@ -141,12 +141,8 @@
     klassOop resolved_type = NULL;
     // if the name isn't in the symbol table then the class isn't loaded anyway...
     if (nameSymbol != NULL) {
-      Handle classloader;
-      Handle protectionDomain;
-      if (accessingClassVmId != 0) {
-        classloader = VmIds::get<klassOop>(accessingClassVmId)->klass_part()->class_loader();
-        protectionDomain = VmIds::get<klassOop>(accessingClassVmId)->klass_part()->protection_domain();
-      }
+      Handle classloader = java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(accessingClass))->klass_part()->class_loader();
+      Handle protectionDomain = java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(accessingClass))->klass_part()->protection_domain();
       resolved_type = SystemDictionary::resolve_or_null(nameSymbol, classloader, protectionDomain, THREAD);
       if (HAS_PENDING_EXCEPTION) {
         CLEAR_PENDING_EXCEPTION;
@@ -156,7 +152,7 @@
     if (resolved_type != NULL) {
       result = C1XCompiler::createHotSpotTypeResolved(resolved_type, name, CHECK_NULL);
     } else {
-      result = VMExits::createRiTypeUnresolved(name, accessingClassVmId, THREAD);
+      result = VMExits::createRiTypeUnresolved(name, THREAD);
     }
   }
 
@@ -310,19 +306,19 @@
   return JNIHandles::make_local(THREAD, field_handle());
 }
 
-// public RiConstantPool RiType_constantPool(long vmId);
-JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1constantPool(JNIEnv *, jobject, jlong vmId) {
+// public RiConstantPool RiType_constantPool(HotSpotTypeResolved klass);
+JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1constantPool(JNIEnv *, jobject, jobject klass) {
   VM_ENTRY_MARK;
 
-  constantPoolOop constantPool = instanceKlass::cast(VmIds::get<klassOop>(vmId))->constants();
+  constantPoolOop constantPool = ((instanceKlass*)java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(klass))->klass_part())->constants();
   return JNIHandles::make_local(VMExits::createRiConstantPool(VmIds::add<constantPoolOop>(constantPool), THREAD));
 }
 
-// public RiMethod RiType_resolveMethodImpl(long vmId, String name, String signature);
-JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_3resolveMethodImpl(JNIEnv *, jobject, jlong vmId, jstring name, jstring signature) {
+// public RiMethod RiType_resolveMethodImpl(HotSpotTypeResolved klass, String name, String signature);
+JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_3resolveMethodImpl(JNIEnv *, jobject, jobject resolved_type, jstring name, jstring signature) {
   VM_ENTRY_MARK;
 
-  klassOop klass = VmIds::get<klassOop>(vmId);
+  klassOop klass = java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(resolved_type));
   symbolOop name_symbol = VmIds::toSymbol(name);
   symbolOop signature_symbol = VmIds::toSymbol(signature);
   methodOop method = klass->klass_part()->lookup_method(name_symbol, signature_symbol);
@@ -336,12 +332,12 @@
   return JNIHandles::make_local(THREAD, VMExits::createRiMethodResolved(VmIds::add<methodOop>(method), Handle(JNIHandles::resolve(name)), THREAD));
 }
 
-// public boolean RiType_isSubtypeOf(long vmId, RiType other);
-JNIEXPORT jboolean JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_2isSubtypeOf(JNIEnv *, jobject, jlong vmId, jobject jother) {
+// public boolean RiType_isSubtypeOf(HotSpotTypeResolved klass, RiType other);
+JNIEXPORT jboolean JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_2isSubtypeOf(JNIEnv *, jobject, jobject klass, jobject jother) {
   oop other = JNIHandles::resolve(jother);
   assert(other->is_a(HotSpotTypeResolved::klass()), "resolved hotspot type expected");
-  klassOop thisKlass = VmIds::get<klassOop>(vmId);
-  klassOop otherKlass = VmIds::get<klassOop>(HotSpotTypeResolved::vmId(other));
+  klassOop thisKlass = java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(klass));
+  klassOop otherKlass = java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(other));
   if (thisKlass->klass_part()->oop_is_instance_slow()) {
     return instanceKlass::cast(thisKlass)->is_subtype_of(otherKlass);
   } else if (thisKlass->klass_part()->oop_is_array()) {
@@ -351,17 +347,17 @@
   }
 }
 
-// public RiType RiType_componentType(long vmId);
-JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1componentType(JNIEnv *, jobject, jlong vmId) {
-  ciArrayKlass* klass;
+// public RiType RiType_componentType(HotSpotResolvedType klass);
+JNIEXPORT jobject JNICALL Java_com_sun_hotspot_c1x_VMEntries_RiType_1componentType(JNIEnv *, jobject, jobject klass) {
+  ciArrayKlass* array_klass;
   {
     VM_ENTRY_MARK;
-    klass = (ciArrayKlass *) CURRENT_ENV->get_object(VmIds::get<klassOop>(vmId));
+    array_klass = (ciArrayKlass *) CURRENT_ENV->get_object(java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(klass)));
   }
-  ciType* element_type = klass->element_type();
+  ciType* element_type = array_klass->element_type();
 
   VM_ENTRY_MARK;
-  return JNIHandles::make_local(C1XCompiler::get_RiType(element_type, VmIds::get<klassOop>(vmId), THREAD));
+  return JNIHandles::make_local(C1XCompiler::get_RiType(element_type, java_lang_Class::as_klassOop(HotSpotTypeResolved::javaMirror(klass)), THREAD));
 }
 
 // public RiType RiType_arrayOf(long vmId);
@@ -528,6 +524,7 @@
 
 #define PROXY           "J"
 #define TYPE            "Lcom/sun/cri/ri/RiType;"
+#define RESOLVED_TYPE   "Lcom/sun/hotspot/c1x/HotSpotTypeResolved;"
 #define METHOD          "Lcom/sun/cri/ri/RiMethod;"
 #define SIGNATURE       "Lcom/sun/cri/ri/RiSignature;"
 #define FIELD           "Lcom/sun/cri/ri/RiField;"
@@ -543,31 +540,31 @@
 #define CLASS           "Ljava/lang/Class;"
 
 JNINativeMethod VMEntries_methods[] = {
-  {CC"RiMethod_code",                   CC"("PROXY")[B",                    FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1code)},
-  {CC"RiMethod_maxStackSize",           CC"("PROXY")I",                     FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1maxStackSize)},
-  {CC"RiMethod_maxLocals",              CC"("PROXY")I",                     FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1maxLocals)},
-  {CC"RiMethod_holder",                 CC"("PROXY")"TYPE,                  FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1holder)},
-  {CC"RiMethod_signature",              CC"("PROXY")"STRING,                FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1signature)},
-  {CC"RiMethod_accessFlags",            CC"("PROXY")I",                     FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1accessFlags)},
-  {CC"RiMethod_exceptionHandlers",      CC"("PROXY")"EXCEPTION_HANDLERS,    FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1exceptionHandlers)},
-  {CC"RiMethod_hasBalancedMonitors",    CC"("PROXY")Z",                     FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1hasBalancedMonitors)},
-  {CC"RiSignature_lookupType",          CC"("STRING PROXY")"TYPE,           FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiSignature_1lookupType)},
-  {CC"RiConstantPool_lookupConstant",   CC"("PROXY"I)"OBJECT,               FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupConstant)},
-  {CC"RiConstantPool_lookupMethod",     CC"("PROXY"IB)"METHOD,              FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupMethod)},
-  {CC"RiConstantPool_lookupSignature",  CC"("PROXY"I)"SIGNATURE,            FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupSignature)},
-  {CC"RiConstantPool_lookupType",       CC"("PROXY"I)"TYPE,                 FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupType)},
-  {CC"RiConstantPool_lookupField",      CC"("PROXY"IB)"FIELD,               FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupField)},
-  {CC"RiType_constantPool",             CC"("PROXY")"CONSTANT_POOL,         FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1constantPool)},
-  {CC"RiType_resolveMethodImpl",        CC"("PROXY STRING STRING")"METHOD,  FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_3resolveMethodImpl)},
-  {CC"RiType_isSubtypeOf",              CC"("PROXY TYPE")Z",                FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_2isSubtypeOf)},
-  {CC"RiType_componentType",            CC"("PROXY")"TYPE,                  FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1componentType)},
-  {CC"RiType_arrayOf",                  CC"("PROXY")"TYPE,                  FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1arrayOf)},
-  {CC"getPrimitiveArrayType",           CC"("CI_KIND")"TYPE,                FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_getPrimitiveArrayType)},
-  {CC"getType",                         CC"("CLASS")"TYPE,                  FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_getType)},
-  {CC"getConfiguration",                CC"()"CONFIG,                       FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_getConfiguration)},
-  {CC"installMethod",                   CC"("TARGET_METHOD")V",             FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_installMethod)},
-  {CC"installStub",                     CC"("TARGET_METHOD")"PROXY,         FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_installStub)},
-  {CC"recordBailout",                   CC"("STRING")V",                    FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_recordBailout)}
+  {CC"RiMethod_code",                   CC"("PROXY")[B",                            FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1code)},
+  {CC"RiMethod_maxStackSize",           CC"("PROXY")I",                             FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1maxStackSize)},
+  {CC"RiMethod_maxLocals",              CC"("PROXY")I",                             FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1maxLocals)},
+  {CC"RiMethod_holder",                 CC"("PROXY")"TYPE,                          FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1holder)},
+  {CC"RiMethod_signature",              CC"("PROXY")"STRING,                        FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1signature)},
+  {CC"RiMethod_accessFlags",            CC"("PROXY")I",                             FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1accessFlags)},
+  {CC"RiMethod_exceptionHandlers",      CC"("PROXY")"EXCEPTION_HANDLERS,            FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1exceptionHandlers)},
+  {CC"RiMethod_hasBalancedMonitors",    CC"("PROXY")Z",                             FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiMethod_1hasBalancedMonitors)},
+  {CC"RiSignature_lookupType",          CC"("STRING RESOLVED_TYPE")"TYPE,           FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiSignature_1lookupType)},
+  {CC"RiConstantPool_lookupConstant",   CC"("PROXY"I)"OBJECT,                       FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupConstant)},
+  {CC"RiConstantPool_lookupMethod",     CC"("PROXY"IB)"METHOD,                      FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupMethod)},
+  {CC"RiConstantPool_lookupSignature",  CC"("PROXY"I)"SIGNATURE,                    FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupSignature)},
+  {CC"RiConstantPool_lookupType",       CC"("PROXY"I)"TYPE,                         FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupType)},
+  {CC"RiConstantPool_lookupField",      CC"("PROXY"IB)"FIELD,                       FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiConstantPool_1lookupField)},
+  {CC"RiType_constantPool",             CC"("RESOLVED_TYPE")"CONSTANT_POOL,         FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1constantPool)},
+  {CC"RiType_resolveMethodImpl",        CC"("RESOLVED_TYPE STRING STRING")"METHOD,  FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_3resolveMethodImpl)},
+  {CC"RiType_isSubtypeOf",              CC"("RESOLVED_TYPE TYPE")Z",                        FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_2isSubtypeOf)},
+  {CC"RiType_componentType",            CC"("RESOLVED_TYPE")"TYPE,                  FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1componentType)},
+  {CC"RiType_arrayOf",                  CC"("PROXY")"TYPE,                          FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_RiType_1arrayOf)},
+  {CC"getPrimitiveArrayType",           CC"("CI_KIND")"TYPE,                        FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_getPrimitiveArrayType)},
+  {CC"getType",                         CC"("CLASS")"TYPE,                          FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_getType)},
+  {CC"getConfiguration",                CC"()"CONFIG,                               FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_getConfiguration)},
+  {CC"installMethod",                   CC"("TARGET_METHOD")V",                     FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_installMethod)},
+  {CC"installStub",                     CC"("TARGET_METHOD")"PROXY,                 FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_installStub)},
+  {CC"recordBailout",                   CC"("STRING")V",                            FN_PTR(Java_com_sun_hotspot_c1x_VMEntries_recordBailout)}
 };
 
 int VMEntries_methods_count() {
--- a/src/share/vm/c1x/c1x_VMExits.cpp	Mon Dec 27 20:35:47 2010 +0100
+++ b/src/share/vm/c1x/c1x_VMExits.cpp	Tue Dec 28 18:33:26 2010 +0100
@@ -144,13 +144,12 @@
   return (oop) result.get_jobject();
 }
 
-oop VMExits::createRiTypeUnresolved(Handle name, jlong accessingClassVmId, TRAPS) {
+oop VMExits::createRiTypeUnresolved(Handle name, TRAPS) {
   assert(!name.is_null(), "just checking");
   JavaValue result(T_OBJECT);
   JavaCallArguments args;
   args.push_oop(instance());
   args.push_oop(name);
-  args.push_long(accessingClassVmId);
   JavaCalls::call_interface(&result, vmExitsKlass(), vmSymbols::createRiTypeUnresolved_name(), vmSymbols::createRiTypeUnresolved_signature(), &args, THREAD);
   check_pending_exception("Error while calling createRiTypeUnresolved");
   return (oop) result.get_jobject();
--- a/src/share/vm/c1x/c1x_VMExits.hpp	Mon Dec 27 20:35:47 2010 +0100
+++ b/src/share/vm/c1x/c1x_VMExits.hpp	Tue Dec 28 18:33:26 2010 +0100
@@ -51,8 +51,8 @@
   // public abstract RiType createRiType(long vmId, String name);
   static oop createRiType(jlong vmId, Handle name, TRAPS);
 
-  // public abstract RiType createRiTypeUnresolved(String name, long accessingClassVmId);
-  static oop createRiTypeUnresolved(Handle name, jlong accessingClassVmId, TRAPS);
+  // public abstract RiType createRiTypeUnresolved(String name);
+  static oop createRiTypeUnresolved(Handle name, TRAPS);
 
   // public abstract RiConstantPool createRiConstantPool(long vmId);
   static oop createRiConstantPool(jlong vmId, TRAPS);
--- a/src/share/vm/classfile/vmSymbols.hpp	Mon Dec 27 20:35:47 2010 +0100
+++ b/src/share/vm/classfile/vmSymbols.hpp	Tue Dec 28 18:33:26 2010 +0100
@@ -304,7 +304,7 @@
   template(createRiTypePrimitive_name,                "createRiTypePrimitive")                                          \
   template(createRiTypePrimitive_signature,           "(I)Lcom/sun/cri/ri/RiType;")                                     \
   template(createRiTypeUnresolved_name,               "createRiTypeUnresolved")                                         \
-  template(createRiTypeUnresolved_signature,          "(Ljava/lang/String;J)Lcom/sun/cri/ri/RiType;")                   \
+  template(createRiTypeUnresolved_signature,          "(Ljava/lang/String;)Lcom/sun/cri/ri/RiType;")                   \
   template(createRiConstantPool_name,                 "createRiConstantPool")                                           \
   template(createRiConstantPool_signature,            "(J)Lcom/sun/cri/ri/RiConstantPool;")                             \
   template(createCiConstant_name,                     "createCiConstant")                                               \
--- a/src/share/vm/oops/klass.cpp	Mon Dec 27 20:35:47 2010 +0100
+++ b/src/share/vm/oops/klass.cpp	Tue Dec 28 18:33:26 2010 +0100
@@ -134,6 +134,7 @@
   }
 
   kl->set_java_mirror(NULL);
+  kl->set_c1x_mirror(NULL);
   kl->set_modifier_flags(0);
   kl->set_layout_helper(Klass::_lh_neutral_value);
   kl->set_name(NULL);
--- a/src/share/vm/oops/klass.hpp	Mon Dec 27 20:35:47 2010 +0100
+++ b/src/share/vm/oops/klass.hpp	Tue Dec 28 18:33:26 2010 +0100
@@ -215,6 +215,8 @@
   klassOop    _primary_supers[_primary_super_limit];
   // java/lang/Class instance mirroring this class
   oop       _java_mirror;
+  // com/sun/hotspot/c1x/HotSpotTypeResolved mirroring this class
+  oop       _c1x_mirror;
   // Superclass
   klassOop  _super;
   // Class name.  Instance classes: java/lang/String, etc.  Array classes: [I,
@@ -315,6 +317,10 @@
   oop java_mirror() const              { return _java_mirror; }
   void set_java_mirror(oop m)          { oop_store((oop*) &_java_mirror, m); }
 
+  // c1x mirror
+  oop c1x_mirror() const               { return _c1x_mirror; }
+  void set_c1x_mirror(oop m)           { oop_store((oop*) &_c1x_mirror, m); }
+
   // modifier flags
   jint modifier_flags() const          { return _modifier_flags; }
   void set_modifier_flags(jint flags)  { _modifier_flags = flags; }
@@ -343,6 +349,7 @@
   oop* adr_secondary_super_cache() const { return (oop*)&_secondary_super_cache; }
   oop* adr_secondary_supers()const { return (oop*)&_secondary_supers;  }
   oop* adr_java_mirror()     const { return (oop*)&_java_mirror;       }
+  oop* adr_c1x_mirror()      const { return (oop*)&_c1x_mirror;        }
   oop* adr_name()            const { return (oop*)&_name;              }
   oop* adr_subklass()        const { return (oop*)&_subklass;          }
   oop* adr_next_sibling()    const { return (oop*)&_next_sibling;      }
--- a/src/share/vm/oops/klassKlass.cpp	Mon Dec 27 20:35:47 2010 +0100
+++ b/src/share/vm/oops/klassKlass.cpp	Tue Dec 28 18:33:26 2010 +0100
@@ -50,6 +50,7 @@
   MarkSweep::mark_and_push(k->adr_secondary_super_cache());
   MarkSweep::mark_and_push(k->adr_secondary_supers());
   MarkSweep::mark_and_push(k->adr_java_mirror());
+  MarkSweep::mark_and_push(k->adr_c1x_mirror());
   MarkSweep::mark_and_push(k->adr_name());
   // We follow the subklass and sibling links at the end of the
   // marking phase, since otherwise following them will prevent
@@ -70,6 +71,7 @@
   PSParallelCompact::mark_and_push(cm, k->adr_secondary_super_cache());
   PSParallelCompact::mark_and_push(cm, k->adr_secondary_supers());
   PSParallelCompact::mark_and_push(cm, k->adr_java_mirror());
+  PSParallelCompact::mark_and_push(cm, k->adr_c1x_mirror());
   PSParallelCompact::mark_and_push(cm, k->adr_name());
   // We follow the subklass and sibling links at the end of the
   // marking phase, since otherwise following them will prevent
@@ -90,6 +92,7 @@
   blk->do_oop(k->adr_secondary_super_cache());
   blk->do_oop(k->adr_secondary_supers());
   blk->do_oop(k->adr_java_mirror());
+  blk->do_oop(k->adr_c1x_mirror());
   blk->do_oop(k->adr_name());
   // The following are in the perm gen and are treated
   // specially in a later phase of a perm gen collection; ...
@@ -124,6 +127,8 @@
   if (mr.contains(adr)) blk->do_oop(adr);
   adr = k->adr_java_mirror();
   if (mr.contains(adr)) blk->do_oop(adr);
+  adr = k->adr_c1x_mirror();
+  if (mr.contains(adr)) blk->do_oop(adr);
   adr = k->adr_name();
   if (mr.contains(adr)) blk->do_oop(adr);
   // The following are "weak links" in the perm gen and are
@@ -154,6 +159,7 @@
   MarkSweep::adjust_pointer(k->adr_secondary_super_cache());
   MarkSweep::adjust_pointer(k->adr_secondary_supers());
   MarkSweep::adjust_pointer(k->adr_java_mirror());
+  MarkSweep::adjust_pointer(k->adr_c1x_mirror());
   MarkSweep::adjust_pointer(k->adr_name());
   MarkSweep::adjust_pointer(k->adr_subklass());
   MarkSweep::adjust_pointer(k->adr_next_sibling());