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