You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by va...@apache.org on 2007/05/24 14:56:40 UTC

svn commit: r541293 - in /harmony/enhanced/drlvm/trunk/vm/jitrino/src: jet/cg.cpp jet/cg.h jet/cg_fld_arr.cpp jet/magics.cpp translator/java/JavaByteCodeTranslator.cpp

Author: varlax
Date: Thu May 24 05:56:39 2007
New Revision: 541293

URL: http://svn.apache.org/viewvc?view=rev&rev=541293
Log:
Applied HARMONY-3784 [drlvm][jit][jet] Incorrect support of vmmagic types and object fields in JET compiler

Modified:
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg.h
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_fld_arr.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/magics.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg.cpp?view=diff&rev=541293&r1=541292&r2=541293
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg.cpp Thu May 24 05:56:39 2007
@@ -49,12 +49,12 @@
 const CallSig ci_helper_io(CCONV_HELPERS, i32, jobj);
 const CallSig ci_helper_linkerr(CCONV_HELPERS, jobj, i32, i32);
 
-void CodeGen::do_mov(const Val& dst_s, const Val& src_s)
+void CodeGen::do_mov(const Val& dst_s, const Val& src_s, bool skipTypeCheck)
 {
     assert(!dst_s.is_imm());
     jtype sjt = jtmov(src_s.jt());
     jtype djt = jtmov(dst_s.jt());
-    assert(sjt == djt);
+    assert(skipTypeCheck || sjt == djt);
     
     if (dst_s.is_mem() && src_s.is_mem()) {
         // Need to allocate a reg

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg.h?view=diff&rev=541293&r1=541292&r2=541293
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg.h Thu May 24 05:56:39 2007
@@ -528,7 +528,7 @@
      * @param src - source operand.
      * @param dst - destination operand.
      */
-    void    do_mov(const Val& dst, const Val& src);
+    void    do_mov(const Val& dst, const Val& src, bool skipTypeCheck=false);
     /**
      * @brief Returns a stack item at the given depth.
      * 

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_fld_arr.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_fld_arr.cpp?view=diff&rev=541293&r1=541292&r2=541293
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_fld_arr.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_fld_arr.cpp Thu May 24 05:56:39 2007
@@ -247,8 +247,8 @@
 
     jtype jt = to_jtype(class_get_cp_field_type(fieldOp.enclClass, fieldOp.cpIndex));
     
-    const char* fieldClassName = const_pool_get_field_class_name(fieldOp.enclClass, fieldOp.cpIndex);
-    bool fieldIsMagic = is_magic_class(fieldClassName);
+    const char* fieldDescName = const_pool_get_field_descriptor(fieldOp.enclClass, fieldOp.cpIndex);
+    bool fieldIsMagic = is_magic_class(fieldDescName);
     if (fieldIsMagic) {
         jt = iplatf;
     }
@@ -391,7 +391,7 @@
     else {
         vunref(jt, where);
         Val& val = vstack(0, vis_mem(0));
-        do_mov(where, val);
+        do_mov(where, val, fieldIsMagic);
         if (is_big(jt)) {
             Opnd where_hi(jt, where.base(), where.disp()+4, 
                               where.index(), where.scale());

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/magics.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/magics.cpp?view=diff&rev=541293&r1=541292&r2=541293
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/magics.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/magics.cpp Thu May 24 05:56:39 2007
@@ -43,6 +43,9 @@
     static const unsigned nameLen = sizeof(unboxedName)-1;
 
     assert(kname!=NULL);
+    if (*kname=='L') {
+        return !strncmp(kname+1, unboxedName, nameLen);
+    }
     return !strncmp(kname, unboxedName, nameLen);
 }
 

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp?view=diff&rev=541293&r1=541292&r2=541293
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp Thu May 24 05:56:39 2007
@@ -39,39 +39,47 @@
 
 namespace Jitrino {
 
-// magics support    
-static bool isVMMagicClass(const char* name) {
+// magics support: both typenames and descriptor names are supported
+static bool isVMMagicClass(const char* kname) {
     static const char magicPackage[] = "org/vmmagic/unboxed/";
     static const unsigned magicPackageLen = sizeof(magicPackage)-1;
-
-    bool res =  !strncmp(name, magicPackage, magicPackageLen);
+    bool res = false;
+    if (*kname=='L') {
+        res = !strncmp(kname+1, magicPackage, magicPackageLen);
+    } else {
+        res = !strncmp(kname, magicPackage, magicPackageLen);
+    }
     return res;
 }
 
-Type* convertVMMagicType2HIR(TypeManager& tm, Type* type) {
-    if (!type->isObject() || !type->isNamedType() || type->isSystemObject()) {
-        return type;
+static bool matchType(const char* candidate, const char* typeName) {
+    if (candidate[0]=='L') {
+        size_t typeLen = strlen(typeName);
+        size_t candLen = strlen(candidate);
+        bool res = typeLen+2 == candLen && !strncmp(typeName, candidate+1, typeLen);
+        return res;
     }
+    return !strcmp(typeName, candidate);
+}
 
-    const char* name = type->getName();    
-
+static Type* convertVMMagicType2HIR(TypeManager& tm, const char* name) {
     assert(isVMMagicClass(name));
 
-    if (!strcmp(name, "org/vmmagic/unboxed/Address") 
+    if (matchType(name, "org/vmmagic/unboxed/Address")
         //TODO: ObjectReference must have a ManagedPointer/Object type
-        || !strcmp(name, "org/vmmagic/unboxed/ObjectReference")) 
+        || matchType(name, "org/vmmagic/unboxed/ObjectReference"))
     {
         return tm.getUnmanagedPtrType(tm.getInt8Type());
-    } else if (!strcmp(name, "org/vmmagic/unboxed/Word") 
-        || !strcmp(name, "org/vmmagic/unboxed/Offset")
-        || !strcmp(name, "org/vmmagic/unboxed/Extent")) 
+    } else if (matchType(name, "org/vmmagic/unboxed/Word")
+        || matchType(name, "org/vmmagic/unboxed/Offset")
+        || matchType(name, "org/vmmagic/unboxed/Extent"))
     {
         return tm.getUIntPtrType();
-    } else if (!strcmp(name, "org/vmmagic/unboxed/WordArray")
-        || !strcmp(name, "org/vmmagic/unboxed/OffsetArray")
-        || !strcmp(name, "org/vmmagic/unboxed/ExtentArray") 
-        || !strcmp(name, "org/vmmagic/unboxed/AddressArray") 
-        || !strcmp(name, "org/vmmagic/unboxed/ObjectReferenceArray")) 
+    } else if (matchType(name, "org/vmmagic/unboxed/WordArray")
+        || matchType(name, "org/vmmagic/unboxed/OffsetArray")
+        || matchType(name, "org/vmmagic/unboxed/ExtentArray") 
+        || matchType(name, "org/vmmagic/unboxed/AddressArray") 
+        || matchType(name, "org/vmmagic/unboxed/ObjectReferenceArray")) 
     {
 #ifdef _EM64T_
         return tm.getArrayType(tm.getInt64Type(), false);
@@ -83,9 +91,17 @@
     return NULL;
 }
 
+static Type* convertVMMagicType2HIR(TypeManager& tm, Type* type) {
+    if (!type->isObject() || !type->isNamedType() || type->isSystemObject()) {
+        return type;
+    }
+    const char* name = type->getName();    
+    return convertVMMagicType2HIR(tm, name);
+}
+
 //vm helpers support
 
-bool isVMHelperClass(const char* name) {
+static bool isVMHelperClass(const char* name) {
 #ifdef _IPF_
     return false;//natives are not tested on IPF.
 #else
@@ -729,10 +745,15 @@
     FieldDesc *field = compilationInterface.getStaticField(methodToCompile.getParentHandle(), constPoolIndex, false);
     if (field && field->isStatic()) {
         bool fieldValueInlined = false;
+        Type* fieldType = field->getFieldType();
+        assert(fieldType);
+        bool fieldIsMagic = isVMMagicClass(fieldType->getName());
+        if (fieldIsMagic) {
+            fieldType = convertVMMagicType2HIR(typeManager, fieldType);
+        }
         if (field->isInitOnly() && !field->getParentType()->needsInitialization()) {
             //the final static field of the initialized class
-            Type* fieldType = field->getFieldType();
-            if (field->getFieldType()->isNumeric() || field->getFieldType()->isBoolean()) {
+            if (field->getFieldType()->isNumeric() || field->getFieldType()->isBoolean() || fieldIsMagic) {
                 Opnd* constVal = NULL;
                 void* fieldAddr = field->getAddress();
                 switch(fieldType->tag) {
@@ -744,6 +765,14 @@
                     case Type::Single:  constVal=irBuilder.genLdConstant(*(float*)fieldAddr);break;
                     case Type::Double:  constVal=irBuilder.genLdConstant(*(double*)fieldAddr);break;
                     case Type::Boolean: constVal=irBuilder.genLdConstant(*(bool*)fieldAddr);break;
+                    case Type::UnmanagedPtr:  assert(fieldIsMagic); 
+#ifdef _IA32_
+                            constVal=irBuilder.genLdConstant(*(int32*)fieldAddr);break;
+#else
+                            assert(sizeof(void*)==8);
+                            constVal=irBuilder.genLdConstant(*(int64*)fieldAddr);break;
+#endif
+                            break;
                     default: assert(0); //??
                 }
                 if (constVal != NULL) {
@@ -753,16 +782,14 @@
             }
         } 
         if (!fieldValueInlined){
-            Type* fieldType = getFieldType(field,constPoolIndex);
-            assert(fieldType);
-            if (isVMMagicClass(fieldType->getName())) {
-                fieldType = convertVMMagicType2HIR(typeManager, fieldType);
-            }
-            pushOpnd(irBuilder.genLdStatic(fieldType,field));
+            pushOpnd(irBuilder.genLdStatic(fieldType, field));
         }
     } else if (typeManager.isLazyResolutionMode()) {
-        Type* type = compilationInterface.getFieldType(methodToCompile.getParentHandle(), constPoolIndex);
-        Opnd* res = irBuilder.genLdStaticWithResolve(type, methodToCompile.getParentType()->asObjectType(), constPoolIndex);
+        const char* fieldTypeName = const_pool_get_field_descriptor(methodToCompile.getParentHandle(), constPoolIndex);
+        bool fieldIsMagic = isVMMagicClass(fieldTypeName);
+        Type* fieldType = fieldIsMagic ? convertVMMagicType2HIR(typeManager, fieldTypeName) 
+                                       : compilationInterface.getFieldType(methodToCompile.getParentHandle(), constPoolIndex);
+        Opnd* res = irBuilder.genLdStaticWithResolve(fieldType, methodToCompile.getParentType()->asObjectType(), constPoolIndex);
         pushOpnd(res);
     } else {
         // generate helper call for throwing respective exception
@@ -779,11 +806,18 @@
     if (field && field->isStatic()) {
         Type* fieldType = getFieldType(field,constPoolIndex);
         assert(fieldType);
+        bool fieldIsMagic = isVMMagicClass(fieldType->getName());
+        if (fieldIsMagic) {
+            fieldType = convertVMMagicType2HIR(typeManager, fieldType);
+        }
         irBuilder.genStStatic(fieldType,field,popOpnd());
     } else  if (typeManager.isLazyResolutionMode()) {
-        Type* type = compilationInterface.getFieldType(methodToCompile.getParentHandle(), constPoolIndex);
+        const char* fieldTypeName = const_pool_get_field_descriptor(methodToCompile.getParentHandle(), constPoolIndex);
+        bool fieldIsMagic = isVMMagicClass(fieldTypeName);
+        Type* fieldType = fieldIsMagic ? convertVMMagicType2HIR(typeManager, fieldTypeName) 
+                                       : compilationInterface.getFieldType(methodToCompile.getParentHandle(), constPoolIndex);
         Opnd* value = popOpnd();
-        irBuilder.genStStaticWithResolve(type, methodToCompile.getParentType()->asObjectType(), constPoolIndex, value);
+        irBuilder.genStStaticWithResolve(fieldType, methodToCompile.getParentType()->asObjectType(), constPoolIndex, value);
     } else {
         // generate helper call for throwing respective exception
         linkingException(constPoolIndex, OPCODE_PUTSTATIC);