[pypy-commit] pypy shadowstack-perf-2: Test

arigo pypy.commits at gmail.com
Wed May 11 14:36:27 EDT 2016


Author: Armin Rigo <arigo at tunes.org>
Branch: shadowstack-perf-2
Changeset: r84385:09e14faba25a
Date: 2016-05-11 20:36 +0200
http://bitbucket.org/pypy/pypy/changeset/09e14faba25a/

Log:	Test

diff --git a/rpython/memory/gctransform/shadowcolor.py b/rpython/memory/gctransform/shadowcolor.py
--- a/rpython/memory/gctransform/shadowcolor.py
+++ b/rpython/memory/gctransform/shadowcolor.py
@@ -1,5 +1,6 @@
 from rpython.rtyper.lltypesystem import lltype, llmemory
-from rpython.flowspace.model import mkentrymap, Variable, Constant
+from rpython.flowspace.model import mkentrymap
+from rpython.flowspace.model import Variable, Constant, SpaceOperation
 from rpython.tool.algo.regalloc import perform_register_allocation
 from rpython.translator.unsimplify import varoftype
 
@@ -130,6 +131,21 @@
     return (last_index, Constant(bitmask, lltype.Signed))
 
 
+def expand_one_push_roots(regalloc, args):
+    if regalloc is None:
+        assert len(args) == 0
+    else:
+        filled = [False] * regalloc.numcolors
+        for v in args:
+            index = regalloc.getcolor(v)
+            assert not filled[index]
+            filled[index] = True
+            yield _gc_save_root(index, v)
+        bitmask_index, bitmask_v = make_bitmask(filled)
+        if bitmask_index is not None:
+            yield _gc_save_root(bitmask_index, bitmask_v)
+
+
 def expand_push_roots(graph, regalloc):
     """Expand gc_push_roots into a series of gc_save_root, including
     writing a bitmask tag to mark some entries as not-in-use
@@ -139,18 +155,7 @@
         newops = []
         for op in block.operations:
             if op.opname == 'gc_push_roots':
-                if regalloc is None:
-                    assert len(op.args) == 0
-                else:
-                    filled = [False] * regalloc.numcolors
-                    for v in op.args:
-                        index = regalloc.getcolor(v)
-                        assert not filled[index]
-                        filled[index] = True
-                        newops.append(_gc_save_root(index, v))
-                    bitmask_index, bitmask_v = make_bitmask(filled)
-                    if bitmask_index is not None:
-                        newops.append(_gc_save_root(bitmask_index, bitmask_v))
+                newops += expand_one_push_roots(regalloc, op)
                 any_change = True
             else:
                 newops.append(op)
diff --git a/rpython/memory/gctransform/test/test_shadowcolor.py b/rpython/memory/gctransform/test/test_shadowcolor.py
--- a/rpython/memory/gctransform/test/test_shadowcolor.py
+++ b/rpython/memory/gctransform/test/test_shadowcolor.py
@@ -265,3 +265,30 @@
             bitmask >>= 1
             index -= 1
     assert boollist == [True] * len(boollist)
+
+
+class FakeRegAlloc:
+    def __init__(self, **colors):
+        self.numcolors = len(colors)
+        self.getcolor = colors.__getitem__
+
+def check_expand_one_push_roots(regalloc, args):
+    got = list(expand_one_push_roots(regalloc, args))
+    result = []
+    for spaceop in got:
+        assert spaceop.opname == 'gc_save_root'
+        result.append((spaceop.args[0].value, spaceop.args[1]))
+    return result
+
+def test_expand_one_push_roots():
+    regalloc = FakeRegAlloc(a=0, b=1, c=2)
+    assert check_expand_one_push_roots(regalloc, ['a', 'b', 'c']) == [
+        (0, 'a'), (1, 'b'), (2, 'c')]
+    assert check_expand_one_push_roots(regalloc, ['a', 'c']) == [
+        (0, 'a'), (2, 'c'), (1, c_NULL)]
+    assert check_expand_one_push_roots(regalloc, ['b']) == [
+        (1, 'b'), (2, Constant(0x5, lltype.Signed))]
+    assert check_expand_one_push_roots(regalloc, ['a']) == [
+        (0, 'a'), (2, Constant(0x3, lltype.Signed))]
+    assert check_expand_one_push_roots(regalloc, []) == [
+        (2, Constant(0x7, lltype.Signed))]


More information about the pypy-commit mailing list