[pypy-commit] pypy stmgc-c4: fighting layers to make it work

Raemi noreply at buildbot.pypy.org
Wed Jul 17 11:23:18 CEST 2013


Author: Remi Meier <remi.meier at gmail.com>
Branch: stmgc-c4
Changeset: r65424:8a3c2efecdca
Date: 2013-07-17 11:22 +0200
http://bitbucket.org/pypy/pypy/changeset/8a3c2efecdca/

Log:	fighting layers to make it work

diff --git a/rpython/jit/backend/arm/regalloc.py b/rpython/jit/backend/arm/regalloc.py
--- a/rpython/jit/backend/arm/regalloc.py
+++ b/rpython/jit/backend/arm/regalloc.py
@@ -628,7 +628,7 @@
         descr = op.getdescr()
         fail_descr = cast_instance_to_gcref(descr)
         # we know it does not move, but well
-        rgc._make_sure_does_not_move(fail_descr)
+        fail_descr = rgc._make_sure_does_not_move(fail_descr)
         fail_descr = rffi.cast(lltype.Signed, fail_descr)
         if op.numargs() == 1:
             loc = self.make_sure_var_in_reg(op.getarg(0))
diff --git a/rpython/jit/backend/llsupport/assembler.py b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -222,7 +222,7 @@
                 raise AssertionError(kind)
 
         gcref = cast_instance_to_gcref(value)
-        rgc._make_sure_does_not_move(gcref)
+        gcref = rgc._make_sure_does_not_move(gcref)
         value = rffi.cast(lltype.Signed, gcref)
         je_location = self._call_assembler_check_descr(value, tmploc)
         #
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
@@ -107,9 +107,12 @@
                 gcrefs_output_list.append(new_p)
                 
         if op.is_guard() or op.getopnum() == rop.FINISH:
-            llref = cast_instance_to_gcref(op.getdescr())
+            # the only ops with descrs that get recorded in a trace
+            from rpython.jit.metainterp.history import AbstractDescr
+            descr = op.getdescr()
+            llref = cast_instance_to_gcref(descr)
             new_llref = rgc._make_sure_does_not_move(llref)
-            new_d = rgc.try_cast_gcref_to_instance(llref.__class__, new_llref)
+            new_d = rgc.try_cast_gcref_to_instance(AbstractDescr, new_llref)
             op.setdescr(new_d)
             gcrefs_output_list.append(new_llref)
 
@@ -298,7 +301,7 @@
         self.returns_modified_object = False
         self.gcheaderbuilder = gc_ll_descr.gcheaderbuilder
         self.HDRPTR = gc_ll_descr.HDRPTR
-        self.b_slowpath = [0, 0, 0, 0]
+        self.b_slowpath = [0, 0, 0, 0, 0]
 
     def repr_of_descr(self):
         raise NotImplementedError
diff --git a/rpython/jit/backend/x86/regalloc.py b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -368,7 +368,7 @@
         descr = op.getdescr()
         fail_descr = cast_instance_to_gcref(descr)
         # we know it does not move, but well
-        rgc._make_sure_does_not_move(fail_descr)
+        fail_descr = rgc._make_sure_does_not_move(fail_descr)
         fail_descr = rffi.cast(lltype.Signed, fail_descr)
         if op.numargs() == 1:
             loc = self.make_sure_var_in_reg(op.getarg(0))
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
@@ -65,21 +65,25 @@
         return llop.stm_get_tid(llgroup.HALFWORD, obj)
 
     def get_hdr_tid(self, addr):
-        return llmemory.cast_adr_to_int(addr + self.H_TID)
+        return llmemory.cast_adr_to_ptr(addr + self.H_TID, rffi.SIGNEDP)
 
     def get_hdr_revision(self, addr):
-        return llmemory.cast_adr_to_int(addr + self.H_REVISION)
-        
+        return llmemory.cast_adr_to_ptr(addr + self.H_REVISION, rffi.SIGNEDP)
+
     def get_hdr_original(self, addr):
-        return llmemory.cast_adr_to_int(addr + self.H_ORIGINAL)
+        return llmemory.cast_adr_to_ptr(addr + self.H_ORIGINAL, rffi.SIGNEDP)
 
-    def get_original_object(self, obj):
-        if bool(self.get_hdr_tid(obj) & GCFLAG_PREBUILT_ORIGINAL):
+    def get_original_copy(self, obj):
+        addr = llmemory.cast_ptr_to_adr(obj)
+        if bool(self.get_hdr_tid(addr)[0] & GCFLAG_PREBUILT_ORIGINAL):
             return obj
-        orig = self.get_hdr_original(obj)
+        #
+        orig = self.get_hdr_original(addr)[0]
         if orig == 0:
             return obj
-        return llmemory.cast_int_to_adr(orig)
+        #
+        return  llmemory.cast_adr_to_ptr(llmemory.cast_int_to_adr(orig), 
+                                         llmemory.GCREF)
         
     def init_gc_object_immortal(self, addr, typeid16, flags=0):
         assert flags == 0
@@ -117,7 +121,7 @@
     def can_move(self, obj):
         """Means the reference will stay valid, except if not
         seen by the GC, then it can get collected."""
-        tid = self.get_hdr_tid(obj)
+        tid = self.get_hdr_tid(obj)[0]
         if bool(tid & GCFLAG_OLD):
             return False
         return True
diff --git a/rpython/memory/gctransform/framework.py b/rpython/memory/gctransform/framework.py
--- a/rpython/memory/gctransform/framework.py
+++ b/rpython/memory/gctransform/framework.py
@@ -314,6 +314,13 @@
         self.can_move_ptr = getfn(GCClass.can_move.im_func,
                                   [s_gc, annmodel.SomeAddress()],
                                   annmodel.SomeBool())
+        if hasattr(GCClass, 'get_original_copy'):
+            self.get_original_copy_ptr = getfn(
+                GCClass.get_original_copy.im_func,
+                [s_gc, annmodel.SomePtr(llmemory.GCREF)],
+                annmodel.SomePtr(llmemory.GCREF))
+        else:
+            self.get_original_copy_ptr = None
 
         if hasattr(GCClass, 'shrink_array'):
             self.shrink_array_ptr = getfn(
@@ -744,6 +751,16 @@
         hop.genop("direct_call", [self.can_move_ptr, self.c_const_gc, v_addr],
                   resultvar=op.result)
 
+    def gct_gc_get_original_copy(self, hop):
+        if self.get_original_copy_ptr is None:
+            raise Exception("unreachable code")
+        op = hop.spaceop
+        v_addr = hop.genop('cast_ptr_to_adr',
+                           [op.args[0]], resulttype=llmemory.Address)
+        hop.genop("direct_call", [self.get_original_copy_ptr,
+                                  self.c_const_gc, v_addr],
+                  resultvar=op.result)
+
     def gct_shrink_array(self, hop):
         if self.shrink_array_ptr is None:
             return GCTransformer.gct_shrink_array(self, hop)
diff --git a/rpython/rlib/rgc.py b/rpython/rlib/rgc.py
--- a/rpython/rlib/rgc.py
+++ b/rpython/rlib/rgc.py
@@ -26,6 +26,12 @@
     return None   # means 'not translated at all';
                   # in "if stm_is_enabled()" it is equivalent to False
 
+def stm_get_original_copy(obj):
+    """ Returns a non-moving reference to an object (only use if obj is
+    already OLD!)
+    """
+    return lltype.nullptr(llmemory.GCREF)
+
 # ____________________________________________________________
 # Annotation and specialization
 
@@ -70,6 +76,20 @@
         hop.exception_cannot_occur()
         return hop.inputconst(lltype.Bool, hop.s_result.const)
 
+
+class StmGCGetOriginalCopy(ExtRegistryEntry):
+    _about_ = stm_get_original_copy
+
+    def compute_result_annotation(self, s_obj):
+        from rpython.annotator import model as annmodel
+        return annmodel.SomePtr(llmemory.GCREF)
+
+    def specialize_call(self, hop):
+        hop.exception_cannot_occur()
+        return hop.genop('gc_get_original_copy', hop.args_v, 
+                         resulttype=hop.r_result)
+
+        
 def can_move(p):
     """Check if the GC object 'p' is at an address that can move.
     Must not be called with None.  With non-moving GCs, it is always False.
@@ -108,9 +128,7 @@
         i += 1
 
     if stm_is_enabled():
-        from rpython.memory.gc.stmgc import StmGC
-        assert isinstance(gc, StmGC)
-        return gc.get_original_object()
+        return stm_get_original_copy(p)
     else:
         return p
 
diff --git a/rpython/rtyper/lltypesystem/lloperation.py b/rpython/rtyper/lltypesystem/lloperation.py
--- a/rpython/rtyper/lltypesystem/lloperation.py
+++ b/rpython/rtyper/lltypesystem/lloperation.py
@@ -526,6 +526,7 @@
     'gc_obtain_free_space': LLOp(),
     'gc_set_max_heap_size': LLOp(),
     'gc_can_move'         : LLOp(sideeffects=False),
+    'gc_get_original_copy': LLOp(sideeffects=False),
     'gc_thread_prepare'   : LLOp(canmallocgc=True),
     'gc_thread_run'       : LLOp(),
     'gc_thread_start'     : LLOp(),
diff --git a/rpython/translator/stm/inevitable.py b/rpython/translator/stm/inevitable.py
--- a/rpython/translator/stm/inevitable.py
+++ b/rpython/translator/stm/inevitable.py
@@ -15,6 +15,7 @@
     'jit_record_known_class',
     'gc_identityhash', 'gc_id', 'gc_can_move', 'gc__collect',
     'gc_adr_of_root_stack_top',
+    'stmgc_get_original_copy',
     'weakref_create', 'weakref_deref',
     'stm_threadlocalref_get', 'stm_threadlocalref_set',
     'stm_threadlocalref_count', 'stm_threadlocalref_addr',


More information about the pypy-commit mailing list