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/04/26 11:04:51 UTC

svn commit: r532676 - in /harmony/enhanced/drlvm/trunk: src/test/regression/H3751/ vm/jitrino/src/codegenerator/ia32/ vm/vmcore/include/ vm/vmcore/src/class_support/

Author: varlax
Date: Thu Apr 26 02:04:51 2007
New Revision: 532676

URL: http://svn.apache.org/viewvc?view=rev&rev=532676
Log:
Applied HARMONY-3751 [drlvm][jit][opt] GCMap verification routine fails with assertion on write to vmmagic Address fields

Added:
    harmony/enhanced/drlvm/trunk/src/test/regression/H3751/
    harmony/enhanced/drlvm/trunk/src/test/regression/H3751/Test.java
    harmony/enhanced/drlvm/trunk/src/test/regression/H3751/run.test.xml
Modified:
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32GCMap.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/include/class_member.h
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/Class_File_Loader.cpp

Added: harmony/enhanced/drlvm/trunk/src/test/regression/H3751/Test.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H3751/Test.java?view=auto&rev=532676
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H3751/Test.java (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H3751/Test.java Thu Apr 26 02:04:51 2007
@@ -0,0 +1,42 @@
+package org.apache.harmony.drlvm.tests.regression.h3751;
+
+import junit.framework.TestCase;
+import org.vmmagic.unboxed.*;
+
+public class Test extends TestCase {
+
+    //both methods caused failure in OPT
+    public static void testStatic() {
+        Foo.testStatic();
+    }
+    
+    public static void testNonStatic() {
+        new Foo().testNonStatic();
+    } 
+} 
+
+
+class Foo {
+    static long val;
+    static Address staticAddr;
+    Address nonStaticAddr;
+
+    static void testStatic() {
+        Address localAddr = Address.fromLong(val);
+        staticAddr = localAddr;
+        val = staticAddr.toLong();
+        System.gc();
+        staticAddr = localAddr;
+    }
+
+
+    void testNonStatic() {
+        Address localAddr = Address.fromLong(val);
+        nonStaticAddr = localAddr;
+        val = nonStaticAddr.toLong();
+        System.gc();
+        nonStaticAddr = localAddr;
+    }
+
+}
+

Added: harmony/enhanced/drlvm/trunk/src/test/regression/H3751/run.test.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H3751/run.test.xml?view=auto&rev=532676
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H3751/run.test.xml (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H3751/run.test.xml Thu Apr 26 02:04:51 2007
@@ -0,0 +1,8 @@
+<project name="RUN HARMONY-3751 Regression Test">
+  <target name="run-test">
+    <run-junit-test 
+        test="org.apache.harmony.drlvm.tests.regression.h3751.Test"
+        vmarg="-Xem:opt">
+    </run-junit-test>
+  </target>
+</project>

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32GCMap.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32GCMap.cpp?view=diff&rev=532676&r1=532675&r2=532676
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32GCMap.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32GCMap.cpp Thu Apr 26 02:04:51 2007
@@ -86,13 +86,40 @@
 
 static bool isManaged(Opnd* op) { return op->getType()->isObject() || op->getType()->isManagedPtr();}
 
-static void checkManaged2UnmanagedConv(IRManager& irm, Opnd* opnd) {
+static bool isUnmanagedFieldPtr(Opnd* opnd) {
+    if (opnd->getMemOpndKind()!=MemOpndKind_Heap) {
+        Log::out()<<"GCMap::isUnmanagedFieldPtr: not a heap opnd"<<std::endl;
+        return false;
+    }
+    Opnd* fieldOpnd = opnd->getMemOpndSubOpnd(MemOpndSubOpndKind_Displacement);
+    if (fieldOpnd==NULL) {
+        fieldOpnd = opnd->getMemOpndSubOpnd(MemOpndSubOpndKind_Base);
+        if (fieldOpnd == NULL) {
+            Log::out()<<"GCMap::isUnmanagedFieldPtr: memopnd base/displacement not found"<<std::endl;
+            return false;
+        }
+    }
+    Opnd::RuntimeInfo* info = fieldOpnd->getRuntimeInfo();
+    if (info==NULL) {
+        Log::out()<<"GCMap::isUnmanagedFieldPtr: runtime info not found"<<std::endl;
+        return false;
+    }
+    FieldDesc* field = NULL;
+    if (info->getKind() != Opnd::RuntimeInfo::Kind_FieldOffset && info->getKind()!=Opnd::RuntimeInfo::Kind_StaticFieldAddress) {
+        Log::out()<<"GCMap::isUnmanagedFieldPtr: not a field kind"<<std::endl;
+        return false;
+    }
+    field = (FieldDesc*)info->getValue(0);
+    return field_is_magic(field->getFieldHandle());
+}
+
+static void checkManaged2UnmanagedConv(IRManager& irm, Opnd* opnd, Inst* skipInst) {
     const Nodes& nodes = irm.getFlowGraph()->getNodes();
     for (Nodes::const_iterator it = nodes.begin(), end = nodes.end(); it!=end; ++it) {
         Node* node = *it;
         if (node->isBlockNode()) {
             for (Inst* inst = (Inst*)node->getLastInst(); inst!=NULL; inst = inst->getPrevInst()) {
-                if (inst->getMnemonic() != Mnemonic_MOV) {
+                if (inst->getMnemonic() != Mnemonic_MOV || inst == skipInst) {
                     continue;
                 }
                 Opnd* op0 = inst->getOpnd(0);
@@ -104,8 +131,11 @@
                     continue;
                 }
                 Opnd* managedOpnd = isManaged(op0)?op0:op1;
-                //the only managed->unmanaged conversion type is allowed is for static (non-gc) fields
-                assert(managedOpnd->isPlacedIn(OpndKind_Immediate)); 
+                bool res = isUnmanagedFieldPtr(managedOpnd);
+                if (!res) {
+                    Log::out()<<"GCMap::checkManaged2UnmanagedConv failure, managedOpnd="<<managedOpnd->getFirstId()<<std::endl;
+                    assert(0);
+                }
             }
         }
     }
@@ -135,7 +165,10 @@
     for (int i = liveOpnds.getNext(); i != -1; i = liveOpnds.getNext()) {
         Opnd* opnd = irm.getOpnd(i);
 #ifdef _DEBUG
-        if (opnd->getType()->isUnmanagedPtr()) checkManaged2UnmanagedConv(irm, opnd);
+        if (opnd->getType()->isUnmanagedPtr()) {
+            Inst* skipInst= opnd == callRes ? inst : NULL; // skip this call from the check if opnd is the result of the call
+            checkManaged2UnmanagedConv(irm, opnd, skipInst);
+        }
 #endif
         
         if (callRes == opnd) {

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/class_member.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/class_member.h?view=diff&rev=532676&r1=532675&r2=532676
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/class_member.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/class_member.h Thu Apr 26 02:04:51 2007
@@ -200,11 +200,12 @@
         _const_value_index = fd._const_value_index;
         _field_type_desc = fd._field_type_desc;
         _is_injected = fd._is_injected;
+        _is_magic_type = fd._is_magic_type;
         _offset_computed = fd._offset_computed;
         const_value = fd.const_value;
         track_access = fd.track_access;
         track_modification = fd.track_modification;
-
+        
         return *this;
     }
     //

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/Class_File_Loader.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/Class_File_Loader.cpp?view=diff&rev=532676&r1=532675&r2=532676
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/Class_File_Loader.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/Class_File_Loader.cpp Thu Apr 26 02:04:51 2007
@@ -749,16 +749,18 @@
 
 static bool is_magic_type_name(const String* name) {
     static String* MAGIC_TYPE_NAMES[]={
-        VM_Global_State::loader_env->string_pool.lookup("org/vmmagic/unboxed/Address"),
-        VM_Global_State::loader_env->string_pool.lookup("org/vmmagic/unboxed/Offset"), 
-        VM_Global_State::loader_env->string_pool.lookup("org/vmmagic/unboxed/Word"),
-        VM_Global_State::loader_env->string_pool.lookup("org/vmmagic/unboxed/Extent"),
+        VM_Global_State::loader_env->string_pool.lookup("Lorg/vmmagic/unboxed/Address;"),
+        VM_Global_State::loader_env->string_pool.lookup("Lorg/vmmagic/unboxed/Offset;"), 
+        VM_Global_State::loader_env->string_pool.lookup("Lorg/vmmagic/unboxed/Word;"),
+        VM_Global_State::loader_env->string_pool.lookup("Lorg/vmmagic/unboxed/Extent;"),
         NULL
     };
     for (int i=0;;i++)    {
         String* magicClassName = MAGIC_TYPE_NAMES[i];
         if (magicClassName == NULL) break;
-        if (magicClassName == name) return true;
+        if (magicClassName == name) {
+            return true;
+        }
     }
     return false;
 }
@@ -843,7 +845,7 @@
     }
 
     //check if field is magic type
-     if (is_magic_type_name(clss->get_name())) {
+     if (is_magic_type_name(_descriptor)) {
          _is_magic_type = 1;
      }