Author: Richard Plangger <planri...@gmail.com>
Branch: new-jit-log
Changeset: r83484:992293e7c5b7
Date: 2016-04-01 10:56 +0200
http://bitbucket.org/pypy/pypy/changeset/992293e7c5b7/

Log:    refactoring the jitlog, inlines encode methods, finish_once of cpu
        now prints enter count of bridges,entries and loops

diff --git a/rpython/jit/backend/llsupport/assembler.py 
b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -352,7 +352,7 @@
         self.loop_run_counters.append(struct)
         return struct
 
-    def finish_once(self):
+    def finish_once(self, jitlog):
         if self._debug:
             debug_start('jit-backend-counts')
             for i in range(len(self.loop_run_counters)):
@@ -372,6 +372,11 @@
                 debug_print(prefix + ':' + str(struct.i))
             debug_stop('jit-backend-counts')
 
+        if jitlog:
+            # this is always called, the jitlog knows if it is enabled
+            for i, struct in enumerate(self.loop_run_counters):
+                jitlog.log_jit_counter(struct)
+
     @staticmethod
     @rgc.no_collect
     def _reacquire_gil_asmgcc(css, old_rpy_fastgil):
diff --git a/rpython/jit/backend/x86/runner.py 
b/rpython/jit/backend/x86/runner.py
--- a/rpython/jit/backend/x86/runner.py
+++ b/rpython/jit/backend/x86/runner.py
@@ -65,8 +65,8 @@
         self.assembler.setup_once()
 
     @rgc.no_release_gil
-    def finish_once(self):
-        self.assembler.finish_once()
+    def finish_once(self, jitlog=None):
+        self.assembler.finish_once(jitlog)
         self.profile_agent.shutdown()
 
     def dump_loop_token(self, looptoken):
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,7 +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
+from rpython.rlib.objectmodel import compute_unique_id, always_inline
 import sys
 import weakref
 
@@ -25,8 +25,42 @@
 # the machine code was patched (e.g. guard)
 MARK_STITCH_BRIDGE = 0x19
 
+MARK_JIT_LOOP_COUNTER = 0x20
+MARK_JIT_BRIDGE_COUNTER = 0x21
+MARK_JIT_ENTRY_COUNTER = 0x22
+
 IS_32_BIT = sys.maxint == 2**31-1
 
+@always_inline
+def encode_str(string):
+    return encode_le_32bit(len(string)) + string
+
+@always_inline
+def encode_le_16bit(val):
+    return chr((val >> 0) & 0xff) + chr((val >> 8) & 0xff)
+
+@always_inline
+def encode_le_32bit(val):
+    return ''.join([chr((val >> 0) & 0xff),
+                    chr((val >> 8) & 0xff),
+                    chr((val >> 16) & 0xff),
+                    chr((val >> 24) & 0xff)])
+
+@always_inline
+def encode_le_addr(val):
+    if IS_32_BIT:
+        return encode_be_32bit(val)
+    else:
+        return ''.join([chr((val >> 0) & 0xff),
+                        chr((val >> 8) & 0xff),
+                        chr((val >> 16) & 0xff),
+                        chr((val >> 24) & 0xff),
+                        chr((val >> 32) & 0xff),
+                        chr((val >> 40) & 0xff),
+                        chr((val >> 48) & 0xff),
+                        chr((val >> 56)& 0xff)])
+
+
 class VMProfJitLogger(object):
 
     def __init__(self):
@@ -37,24 +71,40 @@
     def setup_once(self):
         self.is_setup = True
         self.cintf.jitlog_try_init_using_env()
-        if self.cintf.jitlog_filter(0x0):
+        if not self.cintf.jitlog_enabled():
             return
         count = len(resoperations.opname)
         mark = MARK_RESOP_META
         for opnum, opname in resoperations.opname.items():
-            line = self.encode_le_16bit(opnum) + 
self.encode_str(opname.lower())
-            self.write_marked(mark, line)
+            line = encode_le_16bit(opnum) + encode_str(opname.lower())
+            self._write_marked(mark, line)
 
     def teardown(self):
         self.cintf.jitlog_teardown()
 
-    def write_marked(self, mark, line):
+    def _write_marked(self, mark, line):
+        if not we_are_translated():
+            assert self.cintf.jitlog_enabled()
         if not self.is_setup:
             self.setup_once()
         self.cintf.jitlog_write_marked(mark, line, len(line))
 
+    def log_jit_counter(self, struct):
+        if not self.cintf.jitlog_enabled():
+            return EMPTY_TRACE_LOG
+        le_addr = encode_le_addr(struct.number)
+        # not an address (but a number) but it is a machine word
+        le_count = encode_le_addr(struct.i)
+        if struct.type == 'l':
+            tag = MARK_JIT_LOOP_COUNTER
+        elif struct.type == 'b':
+            tag = MARK_JIT_BRIDGE_COUNTER
+        else:
+            tag = MARK_JIT_ENTRY_COUNTER
+        self._write_marked(tag, le_addr + le_count)
+
     def log_trace(self, tag, metainterp_sd, mc, memo=None):
-        if self.cintf.jitlog_filter(tag):
+        if not self.cintf.jitlog_enabled():
             return EMPTY_TRACE_LOG
         assert isinstance(tag, int)
         if memo is None:
@@ -62,37 +112,12 @@
         return LogTrace(tag, memo, metainterp_sd, mc, self)
 
     def log_patch_guard(self, descr_number, addr):
-        if self.cintf.jitlog_filter(MARK_STITCH_BRIDGE):
+        if not self.cintf.jitlog_enabled():
             return
-        le_descr_number = self.encode_le_addr(descr_number)
-        le_addr = self.encode_le_addr(addr)
+        le_descr_number = encode_le_addr(descr_number)
+        le_addr = encode_le_addr(addr)
         lst = [le_descr_number, le_addr]
-        self.write_marked(MARK_STITCH_BRIDGE, ''.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)
-
-    def encode_le_32bit(self, val):
-        return ''.join([chr((val >> 0) & 0xff),
-                        chr((val >> 8) & 0xff),
-                        chr((val >> 16) & 0xff),
-                        chr((val >> 24) & 0xff)])
-
-    def encode_le_addr(self,val):
-        if IS_32_BIT:
-            return encode_be_32bit(val)
-        else:
-            return ''.join([chr((val >> 0) & 0xff),
-                            chr((val >> 8) & 0xff),
-                            chr((val >> 16) & 0xff),
-                            chr((val >> 24) & 0xff),
-                            chr((val >> 32) & 0xff),
-                            chr((val >> 40) & 0xff),
-                            chr((val >> 48) & 0xff),
-                            chr((val >> 56)& 0xff)])
+        self._write_marked(MARK_STITCH_BRIDGE, ''.join(lst))
 
 class BaseLogTrace(object):
     def write(self, args, ops, faildescr=None, ops_offset={}, name=None, 
unique_id=0):
@@ -119,33 +144,33 @@
             name = ''
         # write the initial tag
         if faildescr is None:
-            string = self.logger.encode_str('loop') + \
-                     self.logger.encode_le_addr(unique_id) + \
-                     self.logger.encode_str(name or '')
-            log.write_marked(self.tag, string)
+            string = encode_str('loop') + \
+                     encode_le_addr(unique_id) + \
+                     encode_str(name or '')
+            log._write_marked(self.tag, string)
         else:
             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)
+            string = encode_str('bridge') + \
+                     encode_le_addr(unique_id) + \
+                     encode_str(name or '')
+            log._write_marked(self.tag, string)
 
         # input args
         str_args = [self.var_to_str(arg) for arg in args]
-        string = self.logger.encode_str(','.join(str_args))
-        log.write_marked(MARK_INPUT_ARGS, string)
+        string = 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:
             absaddr = self.mc.absolute_addr()
             rel = self.mc.get_relative_pos()
             # packs <start addr> <end addr> as two unsigend longs
-            le_addr1 = self.logger.encode_le_addr(absaddr)
-            le_addr2 = self.logger.encode_le_addr(absaddr + rel)
-            log.write_marked(MARK_ASM_ADDR, le_addr1 + le_addr2)
+            le_addr1 = encode_le_addr(absaddr)
+            le_addr2 = encode_le_addr(absaddr + rel)
+            log._write_marked(MARK_ASM_ADDR, le_addr1 + le_addr2)
         for i,op in enumerate(ops):
             mark, line = self.encode_op(op)
-            log.write_marked(mark, line)
+            log._write_marked(mark, line)
             self.write_core_dump(ops, i, op, ops_offset)
 
         self.memo = {}
@@ -160,18 +185,18 @@
         """
         str_args = [self.var_to_str(arg) for arg in op.getarglist()]
         descr = op.getdescr()
-        le_opnum = self.logger.encode_le_16bit(op.getopnum())
+        le_opnum = encode_le_16bit(op.getopnum())
         str_res = self.var_to_str(op)
         line = ','.join([str_res] + str_args)
         if descr:
             descr_str = descr.repr_of_descr()
             line = line + ',' + descr_str
-            string = self.logger.encode_str(line)
+            string = encode_str(line)
             descr_number = compute_unique_id(descr)
-            le_descr_number = self.logger.encode_le_addr(descr_number)
+            le_descr_number = encode_le_addr(descr_number)
             return MARK_RESOP_DESCR, le_opnum + string + le_descr_number
         else:
-            string = self.logger.encode_str(line)
+            string = encode_str(line)
             return MARK_RESOP, le_opnum + string
 
 
@@ -208,9 +233,9 @@
 
         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)
-        edump = self.logger.encode_str(dump)
-        self.logger.write_marked(MARK_ASM, offset + edump)
+        offset = encode_le_16bit(start_offset)
+        edump = encode_str(dump)
+        self.logger._write_marked(MARK_ASM, offset + edump)
 
     def var_to_str(self, arg):
         try:
diff --git a/rpython/jit/metainterp/warmspot.py 
b/rpython/jit/metainterp/warmspot.py
--- a/rpython/jit/metainterp/warmspot.py
+++ b/rpython/jit/metainterp/warmspot.py
@@ -1040,7 +1040,8 @@
         def finish():
             if self.metainterp_sd.profiler.initialized:
                 self.metainterp_sd.profiler.finish()
-            self.metainterp_sd.cpu.finish_once()
+            jitlog = self.metainterp_sd.jitlog
+            self.metainterp_sd.cpu.finish_once(jitlog)
 
         if self.cpu.translate_support_code:
             call_final_function(self.translator, finish,
diff --git a/rpython/rlib/rvmprof/cintf.py b/rpython/rlib/rvmprof/cintf.py
--- a/rpython/rlib/rvmprof/cintf.py
+++ b/rpython/rlib/rvmprof/cintf.py
@@ -64,7 +64,7 @@
     jitlog_write_marked = rffi.llexternal("jitlog_write_marked",
                                   [rffi.INT, rffi.CCHARP, rffi.INT],
                                   lltype.Void, compilation_info=eci)
-    jitlog_filter = rffi.llexternal("jitlog_filter", [rffi.INT], rffi.INT,
+    jitlog_enabled = rffi.llexternal("jitlog_enabled", [], rffi.INT,
                                     compilation_info=eci)
     jitlog_teardown = rffi.llexternal("jitlog_teardown", [], lltype.Void,
                                       compilation_info=eci)
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
@@ -9,9 +9,9 @@
 static int jitlog_ready = 0;
 
 RPY_EXTERN
-int jitlog_filter(int tag)
+int jitlog_enabled()
 {
-    return 0; // TODO
+    return jitlog_ready;
 }
 
 RPY_EXTERN
diff --git a/rpython/rlib/rvmprof/src/rvmprof.h 
b/rpython/rlib/rvmprof/src/rvmprof.h
--- a/rpython/rlib/rvmprof/src/rvmprof.h
+++ b/rpython/rlib/rvmprof/src/rvmprof.h
@@ -11,6 +11,6 @@
 
 RPY_EXTERN char * jitlog_init(int, const char*);
 RPY_EXTERN void jitlog_try_init_using_env(void);
-RPY_EXTERN int jitlog_filter(int);
+RPY_EXTERN int jitlog_enabled();
 RPY_EXTERN void jitlog_write_marked(int, char*, int);
 RPY_EXTERN void jitlog_teardown();
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to