[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