[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