[pypy-commit] pypy stackroot-speedup: (fijal mostly, arigo review)

arigo noreply at buildbot.pypy.org
Sat Jan 28 20:44:08 CET 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: stackroot-speedup
Changeset: r51932:ab6b2fd5deb7
Date: 2012-01-28 20:15 +0100
http://bitbucket.org/pypy/pypy/changeset/ab6b2fd5deb7/

Log:	(fijal mostly, arigo review)

	Adapt the logic to the JIT shadowstack code.

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
@@ -18,7 +18,7 @@
 from pypy.jit.backend.llsupport.descr import get_array_descr
 from pypy.jit.backend.llsupport.descr import get_call_descr
 from pypy.jit.backend.llsupport.rewrite import GcRewriterAssembler
-from pypy.rpython.memory.gctransform import asmgcroot
+from pypy.rpython.memory.gctransform import asmgcroot, shadowstack
 
 # ____________________________________________________________
 
@@ -436,7 +436,7 @@
             def setcontext(iself, context):
                 iself.context = context
 
-            def nextleft(iself, gc, range_lowest, prev):
+            def nextleft(iself, gc, range_lowest, prev, is_minor):
                 # Return the next valid GC object's address, in right-to-left
                 # order from the shadowstack array.  This usually means just
                 # returning "prev - sizeofaddr", until we reach "range_lowest",
@@ -453,7 +453,18 @@
                         # contains a valid pointer
                         while prev != range_lowest:
                             prev -= llmemory.sizeof(llmemory.Address)
-                            if prev.signed[0] == self.MARKER_FRAME:
+                            value = llmemory.cast_adr_to_int(prev.address[0])
+                            # this logic is directly copied from RootIterator
+                            # in shadowstack.py, consult comments there
+                            if value == shadowstack.MARKER_TRACED:
+                                if is_minor:
+                                    return llmemory.NULL
+                                continue
+                            if value == shadowstack.MARKER_NOT_TRACED:
+                                prev.address[0] = rffi.cast(llmemory.Address,
+                                                    shadowstack.MARKER_TRACED)
+                                continue
+                            if value == self.MARKER_FRAME:
                                 break
                             if gc.points_to_valid_gc_object(prev):
                                 return prev
diff --git a/pypy/rpython/memory/gctransform/shadowstack.py b/pypy/rpython/memory/gctransform/shadowstack.py
--- a/pypy/rpython/memory/gctransform/shadowstack.py
+++ b/pypy/rpython/memory/gctransform/shadowstack.py
@@ -351,7 +351,7 @@
                     # cannot contain young pointers.
                     if value == MARKER_TRACED:
                         if is_minor:
-                            break
+                            return llmemory.NULL
                         continue     # ignore the marker and continue
                     #
                     # If 'addr' contains MARKER_NOT_TRACED, replace it by


More information about the pypy-commit mailing list