[pypy-svn] pypy arm-backend-2: Patch bridges correctly again
bivab
commits-noreply at bitbucket.org
Wed Dec 22 14:27:06 CET 2010
Author: David Schneider <david.schneider at picle.org>
Branch: arm-backend-2
Changeset: r40182:515696098b6b
Date: 2010-12-20 13:11 +0100
http://bitbucket.org/pypy/pypy/changeset/515696098b6b/
Log: Patch bridges correctly again
diff --git a/pypy/jit/backend/arm/assembler.py b/pypy/jit/backend/arm/assembler.py
--- a/pypy/jit/backend/arm/assembler.py
+++ b/pypy/jit/backend/arm/assembler.py
@@ -65,6 +65,7 @@
def setup(self):
assert self.memcpy_addr != 0, 'setup_once() not called?'
self.mc = ARMv7Builder()
+ self.guard_descrs = []
def setup_once(self):
# Addresses of functions called by new_xxx operations
@@ -357,10 +358,10 @@
loop_start = self.materialize_loop(looptoken)
looptoken._arm_bootstrap_code = loop_start
looptoken._arm_direct_bootstrap_code = loop_start + direct_bootstrap_code
-
+ self.update_descrs_for_bridges(loop_start)
if log:
print 'Loop', inputargs, operations
- self.mc._dump_trace(loop_start, 'loop.asm')
+ self.mc._dump_trace(loop_start, 'loop_%s.asm' % self.cpu.total_compiled_loops)
print 'Done assembling loop with token %r' % looptoken
self.teardown()
@@ -384,11 +385,13 @@
self._patch_sp_offset(sp_patch_location, regalloc)
bridge_start = self.materialize_loop(original_loop_token)
+ self.update_descrs_for_bridges(bridge_start)
self.patch_trace(faildescr, original_loop_token, bridge_start, regalloc)
if log:
print 'Bridge', inputargs, operations
- self.mc._dump_trace(bridge_start, 'bridge.asm')
+ self.mc._dump_trace(bridge_start, 'bridge_%d.asm' %
+ self.cpu.total_compiled_bridges)
self.teardown()
def materialize_loop(self, looptoken):
@@ -396,8 +399,13 @@
return self.mc.materialize(self.cpu.asmmemmgr, allblocks,
self.cpu.gc_ll_descr.gcrootmap)
+ def update_descrs_for_bridges(self, block_start):
+ for descr in self.guard_descrs:
+ descr._arm_block_start = block_start
+
def teardown(self):
self.mc = None
+ self.guard_descrs = None
#self.looppos = -1
#self.currently_compiling_loop = None
@@ -499,7 +507,7 @@
# The first instruction (word) is not overwritten, because it is the
# one that actually checks the condition
b = ARMv7Builder()
- patch_addr = looptoken._arm_bootstrap_code + faildescr._arm_guard_pos
+ patch_addr = faildescr._arm_block_start + faildescr._arm_guard_pos
b.B(bridge_addr)
b.copy_to_raw_memory(patch_addr)
diff --git a/pypy/jit/backend/arm/opassembler.py b/pypy/jit/backend/arm/opassembler.py
--- a/pypy/jit/backend/arm/opassembler.py
+++ b/pypy/jit/backend/arm/opassembler.py
@@ -136,6 +136,7 @@
def _emit_guard(self, op, arglocs, fcond, save_exc=False):
descr = op.getdescr()
assert isinstance(descr, AbstractFailDescr)
+ self.guard_descrs.append(descr)
if not we_are_translated() and hasattr(op, 'getfailargs'):
print 'Failargs: ', op.getfailargs()
More information about the Pypy-commit
mailing list