[pypy-commit] pypy stm-thread-2: Various fixes

arigo noreply at buildbot.pypy.org
Thu Sep 13 10:06:28 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: stm-thread-2
Changeset: r57321:926b15111a57
Date: 2012-09-13 09:56 +0200
http://bitbucket.org/pypy/pypy/changeset/926b15111a57/

Log:	Various fixes

diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py
--- a/pypy/jit/backend/llsupport/gc.py
+++ b/pypy/jit/backend/llsupport/gc.py
@@ -600,13 +600,22 @@
         self.gcheaderbuilder = gc_ll_descr.gcheaderbuilder
         self.HDRPTR = gc_ll_descr.HDRPTR
         #
+        if self.stmcat is not None:
+            cfunc_name = self.stmcat[2]
+            self.wb_failing_case_ptr = rffi.llexternal(
+                cfunc_name,
+                self.WB_FUNCPTR_MOD.TO.ARGS,
+                self.WB_FUNCPTR_MOD.TO.RESULT,
+                sandboxsafe=True,
+                _nowrapper=True)
+        #
         GCClass = gc_ll_descr.GCClass
         if GCClass is None:     # for tests
             return
         if self.stmcat is None:
             self.jit_wb_if_flag = GCClass.JIT_WB_IF_FLAG
         else:
-            self.jit_wb_if_flag, cat = self.stmcat
+            self.jit_wb_if_flag = self.stmcat[0]
         self.jit_wb_if_flag_byteofs, self.jit_wb_if_flag_singlebyte = (
             self.extract_flag_byte(self.jit_wb_if_flag))
         #
@@ -629,7 +638,7 @@
         if self.stmcat is None:
             return 'wbdescr'
         else:
-            _, cat = self.stmcat
+            cat = self.stmcat[1]
             return cat
 
     def __repr__(self):
@@ -651,11 +660,7 @@
         assert returns_modified_object == self.returns_modified_object
         llop1 = self.llop1
         if returns_modified_object:
-            FUNCTYPE = self.WB_FUNCPTR_MOD
-            _, cat = self.stmcat
-            assert len(cat) == 3 and cat[1] == '2'      # "x2y"
-            funcptr = llop1.get_write_barrier_failing_case(FUNCTYPE,
-                                                           cat[0], cat[2])
+            funcptr = self.wb_failing_case_ptr
         else:
             FUNCTYPE = self.WB_FUNCPTR
             funcptr = llop1.get_write_barrier_failing_case(FUNCTYPE)
@@ -688,6 +693,7 @@
     def set_wb_slowpath(self, withcards, withfloats, addr):
         self.wb_slowpath[withcards + 2 * withfloats] = addr
 
+    @specialize.arg(2)
     def _do_write_barrier(self, gcref_struct, returns_modified_object):
         assert self.returns_modified_object == returns_modified_object
         hdr_addr = llmemory.cast_ptr_to_adr(gcref_struct)
@@ -697,12 +703,12 @@
             # get a pointer to the 'remember_young_pointer' function from
             # the GC, and call it immediately
             funcptr = self.get_barrier_funcptr(returns_modified_object)
-            return funcptr(llmemory.cast_ptr_to_adr(gcref_struct))
+            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
-            else:
-                return None
 
 
 class GcLLDescr_framework(GcLLDescription):
@@ -794,13 +800,19 @@
             self._setup_barriers_for_stm()
         else:
             self.write_barrier_descr = WriteBarrierDescr(self)
+            def do_write_barrier(gcref_struct, gcref_newptr):
+                self.write_barrier_descr._do_write_barrier(gcref_struct, False)
+            self.do_write_barrier = do_write_barrier
 
     def _setup_barriers_for_stm(self):
         from pypy.rpython.memory.gc import stmgc
         WBDescr = WriteBarrierDescr
-        self.P2Rdescr = WBDescr(self, (stmgc.GCFLAG_GLOBAL,      'P2R'))
-        self.P2Wdescr = WBDescr(self, (stmgc.GCFLAG_NOT_WRITTEN, 'P2W'))
-        self.R2Wdescr = WBDescr(self, (stmgc.GCFLAG_NOT_WRITTEN, 'R2W'))
+        self.P2Rdescr = WBDescr(self, (stmgc.GCFLAG_GLOBAL,      'P2R',
+                                       'stm_DirectReadBarrier'))
+        self.P2Wdescr = WBDescr(self, (stmgc.GCFLAG_NOT_WRITTEN, 'P2W',
+                                       'stm_WriteBarrier'))
+        self.R2Wdescr = WBDescr(self, (stmgc.GCFLAG_NOT_WRITTEN, 'R2W',
+                                       'stm_WriteBarrierFromReady'))
         self.write_barrier_descr = "wbdescr: do not use"
         #
         @specialize.argtype(0)
@@ -904,11 +916,14 @@
             # XXX remove the indirections in the following calls
             from pypy.rlib import rstm
             self.generate_function('stm_try_inevitable',
-                                   rstm.become_inevitable, [])
+                                   rstm.become_inevitable, [],
+                                   RESULT=lltype.Void)
             def ptr_eq(x, y): return x == y
             def ptr_ne(x, y): return x != y
-            self.generate_function('stm_ptr_eq', ptr_eq, [llmemory.GCREF] * 2)
-            self.generate_function('stm_ptr_ne', ptr_ne, [llmemory.GCREF] * 2)
+            self.generate_function('stm_ptr_eq', ptr_eq, [llmemory.GCREF] * 2,
+                                   RESULT=lltype.Bool)
+            self.generate_function('stm_ptr_ne', ptr_ne, [llmemory.GCREF] * 2,
+                                   RESULT=lltype.Bool)
 
     def _bh_malloc(self, sizedescr):
         from pypy.rpython.memory.gctypelayout import check_typeid
@@ -972,9 +987,6 @@
         hdr = llmemory.cast_adr_to_ptr(hdr_addr, self.HDRPTR)
         hdr.tid = tid
 
-    def do_write_barrier(self, gcref_struct, gcref_newptr):
-        self.write_barrier_descr._do_write_barrier(gcref_struct, False)
-
     def can_use_nursery_malloc(self, size):
         return (self.max_size_of_young_obj is not None and
                 size < self.max_size_of_young_obj)
diff --git a/pypy/jit/backend/x86/assembler.py b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -478,6 +478,8 @@
                                                   lltype.Void))
 
     def _build_release_gil(self, gcrootmap):
+        if self.cpu.gc_ll_descr.stm:      # XXX FIXME
+            return
         if gcrootmap.is_shadow_stack:
             releasegil_func = llhelper(self._NOARG_FUNC,
                                        self._release_gil_shadowstack)
@@ -2262,6 +2264,8 @@
         # the XMM registers won't be modified.  We store them in
         # [ESP+4], [ESP+8], etc.; on x86-32 we leave enough room in [ESP]
         # for the single argument to closestack_addr below.
+        if self.cpu.gc_ll_descr.stm:                                # XXX FIXME
+            raise NotImplementedError("releasegil_addr can (and will) collect")
         if IS_X86_32:
             p = WORD
         elif IS_X86_64:
diff --git a/pypy/translator/stm/test/targetjit1.py b/pypy/translator/stm/test/targetjit1.py
--- a/pypy/translator/stm/test/targetjit1.py
+++ b/pypy/translator/stm/test/targetjit1.py
@@ -162,6 +162,11 @@
 
 # _____ Define and setup target ___
 
+from pypy.jit.codewriter.policy import JitPolicy
+
+def jitpolicy(driver):
+    return JitPolicy()
+
 def target(*args):
     return entry_point, None
 


More information about the pypy-commit mailing list