You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by gs...@apache.org on 2007/06/18 18:40:28 UTC

svn commit: r548409 - in /harmony/enhanced/drlvm/trunk: src/test/regression/H1859/ src/test/regression/excludes/ vm/jitrino/src/codegenerator/ia32/ vm/jitrino/src/jet/

Author: gshimansky
Date: Mon Jun 18 09:40:26 2007
New Revision: 548409

URL: http://svn.apache.org/viewvc?view=rev&rev=548409
Log:
Applied HARMONY-4118
[drlvm][jit] Stack overflow handling support in Jitrino compiler


Added:
    harmony/enhanced/drlvm/trunk/src/test/regression/H1859/
    harmony/enhanced/drlvm/trunk/src/test/regression/H1859/Test.java   (with props)
    harmony/enhanced/drlvm/trunk/src/test/regression/H1859/run.test.xml   (with props)
Modified:
    harmony/enhanced/drlvm/trunk/src/test/regression/excludes/exclude.linux.x86_64
    harmony/enhanced/drlvm/trunk/src/test/regression/excludes/exclude.windows.x86_64
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.h
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.h
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32StackLayout.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg.cpp

Added: harmony/enhanced/drlvm/trunk/src/test/regression/H1859/Test.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H1859/Test.java?view=auto&rev=548409
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H1859/Test.java (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H1859/Test.java Mon Jun 18 09:40:26 2007
@@ -0,0 +1,30 @@
+package org.apache.harmony.drlvm.tests.regression.h1859;
+
+import junit.framework.TestCase;
+
+public class Test extends TestCase {
+
+    public void test() {
+        boolean passed = false;
+        try {
+            foo(1, 2, 3, 4, 5, 6);
+        } catch (StackOverflowError e) {
+            passed = true;
+        }
+        assertTrue(passed);
+        assertEquals(0, i);
+    }
+
+    static int i=0;
+
+    static void foo(int i1, int i2, int i3, int i4, int i5, int i6) {
+        try {
+            i++;
+            foo(i1, i2, i3, i4, i5, i6);
+        } finally {
+            i--;
+        }
+    }
+
+}
+

Propchange: harmony/enhanced/drlvm/trunk/src/test/regression/H1859/Test.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: harmony/enhanced/drlvm/trunk/src/test/regression/H1859/run.test.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H1859/run.test.xml?view=auto&rev=548409
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H1859/run.test.xml (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H1859/run.test.xml Mon Jun 18 09:40:26 2007
@@ -0,0 +1,14 @@
+<project name="RUN HARMONY-1859 Regression Test">
+    <target name="run-test">
+        <run-junit-test 
+             test="org.apache.harmony.drlvm.tests.regression.h1859.Test"
+             vmarg="-Xem:opt">
+        </run-junit-test>
+
+        <run-junit-test 
+             test="org.apache.harmony.drlvm.tests.regression.h1859.Test"
+             vmarg="-Xem:jet">
+        </run-junit-test>
+    </target>
+</project>
+

Propchange: harmony/enhanced/drlvm/trunk/src/test/regression/H1859/run.test.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: harmony/enhanced/drlvm/trunk/src/test/regression/excludes/exclude.linux.x86_64
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/excludes/exclude.linux.x86_64?view=diff&rev=548409&r1=548408&r2=548409
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/excludes/exclude.linux.x86_64 (original)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/excludes/exclude.linux.x86_64 Mon Jun 18 09:40:26 2007
@@ -1,3 +1,5 @@
+# Exclude this test because of problems with hardware exceptions handling in VM for this platform
+H1859
 H2086
 H2151
 # Exclude this test because JVMTI is not implemented for x86_64 in JIT mode yet

Modified: harmony/enhanced/drlvm/trunk/src/test/regression/excludes/exclude.windows.x86_64
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/excludes/exclude.windows.x86_64?view=diff&rev=548409&r1=548408&r2=548409
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/excludes/exclude.windows.x86_64 (original)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/excludes/exclude.windows.x86_64 Mon Jun 18 09:40:26 2007
@@ -1,3 +1,5 @@
+# Exclude this test because of problems with hardware exceptions handling in VM for this platform
+H1859
 H2151
 H2873
 # Exclude this test because JVMTI is not implemented for x86_64 in JIT mode yet

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp?view=diff&rev=548409&r1=548408&r2=548409
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp Mon Jun 18 09:40:26 2007
@@ -1761,11 +1761,11 @@
 }
 
 //_____________________________________________________________________________________________
-void IRManager::calculateStackDepth()
+uint32 IRManager::calculateStackDepth()
 {
     MemoryManager mm("calculateStackDepth");
     StlVector<int32> stackDepths(mm, fg->getNodeCount(), -1);
-    
+    int32 maxMethodStackDepth = -1;    
     
     const Nodes& nodes = fg->getNodesPostOrder();
     //iterating in topological (reverse postorder) order
@@ -1813,12 +1813,15 @@
                             stackDepth -= ((CallInst *)inst)->getArgStackDepth();
                         }
                     }
+                    maxMethodStackDepth = std::max(maxMethodStackDepth, stackDepth);
                 }
                 assert(stackDepth>=0);
             }
             stackDepths[node->getDfNum()]=stackDepth;
         }
     }
+    assert(maxMethodStackDepth>=0);
+    return (uint32)maxMethodStackDepth;
 }
 
 //_____________________________________________________________________________________________

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.h?view=diff&rev=548409&r1=548408&r2=548409
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.h Mon Jun 18 09:40:26 2007
@@ -427,10 +427,10 @@
     uint32 getLayoutOpndAlignment(Opnd * opnd);
     void finalizeCallSites();
 
-    /** Calculates dislacement from stack entry point
-        for every instruction.
+    /** Calculates displacement from stack entry point
+        for every instruction and returns maximum stack depth needed for a method
     */
-    void calculateStackDepth();
+    uint32 calculateStackDepth();
     //-----------------------------------------------------------------------------------------------
     bool verify();
     bool verifyOpnds() const;

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.h?view=diff&rev=548409&r1=548408&r2=548409
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.h Mon Jun 18 09:40:26 2007
@@ -795,8 +795,12 @@
 
     Inst(Mnemonic m, uint32 _id, Form f)
         :kind(Kind_Inst), id(_id), mnemonic(m), prefix(InstPrefix_Null),
-        form(f), reservedFlags(0), 
-        opcodeGroup(0), index(0), defOpndCount(0), opndCount(0)
+        form(f), reservedFlags(0), codeSize(0), properties(0), reservedFlags2(0),
+        opcodeGroup(0), index(0), codeOffset(0), 
+        /*allocatedOpndCount(0), */defOpndCount(0), opndCount(0), stackDepth(0)/*, opnds(0)*/ 
+        
+        // WARN! commented opnds are assigned in overloaded 'new' operator before the constructor
+        // : void* Inst::operator new(size_t sz, MemoryManager& mm, uint32 opndCount)
     {}
     virtual ~Inst(){};
 

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32StackLayout.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32StackLayout.cpp?view=diff&rev=548409&r1=548408&r2=548409
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32StackLayout.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32StackLayout.cpp Mon Jun 18 09:40:26 2007
@@ -166,6 +166,23 @@
 {
 };
 
+static void insertSOEHandler(IRManager& irm, uint32 maxStackSize) {
+    if (maxStackSize == 0) {
+        return;
+    }
+#ifdef _EM64T_
+    RegName eaxReg = RegName_RAX;
+    RegName espReg = RegName_RSP;
+#else
+    RegName eaxReg = RegName_EAX;
+    RegName espReg = RegName_ESP;
+#endif
+    Opnd* guardedMemOpnd = irm.newMemOpnd(irm.getTypeFromTag(Type::IntPtr), MemOpndKind_Heap, irm.getRegOpnd(espReg), -(int)maxStackSize);
+    Inst* guardInst = irm.newInst(Mnemonic_MOV, irm.getRegOpnd(eaxReg), guardedMemOpnd);
+    Inst* entryInst = irm.getEntryPointInst();
+    guardInst->insertAfter(entryInst);
+}
+
 void StackLayouter::runImpl()
 {
     IRManager & irm=getIRManager();
@@ -180,7 +197,8 @@
     irm.calculateTotalRegUsage(OpndKind_GPReg);
     createProlog();
     createEpilog();
-    irm.calculateStackDepth();
+    uint32 maxStackDepth = irm.calculateStackDepth();
+    insertSOEHandler(irm, maxStackDepth);
     irm.layoutAliasOpnds();
 
     //fill StackInfo object

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=548409&r1=548408&r2=548409
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg.cpp Mon Jun 18 09:40:26 2007
@@ -535,7 +535,7 @@
         (cs.cc() == CCONV_MANAGED_IA32)) {
         int fix = 0;
         if (cnt != 0) {
-            // find the differenece between last used slot and the end of 
+            // find the difference between last used slot and the end of 
             // stack frame
             int s = m_stack.stack_slot(m_jframe->depth2slot(0));
             fix = m_stack.size() + s; // s is < 0
@@ -556,6 +556,11 @@
 
     if (idx == 0 && cs.size() != 0) {
         alu(alu_sub, sp, cs.size());
+        
+        //SOE handler -> read by maximum stack offset
+        Opnd maxStackAddr(iplatf, sp, -(int)cs.size(), ar_x, 0);
+        Opnd unusedRes(iplatf, valloc(iplatf));
+        do_mov(unusedRes, maxStackAddr);
     }
     int depth = 0;
     // 1st pass - free all register that are used for args passing