[pypy-commit] pypy stmgc-c4: hopefully in the right direction: now a single cond_call_stm_b because there may be many more variants in the future.

Raemi noreply at buildbot.pypy.org
Thu Jul 11 18:13:38 CEST 2013


Author: Remi Meier <meierrem at student.ethz.ch>
Branch: stmgc-c4
Changeset: r65346:e1aa4591dc07
Date: 2013-07-11 18:12 +0200
http://bitbucket.org/pypy/pypy/changeset/e1aa4591dc07/

Log:	hopefully in the right direction: now a single cond_call_stm_b
	because there may be many more variants in the future.

diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -958,11 +958,8 @@
     def execute_cond_call_gc_wb_array(self, descr, a, b, c):
         py.test.skip("cond_call_gc_wb_array not supported")
 
-    def execute_cond_call_stm_wb(self, descr, a):
-        py.test.skip("cond_call_stm_wb not supported")
-
-    def execute_cond_call_stm_rb(self, descr, a):
-        py.test.skip("cond_call_stm_rb not supported")
+    def execute_cond_call_stm_b(self, descr, a):
+        py.test.skip("cond_call_stm_b not supported")
 
     def execute_keepalive(self, descr, x):
         pass
diff --git a/rpython/jit/backend/llsupport/gc.py b/rpython/jit/backend/llsupport/gc.py
--- a/rpython/jit/backend/llsupport/gc.py
+++ b/rpython/jit/backend/llsupport/gc.py
@@ -270,23 +270,43 @@
         rst_addr = llop.gc_adr_of_root_stack_top(llmemory.Address)
         return rffi.cast(lltype.Signed, rst_addr)
 
+class GcRootMap_stm(object):
+    is_shadow_stack = False # XXX: should it have an is_stmgc?
 
-class WriteBarrierDescr(AbstractDescr):
+    def __init__(self, gcdescr):
+        pass
+
+    def register_asm_addr(self, start, mark):
+        pass
+
+    def get_root_stack_top_addr(self):
+        rst_addr = llop.gc_adr_of_root_stack_top(llmemory.Address)
+        return rffi.cast(lltype.Signed, rst_addr)
+        
+        
+class BarrierDescr(AbstractDescr):
     def __init__(self, gc_ll_descr):
         self.llop1 = gc_ll_descr.llop1
 
         self.returns_modified_object = False
-        self.WB_FUNCPTR = lltype.Ptr(lltype.FuncType(
+        self.FUNCPTR = lltype.Ptr(lltype.FuncType(
             [llmemory.Address], lltype.Void))
 
-        self.fielddescr_tid = gc_ll_descr.fielddescr_tid
         self.gcheaderbuilder = gc_ll_descr.gcheaderbuilder
         self.HDRPTR = gc_ll_descr.HDRPTR
-        #
+
+    def repr_of_descr(self):
+        raise NotImplementedError
+
+    def __repr(self):
+        raise NotImplementedError
+        
+class WriteBarrierDescr(BarrierDescr):
+    def __init__(self, gc_ll_descr):
+        BarrierDescr.__init__(self, gc_ll_descr)
+        self.fielddescr_tid = gc_ll_descr.fielddescr_tid
+
         GCClass = gc_ll_descr.GCClass
-        if GCClass is None:     # for tests
-            return
-
         self.jit_wb_if_flag = GCClass.JIT_WB_IF_FLAG
         self.jit_wb_if_flag_byteofs, self.jit_wb_if_flag_singlebyte = (
             self.extract_flag_byte(self.jit_wb_if_flag))
@@ -325,14 +345,9 @@
         return (i, struct.unpack('b', value[i])[0])
 
     def get_barrier_funcptr(self, returns_modified_object):
-        assert returns_modified_object == self.returns_modified_object
-        llop1 = self.llop1
-        if returns_modified_object:
-            funcptr = self.wb_failing_case_ptr
-        else:
-            FUNCTYPE = self.WB_FUNCPTR
-            funcptr = llop1.get_write_barrier_failing_case(FUNCTYPE)
-        return funcptr
+        assert not returns_modified_object
+        FUNCTYPE = self.FUNCPTR
+        return llop1.get_write_barrier_failing_case(FUNCTYPE)
 
     def get_write_barrier_fn(self, cpu, returns_modified_object):
         # must pass in 'self.returns_modified_object', to make sure that
@@ -343,16 +358,13 @@
 
     def get_write_barrier_from_array_fn(self, cpu):
         # returns a function with arguments [array, index, newvalue]
-        assert not self.returns_modified_object
         llop1 = self.llop1
         funcptr = llop1.get_write_barrier_from_array_failing_case(
-            self.WB_FUNCPTR)
+            self.FUNCPTR)
         funcaddr = llmemory.cast_ptr_to_adr(funcptr)
         return cpu.cast_adr_to_int(funcaddr)    # this may return 0
 
     def has_write_barrier_from_array(self, cpu):
-        if self.returns_modified_object:
-            return False
         return self.get_write_barrier_from_array_fn(cpu) != 0
 
     def get_wb_slowpath(self, withcards, withfloats):
@@ -372,15 +384,11 @@
             # the GC, and call it immediately
             funcptr = self.get_barrier_funcptr(returns_modified_object)
             res = funcptr(llmemory.cast_ptr_to_adr(gcref_struct))
-            if returns_modified_object:
-                return llmemory.cast_adr_to_ptr(res, llmemory.GCREF)
-        else:
-            if returns_modified_object:
-                return gcref_struct
 
-class STMBarrierDescr(WriteBarrierDescr):
+            
+class STMBarrierDescr(BarrierDescr):
     def __init__(self, gc_ll_descr, stmcat, cfunc_name):
-        WriteBarrierDescr.__init__(self, gc_ll_descr)
+        BarrierDescr.__init__(self, gc_ll_descr)
         self.stmcat = stmcat
         self.returns_modified_object = True
         self.WB_FUNCPTR_MOD = lltype.Ptr(lltype.FuncType(
@@ -394,8 +402,14 @@
             _nowrapper=True)
 
     def repr_of_descr(self):
-        cat = self.stmcat
-        return cat
+        return self.stmcat
+
+    def __repr__(self):
+        return '<STMBarrierDescr %r>' % (self.repr_of_descr(),)
+
+    def get_barrier_funcptr(self, returns_modified_object):
+        assert returns_modified_object
+        return self.wb_failing_case_ptr
 
     @specialize.arg(2)
     def _do_barrier(self, gcref_struct, returns_modified_object):
@@ -403,8 +417,7 @@
         # XXX: fastpath for Read and Write variants
         funcptr = self.get_barrier_funcptr(returns_modified_object)
         res = funcptr(llmemory.cast_ptr_to_adr(gcref_struct))
-        if returns_modified_object:
-            return llmemory.cast_adr_to_ptr(res, llmemory.GCREF)
+        return llmemory.cast_adr_to_ptr(res, llmemory.GCREF)
 
 
 class STMReadBarrierDescr(STMBarrierDescr):
@@ -412,9 +425,8 @@
         assert stmcat == 'P2R'
         STMBarrierDescr.__init__(self, gc_ll_descr, stmcat,
                                  'stm_read_barrier')
-    
-    
 
+        
 class STMWriteBarrierDescr(STMBarrierDescr):
     def __init__(self, gc_ll_descr, stmcat):
         assert stmcat in ['P2W', 'R2W']
@@ -448,7 +460,9 @@
             self._make_layoutbuilder()
             self._make_gcrootmap()
             self._setup_gcclass()
-            self._setup_tid()
+            if not self.stm:
+                # XXX: not needed with stm/shadowstack??
+                self._setup_tid()
         self._setup_write_barrier()
         self._setup_str()
         self._make_functions(really_not_translated)
diff --git a/rpython/jit/backend/llsupport/stmrewrite.py b/rpython/jit/backend/llsupport/stmrewrite.py
--- a/rpython/jit/backend/llsupport/stmrewrite.py
+++ b/rpython/jit/backend/llsupport/stmrewrite.py
@@ -9,8 +9,8 @@
 #
 # Any SETFIELD_GC, SETARRAYITEM_GC, SETINTERIORFIELD_GC must be done on a
 # W object.  The operation that forces an object p1 to be W is
-# COND_CALL_STM_WB(p1, descr=x2Wdescr), for x in 'PGORL'.  This
-# COND_CALL_STM_WB is a bit special because if p1 is not W, it *replaces*
+# COND_CALL_STM_B(p1, descr=x2Wdescr), for x in 'PGORL'.  This
+# COND_CALL_STM_B is a bit special because if p1 is not W, it *replaces*
 # its value with the W copy (by changing the register's value and
 # patching the stack location if any).  It's still conceptually the same
 # object, but the pointer is different.
@@ -121,10 +121,7 @@
         except KeyError:
             return v_base    # no barrier needed
         args = [v_base,]
-        if target_category == 'W':
-            op = rop.COND_CALL_STM_WB
-        else:
-            op = rop.COND_CALL_STM_RB
+        op = rop.COND_CALL_STM_B
         self.newops.append(ResOperation(op, args, None,
                                         descr=write_barrier_descr))
         
diff --git a/rpython/jit/backend/llsupport/test/test_stmrewrite.py b/rpython/jit/backend/llsupport/test/test_stmrewrite.py
--- a/rpython/jit/backend/llsupport/test/test_stmrewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_stmrewrite.py
@@ -44,7 +44,7 @@
             jump()
         """, """
             [p1, p2]
-            cond_call_stm_wb(p1, descr=P2Wdescr)
+            cond_call_stm_b(p1, descr=P2Wdescr)
             setfield_gc(p1, p2, descr=tzdescr)
             jump()
         """)
@@ -59,7 +59,7 @@
         """, """
             [p1, p2]
             p3 = same_as(ConstPtr(t))
-            cond_call_stm_wb(p3, descr=P2Wdescr)
+            cond_call_stm_b(p3, descr=P2Wdescr)
             setfield_gc(p3, p2, descr=tzdescr)
             jump()
             """, t=NULL)
@@ -87,9 +87,9 @@
             jump()
         """, """
             [p1, p2, p3, p4]
-            cond_call_stm_wb(p1, descr=P2Wdescr)
+            cond_call_stm_b(p1, descr=P2Wdescr)
             setfield_gc(p1, p2, descr=tzdescr)
-            cond_call_stm_wb(p3, descr=P2Wdescr)
+            cond_call_stm_b(p3, descr=P2Wdescr)
             setfield_gc(p3, p4, descr=tzdescr)
             jump()
         """)
@@ -102,7 +102,7 @@
             jump()
         """, """
             [p1, p2, i3]
-            cond_call_stm_wb(p1, descr=P2Wdescr)
+            cond_call_stm_b(p1, descr=P2Wdescr)
             setfield_gc(p1, p2, descr=tzdescr)
             setfield_gc(p1, i3, descr=tydescr)
             jump()
@@ -117,10 +117,10 @@
             jump(p1)
         """, """
             [p1, p2, i3]
-            cond_call_stm_wb(p1, descr=P2Wdescr)
+            cond_call_stm_b(p1, descr=P2Wdescr)
             setfield_gc(p1, p2, descr=tzdescr)
             label(p1, i3)
-            cond_call_stm_wb(p1, descr=P2Wdescr)
+            cond_call_stm_b(p1, descr=P2Wdescr)
             setfield_gc(p1, i3, descr=tydescr)
             jump(p1)
         """)
@@ -162,7 +162,7 @@
             jump(p2)
         """, """
             [p1]
-            cond_call_stm_rb(p1, descr=P2Rdescr)
+            cond_call_stm_b(p1, descr=P2Rdescr)
             p2 = getfield_gc(p1, descr=tzdescr)
             jump(p2)
         """)
@@ -177,7 +177,7 @@
         """, """
             [p1]
             p3 = same_as(ConstPtr(t))
-            cond_call_stm_rb(p3, descr=P2Rdescr)
+            cond_call_stm_b(p3, descr=P2Rdescr)
             p2 = getfield_gc(p3, descr=tzdescr)
             jump(p2)
         """, t=NULL)
@@ -190,7 +190,7 @@
             jump(i3)
         """, """
             [p1, i2]
-            cond_call_stm_rb(p1, descr=P2Rdescr)
+            cond_call_stm_b(p1, descr=P2Rdescr)
             i3 = getarrayitem_gc(p1, i2, descr=adescr)
             jump(i3)
         """)
@@ -202,7 +202,7 @@
             jump(i3)
         """, """
             [p1, i2]
-            cond_call_stm_rb(p1, descr=P2Rdescr)
+            cond_call_stm_b(p1, descr=P2Rdescr)
             i3 = getinteriorfield_gc(p1, i2, descr=adescr)
             jump(i3)
         """)
@@ -215,7 +215,7 @@
             jump(p2, i2)
         """, """
             [p1]
-            cond_call_stm_rb(p1, descr=P2Rdescr)
+            cond_call_stm_b(p1, descr=P2Rdescr)
             p2 = getfield_gc(p1, descr=tzdescr)
             i2 = getfield_gc(p1, descr=tydescr)
             jump(p2, i2)
@@ -229,9 +229,9 @@
             jump(p2, i2)
         """, """
             [p1]
-            cond_call_stm_rb(p1, descr=P2Rdescr)
+            cond_call_stm_b(p1, descr=P2Rdescr)
             p2 = getfield_gc(p1, descr=tzdescr)
-            cond_call_stm_rb(p2, descr=P2Rdescr)
+            cond_call_stm_b(p2, descr=P2Rdescr)
             i2 = getfield_gc(p2, descr=tydescr)
             jump(p2, i2)
         """)
@@ -247,10 +247,10 @@
             jump(p1)
         """, """
             [p1]
-            cond_call_stm_rb(p1, descr=P2Rdescr)
+            cond_call_stm_b(p1, descr=P2Rdescr)
             i1 = getfield_gc(p1, descr=tydescr)
             i2 = int_add(i1, 1)
-            cond_call_stm_wb(p1, descr=R2Wdescr)
+            cond_call_stm_b(p1, descr=R2Wdescr)
             setfield_gc(p1, i2, descr=tydescr)
             jump(p1)
         """)
@@ -263,7 +263,7 @@
             jump(p2)
         """, """
             [p1]
-            cond_call_stm_wb(p1, descr=P2Wdescr)
+            cond_call_stm_b(p1, descr=P2Wdescr)
             setfield_gc(p1, 123, descr=tydescr)
             p2 = getfield_gc(p1, descr=tzdescr)
             jump(p2)
@@ -295,10 +295,10 @@
             jump(p2)
         """, """
             [p1]
-            cond_call_stm_rb(p1, descr=P2Rdescr)
+            cond_call_stm_b(p1, descr=P2Rdescr)
             p2 = getfield_gc(p1, descr=tzdescr)
             call(p2)
-            cond_call_stm_wb(p1, descr=P2Wdescr)
+            cond_call_stm_b(p1, descr=P2Wdescr)
             setfield_gc(p1, 5, descr=tydescr)
             jump(p2)
         """)
@@ -358,9 +358,9 @@
             jump()
         """, """
             [p1, i1, p2, p3, i3, p4]
-            cond_call_stm_wb(p1, descr=P2Wdescr)
+            cond_call_stm_b(p1, descr=P2Wdescr)
             setarrayitem_gc(p1, i1, p2, descr=adescr)
-            cond_call_stm_wb(p3, descr=P2Wdescr)
+            cond_call_stm_b(p3, descr=P2Wdescr)
             setarrayitem_gc(p3, i3, p4, descr=adescr)
             jump()
         """)
@@ -374,7 +374,7 @@
             jump()
         """, """
             [p1, p2, i2, p3, i3]
-            cond_call_stm_wb(p1, descr=P2Wdescr)
+            cond_call_stm_b(p1, descr=P2Wdescr)
             setarrayitem_gc(p1, i2, p2, descr=adescr)
             i4 = read_timestamp()
             setarrayitem_gc(p1, i3, p3, descr=adescr)
@@ -390,7 +390,7 @@
             jump()
         """, """
             [p1, p2, i2, p3, i3]
-            cond_call_stm_wb(p1, descr=P2Wdescr)
+            cond_call_stm_b(p1, descr=P2Wdescr)
             setinteriorfield_gc(p1, i2, p2, descr=adescr)
             i4 = read_timestamp()
             setinteriorfield_gc(p1, i3, p3, descr=adescr)
@@ -405,7 +405,7 @@
             jump()
         """, """
             [p1, i2, i3]
-            cond_call_stm_wb(p1, descr=P2Wdescr)
+            cond_call_stm_b(p1, descr=P2Wdescr)
             strsetitem(p1, i2, i3)
             unicodesetitem(p1, i2, i3)
             jump()
@@ -432,11 +432,11 @@
                 jump(i2, p7)
             """ % op, """
                 [i1, i2, i3, p7]
-                cond_call_stm_wb(p7, descr=P2Wdescr)
+                cond_call_stm_b(p7, descr=P2Wdescr)
                 setfield_gc(p7, 10, descr=tydescr)
                 $INEV
                 %s
-                cond_call_stm_wb(p7, descr=P2Wdescr)
+                cond_call_stm_b(p7, descr=P2Wdescr)
                 setfield_gc(p7, 20, descr=tydescr)
                 jump(i2, p7)
             """ % op, calldescr2=calldescr2)
@@ -448,8 +448,8 @@
             jump()
         """, """
             [p1, p2, i1, i2, i3]
-            cond_call_stm_wb(p2, descr=P2Wdescr)
-            cond_call_stm_rb(p1, descr=P2Rdescr)
+            cond_call_stm_b(p2, descr=P2Wdescr)
+            cond_call_stm_b(p1, descr=P2Rdescr)
             copystrcontent(p1, p2, i1, i2, i3)
             jump()
         """)
@@ -468,7 +468,7 @@
                 jump(p1)
             """ % op, """
                 [p1]
-                cond_call_stm_wb(p1, descr=P2Wdescr)
+                cond_call_stm_b(p1, descr=P2Wdescr)
                 setfield_gc(p1, 10, descr=tydescr)
                 %s
                 setfield_gc(p1, 20, descr=tydescr)
@@ -491,10 +491,10 @@
                 jump(p1)
             """ % op, """
                 [p1]
-                cond_call_stm_wb(p1, descr=P2Wdescr)
+                cond_call_stm_b(p1, descr=P2Wdescr)
                 setfield_gc(p1, 10, descr=tydescr)
                 %s
-                cond_call_stm_wb(p1, descr=P2Wdescr)
+                cond_call_stm_b(p1, descr=P2Wdescr)
                 setfield_gc(p1, 20, descr=tydescr)
                 jump(p1)
             """ % op, calldescr2=calldescr2)
diff --git a/rpython/jit/metainterp/executor.py b/rpython/jit/metainterp/executor.py
--- a/rpython/jit/metainterp/executor.py
+++ b/rpython/jit/metainterp/executor.py
@@ -346,8 +346,7 @@
                          rop.CALL_ASSEMBLER,
                          rop.COND_CALL_GC_WB,
                          rop.COND_CALL_GC_WB_ARRAY,
-                         rop.COND_CALL_STM_WB,
-                         rop.COND_CALL_STM_RB,
+                         rop.COND_CALL_STM_B,
                          rop.DEBUG_MERGE_POINT,
                          rop.JIT_DEBUG,
                          rop.SETARRAYITEM_RAW,
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -500,8 +500,7 @@
     'STRSETITEM/3',
     'UNICODESETITEM/3',
     #'RUNTIMENEW/1',     # ootype operation
-    'COND_CALL_STM_WB/1d', # objptr (write barrier)
-    'COND_CALL_STM_RB/1d', # objptr (read barrier)
+    'COND_CALL_STM_B/1d', # objptr (write/read barrier)
     'COND_CALL_GC_WB/2d', # [objptr, newvalue] (for the write barrier)
     'COND_CALL_GC_WB_ARRAY/3d', # [objptr, arrayindex, newvalue] (write barr.)
     'DEBUG_MERGE_POINT/*',      # debugging only
diff --git a/rpython/memory/gc/stmgc.py b/rpython/memory/gc/stmgc.py
--- a/rpython/memory/gc/stmgc.py
+++ b/rpython/memory/gc/stmgc.py
@@ -45,7 +45,10 @@
 
     VISIT_FPTR = lltype.Ptr(lltype.FuncType([llmemory.Address], lltype.Void))
 
-    TRANSLATION_PARAMS = {}
+    minimal_size_in_nursery = llmemory.sizeof(HDR)
+
+    TRANSLATION_PARAMS = {
+    }
 
     def setup(self):
         # Hack: MovingGCBase.setup() sets up stuff related to id(), which
@@ -90,6 +93,15 @@
         (obj + offset_to_length).signed[0] = length
         return llmemory.cast_adr_to_ptr(obj, llmemory.GCREF)
 
+
+    @classmethod
+    def JIT_max_size_of_young_obj(cls):
+        return -1 # XXX: should not be used
+
+    @classmethod
+    def JIT_minimal_size_in_nursery(cls):
+        return cls.minimal_size_in_nursery
+
     def collect(self, gen=1):
         """Do a minor (gen=0) or major (gen>0) collection."""
         if gen > 0:
diff --git a/rpython/memory/gctransform/stmframework.py b/rpython/memory/gctransform/stmframework.py
--- a/rpython/memory/gctransform/stmframework.py
+++ b/rpython/memory/gctransform/stmframework.py
@@ -46,6 +46,9 @@
     def gc_header_for(self, obj, needs_hash=False):
         return self.gcdata.gc.gcheaderbuilder.header_of_object(obj)
 
+    def gct_gc_adr_of_root_stack_top(self, hop):
+        hop.genop("stm_get_root_stack_top")
+
     def _gct_with_roots_pushed(self, hop):
         livevars = self.push_roots(hop)
         self.default(hop)
diff --git a/rpython/translator/stm/funcgen.py b/rpython/translator/stm/funcgen.py
--- a/rpython/translator/stm/funcgen.py
+++ b/rpython/translator/stm/funcgen.py
@@ -94,6 +94,11 @@
     return '%s = (%s)stm_pop_root();' % (
         arg0, cdecl(funcgen.lltypename(op.args[0]), ''))
 
+def stm_get_root_stack_top(funcgen, op):
+    result = funcgen.expr(op.result)
+    return '%s = (%s)stm_shadowstack;' % (
+        result, cdecl(funcgen.lltypename(op.result), ''))
+
 def stm_allocate(funcgen, op):
     arg0 = funcgen.expr(op.args[0])
     arg1 = funcgen.expr(op.args[1])


More information about the pypy-commit mailing list