[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