Author: Armin Rigo <[email protected]>
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
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to