[pypy-svn] r77716 - in pypy/trunk/pypy/translator/c/gcc: . test/elf64
arigo at codespeak.net
arigo at codespeak.net
Fri Oct 8 13:23:41 CEST 2010
Author: arigo
Date: Fri Oct 8 13:23:39 2010
New Revision: 77716
Added:
pypy/trunk/pypy/translator/c/gcc/test/elf64/track_loadconst.s
pypy/trunk/pypy/translator/c/gcc/test/elf64/track_rpyassertfailed.s
Modified:
pypy/trunk/pypy/translator/c/gcc/instruction.py
pypy/trunk/pypy/translator/c/gcc/trackgcroot.py
Log:
Two failing tests, and corresponding fixes to trackgcroot.
Modified: pypy/trunk/pypy/translator/c/gcc/instruction.py
==============================================================================
--- pypy/trunk/pypy/translator/c/gcc/instruction.py (original)
+++ pypy/trunk/pypy/translator/c/gcc/instruction.py Fri Oct 8 13:23:39 2010
@@ -82,6 +82,11 @@
def all_sources_of(self, localvar):
return [localvar]
+class InsnCondJump(Insn): # only for debugging; not used internally
+ _args_ = ['label']
+ def __init__(self, label):
+ self.label = label
+
class Label(Insn):
_args_ = ['label', 'lineno']
def __init__(self, label, lineno):
@@ -170,9 +175,12 @@
self.delta = -7 # use an odd value as marker
class InsnStop(Insn):
- pass
+ _args_ = ['reason']
+ def __init__(self, reason='?'):
+ self.reason = reason
class InsnRet(InsnStop):
+ _args_ = []
framesize = 0
def __init__(self, registers):
self.registers = registers
Added: pypy/trunk/pypy/translator/c/gcc/test/elf64/track_loadconst.s
==============================================================================
--- (empty file)
+++ pypy/trunk/pypy/translator/c/gcc/test/elf64/track_loadconst.s Fri Oct 8 13:23:39 2010
@@ -0,0 +1,12 @@
+ .type pypy_g_handler_inline_call_r_v_1, @function
+pypy_g_handler_inline_call_r_v_1:
+ pushq %rbp
+ call foo_bar
+ ;; expected {8(%rsp) | %rbx, %r12, %r13, %r14, %r15, (%rsp) | }
+ movl $pypy_g_some_prebuilt_gc_object, %ebp
+ call bar_baz
+ ;; expected {8(%rsp) | %rbx, %r12, %r13, %r14, %r15, (%rsp) | %rbp}
+ /* GCROOT %rbp */
+ popq %rbp
+ ret
+ .size pypy_g_handler_inline_call_r_v_1, .-pypy_g_handler_inline_call_r_v_1
Added: pypy/trunk/pypy/translator/c/gcc/test/elf64/track_rpyassertfailed.s
==============================================================================
--- (empty file)
+++ pypy/trunk/pypy/translator/c/gcc/test/elf64/track_rpyassertfailed.s Fri Oct 8 13:23:39 2010
@@ -0,0 +1,16 @@
+ .type pypy_g_handler_inline_call_r_v_1, @function
+pypy_g_handler_inline_call_r_v_1:
+.L10041:
+ pushq %r15
+ movq 8(%rsi), %r15
+ call foo_bar
+ ;; expected {8(%rsp) | %rbx, %r12, %r13, %r14, (%rsp), %rbp | %r15}
+ testq %rax, %rax
+ jne .L10088
+ movq (%ebp), %r15
+ call RPyAssertFailed
+.L10088:
+ /* GCROOT %r15 */
+ popq %r15
+ ret
+ .size pypy_g_handler_inline_call_r_v_1, .-pypy_g_handler_inline_call_r_v_1
Modified: pypy/trunk/pypy/translator/c/gcc/trackgcroot.py
==============================================================================
--- pypy/trunk/pypy/translator/c/gcc/trackgcroot.py (original)
+++ pypy/trunk/pypy/translator/c/gcc/trackgcroot.py Fri Oct 8 13:23:39 2010
@@ -6,7 +6,7 @@
from pypy.translator.c.gcc.instruction import InsnFunctionStart, InsnStop
from pypy.translator.c.gcc.instruction import InsnSetLocal, InsnCopyLocal
from pypy.translator.c.gcc.instruction import InsnPrologue, InsnEpilogue
-from pypy.translator.c.gcc.instruction import InsnGCROOT
+from pypy.translator.c.gcc.instruction import InsnGCROOT, InsnCondJump
from pypy.translator.c.gcc.instruction import InsnStackAdjust
from pypy.translator.c.gcc.instruction import InsnCannotFollowEsp
from pypy.translator.c.gcc.instruction import LocalVar, somenewvalue
@@ -123,18 +123,15 @@
self.labels[label] = Label(label, lineno)
def find_noncollecting_calls(self):
- cannot_collect = self.CANNOT_COLLECT.copy()
+ cannot_collect = {}
for line in self.lines:
match = self.r_gcnocollect_marker.search(line)
if match:
name = match.group(1)
cannot_collect[name] = True
#
- if self.format in ('darwin', 'mingw32', 'msvc'):
- self.cannot_collect = dict.fromkeys(
- ['_' + name for name in cannot_collect])
- else:
- self.cannot_collect = cannot_collect
+ self.cannot_collect = dict.fromkeys(
+ [self.function_names_prefix + name for name in cannot_collect])
def append_instruction(self, insn):
# Add the instruction to the list, and link it to the previous one.
@@ -410,7 +407,8 @@
return result
# ____________________________________________________________
- CANNOT_COLLECT = { # some of the most used functions that cannot collect
+ BASE_FUNCTIONS_NOT_RETURNING = {
+ 'abort': None,
'pypy_debug_catch_fatal_exception': None,
'RPyAbort': None,
'RPyAssertFailed': None,
@@ -644,7 +642,7 @@
if label != '0':
self.register_jump_to(label)
tablelin += 1
- return InsnStop()
+ return InsnStop("jump table")
if self.r_unaryinsn_star.match(line):
# that looks like an indirect tail-call.
# tail-calls are equivalent to RET for us
@@ -658,7 +656,7 @@
assert not target.startswith('.')
# tail-calls are equivalent to RET for us
return InsnRet(self.CALLEE_SAVE_REGISTERS)
- return InsnStop()
+ return InsnStop("jump")
def register_jump_to(self, label):
if not isinstance(self.insns[-1], InsnStop):
@@ -682,7 +680,7 @@
else:
label = match.group(1)
self.register_jump_to(label)
- return []
+ return [InsnCondJump(label)]
visit_jmpl = visit_jmp
visit_je = conditional_jump
@@ -754,7 +752,7 @@
target, = sources
if target in self.FUNCTIONS_NOT_RETURNING:
- return [InsnStop(), InsnCannotFollowEsp()]
+ return [InsnStop(target), InsnCannotFollowEsp()]
if self.format == 'mingw32' and target == '__alloca':
# in functions with large stack requirements, windows
# needs a call to _alloca(), to turn reserved pages
@@ -885,7 +883,7 @@
# statically known pointer to a register
# %eax -> %rax
- new_line = re.sub(r"%e(ax|bx|cx|dx|di|si)$", r"%r\1", line)
+ new_line = re.sub(r"%e(ax|bx|cx|dx|di|si|bp)$", r"%r\1", line)
# %r10d -> %r10
new_line = re.sub(r"%r(\d+)d$", r"%r\1", new_line)
return func(self, new_line)
@@ -951,6 +949,7 @@
class ElfFunctionGcRootTracker32(FunctionGcRootTracker32):
format = 'elf'
+ function_names_prefix = ''
ESP = '%esp'
EBP = '%ebp'
@@ -984,13 +983,14 @@
r_bottom_marker = re.compile(r"\t/[*] GC_STACK_BOTTOM [*]/")
FUNCTIONS_NOT_RETURNING = {
- 'abort': None,
'_exit': None,
'__assert_fail': None,
'___assert_rtn': None,
'L___assert_rtn$stub': None,
'L___eprintf$stub': None,
}
+ for _name in FunctionGcRootTracker.BASE_FUNCTIONS_NOT_RETURNING:
+ FUNCTIONS_NOT_RETURNING[_name] = None
def __init__(self, lines, filetag=0):
match = self.r_functionstart.match(lines[0])
@@ -1010,6 +1010,8 @@
class ElfFunctionGcRootTracker64(FunctionGcRootTracker64):
format = 'elf64'
+ function_names_prefix = ''
+
ESP = '%rsp'
EBP = '%rbp'
EAX = '%rax'
@@ -1042,13 +1044,14 @@
r_bottom_marker = re.compile(r"\t/[*] GC_STACK_BOTTOM [*]/")
FUNCTIONS_NOT_RETURNING = {
- 'abort': None,
'_exit': None,
'__assert_fail': None,
'___assert_rtn': None,
'L___assert_rtn$stub': None,
'L___eprintf$stub': None,
}
+ for _name in FunctionGcRootTracker.BASE_FUNCTIONS_NOT_RETURNING:
+ FUNCTIONS_NOT_RETURNING[_name] = None
def __init__(self, lines, filetag=0):
match = self.r_functionstart.match(lines[0])
@@ -1068,6 +1071,7 @@
class DarwinFunctionGcRootTracker(ElfFunctionGcRootTracker32):
format = 'darwin'
+ function_names_prefix = '_'
r_functionstart = re.compile(r"_(\w+):\s*$")
OFFSET_LABELS = 0
@@ -1079,15 +1083,19 @@
class Mingw32FunctionGcRootTracker(DarwinFunctionGcRootTracker):
format = 'mingw32'
+ function_names_prefix = '_'
FUNCTIONS_NOT_RETURNING = {
- '_abort': None,
'_exit': None,
'__assert': None,
}
+ for _name in FunctionGcRootTracker.BASE_FUNCTIONS_NOT_RETURNING:
+ FUNCTIONS_NOT_RETURNING['_' + _name] = None
class MsvcFunctionGcRootTracker(FunctionGcRootTracker32):
format = 'msvc'
+ function_names_prefix = '_'
+
ESP = 'esp'
EBP = 'ebp'
EAX = 'eax'
@@ -1127,7 +1135,6 @@
r_bottom_marker = re.compile(r"; .+\tpypy_asm_stack_bottom\(\);")
FUNCTIONS_NOT_RETURNING = {
- '_abort': None,
'__exit': None,
'__assert': None,
'__wassert': None,
@@ -1136,6 +1143,8 @@
'DWORD PTR __imp__abort': None,
'DWORD PTR __imp___wassert': None,
}
+ for _name in FunctionGcRootTracker.BASE_FUNCTIONS_NOT_RETURNING:
+ FUNCTIONS_NOT_RETURNING['_' + _name] = None
@classmethod
def init_regexp(cls):
@@ -1543,9 +1552,7 @@
assert self.seen_main
def _globalname(name, disp=""):
- if self.format in ('darwin', 'mingw32', 'msvc'):
- name = '_' + name
- return name
+ return tracker_cls.function_names_prefix + name
def _variant(**kwargs):
txt = kwargs[self.format]
More information about the Pypy-commit
mailing list