[pypy-svn] r76365 - in pypy/branch/improved-asm-logging/pypy/jit/backend/x86: . test

fijal at codespeak.net fijal at codespeak.net
Tue Jul 27 15:29:00 CEST 2010


Author: fijal
Date: Tue Jul 27 15:28:56 2010
New Revision: 76365

Modified:
   pypy/branch/improved-asm-logging/pypy/jit/backend/x86/assembler.py
   pypy/branch/improved-asm-logging/pypy/jit/backend/x86/test/test_runner.py
Log:
An attempt to write down counter for how many times the loop has run


Modified: pypy/branch/improved-asm-logging/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/improved-asm-logging/pypy/jit/backend/x86/assembler.py	(original)
+++ pypy/branch/improved-asm-logging/pypy/jit/backend/x86/assembler.py	Tue Jul 27 15:28:56 2010
@@ -1,4 +1,4 @@
-import sys
+import sys, os
 from pypy.jit.backend.llsupport import symbolic
 from pypy.jit.metainterp.history import Const, Box, BoxInt, BoxPtr, BoxFloat
 from pypy.jit.metainterp.history import AbstractFailDescr, INT, REF, FLOAT,\
@@ -113,18 +113,25 @@
         self.fail_boxes_ptr = values_array(llmemory.GCREF, failargs_limit)
         self.fail_boxes_float = values_array(lltype.Float, failargs_limit)
         self.fail_ebp = 0
+        self.loop_run_counter = values_array(lltype.Signed, 10000)
+        self.loop_names = []
+        # if we have 10000 loops, we have some other problems I guess
         self.loc_float_const_neg = None
         self.loc_float_const_abs = None
         self.malloc_fixedsize_slowpath1 = 0
         self.malloc_fixedsize_slowpath2 = 0
         self.setup_failure_recovery()
         self._loop_counter = 0
+        self._debug = False
 
     def leave_jitted_hook(self):
         ptrs = self.fail_boxes_ptr.ar
         llop.gc_assume_young_pointers(lltype.Void,
                                       llmemory.cast_ptr_to_adr(ptrs))
 
+    def set_debug(self, v):
+        self._debug = v
+
     def make_sure_mc_exists(self):
         if self.mc is None:
             # the address of the function called by 'new'
@@ -158,6 +165,9 @@
                 self._build_float_constants()
             if hasattr(gc_ll_descr, 'get_malloc_fixedsize_slowpath_addr'):
                 self._build_malloc_fixedsize_slowpath()
+            s = os.environ.get('PYPYJITLOG')
+            if s:
+                self.set_debug(True)
 
     def _build_float_constants(self):
         # 11 words: 8 words for the data, and up to 3 words for alignment
@@ -279,12 +289,18 @@
         self.mc.end_function()
 
     def _find_debug_merge_point(self, operations):
+
         for op in operations:
             if op.opnum == rop.DEBUG_MERGE_POINT:
-                return op.args[0]._get_str()
+                funcname = op.args[0]._get_str()
+                break
+        else:
+            funcname = "<loop %d>" % self._loop_counter
         # invent the counter, so we don't get too confused
+        if self._debug:
+            self.loop_names.append(funcname)
         self._loop_counter += 1
-        return "<loop %d>" % self._loop_counter
+        return funcname
         
     def patch_jump_for_descr(self, faildescr, adr_new_target):
         adr_jump_offset = faildescr._x86_adr_jump_offset
@@ -295,6 +311,15 @@
 
     def _assemble(self, regalloc, operations):
         self._regalloc = regalloc
+        if self._debug:
+            # before doing anything, let's increase a counter
+            # we need one register free (a bit of a hack, but whatever)
+            self.mc.PUSH(eax)
+            adr = self.loop_run_counter.get_addr_for_num(self._loop_counter - 1)
+            self.mc.MOV(eax, heap(adr))
+            self.mc.ADD(eax, imm(1))
+            self.mc.MOV(heap(adr), eax)
+            self.mc.POP(eax)
         regalloc.walk_operations(operations)        
         self.mc.done()
         self.mc2.done()

Modified: pypy/branch/improved-asm-logging/pypy/jit/backend/x86/test/test_runner.py
==============================================================================
--- pypy/branch/improved-asm-logging/pypy/jit/backend/x86/test/test_runner.py	(original)
+++ pypy/branch/improved-asm-logging/pypy/jit/backend/x86/test/test_runner.py	Tue Jul 27 15:28:56 2010
@@ -9,6 +9,7 @@
 from pypy.jit.metainterp.resoperation import rop
 from pypy.jit.metainterp.executor import execute
 from pypy.jit.backend.test.runner_test import LLtypeBackendTest
+from pypy.jit.metainterp.test.oparser import parse
 import ctypes
 import sys
 
@@ -390,3 +391,25 @@
         self.cpu.set_future_value_int(0, base_v.value)
         self.cpu.execute_token(looptoken)
         assert self.cpu.get_latest_value_int(0) == 1024
+
+class TestDebuggingAssembler(object):
+    def setup_method(self, meth):
+        self.cpu = CPU(rtyper=None, stats=FakeStats())
+
+    def test_debugger_on(self):
+        loop = """
+        [i0]
+        debug_merge_point('xyz')
+        i1 = int_add(i0, 1)
+        i2 = int_ge(i1, 10)
+        guard_false(i2) []
+        jump(i1)
+        """
+        ops = parse(loop)
+        self.cpu.assembler.set_debug(True)
+        self.cpu.compile_loop(ops.inputargs, ops.operations, ops.token)
+        self.cpu.set_future_value_int(0, 0)
+        self.cpu.execute_token(ops.token)
+        # check debugging info
+        assert self.cpu.assembler.loop_names == ["xyz"]
+        assert self.cpu.assembler.loop_run_counter.getitem(0) == 10



More information about the Pypy-commit mailing list