Author: Carl Friedrich Bolz <[email protected]>
Branch: guard-compatible
Changeset: r83376:90e798a6ec1f
Date: 2016-03-25 14:37 +0100
http://bitbucket.org/pypy/pypy/changeset/90e798a6ec1f/
Log: store more debug info on the Conditions, as it can be very hard to
figure out where they come from
diff --git a/rpython/jit/metainterp/compatible.py
b/rpython/jit/metainterp/compatible.py
--- a/rpython/jit/metainterp/compatible.py
+++ b/rpython/jit/metainterp/compatible.py
@@ -55,11 +55,11 @@
copied_op = op.copy()
copied_op.setarg(1, self.known_valid)
if op.numargs() == 2:
- return copied_op, PureCallCondition(op, optimizer.metainterp_sd)
+ return copied_op, PureCallCondition(op, optimizer)
arg2 = copied_op.getarg(2)
if arg2.is_constant():
# already a constant, can just use PureCallCondition
- return copied_op, PureCallCondition(op, optimizer.metainterp_sd)
+ return copied_op, PureCallCondition(op, optimizer)
# really simple-minded pattern matching
# the order of things is like this:
@@ -85,15 +85,25 @@
copied_op.setarg(2, qmutdescr.constantfieldbox)
self.last_quasi_immut_field_op = None
return copied_op, QuasiimmutGetfieldAndPureCallCondition(
- op, qmutdescr, optimizer.metainterp_sd)
+ op, qmutdescr, optimizer)
def repr_of_conditions(self, argrepr="?"):
return "\n".join([cond.repr(argrepr) for cond in self.conditions])
class Condition(object):
- def __init__(self, metainterp_sd):
- self.metainterp_sd = metainterp_sd
+ def __init__(self, optimizer):
+ self.metainterp_sd = optimizer.metainterp_sd
+ # XXX maybe too expensive
+ op = optimizer._last_debug_merge_point
+ if op:
+ jd_sd = self.metainterp_sd.jitdrivers_sd[op.getarg(0).getint()]
+ s = jd_sd.warmstate.get_location_str(op.getarglist()[3:])
+ s = s.replace(',', '.') # we use comma for argument splitting
+ else:
+ s = ''
+ self.debug_mp_str = s
+ self.rpyfunc = None
def check(self, cpu, ref):
raise NotImplementedError
@@ -133,12 +143,13 @@
return "<huh?>"
class PureCallCondition(Condition):
- def __init__(self, op, metainterp_sd):
- Condition.__init__(self, metainterp_sd)
+ def __init__(self, op, optimizer):
+ Condition.__init__(self, optimizer)
args = op.getarglist()[:]
args[1] = None
self.args = args
self.descr = op.getdescr()
+ self.rpyfunc = op.rpyfunc
def check(self, cpu, ref):
from rpython.rlib.debug import debug_print, debug_start, debug_stop
@@ -186,17 +197,23 @@
extra = ''
else:
extra = ', ' + ', '.join([self._repr_const(arg) for arg in
self.args[2:]])
- return "compatible if %s == %s(%s%s)" % (result, funcname, argrepr,
extra)
+ res = "compatible if %s == %s(%s%s)" % (result, funcname, argrepr,
extra)
+ if self.rpyfunc:
+ res = "%s: %s" % (self.rpyfunc, res)
+ if self.debug_mp_str:
+ res = self.debug_mp_str + "\n" + res
+ return res
class QuasiimmutGetfieldAndPureCallCondition(PureCallCondition):
- def __init__(self, op, qmutdescr, metainterp_sd):
- Condition.__init__(self, metainterp_sd)
+ def __init__(self, op, qmutdescr, optimizer):
+ Condition.__init__(self, optimizer)
args = op.getarglist()[:]
args[1] = None
args[2] = None
self.args = args
self.descr = op.getdescr()
+ self.rpyfunc = op.rpyfunc
self.qmut = qmutdescr.qmut
self.mutatefielddescr = qmutdescr.mutatefielddescr
self.fielddescr = qmutdescr.fielddescr
@@ -266,5 +283,10 @@
else:
extra = ', ' + ', '.join([self._repr_const(arg) for arg in
self.args[3:]])
attrname = self.fielddescr.repr_of_descr()
- return "compatible if %s == %s(%s, %s.%s%s)" % (
+ res = "compatible if %s == %s(%s, %s.%s%s)" % (
result, funcname, argrepr, argrepr, attrname, extra)
+ if self.rpyfunc:
+ res = "%s: %s" % (self.rpyfunc, res)
+ if self.debug_mp_str:
+ res = self.debug_mp_str + "\n" + res
+ return res
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py
b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -264,6 +264,7 @@
self.optunroll = None
self._last_guard_op = None
+ self._last_debug_merge_point = None
self.set_optimizations(optimizations)
self.setup()
@@ -886,6 +887,7 @@
# FIXME: Is this still needed?
def optimize_DEBUG_MERGE_POINT(self, op):
+ self._last_debug_merge_point = op
self.emit_operation(op)
def optimize_JIT_DEBUG(self, op):
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
@@ -1903,6 +1903,7 @@
cancel_count = 0
exported_state = None
last_exc_box = None
+ framestack = None
def __init__(self, staticdata, jitdriver_sd):
self.staticdata = staticdata
@@ -2217,10 +2218,10 @@
def attach_debug_info(self, op):
- if (not we_are_translated() and op is not None
- and getattr(self, 'framestack', None)):
- op.pc = self.framestack[-1].pc
- op.name = self.framestack[-1].jitcode.name
+ if (op is not None and self.framestack is not None):
+ if not we_are_translated():
+ op.pc = self.framestack[-1].pc
+ op.rpyfunc = self.framestack[-1].jitcode.name
def execute_raised(self, exception, constant=False):
if isinstance(exception, jitexc.JitException):
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
@@ -249,10 +249,10 @@
class AbstractResOp(AbstractResOpOrInputArg):
"""The central ResOperation class, representing one operation."""
- _attrs_ = ()
+ _attrs_ = ('rpyfunc', )
# debug
- name = ""
+ rpyfunc = ""
pc = 0
opnum = 0
_cls_has_bool_result = False
@@ -331,6 +331,7 @@
if descr is DONT_CHANGE:
descr = None
newop = ResOperation(opnum, args, descr)
+ newop.rpyfunc = self.rpyfunc
if self.type != 'v':
newop.copy_value_from(self)
return newop
@@ -351,8 +352,8 @@
# sres = '%s = ' % (self.result,)
else:
sres = ''
- if self.name:
- prefix = "%s:%s " % (self.name, self.pc)
+ if self.rpyfunc:
+ prefix = "%s:%s " % (self.rpyfunc, self.pc)
if graytext:
prefix = "\f%s\f" % prefix
else:
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit