Author: Richard Plangger <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit