[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