changeset 2055:99ad52189524

Refactorings to get towards less CRI overhead.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Thu, 13 Jan 2011 17:45:17 +0100
parents 3c0a889a176b
children b7f06f504206
files c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotField.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethod.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethodResolved.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethodUnresolved.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotType.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/HotSpotXirGenerator.java c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExitsNative.java src/share/vm/c1x/c1x_Compiler.cpp src/share/vm/c1x/c1x_JavaAccess.hpp src/share/vm/classfile/systemDictionary.hpp src/share/vm/classfile/vmSymbols.hpp
diffstat 14 files changed, 88 insertions(+), 83 deletions(-) [+]
line wrap: on
line diff
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotField.java	Wed Jan 12 19:14:32 2011 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotField.java	Thu Jan 13 17:45:17 2011 +0100
@@ -101,7 +101,7 @@
 
     @Override
     public String toString() {
-        return "HotSpotField<" + ((HotSpotType) holder).simpleName() + "." + name + ">";
+        return "HotSpotField<" + holder.name() + "." + name + ">";
     }
 
 }
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethod.java	Wed Jan 12 19:14:32 2011 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethod.java	Thu Jan 13 17:45:17 2011 +0100
@@ -23,6 +23,18 @@
 import com.sun.cri.ri.*;
 
 
-public interface HotSpotMethod extends RiMethod {
+public abstract class HotSpotMethod extends CompilerObject implements RiMethod {
+
+    protected RiType holder;
+    protected String name;
 
+    @Override
+    public final RiType holder() {
+        return holder;
+    }
+
+    @Override
+    public final String name() {
+        return name;
+    }
 }
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethodResolved.java	Wed Jan 12 19:14:32 2011 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethodResolved.java	Thu Jan 13 17:45:17 2011 +0100
@@ -30,10 +30,9 @@
  *
  * @author Thomas Wuerthinger, Lukas Stadler
  */
-public class HotSpotMethodResolved extends CompilerObject implements HotSpotMethod {
+public final class HotSpotMethodResolved extends HotSpotMethod {
 
     private final long vmId;
-    private final String name;
 
     // cached values
     private byte[] code;
@@ -42,12 +41,12 @@
     private int maxStackSize = -1;
     private RiExceptionHandler[] exceptionHandlers;
     private RiSignature signature;
-    private RiType holder;
     private Boolean hasBalancedMonitors;
 
     public HotSpotMethodResolved(long vmId, String name) {
         this.vmId = vmId;
         this.name = name;
+        this.holder = Compiler.getVMEntries().RiMethod_holder(vmId);
     }
 
     @Override
@@ -88,14 +87,6 @@
     }
 
     @Override
-    public RiType holder() {
-        if (holder == null) {
-            holder = Compiler.getVMEntries().RiMethod_holder(vmId);
-        }
-        return holder;
-    }
-
-    @Override
     public boolean isClassInitializer() {
         return "<clinit>".equals(name);
     }
@@ -151,11 +142,6 @@
     }
 
     @Override
-    public String name() {
-        return name;
-    }
-
-    @Override
     public StackTraceElement toStackTraceElement(int bci) {
         return CiUtil.toStackTraceElement(this, bci);
     }
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethodUnresolved.java	Wed Jan 12 19:14:32 2011 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotMethodUnresolved.java	Thu Jan 13 17:45:17 2011 +0100
@@ -28,9 +28,7 @@
  *
  * @author Lukas Stadler
  */
-public class HotSpotMethodUnresolved implements HotSpotMethod {
-    private final String name;
-    private final RiType holder;
+public final class HotSpotMethodUnresolved extends HotSpotMethod {
     private final RiSignature signature;
 
     public HotSpotMethodUnresolved(String name, String signature, RiType holder) {
@@ -40,16 +38,6 @@
     }
 
     @Override
-    public String name() {
-        return name;
-    }
-
-    @Override
-    public RiType holder() {
-        return holder;
-    }
-
-    @Override
     public RiSignature signature() {
         return signature;
     }
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotType.java	Wed Jan 12 19:14:32 2011 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotType.java	Thu Jan 13 17:45:17 2011 +0100
@@ -27,8 +27,11 @@
  *
  * @author Lukas Stadler
  */
-public interface HotSpotType extends RiType {
+public abstract class HotSpotType extends CompilerObject implements RiType {
+    protected String name;
 
-    String simpleName();
-
+    @Override
+    public final String name() {
+        return name;
+    }
 }
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypePrimitive.java	Wed Jan 12 19:14:32 2011 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypePrimitive.java	Thu Jan 13 17:45:17 2011 +0100
@@ -28,7 +28,7 @@
  *
  * @author Thomas Wuerthinger, Lukas Stadler
  */
-public final class HotSpotTypePrimitive extends CompilerObject implements HotSpotType {
+public final class HotSpotTypePrimitive extends HotSpotType {
 
     private CiKind kind;
 
@@ -44,6 +44,7 @@
 
     private HotSpotTypePrimitive(CiKind kind) {
         this.kind = kind;
+        this.name = kind.toString();
     }
 
     @Override
@@ -141,16 +142,6 @@
     }
 
     @Override
-    public String name() {
-        return kind.toString();
-    }
-
-    @Override
-    public String simpleName() {
-        return kind.toString();
-    }
-
-    @Override
     public RiMethod resolveMethodImpl(RiMethod method) {
         return null;
     }
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeResolved.java	Wed Jan 12 19:14:32 2011 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeResolved.java	Thu Jan 13 17:45:17 2011 +0100
@@ -32,10 +32,10 @@
  *
  * @author Thomas Wuerthinger, Lukas Stadler
  */
-public class HotSpotTypeResolved implements HotSpotType {
+public class HotSpotTypeResolved extends HotSpotType {
 
     private Class javaMirror;
-    private String name;
+    private String simpleName;
     private int accessFlags;
     private boolean hasFinalizer;
     private boolean hasSubclass;
@@ -55,7 +55,7 @@
 
     @Override
     public RiType arrayOf() {
-        Logger.log("arrayOf " + name);
+        Logger.log("arrayOf " + simpleName);
         return null;
         //return Compiler.getVMEntries().RiType_arrayOf(vmId);
     }
@@ -164,16 +164,6 @@
     }
 
     @Override
-    public String name() {
-        return "L" + name + ";";
-    }
-
-    @Override
-    public String simpleName() {
-        return name;
-    }
-
-    @Override
     public RiMethod resolveMethodImpl(RiMethod method) {
         assert method instanceof HotSpotMethod;
         return Compiler.getVMEntries().RiType_resolveMethodImpl(this, method.name(), method.signature().asString());
@@ -181,7 +171,7 @@
 
     @Override
     public String toString() {
-        return "HotSpotType<" + name + ", resolved>";
+        return "HotSpotType<" + simpleName + ", resolved>";
     }
 
     public RiConstantPool constantPool() {
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeUnresolved.java	Wed Jan 12 19:14:32 2011 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotTypeUnresolved.java	Thu Jan 13 17:45:17 2011 +0100
@@ -28,9 +28,9 @@
  *
  * @author Thomas Wuerthinger, Lukas Stadler
  */
-public class HotSpotTypeUnresolved implements HotSpotType {
+public class HotSpotTypeUnresolved extends HotSpotType {
 
-    public final String name;
+    public final String simpleName;
     public final int dimensions;
 
     /**
@@ -48,35 +48,33 @@
                 dimensions++;
             }
             assert name.charAt(startIndex) == 'L';
-            name = name.substring(startIndex + 1, name.length() - 1);
+            this.simpleName = name.substring(startIndex + 1, name.length() - 1);
+            this.name = name;
+        } else {
+            this.simpleName = name;
+            this.name = getFullName(name, dimensions);
         }
 
-        this.name = name;
         this.dimensions = dimensions;
     }
 
     public HotSpotTypeUnresolved(String name, int dimensions) {
         assert dimensions >= 0;
-        this.name = name;
+        this.simpleName = name;
         this.dimensions = dimensions;
+        this.name = getFullName(name, dimensions);
     }
 
-    @Override
-    public String name() {
+    private String getFullName(String name, int dimensions) {
         StringBuilder str = new StringBuilder();
         for (int i = 0; i < dimensions; i++) {
             str.append('[');
         }
-        str.append('L').append(name).append(';');
+        str.append('L').append(simpleName).append(';');
         return str.toString();
     }
 
     @Override
-    public String simpleName() {
-        return name;
-    }
-
-    @Override
     public RiType uniqueConcreteSubtype() {
         throw unresolved("uniqueConcreteSubtype");
     }
@@ -144,7 +142,7 @@
     @Override
     public RiType componentType() {
         assert isArrayClass() : "no array class" + name();
-        return new HotSpotTypeUnresolved(name, dimensions - 1);
+        return new HotSpotTypeUnresolved(simpleName, dimensions - 1);
     }
 
     @Override
@@ -154,7 +152,7 @@
 
     @Override
     public RiType arrayOf() {
-        return new HotSpotTypeUnresolved(name, dimensions + 1);
+        return new HotSpotTypeUnresolved(simpleName, dimensions + 1);
     }
 
     @Override
@@ -168,12 +166,12 @@
     }
 
     private CiUnresolvedException unresolved(String operation) {
-        throw new CiUnresolvedException(operation + " not defined for unresolved class " + name);
+        throw new CiUnresolvedException(operation + " not defined for unresolved class " + simpleName);
     }
 
     @Override
     public int hashCode() {
-        return name.hashCode();
+        return simpleName.hashCode();
     }
 
     @Override
@@ -183,7 +181,7 @@
 
     @Override
     public String toString() {
-        return "HotSpotType<" + name + ", unresolved>";
+        return "HotSpotType<" + simpleName + ", unresolved>";
     }
 
     @Override
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java	Wed Jan 12 19:14:32 2011 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/HotSpotXirGenerator.java	Thu Jan 13 17:45:17 2011 +0100
@@ -37,6 +37,7 @@
 import com.sun.cri.xir.CiXirAssembler.XirMark;
 import com.sun.cri.xir.CiXirAssembler.XirOperand;
 import com.sun.cri.xir.CiXirAssembler.XirParameter;
+import com.sun.cri.xir.CiXirAssembler.XirTemp;
 
 /**
  *
@@ -378,6 +379,22 @@
         }
     };
 
+    private KindTemplates writeBarrierTemplate = new KindTemplates() {
+
+        @Override
+        protected XirTemplate create(CiXirAssembler asm, long flags, CiKind kind) {
+            asm.restart(CiKind.Void);
+            XirParameter object = asm.createInputParameter("object", CiKind.Object);
+
+            // Need temp operand, because the write barrier destroys the object pointer.
+            XirOperand temp = asm.createTemp("temp", CiKind.Object);
+            asm.mov(temp, object);
+
+            writeBarrier(asm, temp);
+            return asm.finishTemplate("writeBarrier");
+        }
+    };
+
     private KindTemplates putFieldTemplates = new KindTemplates(WRITE_BARRIER, NULL_CHECK, UNRESOLVED) {
 
         @Override
@@ -885,6 +902,11 @@
     }
 
     @Override
+    public XirSnippet genWriteBarrier(XirArgument object) {
+        return new XirSnippet(writeBarrierTemplate.get(null, CiKind.Void), object);
+    }
+
+    @Override
     public XirSnippet genPutField(XirSite site, XirArgument object, RiField field, XirArgument value) {
         if (field.isResolved()) {
             return new XirSnippet(putFieldTemplates.get(site, field.kind()), object, value, XirArgument.forInt(((HotSpotField) field).offset()));
--- a/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExitsNative.java	Wed Jan 12 19:14:32 2011 +0100
+++ b/c1x4hotspotsrc/HotSpotVM/src/com/sun/hotspot/c1x/VMExitsNative.java	Thu Jan 13 17:45:17 2011 +0100
@@ -152,6 +152,7 @@
                         Logger.info(String.format("%-10s %3d %s", type, e.getLineNumber(), current));
                     }
                 }
+                System.out.println("BAILOUT:" + result.bailout().getMessage());
                 Compiler.getVMEntries().recordBailout(result.bailout().getMessage());
             } else {
                 HotSpotTargetMethod.installMethod(riMethod, result.targetMethod());
--- a/src/share/vm/c1x/c1x_Compiler.cpp	Wed Jan 12 19:14:32 2011 +0100
+++ b/src/share/vm/c1x/c1x_Compiler.cpp	Thu Jan 13 17:45:17 2011 +0100
@@ -143,11 +143,20 @@
   }
 
   instanceKlass::cast(HotSpotTypeResolved::klass())->initialize(CHECK_NULL);
-  oop obj = instanceKlass::cast(HotSpotTypeResolved::klass())->allocate_instance(CHECK_NULL);
-  assert(obj != NULL, "must succeed in allocating instance");
+  Handle obj = instanceKlass::cast(HotSpotTypeResolved::klass())->allocate_instance(CHECK_NULL);
+  assert(obj() != NULL, "must succeed in allocating instance");
+
+
+  if (klass->oop_is_instance()) {
+    instanceKlass* ik = (instanceKlass*)klass()->klass_part();
+    Handle full_name = java_lang_String::create_from_str(ik->signature_name(), CHECK_NULL);
+    HotSpotType::set_name(obj, full_name());
+  } else {
+    HotSpotType::set_name(obj, name());
+  }
 
   HotSpotTypeResolved::set_javaMirror(obj, klass->java_mirror());
-  HotSpotTypeResolved::set_name(obj, name());
+  HotSpotTypeResolved::set_simpleName(obj, name());
   HotSpotTypeResolved::set_accessFlags(obj, klass->access_flags().as_int());
   HotSpotTypeResolved::set_isInterface(obj, klass->is_interface());
   HotSpotTypeResolved::set_isInstanceClass(obj, klass->oop_is_instance());
@@ -167,9 +176,9 @@
   HotSpotTypeResolved::set_hasSubclass(obj, false);
   HotSpotTypeResolved::set_hasFinalizableSubclass(obj, false);
 
-  klass->set_c1x_mirror(obj);
+  klass->set_c1x_mirror(obj());
 
-  return obj;
+  return obj();
 }
 
 BasicType C1XCompiler::kindToBasicType(jchar ch) {
--- a/src/share/vm/c1x/c1x_JavaAccess.hpp	Wed Jan 12 19:14:32 2011 +0100
+++ b/src/share/vm/c1x/c1x_JavaAccess.hpp	Thu Jan 13 17:45:17 2011 +0100
@@ -45,7 +45,7 @@
 #define COMPILER_CLASSES_DO(start_class, end_class, char_field, int_field, boolean_field, long_field, oop_field, static_oop_field)   \
   start_class(HotSpotTypeResolved)                                                      \
     oop_field(HotSpotTypeResolved, javaMirror, "Ljava/lang/Class;")                     \
-    oop_field(HotSpotTypeResolved, name, "Ljava/lang/String;")                          \
+    oop_field(HotSpotTypeResolved, simpleName, "Ljava/lang/String;")                    \
     int_field(HotSpotTypeResolved, accessFlags)                                         \
     boolean_field(HotSpotTypeResolved, hasFinalizer)                                    \
     boolean_field(HotSpotTypeResolved, hasSubclass)                                     \
@@ -57,6 +57,9 @@
     int_field(HotSpotTypeResolved, instanceSize)                                        \
     oop_field(HotSpotTypeResolved, componentType, "Lcom/sun/cri/ri/RiType;")            \
   end_class                                                                             \
+  start_class(HotSpotType)                                                              \
+    oop_field(HotSpotType, name, "Ljava/lang/String;")                                  \
+  end_class                                                                             \
   start_class(HotSpotField)                                                             \
     oop_field(HotSpotField, constant, "Lcom/sun/cri/ci/CiConstant;")                    \
   end_class                                                                             \
--- a/src/share/vm/classfile/systemDictionary.hpp	Wed Jan 12 19:14:32 2011 +0100
+++ b/src/share/vm/classfile/systemDictionary.hpp	Thu Jan 13 17:45:17 2011 +0100
@@ -183,6 +183,7 @@
   template(Long_klass,                   java_lang_Long,                 Pre) \
                                                                               \
   template(HotSpotTypeResolved_klass,    com_sun_hotspot_c1x_HotSpotTypeResolved,                   Opt) \
+  template(HotSpotType_klass,            com_sun_hotspot_c1x_HotSpotType,                           Opt) \
   template(HotSpotField_klass,           com_sun_hotspot_c1x_HotSpotField,                          Opt) \
   template(HotSpotMethodResolved_klass,  com_sun_hotspot_c1x_HotSpotMethodResolved,                 Opt) \
   template(HotSpotTargetMethod_klass,    com_sun_hotspot_c1x_HotSpotTargetMethod,                   Opt) \
--- a/src/share/vm/classfile/vmSymbols.hpp	Wed Jan 12 19:14:32 2011 +0100
+++ b/src/share/vm/classfile/vmSymbols.hpp	Thu Jan 13 17:45:17 2011 +0100
@@ -267,6 +267,7 @@
   template(com_sun_hotspot_c1x_HotSpotTargetMethod,   "com/sun/hotspot/c1x/HotSpotTargetMethod")                        \
   template(com_sun_hotspot_c1x_HotSpotField,          "com/sun/hotspot/c1x/HotSpotField")                               \
   template(com_sun_hotspot_c1x_HotSpotTypeResolved,   "com/sun/hotspot/c1x/HotSpotTypeResolved")                        \
+  template(com_sun_hotspot_c1x_HotSpotType,           "com/sun/hotspot/c1x/HotSpotType")                                \
   template(com_sun_hotspot_c1x_HotSpotExceptionHandler,"com/sun/hotspot/c1x/HotSpotExceptionHandler")                   \
   template(com_sun_hotspot_c1x_HotSpotProxy,          "com/sun/hotspot/c1x/HotSpotProxy")                               \
   template(com_sun_hotspot_c1x_Compiler,              "com/sun/hotspot/c1x/Compiler")                                   \