[pypy-commit] pypy continulet-jit-2: Yay. This is enough at least to have "test_zrpy_gc -k AsmGcc" pass.

arigo noreply at buildbot.pypy.org
Fri Mar 2 23:06:14 CET 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: continulet-jit-2
Changeset: r53129:a852412187c3
Date: 2012-03-02 22:17 +0100
http://bitbucket.org/pypy/pypy/changeset/a852412187c3/

Log:	Yay. This is enough at least to have "test_zrpy_gc -k AsmGcc" pass.

diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py
--- a/pypy/jit/backend/llsupport/gc.py
+++ b/pypy/jit/backend/llsupport/gc.py
@@ -337,11 +337,18 @@
             self._gcmap_deadentries += 1
             item += asmgcroot.arrayitemsize
 
-    def get_basic_shape(self):
+    def get_basic_shape(self, return_addr_words_from_esp=0):
         # XXX: Should this code even really know about stack frame layout of
         # the JIT?
+        if return_addr_words_from_esp == 0:
+            retaddr = chr(self.LOC_EBP_PLUS | 4)   # return addr: at WORD(%rbp)
+        else:
+            x = return_addr_words_from_esp * 4
+            assert 0 < x < 128
+            retaddr = chr(self.LOC_ESP_PLUS | x)
+        #
         if self.is_64_bit:
-            return [chr(self.LOC_EBP_PLUS  | 4),    # return addr: at   8(%rbp)
+            return [retaddr,
                     chr(self.LOC_EBP_MINUS | 4),    # saved %rbx:  at  -8(%rbp)
                     chr(self.LOC_EBP_MINUS | 8),    # saved %r12:  at -16(%rbp)
                     chr(self.LOC_EBP_MINUS | 12),   # saved %r13:  at -24(%rbp)
@@ -350,7 +357,7 @@
                     chr(self.LOC_EBP_PLUS  | 0),    # saved %rbp:  at    (%rbp)
                     chr(0)]
         else:
-            return [chr(self.LOC_EBP_PLUS  | 4),    # return addr: at   4(%ebp)
+            return [retaddr,
                     chr(self.LOC_EBP_MINUS | 4),    # saved %ebx:  at  -4(%ebp)
                     chr(self.LOC_EBP_MINUS | 8),    # saved %esi:  at  -8(%ebp)
                     chr(self.LOC_EBP_MINUS | 12),   # saved %edi:  at -12(%ebp)
@@ -523,7 +530,7 @@
     def initialize(self):
         pass
 
-    def get_basic_shape(self):
+    def get_basic_shape(self, return_addr_words_from_esp=0):
         return []
 
     def add_frame_offset(self, shape, offset):
diff --git a/pypy/jit/backend/x86/regalloc.py b/pypy/jit/backend/x86/regalloc.py
--- a/pypy/jit/backend/x86/regalloc.py
+++ b/pypy/jit/backend/x86/regalloc.py
@@ -1418,7 +1418,8 @@
         self.force_spill_var(op.getarg(0))
 
     def get_mark_gc_roots(self, gcrootmap, use_copy_area=False):
-        shape = gcrootmap.get_basic_shape()
+        orf = OFFSTACK_REAL_FRAME
+        shape = gcrootmap.get_basic_shape(return_addr_words_from_esp=orf)
         for v, val in self.fm.bindings.items():
             if (isinstance(v, BoxPtr) and self.rm.stays_alive(v)):
                 assert isinstance(val, StackLoc)


More information about the pypy-commit mailing list