[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