[pypy-commit] pypy shadowstack-again: Yet a different approach

arigo noreply at buildbot.pypy.org
Wed May 21 09:32:01 CEST 2014


Author: Armin Rigo <arigo at 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):
 


More information about the pypy-commit mailing list