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