[pypy-commit] pypy shadowstack-perf-2: Fix for test/test_rstacklet.py

arigo pypy.commits at gmail.com
Mon Mar 6 03:52:13 EST 2017


Author: Armin Rigo <arigo at tunes.org>
Branch: shadowstack-perf-2
Changeset: r90578:a759310b811d
Date: 2017-03-06 09:51 +0100
http://bitbucket.org/pypy/pypy/changeset/a759310b811d/

Log:	Fix for test/test_rstacklet.py

diff --git a/rpython/memory/gctransform/shadowstack.py b/rpython/memory/gctransform/shadowstack.py
--- a/rpython/memory/gctransform/shadowstack.py
+++ b/rpython/memory/gctransform/shadowstack.py
@@ -40,6 +40,36 @@
         # shadowcolor.move_pushes_earlier()
 
 
+ at specialize.call_location()
+def walk_stack_root(invoke, arg0, arg1, start, addr, is_minor):
+    skip = 0
+    while addr != start:
+        addr -= sizeofaddr
+        #XXX reintroduce support for tagged values?
+        #if gc.points_to_valid_gc_object(addr):
+        #    callback(gc, addr)
+
+        if skip & 1 == 0:
+            content = addr.address[0]
+            n = llmemory.cast_adr_to_int(content)
+            if n & 1 == 0:
+                if content:   # non-0, non-odd: a regular ptr
+                    invoke(arg0, arg1, addr)
+            else:
+                # odd number: a skip bitmask
+                if n > 0:       # initially, an unmarked value
+                    if is_minor:
+                        newcontent = llmemory.cast_int_to_adr(-n)
+                        addr.address[0] = newcontent   # mark
+                    skip = n
+                else:
+                    # a marked value
+                    if is_minor:
+                        return
+                    skip = -n
+        skip >>= 1
+
+
 class ShadowStackRootWalker(BaseRootWalker):
     def __init__(self, gctransformer):
         BaseRootWalker.__init__(self, gctransformer)
@@ -58,35 +88,6 @@
             return top
         self.decr_stack = decr_stack
 
-        @specialize.call_location()
-        def walk_stack_root(invoke, arg0, arg1, start, addr, is_minor):
-            skip = 0
-            while addr != start:
-                addr -= sizeofaddr
-                #XXX reintroduce support for tagged values?
-                #if gc.points_to_valid_gc_object(addr):
-                #    callback(gc, addr)
-
-                if skip & 1 == 0:
-                    content = addr.address[0]
-                    n = llmemory.cast_adr_to_int(content)
-                    if n & 1 == 0:
-                        if content:   # non-0, non-odd: a regular ptr
-                            invoke(arg0, arg1, addr)
-                    else:
-                        # odd number: a skip bitmask
-                        if n > 0:       # initially, an unmarked value
-                            if is_minor:
-                                newcontent = llmemory.cast_int_to_adr(-n)
-                                addr.address[0] = newcontent   # mark
-                            skip = n
-                        else:
-                            # a marked value
-                            if is_minor:
-                                return
-                            skip = -n
-                skip >>= 1
-        self.rootstackhook = walk_stack_root
         self.invoke_collect_stack_root = specialize.call_location()(
             lambda arg0, arg1, addr: arg0(self.gc, addr))
 
@@ -109,9 +110,9 @@
 
     def walk_stack_roots(self, collect_stack_root, is_minor=False):
         gcdata = self.gcdata
-        self.rootstackhook(self.invoke_collect_stack_root, collect_stack_root,
-                           None, gcdata.root_stack_base, gcdata.root_stack_top,
-                           is_minor=is_minor)
+        walk_stack_root(self.invoke_collect_stack_root, collect_stack_root,
+                        None, gcdata.root_stack_base, gcdata.root_stack_top,
+                        is_minor=is_minor)
 
     def need_thread_support(self, gctransformer, getfn):
         from rpython.rlib import rthread    # xxx fish
@@ -329,9 +330,8 @@
 
     def customtrace(gc, obj, callback, arg):
         obj = llmemory.cast_adr_to_ptr(obj, SHADOWSTACKREFPTR)
-        root_walker.rootstackhook(gc._trace_callback, callback, arg,
-                                  obj.base, obj.top,
-                                  is_minor=False)   # xxx optimize?
+        walk_stack_root(gc._trace_callback, callback, arg, obj.base, obj.top,
+                        is_minor=False)   # xxx optimize?
 
     gc = gctransformer.gcdata.gc
     assert not hasattr(gc, 'custom_trace_dispatcher')
diff --git a/rpython/rlib/_stacklet_shadowstack.py b/rpython/rlib/_stacklet_shadowstack.py
--- a/rpython/rlib/_stacklet_shadowstack.py
+++ b/rpython/rlib/_stacklet_shadowstack.py
@@ -47,14 +47,15 @@
 SIZEADDR = llmemory.sizeof(llmemory.Address)
 
 def customtrace(gc, obj, callback, arg):
+    from rpython.memory.gctransform.shadowstack import walk_stack_root
+
     stacklet = llmemory.cast_adr_to_ptr(obj, STACKLET_PTR)
     sscopy = stacklet.s_sscopy
     if sscopy:
         length_bytes = sscopy.signed[0]
-        while length_bytes > 0:
-            addr = sscopy + length_bytes
-            gc._trace_callback(callback, arg, addr)
-            length_bytes -= SIZEADDR
+        walk_stack_root(gc._trace_callback, callback, arg,
+                        sscopy + SIZEADDR, sscopy + SIZEADDR + length_bytes,
+                        is_minor=False)
 lambda_customtrace = lambda: customtrace
 
 def sscopy_detach_shadow_stack():


More information about the pypy-commit mailing list