Author: Richard Plangger <planri...@gmail.com> Branch: new-jit-log Changeset: r83115:24a3cc49b4ee Date: 2016-03-17 19:28 +0100 http://bitbucket.org/pypy/pypy/changeset/24a3cc49b4ee/
Log: writing core dump just after each resoperation, added test to check that diff --git a/rpython/jit/backend/llsupport/asmmemmgr.py b/rpython/jit/backend/llsupport/asmmemmgr.py --- a/rpython/jit/backend/llsupport/asmmemmgr.py +++ b/rpython/jit/backend/llsupport/asmmemmgr.py @@ -226,6 +226,7 @@ self.init_block_builder() else: self._become_a_plain_block_builder() + self.rawstart = 0 def init_block_builder(self): self._cursubblock = lltype.nullptr(self.SUBBLOCK) @@ -248,6 +249,9 @@ self._cursubblock.data[index] = char self._cursubindex = index + 1 + def absolute_addr(self): + return self.rawstart + def overwrite(self, index, char): assert 0 <= index < self.get_relative_pos() block = self._cursubblock @@ -283,6 +287,16 @@ targetindex -= self.SUBBLOCK_SIZE assert not block + def copy_core_dump(self, addr, offset=0): + HEX = '0123456789ABCDEF' + dump = [] + src = rffi.cast(rffi.CCHARP, addr + offset) + for p in range(self.get_relative_pos()): + o = ord(src[p]) + dump.append(HEX[o >> 4]) + dump.append(HEX[o & 15]) + return ''.join(dump) + def _dump(self, addr, logname, backend=None): debug_start(logname) if have_debug_prints(): @@ -296,17 +310,11 @@ else: debug_print('SYS_EXECUTABLE', '??') # - HEX = '0123456789ABCDEF' - dump = [] - src = rffi.cast(rffi.CCHARP, addr) - for p in range(self.get_relative_pos()): - o = ord(src[p]) - dump.append(HEX[o >> 4]) - dump.append(HEX[o & 15]) + dump = self.copy_core_dump(addr) debug_print('CODE_DUMP', '@%x' % addr, '+0 ', # backwards compatibility - ''.join(dump)) + dump) # debug_stop(logname) @@ -318,6 +326,7 @@ allblocks.append(malloced) rawstart = malloced[0] rawstart = (rawstart + align - 1) & (-align) + self.rawstart = rawstart self.copy_to_raw_memory(rawstart) if self.gcroot_markers is not None: assert gcrootmap is not None diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py --- a/rpython/jit/backend/x86/assembler.py +++ b/rpython/jit/backend/x86/assembler.py @@ -533,7 +533,7 @@ looptoken._ll_function_addr = rawstart if logger: logger.log_trace(logger.MARK_ASM, inputargs, operations, - ops_offset=ops_offset) + ops_offset=ops_offset, self.mc) self.fixup_target_tokens(rawstart) self.teardown() @@ -587,7 +587,7 @@ frame_depth = max(self.current_clt.frame_info.jfi_frame_depth, frame_depth_no_fixed_size + JITFRAME_FIXED_SIZE) if logger: - logger.log_trace(logger.MARK_ASM, inputargs, operations, + logger.log_trace(logger.MARK_TRACE_ASM, inputargs, operations, faildescr=faildescr, ops_offset=ops_offset) self.fixup_target_tokens(rawstart) self.update_frame_depth(frame_depth) diff --git a/rpython/jit/metainterp/jitlog.py b/rpython/jit/metainterp/jitlog.py --- a/rpython/jit/metainterp/jitlog.py +++ b/rpython/jit/metainterp/jitlog.py @@ -2,16 +2,35 @@ from rpython.jit.metainterp import resoperation as resoperations import struct -class VMProfJitLogger(object): +class JitLogMarshall(object): + def encode(self, op): + str_args = [arg.repr_short(arg._repr_memo) for arg in op.getarglist()] + descr = op.getdescr() + line = struct.pack('<i', op.getopnum()) + ','.join(str_args) + if descr: + line += "|" + str(descr) + return VMProfJitLogger.MARK_RESOP_DESCR, line + else: + return VMProfJitLogger.MARK_RESOP, line + + def decode(self, data): + opnum = struct.unpack('<i', data[:4]) + # TODO + +class VMProfJitLogger(JitLogMarshall): MARK_TRACED = 0x10 - MARK_ASM = 0x11 MARK_INPUT_ARGS = 0x12 - MARK_RESOP = 0x13 - MARK_RESOP_META = 0x14 - MARK_RESOP = 0x15 + MARK_RESOP_META = 0x13 + MARK_RESOP = 0x14 + MARK_RESOP_DESCR = 0x15 + MARK_ASM_ADDR = 0x16 + MARK_ASM = 0x17 + + # the ones as parameter to log_trace + MARK_TRACE_ASM = 0x18 def __init__(self): self.cintf = cintf.setup() @@ -23,7 +42,7 @@ count = len(resoperations.opname) mark = VMProfJitLogger.MARK_RESOP_META for opnum, opname in resoperations.opname.items(): - line = struct.pack(">h", opnum) + opname.lower() + line = struct.pack("<h", opnum) + opname.lower() self.write_marked(mark, line) def teardown(self): @@ -33,18 +52,64 @@ self.cintf.jitlog_write_marked(mark, line, len(line)) def log_trace(self, tag, args, ops, - faildescr=None, ops_offset={}): + faildescr=None, ops_offset={}, mc=None): + # this is a mixture of binary and text! if self.cintf.jitlog_filter(tag): return assert isinstance(tag, int) + # write the initial tag + if faildescr is None: + self.write_marked(tag, 'loop') + else: + self.write_marked(tag, 'bridge') + # input args str_args = [arg.repr_short(arg._repr_memo) for arg in args] self.write_marked(self.MARK_INPUT_ARGS, ','.join(str_args)) + # assembler address (to not duplicate it in write_code_dump) + if mc is not None: + lendian_addr = struct.pack('<l', mc.absolute_addr()) + self.write_marked(self.MARK_ASM_ADDR, lendian_addr) + for i,op in enumerate(ops): - str_args = [arg.repr_short(arg._repr_memo) for arg in op.getarglist()] - descr = op.getdescr() - if descr: - str_args += ['descr='+descr] - self.write_marked(self.MARK_RESOP, ','.join(args)) + mark, line = self.encode(op) + self.write_marked(mark, line) + self.write_core_dump(ops, i, op, ops_offset, mc) + + def write_core_dump(self, operations, i, op, ops_offset, mc): + if mc is None: + return + + op2 = None + j = i+1 + # find the next op that is in the offset hash + while j < len(operations): + op2 = operations[j] + if op in ops_offset: + break + j += 1 + + # this op has no known offset in the machine code (it might be + # a debug operation) + if op not in ops_offset: + return + # there is no well defined boundary for the end of the + # next op in the assembler + if op2 is not None and op2 not in ops_offset: + return + dump = [] + + start_offset = ops_offset[op] + # end offset is either the last pos in the assembler + # or the offset of op2 + if op2 is None: + end_offset = mc.get_relative_pos() + else: + end_offset = ops_offset[op2] + + dump = mc.copy_core_dump(mc.absolute_addr(), start_offset) + self.write_marked(self.MARK_ASM, dump) + + diff --git a/rpython/rlib/rvmprof/src/jitlog_main.h b/rpython/rlib/rvmprof/src/jitlog_main.h --- a/rpython/rlib/rvmprof/src/jitlog_main.h +++ b/rpython/rlib/rvmprof/src/jitlog_main.h @@ -113,10 +113,11 @@ char header[5]; header[0] = tag; - header[1] = (length >> 24) & 0xff; - header[2] = (length >> 16) & 0xff; - header[3] = (length >> 8) & 0xff; - header[4] = length & 0xff; + // little endian 32 bit singed int + header[1] = length & 0xff; + header[2] = (length >> 8) & 0xff; + header[3] = (length >> 16) & 0xff; + header[4] = (length >> 24) & 0xff; write(jitlog_fd, (const char*)&header, 5); write(jitlog_fd, text, length); } _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit