[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