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

Reply via email to