[pypy-commit] pypy new-jit-log: modifying the jit log. length is not written as a header but always before a string

plan_rich pypy.commits at gmail.com
Fri Mar 25 05:22:32 EDT 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: new-jit-log
Changeset: r83330:0dfb4f8b2119
Date: 2016-03-24 17:51 +0100
http://bitbucket.org/pypy/pypy/changeset/0dfb4f8b2119/

Log:	modifying the jit log. length is not written as a header but always
	before a string

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
@@ -287,11 +287,14 @@
             targetindex -= self.SUBBLOCK_SIZE
         assert not block
 
-    def copy_core_dump(self, addr, offset=0):
+    def copy_core_dump(self, addr, offset=0, count=-1):
         HEX = '0123456789ABCDEF'
         dump = []
-        src = rffi.cast(rffi.CCHARP, addr + offset)
-        for p in range(self.get_relative_pos()):
+        src = rffi.cast(rffi.CCHARP, addr)
+        end = self.get_relative_pos()
+        if count != -1:
+            end = offset + count
+        for p in range(offset, end):
             o = ord(src[p])
             dump.append(HEX[o >> 4])
             dump.append(HEX[o & 15])
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
@@ -534,7 +534,7 @@
         looptoken._ll_function_addr = rawstart
         if logger:
             log = logger.log_trace(MARK_TRACE_ASM, None, self.mc)
-            log.write(inputargs, operations, None, ops_offset)
+            log.write(inputargs, operations, None, ops_offset, unique_id=unique_id)
         self.fixup_target_tokens(rawstart)
         self.teardown()
         # oprofile support
diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -482,7 +482,7 @@
 def do_compile_loop(jd_id, unique_id, metainterp_sd, inputargs, operations,
                     looptoken, log=True, name='', memo=None):
     _log = metainterp_sd.jitlog.log_trace(MARK_TRACE_OPT, metainterp_sd, None)
-    _log.write(inputargs, operations)
+    _log.write(inputargs, operations, name=name, unique_id=unique_id)
     # TODO remove old
     metainterp_sd.logger_ops.log_loop(inputargs, operations, -2,
                                       'compiling', None, name, memo)
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
@@ -3,6 +3,7 @@
 from rpython.jit.metainterp.history import ConstInt, ConstFloat
 from rpython.rlib.objectmodel import we_are_translated
 from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
+from rpython.rlib.objectmodel import compute_unique_id
 import sys
 import weakref
 
@@ -31,21 +32,25 @@
     def __init__(self):
         self.cintf = cintf.setup()
         self.memo = {}
+        self.is_setup = False
 
     def setup_once(self):
+        self.is_setup = True
         self.cintf.jitlog_try_init_using_env()
         if self.cintf.jitlog_filter(0x0):
             return
         count = len(resoperations.opname)
         mark = MARK_RESOP_META
         for opnum, opname in resoperations.opname.items():
-            line = self.encode_le_16bit(opnum) + opname.lower()
+            line = self.encode_le_16bit(opnum) + self.encode_str(opname.lower())
             self.write_marked(mark, line)
 
     def teardown(self):
         self.cintf.jitlog_teardown()
 
     def write_marked(self, mark, line):
+        if not self.is_setup:
+            self.setup_once()
         self.cintf.jitlog_write_marked(mark, line, len(line))
 
     def log_trace(self, tag, metainterp_sd, mc, memo=None):
@@ -65,6 +70,9 @@
         lst = [le_addr, le_len, le_addr]
         self.cintf.jitlog_filter(MARK_ASM_PATCH, ''.join(lst))
 
+    def encode_str(self, string):
+        return self.encode_le_32bit(len(string)) + string
+
     def encode_le_16bit(self, val):
         return chr((val >> 0) & 0xff) + chr((val >> 8) & 0xff)
 
@@ -92,24 +100,36 @@
     def __init__(self, tag, memo, metainterp_sd, mc, logger):
         self.memo = memo
         self.metainterp_sd = metainterp_sd
+        self.ts = None
         if self.metainterp_sd is not None:
             self.ts = metainterp_sd.cpu.ts
         self.tag = tag
         self.mc = mc
         self.logger = logger
 
-    def write(self, args, ops, faildescr=None, ops_offset={}):
+    def write(self, args, ops, faildescr=None, ops_offset={},
+              name=None, unique_id=None):
         log = self.logger
 
+        if not name:
+            name = ''
         # write the initial tag
         if faildescr is None:
-            log.write_marked(self.tag, 'loop')
+            string = self.logger.encode_str('loop') + \
+                     self.logger.encode_le_addr(unique_id or 0) + \
+                     self.logger.encode_str(name or '')
+            log.write_marked(self.tag, string)
         else:
-            log.write_marked(self.tag, 'bridge')
+            unique_id = compute_unique_id(faildescr)
+            string = self.logger.encode_str('bridge') + \
+                     self.logger.encode_le_addr(unique_id) + \
+                     self.logger.encode_str(name or '')
+            log.write_marked(self.tag, string)
 
         # input args
         str_args = [self.var_to_str(arg) for arg in args]
-        log.write_marked(MARK_INPUT_ARGS, ','.join(str_args))
+        string = self.logger.encode_str(','.join(str_args))
+        log.write_marked(MARK_INPUT_ARGS, string)
 
         # assembler address (to not duplicate it in write_code_dump)
         if self.mc is not None:
@@ -138,12 +158,15 @@
         descr = op.getdescr()
         le_opnum = self.logger.encode_le_16bit(op.getopnum())
         str_res = self.var_to_str(op)
-        line = le_opnum + ','.join([str_res] + str_args)
+        line = ','.join([str_res] + str_args)
         if descr:
             descr_str = descr.repr_of_descr()
-            return MARK_RESOP_DESCR, line + ',' + descr_str
+            line = line + ',' + descr_str
+            string = self.logger.encode_str(line)
+            return MARK_RESOP_DESCR, le_opnum + string
         else:
-            return MARK_RESOP, line
+            string = self.logger.encode_str(line)
+            return MARK_RESOP, le_opnum + string
 
 
     def write_core_dump(self, operations, i, op, ops_offset):
@@ -177,9 +200,11 @@
         else:
             end_offset = ops_offset[op2]
 
-        dump = self.mc.copy_core_dump(self.mc.absolute_addr(), start_offset)
+        count = end_offset - start_offset
+        dump = self.mc.copy_core_dump(self.mc.absolute_addr(), start_offset, count)
         offset = self.logger.encode_le_16bit(start_offset)
-        self.logger.write_marked(MARK_ASM, offset + dump)
+        edump = self.logger.encode_str(dump)
+        self.logger.write_marked(MARK_ASM, offset + edump)
 
     def var_to_str(self, arg):
         try:
diff --git a/rpython/jit/metainterp/optimizeopt/__init__.py b/rpython/jit/metainterp/optimizeopt/__init__.py
--- a/rpython/jit/metainterp/optimizeopt/__init__.py
+++ b/rpython/jit/metainterp/optimizeopt/__init__.py
@@ -55,8 +55,9 @@
     debug_start("jit-optimize")
     inputargs = compile_data.start_label.getarglist()
     try:
-        log = metainterp_sd.jitlog.log_trace(MARK_TRACE, metainterp_sd, None)
-        log.write(inputargs, compile_data.operations)
+        # TODO missing the unique id
+        # TODO log = metainterp_sd.jitlog.log_trace(MARK_TRACE, metainterp_sd, None)
+        # TODO log.write(inputargs, compile_data.operations)
         #
         metainterp_sd.logger_noopt.log_loop(inputargs,
                                             compile_data.operations,
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
@@ -68,17 +68,6 @@
 #endif
       }
     }
-    if (!jitlog_fd) {
-        jitlog_fd = 2;
-        // TODO
-        //if (isatty(2))
-        //  {
-        //    debug_start_colors_1 = "\033[1m\033[31m";
-        //    debug_start_colors_2 = "\033[31m";
-        //    debug_stop_colors = "\033[0m";
-        //  }
-    }
-
     jitlog_ready = 1;
 }
 
@@ -87,6 +76,7 @@
 {
     jitlog_fd = fd;
     jitlog_prefix = strdup(prefix);
+    jitlog_ready = 1;
     return NULL;
 }
 
@@ -111,13 +101,8 @@
 {
     if (!jitlog_ready) { return; }
 
-    char header[5];
+    char header[1];
     header[0] = tag;
-    // 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, (const char*)&header, 1);
     write(jitlog_fd, text, length);
 }


More information about the pypy-commit mailing list