Author: Armin Rigo <[email protected]>
Branch: stmgc-c7
Changeset: r75788:03e15ee4e282
Date: 2015-02-09 22:42 +0100
http://bitbucket.org/pypy/pypy/changeset/03e15ee4e282/

Log:    Add the original stm_location to resume's pending_setfields.
        Needed, otherwise such setfields that occur at the start of a bridge
        have lost their origin and will be incorrectly reported.

diff --git a/TODO b/TODO
--- a/TODO
+++ b/TODO
@@ -146,6 +146,12 @@
 stm_read(p125)
 cond_call_gc_wb_array(p125...)    # don't need the stm_read maybe?
 
+------------------------------------------------------------
+
+we should fake the stm_location inside jit/metainterp, so that it
+is reported correctly even if we're (1) tracing, (2) blackholing,
+or (3) in ResumeDataDirectReader.change_stm_location
+
 
 
 ===============================================================================
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
@@ -23,8 +23,8 @@
 from rpython.jit.codewriter import longlong
 from rpython.jit.codewriter.effectinfo import EffectInfo
 from rpython.jit.metainterp.history import (Box, Const, ConstInt, ConstPtr,
-    ConstFloat, BoxInt, BoxFloat, INT, REF, FLOAT, TargetToken)
-from rpython.jit.metainterp.resoperation import rop, ResOperation, StmLocation
+    ConstFloat, BoxInt, BoxFloat, INT, REF, FLOAT, TargetToken, StmLocation)
+from rpython.jit.metainterp.resoperation import rop, ResOperation
 from rpython.rlib import rgc
 from rpython.rlib.objectmodel import we_are_translated
 from rpython.rlib.rarithmetic import r_longlong, r_uint
diff --git a/rpython/jit/metainterp/history.py 
b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -776,6 +776,16 @@
         op.stm_location = self.stm_location
         self.operations.append(op)
 
+    def set_stm_location(self, num, ref):
+        old = self.stm_location
+        if old is None or old.num != num or old.ref != ref:
+            self.stm_location = StmLocation(num, ref)
+
+class StmLocation(object):
+    def __init__(self, num, ref):
+        self.num = num
+        self.ref = ref
+
 # ____________________________________________________________
 
 
diff --git a/rpython/jit/metainterp/optimizeopt/heap.py 
b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -428,7 +428,8 @@
                 else:
                     assert 0
                 pendingfields.append((op.getdescr(), value.box,
-                                      fieldvalue.get_key_box(), itemindex))
+                                      fieldvalue.get_key_box(), itemindex,
+                                      op.stm_location))
             else:
                 cf.force_lazy_setfield(self)
         return pendingfields
diff --git a/rpython/jit/metainterp/pyjitpl.py 
b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -12,7 +12,7 @@
 from rpython.jit.metainterp.jitprof import EmptyProfiler
 from rpython.jit.metainterp.logger import Logger
 from rpython.jit.metainterp.optimizeopt.util import args_dict
-from rpython.jit.metainterp.resoperation import rop, StmLocation
+from rpython.jit.metainterp.resoperation import rop
 from rpython.rlib import nonconst, rstack
 from rpython.rlib.debug import debug_start, debug_stop, debug_print
 from rpython.rlib.debug import have_debug_prints, make_sure_not_resized
@@ -1165,8 +1165,7 @@
                 idx_num, idx_ref = report_location
                 num = greenkey[idx_num].getint()
                 ref = greenkey[idx_ref].getref_base()
-                location = StmLocation(num, ref)
-                self.metainterp.history.stm_location = location
+                self.metainterp.history.set_stm_location(num, ref)
         #
         self.metainterp.history.record(rop.DEBUG_MERGE_POINT, args, None)
 
@@ -2173,9 +2172,8 @@
             #
             if (self.staticdata.config.translation.stm and
                     isinstance(key, compile.ResumeGuardDescr)):
-                location = StmLocation(key.stm_location_int,
-                                       key.stm_location_ref)
-                self.history.stm_location = location
+                self.history.set_stm_location(key.stm_location_int,
+                                              key.stm_location_ref)
             #
             self.interpret()
         except SwitchToBlackhole, stb:
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
@@ -374,12 +374,6 @@
         self._args[i] = box
 
 
-class StmLocation(object):
-    def __init__(self, num, ref):
-        self.num = num
-        self.ref = ref
-
-
 # ____________________________________________________________
 
 _oplist = [
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -1,7 +1,7 @@
 from rpython.jit.codewriter.effectinfo import EffectInfo
 from rpython.jit.metainterp import jitprof
 from rpython.jit.metainterp.history import (Box, Const, ConstInt, getkind,
-    BoxInt, BoxPtr, BoxFloat, INT, REF, FLOAT, AbstractDescr)
+    BoxInt, BoxPtr, BoxFloat, INT, REF, FLOAT, AbstractDescr, StmLocation)
 from rpython.jit.metainterp.resoperation import rop
 from rpython.rlib import rarithmetic, rstack
 from rpython.rlib.objectmodel import (we_are_translated, specialize,
@@ -95,7 +95,9 @@
                                    ('lldescr', OBJECTPTR),
                                    ('num', rffi.SHORT),
                                    ('fieldnum', rffi.SHORT),
-                                   ('itemindex', rffi.INT))
+                                   ('itemindex', rffi.INT),
+                                   ('llstmloc', OBJECTPTR)) # xxx make this 
last
+                                                        # field optional on 
stm?
 PENDINGFIELDSP = lltype.Ptr(lltype.GcArray(PENDINGFIELDSTRUCT))
 
 TAGMASK = 3
@@ -378,7 +380,7 @@
                 value = optimizer.getvalue(box)
                 value.visitor_walk_recursive(self)
 
-        for _, box, fieldbox, _ in pending_setfields:
+        for _, box, fieldbox, _, _ in pending_setfields:
             self.register_box(box)
             self.register_box(fieldbox)
             value = optimizer.getvalue(fieldbox)
@@ -458,7 +460,7 @@
             n = len(pending_setfields)
             rd_pendingfields = lltype.malloc(PENDINGFIELDSP.TO, n)
             for i in range(n):
-                descr, box, fieldbox, itemindex = pending_setfields[i]
+                descr, box, fieldbox, itemindex, stmloc = pending_setfields[i]
                 lldescr = annlowlevel.cast_instance_to_base_ptr(descr)
                 num = self._gettagged(box)
                 fieldnum = self._gettagged(fieldbox)
@@ -471,6 +473,9 @@
                 rd_pendingfields[i].num = num
                 rd_pendingfields[i].fieldnum = fieldnum
                 rd_pendingfields[i].itemindex = itemindex
+                if stmloc is not None:
+                    llstmloc = annlowlevel.cast_instance_to_base_ptr(stmloc)
+                    rd_pendingfields[i].llstmloc = llstmloc
         self.storage.rd_pendingfields = rd_pendingfields
 
     def _gettagged(self, box):
@@ -880,14 +885,17 @@
                 num = pendingfields[i].num
                 fieldnum = pendingfields[i].fieldnum
                 itemindex = pendingfields[i].itemindex
+                llstmloc = pendingfields[i].llstmloc
                 descr = annlowlevel.cast_base_ptr_to_instance(AbstractDescr,
                                                               lldescr)
                 struct = self.decode_ref(num)
                 itemindex = rffi.cast(lltype.Signed, itemindex)
+                saved = self.change_stm_location(llstmloc)
                 if itemindex < 0:
                     self.setfield(struct, fieldnum, descr)
                 else:
                     self.setarrayitem(struct, itemindex, fieldnum, descr)
+                self.restore_stm_location(saved)
 
     def setarrayitem(self, array, index, fieldnum, arraydescr):
         if arraydescr.is_array_of_pointers():
@@ -918,6 +926,15 @@
         value = self.decode_float(self.cur_numb.nums[index])
         self.write_a_float(register_index, value)
 
+    def change_stm_location(self, ignored):
+        # xxx maybe we should really use this STM location in
+        # ResumeDataDirectReader, but later
+        pass
+
+    def restore_stm_location(self, ignored):
+        pass
+
+
 # ---------- when resuming for pyjitpl.py, make boxes ----------
 
 def rebuild_from_resumedata(metainterp, storage, deadframe,
@@ -1181,6 +1198,18 @@
         return self.metainterp.execute_and_record(rop.INT_ADD, None, intbox,
                                                   ConstInt(offset))
 
+    def change_stm_location(self, llstmloc):
+        if self.metainterp.jitdriver_sd.stm_report_location is None:
+            return None
+        saved_stm_location = self.metainterp.history.stm_location
+        stmloc = annlowlevel.cast_base_ptr_to_instance(StmLocation, llstmloc)
+        self.metainterp.history.stm_location = stmloc
+        return saved_stm_location
+
+    def restore_stm_location(self, stmloc):
+        self.metainterp.history.stm_location = stmloc
+
+
 # ---------- when resuming for blackholing, get direct values ----------
 
 def blackhole_from_resumedata(blackholeinterpbuilder, jitdriver_sd, storage,
diff --git a/rpython/jit/metainterp/test/test_resume.py 
b/rpython/jit/metainterp/test/test_resume.py
--- a/rpython/jit/metainterp/test/test_resume.py
+++ b/rpython/jit/metainterp/test/test_resume.py
@@ -8,6 +8,7 @@
 from rpython.jit.metainterp.resume import *
 from rpython.jit.metainterp.history import BoxInt, BoxPtr, ConstInt
 from rpython.jit.metainterp.history import ConstPtr, ConstFloat
+from rpython.jit.metainterp.history import History, StmLocation
 from rpython.jit.metainterp.optimizeopt.test.test_util import LLtypeMixin
 from rpython.jit.metainterp import executor
 from rpython.jit.codewriter import heaptracker, longlong
@@ -138,6 +139,9 @@
     _already_allocated_resume_virtuals = None
     callinfocollection = None
 
+    class jitdriver_sd:
+        stm_report_location = 'yes please'
+
     def __init__(self, cpu=None):
         if cpu is None:
             cpu = LLtypeMixin.cpu
@@ -145,6 +149,7 @@
         self.trace = []
         self.framestack = []
         self.resboxes = []
+        self.history = History()
 
     def newframe(self, jitcode):
         frame = FakeFrame(jitcode, -1)
@@ -157,6 +162,8 @@
                            list(argboxes),
                            resbox,
                            descr))
+        if self.history.stm_location is not None:
+            self.trace[-1] += (self.history.stm_location,)
         if resbox is not None:
             self.resboxes.append(resbox)
         return resbox
@@ -1378,7 +1385,9 @@
     liveboxes = []
     modifier._number_virtuals(liveboxes, FakeOptimizer(values), 0)
     assert liveboxes == [b2s, b4s] or liveboxes == [b4s, b2s]
-    modifier._add_pending_fields([(LLtypeMixin.nextdescr, b2s, b4s, -1)])
+    stmloc = StmLocation(43, 'foobar')
+    modifier._add_pending_fields([(LLtypeMixin.nextdescr, b2s, b4s, -1,
+                                   stmloc)])
     storage.rd_consts = memo.consts[:]
     storage.rd_numb = None
     # resume
@@ -1391,7 +1400,7 @@
     reader = ResumeDataFakeReader(storage, newboxes, metainterp)
     assert reader.virtuals_cache is None
     trace = metainterp.trace
-    b2set = (rop.SETFIELD_GC, [b2t, b4t], None, LLtypeMixin.nextdescr)
+    b2set = (rop.SETFIELD_GC, [b2t, b4t], None, LLtypeMixin.nextdescr, stmloc)
     expected = [b2set]
 
     for x, y in zip(expected, trace):
@@ -1414,7 +1423,7 @@
     modifier = ResumeDataVirtualAdder(storage, None)
     modifier.liveboxes_from_env = {42: rffi.cast(rffi.SHORT, 1042),
                                    61: rffi.cast(rffi.SHORT, 1061)}
-    modifier._add_pending_fields([(field_a, 42, 61, -1)])
+    modifier._add_pending_fields([(field_a, 42, 61, -1, None)])
     pf = storage.rd_pendingfields
     assert len(pf) == 1
     assert (annlowlevel.cast_base_ptr_to_instance(FieldDescr, pf[0].lldescr)
@@ -1430,8 +1439,8 @@
                                    61: rffi.cast(rffi.SHORT, 1061),
                                    62: rffi.cast(rffi.SHORT, 1062),
                                    63: rffi.cast(rffi.SHORT, 1063)}
-    modifier._add_pending_fields([(array_a, 42, 61, 0),
-                                  (array_a, 42, 62, 2147483647)])
+    modifier._add_pending_fields([(array_a, 42, 61, 0, None),
+                                  (array_a, 42, 62, 2147483647, None)])
     pf = storage.rd_pendingfields
     assert len(pf) == 2
     assert (annlowlevel.cast_base_ptr_to_instance(FieldDescr, pf[0].lldescr)
@@ -1446,7 +1455,7 @@
     assert rffi.cast(lltype.Signed, pf[1].itemindex) == 2147483647
     #
     py.test.raises(TagOverflow, modifier._add_pending_fields,
-                   [(array_a, 42, 63, 2147483648)])
+                   [(array_a, 42, 63, 2147483648, None)])
 
 def test_resume_reader_fields_and_arrayitems():
     class ResumeReader(AbstractResumeDataReader):
diff --git a/rpython/jit/tool/oparser.py b/rpython/jit/tool/oparser.py
--- a/rpython/jit/tool/oparser.py
+++ b/rpython/jit/tool/oparser.py
@@ -7,7 +7,8 @@
 from rpython.jit.tool.oparser_model import get_model
 from rpython.jit.metainterp.resoperation import rop, ResOperation, \
                                             ResOpWithDescr, N_aryOp, \
-                                            UnaryOp, PlainResOp, StmLocation
+                                            UnaryOp, PlainResOp
+from rpython.jit.metainterp.history import StmLocation
 
 r_skip_thread = re.compile(r'^(\d+#)?')
 
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to