[pypy-commit] pypy stmgc-c7: Merge

Raemi noreply at buildbot.pypy.org
Thu Apr 17 11:29:02 CEST 2014


Author: Remi Meier <remi.meier at inf.ethz.ch>
Branch: stmgc-c7
Changeset: r70689:68bd542ca517
Date: 2014-04-17 11:29 +0200
http://bitbucket.org/pypy/pypy/changeset/68bd542ca517/

Log:	Merge

diff --git a/pypy/interpreter/executioncontext.py b/pypy/interpreter/executioncontext.py
--- a/pypy/interpreter/executioncontext.py
+++ b/pypy/interpreter/executioncontext.py
@@ -56,10 +56,6 @@
         return frame
 
     def enter(self, frame):
-        if self.space.config.translation.stm:
-          if not self.space.config.translation.jit:  # XXX
-            from pypy.module.thread.stm import enter_frame
-            enter_frame(self, frame)
         frame.f_backref = self.topframeref
         self.topframeref = jit.virtual_ref(frame)
 
@@ -81,11 +77,6 @@
                 frame_vref()
             jit.virtual_ref_finish(frame_vref, frame)
 
-        if self.space.config.translation.stm:
-          if not self.space.config.translation.jit:  # XXX
-            from pypy.module.thread.stm import leave_frame
-            leave_frame(self, frame)
-
     # ________________________________________________________________
 
     def c_call_trace(self, frame, w_func, args=None):
diff --git a/pypy/module/thread/stm.py b/pypy/module/thread/stm.py
--- a/pypy/module/thread/stm.py
+++ b/pypy/module/thread/stm.py
@@ -41,21 +41,6 @@
     if not we_are_translated() and not hasattr(ec, '_thread_local_dicts'):
         initialize_execution_context(ec)
 
- at jit.dont_look_inside # XXX: handle abort_info_push in JIT
-def enter_frame(ec, frame):
-    """Called from ExecutionContext.enter()."""
-    if frame.hide():
-        return
-    rstm.abort_info_push(frame.pycode, ('[', 'co_filename', 'co_name',
-                                        'co_firstlineno', 'co_lnotab'))
-    rstm.abort_info_push(frame, ('last_instr', ']'))
-
-def leave_frame(ec, frame):
-    """Called from ExecutionContext.leave()."""
-    if frame.hide():
-        return
-    rstm.abort_info_pop(2)
-
 
 class STMThreadLocals(BaseThreadLocals):
 
diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -859,11 +859,18 @@
         # (ebp is a writeable object and does not need a write-barrier
         # again (ensured by the code calling the loop))
         self.mc.MOV(ebx, self.heap_shadowstack_top())
-        self.mc.MOV_mr((self.SEGMENT_NO, ebx.value, 0), ebp.value)
-                                                      # MOV [ebx], ebp
         if self.cpu.gc_ll_descr.stm:
+            self.mc.MOV_mi((self.SEGMENT_NO, ebx.value, 0),
+                           rstm.STM_STACK_MARKER_NEW) # MOV [ebx], MARKER_NEW
+            self.mc.MOV_mr((self.SEGMENT_NO, ebx.value, WORD),
+                           ebp.value)                 # MOV [ebx+WORD], ebp
             self.mc.MOV_sr(STM_OLD_SHADOWSTACK, ebx.value)
-        self.mc.ADD_ri(ebx.value, WORD)
+                                                      # MOV [esp+xx], ebx
+            self.mc.ADD_ri(ebx.value, 2 * WORD)
+        else:
+            self.mc.MOV_mr((self.SEGMENT_NO, ebx.value, 0),
+                           ebp.value)                 # MOV [ebx], ebp
+            self.mc.ADD_ri(ebx.value, WORD)
         self.mc.MOV(self.heap_shadowstack_top(), ebx) # MOV [rootstacktop], ebx
 
     def _call_footer_shadowstack(self):
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
@@ -123,7 +123,6 @@
 
     gct_stm_become_globally_unique_transaction      = _gct_with_roots_pushed
     gct_stm_perform_transaction                     = _gct_with_roots_pushed
-    gct_stm_inspect_abort_info                      = _gct_with_roots_pushed
     gct_stm_threadlocalref_set                      = _gct_with_roots_pushed
 
 
diff --git a/rpython/rlib/rstm.py b/rpython/rlib/rstm.py
--- a/rpython/rlib/rstm.py
+++ b/rpython/rlib/rstm.py
@@ -12,6 +12,8 @@
 TID = rffi.UINT
 tid_offset = CFlexSymbolic('offsetof(struct rpyobj_s, tid)')
 stm_nb_segments = CFlexSymbolic('STM_NB_SEGMENTS')
+stm_stack_marker_new = CFlexSymbolic('STM_STACK_MARKER_NEW')
+stm_stack_marker_old = CFlexSymbolic('STM_STACK_MARKER_OLD')
 adr_nursery_free = CFlexSymbolic('((long)&STM_SEGMENT->nursery_current)')
 adr_nursery_top  = CFlexSymbolic('((long)&STM_SEGMENT->nursery_end)')
 adr_pypy_stm_nursery_low_fill_mark = (
@@ -79,18 +81,6 @@
 def is_atomic():
     return llop.stm_get_atomic(lltype.Signed)
 
-def abort_info_push(instance, fieldnames):
-    "Special-cased below."
-
- at dont_look_inside
-def abort_info_pop(count):
-    if we_are_translated():
-        llop.stm_abort_info_pop(lltype.Void, count)
-
- at dont_look_inside
-def charp_inspect_abort_info():
-    return llop.stm_inspect_abort_info(rffi.CCHARP)
-
 @dont_look_inside
 def abort_and_retry():
     llop.stm_abort_and_retry(lltype.Void)
@@ -160,58 +150,6 @@
 
 # ____________________________________________________________
 
-class AbortInfoPush(ExtRegistryEntry):
-    _about_ = abort_info_push
-
-    def compute_result_annotation(self, s_instance, s_fieldnames):
-        from rpython.annotator.model import SomeInstance
-        assert isinstance(s_instance, SomeInstance)
-        assert s_fieldnames.is_constant()
-        assert isinstance(s_fieldnames.const, tuple)  # tuple of names
-
-    def specialize_call(self, hop):
-        fieldnames = hop.args_s[1].const
-        lst = []
-        v_instance = hop.inputarg(hop.args_r[0], arg=0)
-        for fieldname in fieldnames:
-            if fieldname == '[':
-                lst.append(-2)    # start of sublist
-                continue
-            if fieldname == ']':
-                lst.append(-1)    # end of sublist
-                continue
-            fieldname = 'inst_' + fieldname
-            extraofs = None
-            STRUCT = v_instance.concretetype.TO
-            while not hasattr(STRUCT, fieldname):
-                STRUCT = STRUCT.super
-            TYPE = getattr(STRUCT, fieldname)
-            if TYPE == lltype.Signed:
-                kind = 1
-            elif TYPE == lltype.Unsigned:
-                kind = 2
-            elif TYPE == lltype.Ptr(rstr.STR):
-                kind = 3
-                extraofs = llmemory.offsetof(rstr.STR, 'chars')
-            else:
-                raise NotImplementedError(
-                    "abort_info_push(%s, %r): field of type %r"
-                    % (STRUCT.__name__, fieldname, TYPE))
-            lst.append(kind)
-            lst.append(llmemory.offsetof(STRUCT, fieldname))
-            if extraofs is not None:
-                lst.append(extraofs)
-        lst.append(0)
-        ARRAY = rffi.CArray(lltype.Signed)
-        array = lltype.malloc(ARRAY, len(lst), flavor='raw', immortal=True)
-        for i in range(len(lst)):
-            array[i] = lst[i]
-        c_array = hop.inputconst(lltype.Ptr(ARRAY), array)
-        hop.exception_cannot_occur()
-        hop.genop('stm_abort_info_push', [v_instance, c_array])
-
-# ____________________________________________________________
-
 class ThreadLocalReference(object):
     _COUNT = 1
 
diff --git a/rpython/rtyper/llinterp.py b/rpython/rtyper/llinterp.py
--- a/rpython/rtyper/llinterp.py
+++ b/rpython/rtyper/llinterp.py
@@ -959,9 +959,6 @@
     op_stm_get_atomic = _stm_not_implemented
     op_stm_change_atomic = _stm_not_implemented
     op_stm_set_transaction_length = _stm_not_implemented
-    op_stm_abort_info_push = _stm_not_implemented
-    op_stm_abort_info_pop = _stm_not_implemented
-    op_stm_inspect_abort_info = _stm_not_implemented
     op_stm_threadlocal_get = _stm_not_implemented
     op_stm_threadlocal_set = _stm_not_implemented
     op_stm_threadlocalref_get = _stm_not_implemented
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
@@ -448,10 +448,6 @@
     'stm_decrement_atomic':   LLOp(),
     'stm_get_atomic':         LLOp(sideeffects=False),
 
-    'stm_abort_info_push':    LLOp(),
-    'stm_abort_info_pop':     LLOp(),
-    'stm_inspect_abort_info': LLOp(sideeffects=False, canmallocgc=True),
-
     'stm_ignored_start':      LLOp(canrun=True),
     'stm_ignored_stop':       LLOp(canrun=True),
 
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
@@ -196,19 +196,6 @@
 def stm_abort_and_retry(funcgen, op):
     return 'stm_abort_transaction();'
 
-def stm_abort_info_push(funcgen, op):
-    arg0 = funcgen.expr(op.args[0])
-    arg1 = funcgen.expr(op.args[1])
-    return '//XXX stm_abort_info_push((gcptr)%s, %s);' % (arg0, arg1)
-
-def stm_abort_info_pop(funcgen, op):
-    arg0 = funcgen.expr(op.args[0])
-    return '//XXX stm_abort_info_pop(%s);' % (arg0,)
-
-def stm_inspect_abort_info(funcgen, op):
-    result = funcgen.expr(op.result)
-    return '%s = NULL; //XXX stm_inspect_abort_info();' % (result,)
-
 def stm_ignored_start(funcgen, op):
     return '/* stm_ignored_start */'
 
diff --git a/rpython/translator/stm/src_stm/revision b/rpython/translator/stm/src_stm/revision
--- a/rpython/translator/stm/src_stm/revision
+++ b/rpython/translator/stm/src_stm/revision
@@ -1,1 +1,1 @@
-a158a889e78b
+918b1901b1f9
diff --git a/rpython/translator/stm/src_stm/stm/gcpage.c b/rpython/translator/stm/src_stm/stm/gcpage.c
--- a/rpython/translator/stm/src_stm/stm/gcpage.c
+++ b/rpython/translator/stm/src_stm/stm/gcpage.c
@@ -380,8 +380,8 @@
         struct stm_shadowentry_s *current = tl->shadowstack;
         struct stm_shadowentry_s *base = tl->shadowstack_base;
         while (current-- != base) {
-            assert(current->ss != (object_t *)-1);
-            mark_visit_object(current->ss, segment_base);
+            if (((uintptr_t)current->ss) > STM_STACK_MARKER_OLD)
+                mark_visit_object(current->ss, segment_base);
         }
         mark_visit_object(tl->thread_local_obj, segment_base);
 
diff --git a/rpython/translator/stm/src_stm/stm/nursery.c b/rpython/translator/stm/src_stm/stm/nursery.c
--- a/rpython/translator/stm/src_stm/stm/nursery.c
+++ b/rpython/translator/stm/src_stm/stm/nursery.c
@@ -157,10 +157,32 @@
     stm_thread_local_t *tl = STM_SEGMENT->running_thread;
     struct stm_shadowentry_s *current = tl->shadowstack;
     struct stm_shadowentry_s *base = tl->shadowstack_base;
-    while (current-- != base) {
-        assert(current->ss != (object_t *)-1);
-        minor_trace_if_young(&current->ss);
+    while (1) {
+        --current;
+        OPT_ASSERT(current >= base);
+
+        switch ((uintptr_t)current->ss) {
+
+        case 0:   /* NULL */
+            continue;
+
+        case STM_STACK_MARKER_NEW:
+            /* the marker was not already seen: mark it as seen,
+               but continue looking more deeply in the shadowstack */
+            current->ss = (object_t *)STM_STACK_MARKER_OLD;
+            continue;
+
+        case STM_STACK_MARKER_OLD:
+            /* the marker was already seen: we can stop the
+               root stack tracing at this point */
+            goto interrupt;
+
+        default:
+            /* the stack entry is a regular pointer */
+            minor_trace_if_young(&current->ss);
+        }
     }
+ interrupt:
     minor_trace_if_young(&tl->thread_local_obj);
 }
 
diff --git a/rpython/translator/stm/src_stm/stm/setup.c b/rpython/translator/stm/src_stm/stm/setup.c
--- a/rpython/translator/stm/src_stm/stm/setup.c
+++ b/rpython/translator/stm/src_stm/stm/setup.c
@@ -154,11 +154,13 @@
     struct stm_shadowentry_s *s = (struct stm_shadowentry_s *)start;
     tl->shadowstack = s;
     tl->shadowstack_base = s;
+    STM_PUSH_ROOT(*tl, STM_STACK_MARKER_OLD);
 }
 
 static void _done_shadow_stack(stm_thread_local_t *tl)
 {
-    assert(tl->shadowstack >= tl->shadowstack_base);
+    assert(tl->shadowstack > tl->shadowstack_base);
+    assert(tl->shadowstack_base->ss == (object_t *)STM_STACK_MARKER_OLD);
 
     char *start = (char *)tl->shadowstack_base;
     _shadowstack_trap_page(start, PROT_READ | PROT_WRITE);
diff --git a/rpython/translator/stm/src_stm/stm/timing.c b/rpython/translator/stm/src_stm/stm/timing.c
--- a/rpython/translator/stm/src_stm/stm/timing.c
+++ b/rpython/translator/stm/src_stm/stm/timing.c
@@ -71,7 +71,7 @@
         s_mutex_lock();
         fprintf(stderr, "thread %p:\n", tl);
         for (i = 0; i < _STM_TIME_N; i++) {
-            fprintf(stderr, "    %-24s %9u  %.3f s\n",
+            fprintf(stderr, "    %-24s %9u %8.3f s\n",
                     timer_names[i], tl->events[i], (double)tl->timing[i]);
         }
         s_mutex_unlock();
diff --git a/rpython/translator/stm/src_stm/stmgc.h b/rpython/translator/stm/src_stm/stmgc.h
--- a/rpython/translator/stm/src_stm/stmgc.h
+++ b/rpython/translator/stm/src_stm/stmgc.h
@@ -265,6 +265,8 @@
 #define STM_PUSH_ROOT(tl, p)   ((tl).shadowstack++->ss = (object_t *)(p))
 #define STM_POP_ROOT(tl, p)    ((p) = (typeof(p))((--(tl).shadowstack)->ss))
 #define STM_POP_ROOT_RET(tl)   ((--(tl).shadowstack)->ss)
+#define STM_STACK_MARKER_NEW   1
+#define STM_STACK_MARKER_OLD   2
 
 
 /* Every thread needs to have a corresponding stm_thread_local_t


More information about the pypy-commit mailing list