Author: Armin Rigo <ar...@tunes.org> Branch: shadowstack-perf-2 Changeset: r90545:b4fbb27942b9 Date: 2017-03-04 22:47 +0100 http://bitbucket.org/pypy/pypy/changeset/b4fbb27942b9/
Log: tweaks for threads 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 @@ -3,6 +3,7 @@ from rpython.rlib.debug import ll_assert from rpython.rlib.nonconst import NonConstant from rpython.rlib import rgc +from rpython.rlib.objectmodel import specialize from rpython.rtyper import rmodel from rpython.rtyper.annlowlevel import llhelper from rpython.rtyper.lltypesystem import lltype, llmemory @@ -57,6 +58,38 @@ 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)) + self.shadow_stack_pool = ShadowStackPool(gcdata) rsd = gctransformer.root_stack_depth if rsd is not None: @@ -75,36 +108,10 @@ BaseRootWalker.setup_root_walker(self) def walk_stack_roots(self, collect_stack_root, is_minor=False): - gc = self.gc gcdata = self.gcdata - start = gcdata.root_stack_base - addr = gcdata.root_stack_top - 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 - collect_stack_root(gc, 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(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 @@ -322,11 +329,9 @@ def customtrace(gc, obj, callback, arg): obj = llmemory.cast_adr_to_ptr(obj, SHADOWSTACKREFPTR) - addr = obj.top - start = obj.base - while addr != start: - addr -= sizeofaddr - gc._trace_callback(callback, arg, addr) + root_walker.rootstackhook(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/translator/c/gc.py b/rpython/translator/c/gc.py --- a/rpython/translator/c/gc.py +++ b/rpython/translator/c/gc.py @@ -450,7 +450,7 @@ # yield ('typedef struct { void %s; } pypy_ss_t;' % ', '.join(['*s%d' % i for i in range(numcolors)])) - yield 'pypy_ss_t *ss = (pypy_ss_t *)%s;' % gcpol_ss + yield 'pypy_ss_t *ss;' funcgen.gcpol_ss = gcpol_ss def OP_GC_PUSH_ROOTS(self, funcgen, op): @@ -460,7 +460,8 @@ raise Exception("gc_pop_roots should be removed by postprocess_graph") def OP_GC_ENTER_ROOTS_FRAME(self, funcgen, op): - return '%s = (void *)(ss+1);' % funcgen.gcpol_ss + return 'ss = (pypy_ss_t *)%s; %s = (void *)(ss+1);' % ( + funcgen.gcpol_ss, funcgen.gcpol_ss) def OP_GC_LEAVE_ROOTS_FRAME(self, funcgen, op): return '%s = (void *)ss;' % funcgen.gcpol_ss _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit