[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