Author: fijal
Branch: vmprof-newstack
Changeset: r80535:f276c700c181
Date: 2015-11-04 09:46 +0000
http://bitbucket.org/pypy/pypy/changeset/f276c700c181/
Log: don't scan the first item of shadowstack and always use an extra one
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
@@ -76,10 +76,11 @@
def walk_stack_root(callback, start, end):
gc = self.gc
addr = end
+ addr -= sizeofaddr
while addr != start:
- addr -= sizeofaddr
if gc.points_to_valid_gc_object(addr):
callback(gc, addr)
+ addr -= sizeofaddr
self.rootstackhook = walk_stack_root
self.shadow_stack_pool = ShadowStackPool(gcdata)
@@ -282,7 +283,7 @@
def start_fresh_new_state(self):
self.gcdata.root_stack_base = self.unused_full_stack
- self.gcdata.root_stack_top = self.unused_full_stack
+ self.gcdata.root_stack_top = self.unused_full_stack + sizeofaddr
self.unused_full_stack = llmemory.NULL
def _cleanup(self, shadowstackref):
@@ -312,10 +313,11 @@
obj = llmemory.cast_adr_to_ptr(obj, SHADOWSTACKREFPTR)
addr = obj.top
start = obj.base
+ addr -= sizeofaddr
while addr != start:
+ gc._trace_callback(callback, arg, addr)
addr -= sizeofaddr
- gc._trace_callback(callback, arg, addr)
-
+
gc = gctransformer.gcdata.gc
assert not hasattr(gc, 'custom_trace_dispatcher')
# ^^^ create_custom_trace_funcs() must not run before this
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit