[pypy-commit] pypy ppc-jit-backend: add debug information

hager noreply at buildbot.pypy.org
Fri Mar 2 16:43:13 CET 2012


Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r53115:5e0e0edb387e
Date: 2012-03-02 07:42 -0800
http://bitbucket.org/pypy/pypy/changeset/5e0e0edb387e/

Log:	add debug information

diff --git a/pypy/jit/backend/ppc/ppc_assembler.py b/pypy/jit/backend/ppc/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppc_assembler.py
@@ -14,20 +14,22 @@
 import pypy.jit.backend.ppc.register as r
 import pypy.jit.backend.ppc.condition as c
 from pypy.jit.metainterp.history import AbstractFailDescr
+from pypy.jit.metainterp.history import ConstInt, BoxInt
 from pypy.jit.backend.llsupport.asmmemmgr import MachineDataBlockWrapper
 from pypy.jit.backend.model import CompiledLoopToken
 from pypy.rpython.lltypesystem import lltype, rffi, llmemory
-from pypy.jit.metainterp.resoperation import rop
+from pypy.jit.metainterp.resoperation import rop, ResOperation
 from pypy.jit.metainterp.history import (INT, REF, FLOAT)
 from pypy.jit.backend.x86.support import values_array
 from pypy.rlib.debug import (debug_print, debug_start, debug_stop,
                              have_debug_prints)
 from pypy.rlib import rgc
 from pypy.rpython.annlowlevel import llhelper
-from pypy.rlib.objectmodel import we_are_translated
+from pypy.rlib.objectmodel import we_are_translated, specialize
 from pypy.rpython.lltypesystem.lloperation import llop
 from pypy.jit.backend.ppc.locations import StackLocation, get_spp_offset
 from pypy.rlib.jit import AsmInfo
+from pypy.rlib.objectmodel import compute_unique_id
 
 memcpy_fn = rffi.llexternal('memcpy', [llmemory.Address, llmemory.Address,
                                        rffi.SIZE_T], lltype.Void,
@@ -475,6 +477,55 @@
                 debug_print(prefix + ':' + str(struct.i))
             debug_stop('jit-backend-counts')
 
+    # XXX: merge with x86
+    def _register_counter(self, tp, number, token):
+        # YYY very minor leak -- we need the counters to stay alive
+        # forever, just because we want to report them at the end
+        # of the process
+        struct = lltype.malloc(DEBUG_COUNTER, flavor='raw',
+                               track_allocation=False)
+        struct.i = 0
+        struct.type = tp
+        if tp == 'b' or tp == 'e':
+            struct.number = number
+        else:
+            assert token
+            struct.number = compute_unique_id(token)
+        self.loop_run_counters.append(struct)
+        return struct
+
+    def _append_debugging_code(self, operations, tp, number, token):
+        counter = self._register_counter(tp, number, token)
+        c_adr = ConstInt(rffi.cast(lltype.Signed, counter))
+        box = BoxInt()
+        box2 = BoxInt()
+        ops = [ResOperation(rop.GETFIELD_RAW, [c_adr],
+                            box, descr=self.debug_counter_descr),
+               ResOperation(rop.INT_ADD, [box, ConstInt(1)], box2),
+               ResOperation(rop.SETFIELD_RAW, [c_adr, box2],
+                            None, descr=self.debug_counter_descr)]
+        operations.extend(ops)
+
+    @specialize.argtype(1)
+    def _inject_debugging_code(self, looptoken, operations, tp, number):
+        if self._debug:
+            # before doing anything, let's increase a counter
+            s = 0
+            for op in operations:
+                s += op.getopnum()
+            looptoken._arm_debug_checksum = s
+
+            newoperations = []
+            self._append_debugging_code(newoperations, tp, number,
+                                        None)
+            for op in operations:
+                newoperations.append(op)
+                if op.getopnum() == rop.LABEL:
+                    self._append_debugging_code(newoperations, 'l', number,
+                                                op.getdescr())
+            operations = newoperations
+        return operations
+
     @staticmethod
     def _release_gil_shadowstack():
         before = rffi.aroundstate.before
@@ -508,6 +559,10 @@
             assert len(set(inputargs)) == len(inputargs)
 
         operations = self.setup(looptoken, operations)
+
+        if log:
+            operations = self._inject_debugging_code(looptoken, operations,
+                                                     'e', looptoken.number)
         self.startpos = self.mc.currpos()
         regalloc = Regalloc(assembler=self, frame_manager=PPCFrameManager())
 
@@ -541,10 +596,11 @@
             looptoken._ppc_func_addr = fdescr
 
         self.process_pending_guards(loop_start)
-        if not we_are_translated():
-            print 'Loop', inputargs, operations
-            self.mc._dump_trace(loop_start, 'loop_%s.asm' % self.cpu.total_compiled_loops)
-            print 'Done assembling loop with token %r' % looptoken
+
+        if log and not we_are_translated():
+            self.mc._dump_trace(real_start,
+                    'loop_%s.asm' % self.cpu.total_compiled_loops)
+
         ops_offset = self.mc.ops_offset
         self._teardown()
 
@@ -567,6 +623,10 @@
 
     def assemble_bridge(self, faildescr, inputargs, operations, looptoken, log):
         operations = self.setup(looptoken, operations)
+        descr_number = self.cpu.get_fail_descr_number(faildescr)
+        if log:
+            operations = self._inject_debugging_code(faildescr, operations,
+                                                     'b', descr_number)
         assert isinstance(faildescr, AbstractFailDescr)
         code = self._find_failure_recovery_bytecode(faildescr)
         arglocs = self.decode_inputargs(code)
@@ -595,12 +655,15 @@
             # for the benefit of tests
             faildescr._ppc_bridge_frame_depth = self.current_clt.frame_depth
             faildescr._ppc_bridge_param_depth = self.current_clt.param_depth
+            if log:
+                self.mc._dump_trace(rawstart, 'bridge_%d.asm' %
+                self.cpu.total_compiled_bridges)
 
         self._patch_sp_offset(sp_patch_location, rawstart)
-        if not we_are_translated():
-            print 'Loop', inputargs, operations
-            self.mc._dump_trace(rawstart, 'bridge_%s.asm' % self.cpu.total_compiled_loops)
-            print 'Done assembling bridge with token %r' % looptoken
+        #if not we_are_translated():
+        #    print 'Loop', inputargs, operations
+        #    self.mc._dump_trace(rawstart, 'bridge_%s.asm' % self.cpu.total_compiled_loops)
+        #    print 'Done assembling bridge with token %r' % looptoken
 
         ops_offset = self.mc.ops_offset
         self._teardown()
diff --git a/pypy/jit/backend/ppc/test/test_runner.py b/pypy/jit/backend/ppc/test/test_runner.py
--- a/pypy/jit/backend/ppc/test/test_runner.py
+++ b/pypy/jit/backend/ppc/test/test_runner.py
@@ -124,3 +124,44 @@
         assert fail.identifier == 1
         for i in range(10):
             assert self.cpu.get_latest_value_int(i) == args[i]
+
+    def test_debugger_on(self):
+        from pypy.rlib import debug
+
+        targettoken, preambletoken = TargetToken(), TargetToken()
+        loop = """
+        [i0]
+        label(i0, descr=preambletoken)
+        debug_merge_point('xyz', 0)
+        i1 = int_add(i0, 1)
+        i2 = int_ge(i1, 10)
+        guard_false(i2) []
+        label(i1, descr=targettoken)
+        debug_merge_point('xyz', 0)
+        i11 = int_add(i1, 1)
+        i12 = int_ge(i11, 10)
+        guard_false(i12) []
+        jump(i11, descr=targettoken)
+        """
+        ops = parse(loop, namespace={'targettoken': targettoken,
+                                     'preambletoken': preambletoken})
+        debug._log = dlog = debug.DebugLog()
+        try:
+            self.cpu.asm.set_debug(True)
+            looptoken = JitCellToken()
+            self.cpu.compile_loop(ops.inputargs, ops.operations, looptoken)
+            self.cpu.execute_token(looptoken, 0)
+            # check debugging info
+            struct = self.cpu.asm.loop_run_counters[0]
+            assert struct.i == 1
+            struct = self.cpu.asm.loop_run_counters[1]
+            assert struct.i == 1
+            struct = self.cpu.asm.loop_run_counters[2]
+            assert struct.i == 9
+            self.cpu.finish_once()
+        finally:
+            debug._log = None
+        l0 = ('debug_print', 'entry -1:1')
+        l1 = ('debug_print', preambletoken.repr_of_descr() + ':1')
+        l2 = ('debug_print', targettoken.repr_of_descr() + ':9')
+        assert ('jit-backend-counts', [l0, l1, l2]) in dlog


More information about the pypy-commit mailing list