[pypy-svn] r68665 - pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc

afa at codespeak.net afa at codespeak.net
Tue Oct 20 18:33:13 CEST 2009


Author: afa
Date: Tue Oct 20 18:33:13 2009
New Revision: 68665

Modified:
   pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/trackgcroot.py
Log:
Fix trackgcroot when compiled in debug mode
try to fix generated assembler. Someone should verify it.


Modified: pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/trackgcroot.py
==============================================================================
--- pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/trackgcroot.py	(original)
+++ pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/trackgcroot.py	Tue Oct 20 18:33:13 2009
@@ -250,6 +250,8 @@
                 match = self.r_localvar_ebp.match(localvar)
                 if match:
                     ofs_from_ebp = int(match.group(1) or '0')
+                    if self.format == 'msvc':
+                        ofs_from_ebp += int(match.group(2) or '0')
                     localvar = ofs_from_ebp - 4
                     assert localvar != 0    # that's the return address
                     return LocalVar(localvar, hint='ebp')
@@ -727,7 +729,7 @@
     r_symboldefine =  re.compile(r"([_a-z0-9]+\$) = ([-0-9]+)\s*;.+\n")
 
     LOCALVAR        = r"eax|edx|ecx|ebx|esi|edi|ebp|DWORD PTR [-+]?\d*\[esp[-+]\d+\]"
-    LOCALVARFP      = LOCALVAR + r"|-?\d*\[ebp\]"
+    LOCALVARFP      = LOCALVAR + r"|DWORD PTR -?\d*\[ebp\]"
     r_localvarnofp  = re.compile(LOCALVAR)
     r_localvarfp    = re.compile(LOCALVARFP)
     r_gcroot_marker = re.compile(r";.+ = pypy_asm_gcroot\(")
@@ -1004,10 +1006,16 @@
             if self.format in ('darwin', 'mingw32', 'msvc'):
                 name = '_' + name
 
-            if disp:
-                return "%s + %s" % (name, disp)
+            if self.format == 'msvc':
+                if disp:
+                    return "DWORD PTR [%s+%s]" % (name, disp)
+                else:
+                    return name
             else:
-                return name
+                if disp:
+                    return "%s + %s" % (name, disp)
+                else:
+                    return name
 
         def _globl(name):
             if self.format == 'msvc':
@@ -1059,7 +1067,7 @@
 
         def _offset(name):
             if self.format == 'msvc':
-                return "OFFSET %s" % _globalname(name)
+                return "DWORD PTR [%s]" % _globalname(name)
             else:
                 return "$%s" % _globalname(name)
 
@@ -1071,7 +1079,7 @@
 
         def _indirectjmp(arg):
             if self.format == 'msvc':
-                return arg
+                return "DWORD PTR " + arg
             else:
                 return "*%" + arg
 



More information about the Pypy-commit mailing list