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

Reply via email to