Author: Armin Rigo <[email protected]>
Branch: r15-for-exception
Changeset: r45437:523c9a2ca35f
Date: 2011-07-09 16:33 +0200
http://bitbucket.org/pypy/pypy/changeset/523c9a2ca35f/
Log: Fix trackgcroot for ignoring r15 in case it is used by
rlib/register.py.
diff --git a/pypy/translator/c/gcc/trackgcroot.py
b/pypy/translator/c/gcc/trackgcroot.py
--- a/pypy/translator/c/gcc/trackgcroot.py
+++ b/pypy/translator/c/gcc/trackgcroot.py
@@ -103,7 +103,15 @@
else:
regindex = self.CALLEE_SAVE_REGISTERS.index(tag)
shape[1 + regindex] = loc
- if LOC_NOWHERE in shape and not self.is_stack_bottom:
+ #
+ if self.special_register is None:
+ shape_wo_specialreg = shape
+ else:
+ tag = self.special_register
+ regindex = self.CALLEE_SAVE_REGISTERS.index(tag)
+ shape_wo_specialreg = shape[:]
+ del shape_wo_specialreg[1 + regindex]
+ if LOC_NOWHERE in shape_wo_specialreg and not self.is_stack_bottom:
reg = self.CALLEE_SAVE_REGISTERS[shape.index(LOC_NOWHERE) - 1]
raise AssertionError("cannot track where register %s is saved"
% (reg,))
@@ -1346,6 +1354,7 @@
def process_function(self, lines, filename):
tracker = self.FunctionGcRootTracker(
lines, filetag=getidentifier(filename))
+ tracker.special_register = special_register
if self.verbose == 1:
sys.stderr.write('.')
elif self.verbose > 1:
@@ -1548,10 +1557,12 @@
class GcRootTracker(object):
- def __init__(self, verbose=0, shuffle=False, format='elf'):
+ def __init__(self, verbose=0, shuffle=False, format='elf',
+ special_register=None):
self.verbose = verbose
self.shuffle = shuffle # to debug the sorting logic in asmgcroot.py
self.format = format
+ self.special_register = special_register
self.gcmaptable = []
def dump_raw_table(self, output):
@@ -1892,6 +1903,7 @@
verbose = 0
shuffle = False
output_raw_table = False
+ special_register = None
if sys.platform == 'darwin':
if sys.maxint > 2147483647:
format = 'darwin64'
@@ -1917,12 +1929,16 @@
elif sys.argv[1].startswith('-f'):
format = sys.argv[1][2:]
del sys.argv[1]
+ elif sys.argv[1].startswith('-%'):
+ special_register = sys.argv[1][1:]
+ del sys.argv[1]
elif sys.argv[1].startswith('-'):
print >> sys.stderr, "unrecognized option:", sys.argv[1]
sys.exit(1)
else:
break
- tracker = GcRootTracker(verbose=verbose, shuffle=shuffle, format=format)
+ tracker = GcRootTracker(verbose=verbose, shuffle=shuffle, format=format,
+ special_register=special_register)
for fn in sys.argv[1:]:
f = open(fn, 'r')
firstline = f.readline()
diff --git a/pypy/translator/c/genc.py b/pypy/translator/c/genc.py
--- a/pypy/translator/c/genc.py
+++ b/pypy/translator/c/genc.py
@@ -558,6 +558,12 @@
for rule in rules:
mk.rule(*rule)
+ from pypy.rlib.register import register_number
+ if register_number is None:
+ extra_trackgcroot_arg = ''
+ else:
+ extra_trackgcroot_arg = '-%%r%d' % register_number
+
if self.config.translation.gcrootfinder == 'asmgcc':
trackgcfiles = [cfile[:-2] for cfile in mk.cfiles]
if self.translator.platform.name == 'msvc':
@@ -605,7 +611,7 @@
'cmd /c $(MASM) /nologo /Cx /Cp /Zm /coff /Fo$@ /c $<
$(INCLUDEDIRS)')
mk.rule('.c.gcmap', '',
['$(CC) /nologo $(ASM_CFLAGS) /c /FAs /Fa$*.s $<
$(INCLUDEDIRS)',
- 'cmd /c ' + python +
'$(PYPYDIR)/translator/c/gcc/trackgcroot.py -fmsvc -t $*.s > $@']
+ 'cmd /c ' + python +
'$(PYPYDIR)/translator/c/gcc/trackgcroot.py -fmsvc -t %s $*.s > $@' %
extra_trackgcroot_arg]
)
mk.rule('gcmaptable.c', '$(GCMAPFILES)',
'cmd /c ' + python +
'$(PYPYDIR)/translator/c/gcc/trackgcroot.py -fmsvc $(GCMAPFILES) > $@')
@@ -616,7 +622,7 @@
mk.rule('%.lbl.s %.gcmap', '%.s',
[python +
'$(PYPYDIR)/translator/c/gcc/trackgcroot.py '
- '-t $< > $*.gctmp',
+ '-t %s $< > $*.gctmp' % extra_trackgcroot_arg,
'mv $*.gctmp $*.gcmap'])
mk.rule('gcmaptable.s', '$(GCMAPFILES)',
[python +
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit