Author: Armin Rigo <ar...@tunes.org> Branch: shadowstack-again Changeset: r71627:fb7560c4e5f5 Date: 2014-05-20 18:08 +0200 http://bitbucket.org/pypy/pypy/changeset/fb7560c4e5f5/
Log: Yet a different approach 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 @@ -31,35 +31,19 @@ del self._ss_graph_marker del self._transforming_graph - def sanitize_graph(self, graph): - SSA_to_SSI(graph, self.translator.annotator) - - def ensure_ss_graph_marker(self): - if self._ss_graph_marker is None: - graph = self._transforming_graph - inputargs = [copyvar(self.translator.annotator, v) - for v in graph.startblock.inputargs] - hblock = Block(inputargs) - v_marker = varoftype(self.RPY_SHADOWSTACK_PTR) - hblock.operations.append(SpaceOperation('gc_ss_graph_marker', - [], v_marker)) - hblock.closeblock(Link(inputargs, graph.startblock)) - graph.startblock = hblock - self._ss_graph_marker = v_marker - return self._ss_graph_marker - def push_roots(self, hop, keep_current_args=False): livevars = self.get_livevars_for_roots(hop, keep_current_args) + if not livevars: + return [] self.num_pushs += len(livevars) - v_marker = self.ensure_ss_graph_marker() - hop.genop("gc_ss_store", [v_marker] + livevars) + hop.genop("gc_ss_store", livevars) return livevars def pop_roots(self, hop, livevars): # for moving collectors, reload the roots into the local variables - if self.gcdata.gc.moving_gc and livevars: - v_marker = self.ensure_ss_graph_marker() - hop.genop("gc_ss_reload", [v_marker] + livevars) + assert self.gcdata.gc.moving_gc, "XXX" + if livevars: + hop.genop("gc_ss_reload", livevars) class ShadowStackRootWalker(BaseRootWalker): 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 @@ -443,31 +443,26 @@ from rpython.memory.gctransform import shadowstack return shadowstack.ShadowStackFrameworkGCTransformer(self.db.translator) - def OP_GC_SS_GRAPH_MARKER(self, funcgen, op): - return '%s = rpy_shadowstack;' % funcgen.expr(op.result) - def OP_GC_SS_STORE(self, funcgen, op): - marker = funcgen.expr(op.args[0]) lines = [] - for i, v in enumerate(op.args[1:]): - lines.append('%s[%d].s = %s;' % (marker, i, funcgen.expr(v))) - lines.append('rpy_shadowstack = %s + %d;' % (marker, len(op.args) - 1)) + for i, v in enumerate(op.args): + lines.append('rpy_shadowstack[%d].s = %s;' % (i, funcgen.expr(v))) + lines.append('rpy_shadowstack += %d;' % len(op.args)) return '\n'.join(lines) def OP_GC_SS_RELOAD(self, funcgen, op): - marker = funcgen.expr(op.args[0]) - lines = [] - for i, v in enumerate(op.args[1:]): + revlines = [] + for i, v in enumerate(op.args): typename = funcgen.db.gettype(v.concretetype) - lines.append('%s = (%s)%s[%d].s;' % ( + revlines.append('%s = (%s)rpy_shadowstack[%d].s;' % ( funcgen.expr(v), cdecl(typename, ''), - marker, i)) if isinstance(v, Constant): - lines[-1] = '/* %s */' % lines[-1] - lines.reverse() - return '\n'.join(lines) + revlines[-1] = '/* %s */' % revlines[-1] + revlines.append('rpy_shadowstack -= %d;' % len(op.args)) + revlines.reverse() + return '\n'.join(revlines) class AsmGcRootFrameworkGcPolicy(BasicFrameworkGcPolicy): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit