Author: Antonio Cuni <anto.c...@gmail.com> Branch: x86-dump-labels Changeset: r44095:14e8b6b078ac Date: 2011-05-11 17:51 +0200 http://bitbucket.org/pypy/pypy/changeset/14e8b6b078ac/
Log: refactoring: instead of storing a list of "labels", we store a mapping between ops and offsets. Next step is to print the offsets directly in the jit-lot-opt section of the log diff --git a/pypy/jit/backend/x86/codebuf.py b/pypy/jit/backend/x86/codebuf.py --- a/pypy/jit/backend/x86/codebuf.py +++ b/pypy/jit/backend/x86/codebuf.py @@ -27,14 +27,17 @@ # at [p-4:p] encode an absolute address that will need to be # made relative. self.relocations = [] - self.labels = [] + # ResOperation --> offset in the assembly. + # labels[None] represents the beginning of the code after the last op + # (i.e., the tail of the loop + self.labels = {} def add_pending_relocation(self): self.relocations.append(self.get_relative_pos()) - def mark_label(self, name): + def mark_op(self, op): pos = self.get_relative_pos() - self.labels.append((pos, name)) + self.labels[op] = pos def copy_to_raw_memory(self, addr): self._copy_to_raw_memory(addr) @@ -44,13 +47,3 @@ adr[0] = intmask(adr[0] - p) valgrind.discard_translations(addr, self.get_relative_pos()) self._dump(addr, "jit-backend-dump", backend_name) - self.dump_labels(addr, "jit-backend-dump-labels") - - def dump_labels(self, addr, logname): - debug_start(logname) - if have_debug_prints(): - debug_print('LABELS @%x' % addr) - for offset, name in self.labels: - debug_print('+%d: %s' % (offset, name)) - debug_stop(logname) - diff --git a/pypy/jit/backend/x86/regalloc.py b/pypy/jit/backend/x86/regalloc.py --- a/pypy/jit/backend/x86/regalloc.py +++ b/pypy/jit/backend/x86/regalloc.py @@ -406,7 +406,7 @@ #self.operations = operations while i < len(operations): op = operations[i] - self.assembler.mc.mark_label(op.repr()) + self.assembler.mc.mark_op(op) self.rm.position = i self.xrm.position = i if op.has_no_side_effect() and op.result not in self.longevity: @@ -425,7 +425,7 @@ i += 1 assert not self.rm.reg_bindings assert not self.xrm.reg_bindings - self.assembler.mc.mark_label('--end of the loop--') + self.assembler.mc.mark_op(None) # end of the loop def _compute_vars_longevity(self, inputargs, operations): # compute a dictionary that maps variables to index in diff --git a/pypy/jit/backend/x86/runner.py b/pypy/jit/backend/x86/runner.py --- a/pypy/jit/backend/x86/runner.py +++ b/pypy/jit/backend/x86/runner.py @@ -61,15 +61,19 @@ self.profile_agent.shutdown() def dump_loop_token(self, looptoken): + """ + NOT_RPYTHON + """ from pypy.jit.backend.x86.tool.viewcode import machine_code_dump data = [] + label_list = [(offset, name) for name, offset in looptoken._x86_labels.iteritems()] + label_list.sort() addr = looptoken._x86_rawstart src = rffi.cast(rffi.CCHARP, addr) for p in range(looptoken._x86_fullsize): data.append(src[p]) data = ''.join(data) - lines = machine_code_dump(data, addr, self.backend_name, - labels=looptoken._x86_labels) + lines = machine_code_dump(data, addr, self.backend_name, label_list) print ''.join(lines) def compile_loop(self, inputargs, operations, looptoken, log=True): diff --git a/pypy/jit/backend/x86/test/test_runner.py b/pypy/jit/backend/x86/test/test_runner.py --- a/pypy/jit/backend/x86/test/test_runner.py +++ b/pypy/jit/backend/x86/test/test_runner.py @@ -405,30 +405,15 @@ debug._log = dlog = debug.DebugLog() self.cpu.compile_loop(inputargs, operations, looptoken) debug._log = None - expected = ['getfield_raw', - 'int_add', - 'setfield_raw', - 'int_add', - 'int_le', - 'jump', - '--end of the loop--'] # # check the labels saved on the looptoken labels = looptoken._x86_labels - assert len(labels) == len(expected) - for (off, lbl), exp_lbl in zip(labels, expected): - assert exp_lbl in lbl - # - # ----- - # check the labels dumped to the log - # discards code blocks which do not belong to loops - dumped_labels, = [content for category, content in dlog - if (category == 'jit-backend-dump-labels' and - len(content) > 1)] - # the first debug_print is LABELS @address - assert len(dumped_labels) == len(expected) + 1 - for (_, lbl), exp_lbl in zip(dumped_labels[1:], expected): - assert exp_lbl in lbl + # getfield_raw/int_add/setfield_raw + ops + None + assert len(labels) == 3 + len(operations) + 1 + assert (labels[operations[0]] <= + labels[operations[1]] <= + labels[operations[2]] <= + labels[None]) class TestDebuggingAssembler(object): def setup_method(self, meth): diff --git a/pypy/jit/backend/x86/tool/test/test_viewcode.py b/pypy/jit/backend/x86/tool/test/test_viewcode.py --- a/pypy/jit/backend/x86/tool/test/test_viewcode.py +++ b/pypy/jit/backend/x86/tool/test/test_viewcode.py @@ -14,8 +14,8 @@ aa12: eight """.strip()).readlines() # - labels = [(0x00, 'AAA'), (0x03, 'BBB'), (0x0c, 'CCC')] - lines = format_code_dump_with_labels(0xAA00, lines, labels) + label_list = [(0x00, 'AAA'), (0x03, 'BBB'), (0x0c, 'CCC')] + lines = format_code_dump_with_labels(0xAA00, lines, label_list) out = ''.join(lines) assert out == """ aa00 <.data>: @@ -50,6 +50,6 @@ """.strip() lines = StringIO(input).readlines() # - lines = format_code_dump_with_labels(0xAA00, lines, labels=None) + lines = format_code_dump_with_labels(0xAA00, lines, label_list=None) out = ''.join(lines) assert out.strip() == input diff --git a/pypy/jit/backend/x86/tool/viewcode.py b/pypy/jit/backend/x86/tool/viewcode.py --- a/pypy/jit/backend/x86/tool/viewcode.py +++ b/pypy/jit/backend/x86/tool/viewcode.py @@ -31,7 +31,7 @@ if sys.platform == "win32": XXX # lots more in Psyco -def machine_code_dump(data, originaddr, backend_name, labels=None): +def machine_code_dump(data, originaddr, backend_name, label_list=None): objdump_backend_option = { 'x86': 'i386', 'x86_64': 'x86-64', @@ -52,22 +52,25 @@ result = g.readlines() g.close() lines = result[6:] # drop some objdump cruft - return format_code_dump_with_labels(originaddr, lines, labels) + return format_code_dump_with_labels(originaddr, lines, label_list) -def format_code_dump_with_labels(originaddr, lines, labels): +def format_code_dump_with_labels(originaddr, lines, label_list): from pypy.rlib.rarithmetic import r_uint - if not labels: - labels = [] + if not label_list: + label_list = [] originaddr = r_uint(originaddr) itlines = iter(lines) yield itlines.next() # don't process the first line - for lbl_start, lbl_name in labels: + for lbl_start, lbl_name in label_list: for line in itlines: addr, _ = line.split(':', 1) addr = int(addr, 16) if addr >= originaddr+lbl_start: yield '\n' - yield lbl_name + '\n' + if lbl_name is None: + yield '--end of the loop--\n' + else: + yield str(lbl_name) + '\n' yield line break yield line _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit