[pypy-svn] r68624 - in pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc: . test test/msvc

afa at codespeak.net afa at codespeak.net
Mon Oct 19 13:49:44 CEST 2009


Author: afa
Date: Mon Oct 19 13:49:43 2009
New Revision: 68624

Modified:
   pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/test/msvc/track0.s
   pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/test/test_trackgcroot.py
   pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/trackgcroot.py
Log:
The first msvc test passes!


Modified: pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/test/msvc/track0.s
==============================================================================
--- pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/test/msvc/track0.s	(original)
+++ pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/test/msvc/track0.s	Mon Oct 19 13:49:43 2009
@@ -65,6 +65,7 @@
 	jl	SHORT $LN15 at pypy_g_ll_@139
 $LN14 at pypy_g_ll_@139:
 	call	_RPyAbort
+    ;; expected {24(%esp) | %ebx, %esi, %edi, %ebp | }
 $LN15 at pypy_g_ll_@139:
 
 ; 1529 : 	l_v420 = l_v419;
@@ -76,6 +77,7 @@
 	test	ebx, ebx
 	jne	SHORT $LN16 at pypy_g_ll_@139
 	call	_RPyAbort
+    ;; expected {24(%esp) | %ebx, %esi, %edi, %ebp | }
 $LN16 at pypy_g_ll_@139:
 
 ; 1531 : 	OP_INT_ADD(l_v402, l_v421, l_v422);
@@ -105,6 +107,7 @@
 
 	push	edi
 	call	_pypy_g_mallocstr__Signed
+    ;; expected {28(%esp) | %ebx, %esi, %edi, %ebp | }
 
 ; 1486 : 	l_v405 = (void*)l_items_2;
 
@@ -180,6 +183,7 @@
 	jl	SHORT $LN10 at pypy_g_ll_@139
 $LN9 at pypy_g_ll_@139:
 	call	_RPyAbort
+    ;; expected {24(%esp) | %ebx, %esi, %edi, %ebp | }
 $LN10 at pypy_g_ll_@139:
 
 ; 1517 : 	l_v413 = l_v412;
@@ -191,6 +195,7 @@
 	test	edi, edi
 	jne	SHORT $LN11 at pypy_g_ll_@139
 	call	_RPyAbort
+    ;; expected {24(%esp) | %ebx, %esi, %edi, %ebp | }
 $LN11 at pypy_g_ll_@139:
 	mov	edi, DWORD PTR [edi+8]
 
@@ -203,6 +208,7 @@
 	jl	SHORT $LN13 at pypy_g_ll_@139
 $LN12 at pypy_g_ll_@139:
 	call	_RPyAbort
+    ;; expected {24(%esp) | %ebx, %esi, %edi, %ebp | }
 $LN13 at pypy_g_ll_@139:
 
 ; 1520 : 	pypy_g_copy_string_contents__rpy_stringPtr_rpy_stringPt(l_v415, l_result_2, 0L, l_res_index_0, l_v414);
@@ -230,6 +236,7 @@
 $block0$80678:
 $block1$80679:
 	call	_memcpy
+    ;; expected {36(%esp) | %ebx, %esi, %edi, %ebp | }
 	add	esp, 12					; 0000000cH
 
 ; 1521 : 	OP_INT_ADD(l_res_index_0, l_v414, l_v417);

Modified: pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/test/test_trackgcroot.py
==============================================================================
--- pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/test/test_trackgcroot.py	(original)
+++ pypy/branch/msvc-asmgcroot/pypy/translator/c/gcc/test/test_trackgcroot.py	Mon Oct 19 13:49:43 2009
@@ -126,7 +126,7 @@
 
 def check_computegcmaptable(format, path):
     print
-    print path.basename
+    print path.dirpath().basename + '/' + path.basename
     lines = path.readlines()
     expectedlines = lines[:]
     tracker = PARSERS[format].FunctionGcRootTracker(lines)

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	Mon Oct 19 13:49:43 2009
@@ -48,12 +48,13 @@
 
 class FunctionGcRootTracker(object):
 
-    OPERAND         =            r'(?:[-\w$%+.:@"]+(?:[(][\w%,]+[)])?|[(][\w%,]+[)])'
-    r_unaryinsn     = re.compile(r"\t[a-z]\w*\s+("+OPERAND+")\s*$")
-    r_unaryinsn_star= re.compile(r"\t[a-z]\w*\s+([*]"+OPERAND+")\s*$")
-    r_binaryinsn    = re.compile(r"\t[a-z]\w*\s+(?P<source>"+OPERAND+"),\s*(?P<target>"+OPERAND+")\s*$")
+    @classmethod
+    def init_regexp(cls):
+        cls.r_unaryinsn     = re.compile(r"\t[a-z]\w*\s+("+cls.OPERAND+")\s*$")
+        cls.r_unaryinsn_star= re.compile(r"\t[a-z]\w*\s+([*]"+cls.OPERAND+")\s*$")
+        cls.r_binaryinsn    = re.compile(r"\t[a-z]\w*\s+(?P<source>"+cls.OPERAND+"),\s*(?P<target>"+cls.OPERAND+")\s*$")
 
-    r_jump          = re.compile(r"\tj\w+\s+"+LABEL+"\s*$")
+        cls.r_jump          = re.compile(r"\tj\w+\s+"+cls.LABEL+"\s*$")
 
     def __init__(self, funcname, lines, filetag=0):
         self.funcname = funcname
@@ -158,6 +159,7 @@
                     except AttributeError:
                         self.find_missing_visit_method(opname)
                         meth = getattr(self, 'visit_' + opname)
+                    line = line.rsplit(';', 1)[0]
                     insn = meth(line)
             elif r_gcroot_marker.match(line):
                 insn = self._visit_gcroot_marker(line)
@@ -374,12 +376,12 @@
         match = self.r_binaryinsn.match(line)
         source = match.group("source")
         target = match.group("target")
-        if target == '%esp':
-            count = match.group(1)
-            if not count.startswith('$'):
+        if target == self.ESP:
+            count = self.extract_immediate(source)
+            if count is None:
                 # strange instruction - I've seen 'subl %eax, %esp'
                 return InsnCannotFollowEsp()
-            return InsnStackAdjust(sign * int(count[1:]))
+            return InsnStackAdjust(sign * count)
         elif self.r_localvar.match(target):
             return InsnSetLocal(target, [source, target])
         else:
@@ -404,7 +406,7 @@
         target = match.group("target")
         if self.r_localvar.match(target):
             return InsnSetLocal(target, [source])
-        elif target == '%esp':
+        elif target == self.ESP:
             raise UnrecognizedOperation(line)
         else:
             return []
@@ -431,7 +433,7 @@
     def visit_andl(self, line):
         match = self.r_binaryinsn.match(line)
         target = match.group("target")
-        if target == '%esp':
+        if target == self.ESP:
             # only for  andl $-16, %esp  used to align the stack in main().
             # The exact amount of adjutment is not known yet, so we use
             # an odd-valued estimate to make sure the real value is not used
@@ -443,7 +445,7 @@
     def visit_leal(self, line):
         match = self.r_binaryinsn.match(line)
         target = match.group("target")
-        if target == '%esp':
+        if target == self.ESP:
             # only for  leal -12(%ebp), %esp  in function epilogues
             source = match.group("source")
             match = r_localvar_ebp.match(source)
@@ -465,7 +467,7 @@
             return self.binary_insn(line)
 
     def insns_for_copy(self, source, target):
-        if source == '%esp' or target == '%esp':
+        if source == self.ESP or target == self.ESP:
             raise UnrecognizedOperation('%s -> %s' % (source, target))
         elif self.r_localvar.match(target):
             if self.r_localvar.match(source):
@@ -479,9 +481,9 @@
         match = self.r_binaryinsn.match(line)
         source = match.group("source")
         target = match.group("target")
-        if source == '%esp' and target == '%ebp':
+        if source == self.ESP and target == '%ebp':
             return self._visit_prologue()
-        elif source == '%ebp' and target == '%esp':
+        elif source == '%ebp' and target == self.ESP:
             return self._visit_epilogue()
         return self.insns_for_copy(source, target)
 
@@ -658,6 +660,10 @@
 class ElfFunctionGcRootTracker(FunctionGcRootTracker):
     format = 'elf'
 
+    ESP      = '%esp'
+    OPERAND  = r'(?:[-\w$%+.:@"]+(?:[(][\w%,]+[)])?|[(][\w%,]+[)])'
+    LABEL    = r'([a-zA-Z_$.][a-zA-Z0-9_$@.]*)'
+
     def __init__(self, lines, filetag=0):
         match = r_functionstart_elf.match(lines[0])
         funcname = match.group(1)
@@ -667,14 +673,20 @@
         super(ElfFunctionGcRootTracker, self).__init__(
             funcname, lines, filetag)
 
-class DarwinFunctionGcRootTracker(FunctionGcRootTracker):
+    def extract_immediate(self, value):
+        if not value.startswith('$'):
+            return None
+        return int(value[1:])
+
+ElfFunctionGcRootTracker.init_regexp()
+
+class DarwinFunctionGcRootTracker(ElfFunctionGcRootTracker):
     format = 'darwin'
 
     def __init__(self, lines, filetag=0):
         match = r_functionstart_darwin.match(lines[0])
         funcname = '_'+match.group(1)
-        super(DarwinFunctionGcRootTracker, self).__init__(
-            funcname, lines, filetag)
+        FunctionGcRootTracker.__init__(self, funcname, lines, filetag)
 
 class Mingw32FunctionGcRootTracker(DarwinFunctionGcRootTracker):
     format = 'mingw32'
@@ -684,12 +696,16 @@
 
     r_functionstart = re.compile(r"PUBLIC\t"+LABEL+"$")
 
-    OPERAND         =            r'(?:\w+|(?:DWORD PTR )?[_\w$]*\[[-+\w0-9]+\])'
-    r_unaryinsn     = re.compile(r"\t[a-z]\w*\s+("+OPERAND+")\s*$")
-    r_unaryinsn_star= re.compile(r"\t[a-z]\w*\s+([*]"+OPERAND+")\s*$")
-    r_binaryinsn    = re.compile(r"\t[a-z]\w*\s+(?P<target>"+OPERAND+"),\s*(?P<source>"+OPERAND+")\s*(?:;.+)?$")
+    ESP = 'esp'
 
-    r_jump          = re.compile(r"\tj\w+\s+(?:SHORT )?"+LABEL+"\s*$")
+    OPERAND  = r'(?:\w+|(?:DWORD PTR )?[_\w$]*\[[-+\w0-9]+\])'
+    LABEL    = r'([a-zA-Z_$.][a-zA-Z0-9_$@.]*)'
+
+    @classmethod
+    def init_regexp(cls):
+        super(MsvcFunctionGcRootTracker, cls).init_regexp()
+        cls.r_binaryinsn    = re.compile(r"\t[a-z]\w*\s+(?P<target>"+cls.OPERAND+"),\s*(?P<source>"+cls.OPERAND+")\s*(?:;.+)?$")
+        cls.r_jump = re.compile(r"\tj\w+\s+(?:SHORT )?"+LABEL+"\s*$")
 
     def __init__(self, lines, filetag=0):
         match = self.r_functionstart.match(lines[0])
@@ -704,6 +720,14 @@
         locals()['visit_' + name] = getattr(FunctionGcRootTracker,
                                             'visit_' + name + 'l')
 
+    def extract_immediate(self, value):
+        try:
+            return int(value)
+        except ValueError:
+            return None
+
+MsvcFunctionGcRootTracker.init_regexp()
+
 class AssemblerParser(object):
     def __init__(self, verbose=0, shuffle=False):
         self.verbose = verbose



More information about the Pypy-commit mailing list