kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

metrics.h (13333B)


      1 #ifndef KIT_METRICS_H
      2 #define KIT_METRICS_H
      3 
      4 #include "core/profile.h"
      5 
      6 static inline int metrics_streq(const char* a, const char* b) {
      7   while (*a && *b && *a == *b) {
      8     ++a;
      9     ++b;
     10   }
     11   return *a == *b;
     12 }
     13 
     14 static inline KitProfileScope metrics_scope_from_name(const char* name) {
     15   if (!name) return KIT_PROFILE_SCOPE_NONE;
     16 #define METRICS_SCOPE(s, id) \
     17   if (metrics_streq(name, s)) return id
     18   METRICS_SCOPE("compile.tu", KIT_PROFILE_SCOPE_COMPILE_TU);
     19   METRICS_SCOPE("compile.frontend", KIT_PROFILE_SCOPE_COMPILE_FRONTEND);
     20   METRICS_SCOPE("compile.obj_finalize", KIT_PROFILE_SCOPE_COMPILE_OBJ_FINALIZE);
     21   METRICS_SCOPE("compile.asm.lex_open", KIT_PROFILE_SCOPE_COMPILE_ASM_LEX_OPEN);
     22   METRICS_SCOPE("compile.asm.mc_new", KIT_PROFILE_SCOPE_COMPILE_ASM_MC_NEW);
     23   METRICS_SCOPE("compile.asm.parse", KIT_PROFILE_SCOPE_COMPILE_ASM_PARSE);
     24   METRICS_SCOPE("compile.asm.mc_free", KIT_PROFILE_SCOPE_COMPILE_ASM_MC_FREE);
     25   METRICS_SCOPE("opt.cfg.build_1", KIT_PROFILE_SCOPE_OPT_CFG_BUILD_1);
     26   METRICS_SCOPE("opt.cfg.jump_cleanup_cfg",
     27                 KIT_PROFILE_SCOPE_OPT_CFG_JUMP_CLEANUP_CFG);
     28   METRICS_SCOPE("opt.cfg.build_2", KIT_PROFILE_SCOPE_OPT_CFG_BUILD_2);
     29   METRICS_SCOPE("opt.cfg.simplify_local",
     30                 KIT_PROFILE_SCOPE_OPT_CFG_SIMPLIFY_LOCAL);
     31   METRICS_SCOPE("opt.cfg.verify", KIT_PROFILE_SCOPE_OPT_CFG_VERIFY);
     32   METRICS_SCOPE("opt.machinize", KIT_PROFILE_SCOPE_OPT_MACHINIZE);
     33   METRICS_SCOPE("opt.machinize.verify",
     34                 KIT_PROFILE_SCOPE_OPT_MACHINIZE_VERIFY);
     35   METRICS_SCOPE("opt.o1.addr_xform_pregs",
     36                 KIT_PROFILE_SCOPE_OPT_O1_ADDR_XFORM_PREGS);
     37   METRICS_SCOPE("opt.o1.addr_xform.verify",
     38                 KIT_PROFILE_SCOPE_OPT_O1_ADDR_XFORM_VERIFY);
     39   METRICS_SCOPE("opt.o1.promote_scalar_locals",
     40                 KIT_PROFILE_SCOPE_OPT_O1_PROMOTE_SCALAR_LOCALS);
     41   METRICS_SCOPE("opt.o1.promote_scalar.verify",
     42                 KIT_PROFILE_SCOPE_OPT_O1_PROMOTE_SCALAR_VERIFY);
     43   METRICS_SCOPE("opt.o1.addr_of_global_cse",
     44                 KIT_PROFILE_SCOPE_OPT_O1_ADDR_OF_GLOBAL_CSE);
     45   METRICS_SCOPE("opt.o1.addr_of_global.verify",
     46                 KIT_PROFILE_SCOPE_OPT_O1_ADDR_OF_GLOBAL_VERIFY);
     47   METRICS_SCOPE("opt.build_loop_tree", KIT_PROFILE_SCOPE_OPT_BUILD_LOOP_TREE);
     48   METRICS_SCOPE("opt.o1.lower_loop_imm",
     49                 KIT_PROFILE_SCOPE_OPT_O1_LOWER_LOOP_IMM);
     50   METRICS_SCOPE("opt.o1.hoist_loop_consts",
     51                 KIT_PROFILE_SCOPE_OPT_O1_HOIST_LOOP_CONSTS);
     52   METRICS_SCOPE("opt.live_blocks.pre_dde",
     53                 KIT_PROFILE_SCOPE_OPT_LIVE_BLOCKS_PRE_DDE);
     54   METRICS_SCOPE("opt.dead_def_elim", KIT_PROFILE_SCOPE_OPT_DEAD_DEF_ELIM);
     55   METRICS_SCOPE("opt.regalloc", KIT_PROFILE_SCOPE_OPT_REGALLOC);
     56   METRICS_SCOPE("opt.regalloc.verify", KIT_PROFILE_SCOPE_OPT_REGALLOC_VERIFY);
     57   METRICS_SCOPE("opt.live_ranges.regalloc",
     58                 KIT_PROFILE_SCOPE_OPT_LIVE_RANGES_REGALLOC);
     59   METRICS_SCOPE("opt.lower_mir", KIT_PROFILE_SCOPE_OPT_LOWER_MIR);
     60   METRICS_SCOPE("opt.lower_mir.verify",
     61                 KIT_PROFILE_SCOPE_OPT_LOWER_MIR_VERIFY);
     62   METRICS_SCOPE("opt.combine", KIT_PROFILE_SCOPE_OPT_COMBINE);
     63   METRICS_SCOPE("opt.combine.verify", KIT_PROFILE_SCOPE_OPT_COMBINE_VERIFY);
     64   METRICS_SCOPE("opt.dce", KIT_PROFILE_SCOPE_OPT_DCE);
     65   METRICS_SCOPE("opt.dce.verify", KIT_PROFILE_SCOPE_OPT_DCE_VERIFY);
     66   METRICS_SCOPE("opt.post_ra.jump_cleanup_cfg",
     67                 KIT_PROFILE_SCOPE_OPT_POST_RA_JUMP_CLEANUP_CFG);
     68   METRICS_SCOPE("opt.post_ra.build_cfg",
     69                 KIT_PROFILE_SCOPE_OPT_POST_RA_BUILD_CFG);
     70   METRICS_SCOPE("opt.post_ra.verify", KIT_PROFILE_SCOPE_OPT_POST_RA_VERIFY);
     71   METRICS_SCOPE("opt.post_ra.jump_cleanup_layout",
     72                 KIT_PROFILE_SCOPE_OPT_POST_RA_JUMP_CLEANUP_LAYOUT);
     73   METRICS_SCOPE("opt.emit", KIT_PROFILE_SCOPE_OPT_EMIT);
     74   METRICS_SCOPE("opt.o1.tiny_inline", KIT_PROFILE_SCOPE_OPT_O1_TINY_INLINE);
     75   METRICS_SCOPE("opt.o1.cg_ir_lower", KIT_PROFILE_SCOPE_OPT_O1_CG_IR_LOWER);
     76   METRICS_SCOPE("opt.inline.total", KIT_PROFILE_SCOPE_OPT_INLINE_TOTAL);
     77   METRICS_SCOPE("opt.o1.total", KIT_PROFILE_SCOPE_OPT_O1_TOTAL);
     78   METRICS_SCOPE("opt.interp.total", KIT_PROFILE_SCOPE_OPT_INTERP_TOTAL);
     79   METRICS_SCOPE("opt.native_emit.setup",
     80                 KIT_PROFILE_SCOPE_OPT_NATIVE_EMIT_SETUP);
     81   METRICS_SCOPE("opt.native_emit.func_begin",
     82                 KIT_PROFILE_SCOPE_OPT_NATIVE_EMIT_FUNC_BEGIN);
     83   METRICS_SCOPE("opt.native_emit.body", KIT_PROFILE_SCOPE_OPT_NATIVE_EMIT_BODY);
     84   METRICS_SCOPE("opt.native_emit.func_end",
     85                 KIT_PROFILE_SCOPE_OPT_NATIVE_EMIT_FUNC_END);
     86   METRICS_SCOPE("link.resolve.total", KIT_PROFILE_SCOPE_LINK_RESOLVE_TOTAL);
     87   METRICS_SCOPE("link.ingest_archives", KIT_PROFILE_SCOPE_LINK_INGEST_ARCHIVES);
     88   METRICS_SCOPE("link.resolve_symbols", KIT_PROFILE_SCOPE_LINK_RESOLVE_SYMBOLS);
     89   METRICS_SCOPE("link.gc", KIT_PROFILE_SCOPE_LINK_GC);
     90   METRICS_SCOPE("link.layout_sections", KIT_PROFILE_SCOPE_LINK_LAYOUT_SECTIONS);
     91   METRICS_SCOPE("link.emit_segment_bytes",
     92                 KIT_PROFILE_SCOPE_LINK_EMIT_SEGMENT_BYTES);
     93   METRICS_SCOPE("link.layout_debug", KIT_PROFILE_SCOPE_LINK_LAYOUT_DEBUG);
     94   METRICS_SCOPE("link.assign_vaddrs", KIT_PROFILE_SCOPE_LINK_ASSIGN_VADDRS);
     95   METRICS_SCOPE("link.emit_boundaries", KIT_PROFILE_SCOPE_LINK_EMIT_BOUNDARIES);
     96   METRICS_SCOPE("link.resolve_undefs", KIT_PROFILE_SCOPE_LINK_RESOLVE_UNDEFS);
     97   METRICS_SCOPE("link.gc_drop_dead", KIT_PROFILE_SCOPE_LINK_GC_DROP_DEAD);
     98   METRICS_SCOPE("link.layout_iplt", KIT_PROFILE_SCOPE_LINK_LAYOUT_IPLT);
     99   METRICS_SCOPE("link.layout_jit_stubs",
    100                 KIT_PROFILE_SCOPE_LINK_LAYOUT_JIT_STUBS);
    101   METRICS_SCOPE("link.layout_got", KIT_PROFILE_SCOPE_LINK_LAYOUT_GOT);
    102   METRICS_SCOPE("link.emit_relocations",
    103                 KIT_PROFILE_SCOPE_LINK_EMIT_RELOCATIONS);
    104   METRICS_SCOPE("link.layout_dyn", KIT_PROFILE_SCOPE_LINK_LAYOUT_DYN);
    105   METRICS_SCOPE("link.resolve_entry", KIT_PROFILE_SCOPE_LINK_RESOLVE_ENTRY);
    106   METRICS_SCOPE("link.capture_debug", KIT_PROFILE_SCOPE_LINK_CAPTURE_DEBUG);
    107   METRICS_SCOPE("jit.reserve", KIT_PROFILE_SCOPE_JIT_RESERVE);
    108   METRICS_SCOPE("jit.copy_segments", KIT_PROFILE_SCOPE_JIT_COPY_SEGMENTS);
    109   METRICS_SCOPE("jit.apply_relocs", KIT_PROFILE_SCOPE_JIT_APPLY_RELOCS);
    110   METRICS_SCOPE("jit.protect", KIT_PROFILE_SCOPE_JIT_PROTECT);
    111   METRICS_SCOPE("jit.flush_icache", KIT_PROFILE_SCOPE_JIT_FLUSH_ICACHE);
    112   METRICS_SCOPE("jit.ctors", KIT_PROFILE_SCOPE_JIT_CTORS);
    113 #undef METRICS_SCOPE
    114   return KIT_PROFILE_SCOPE_NONE;
    115 }
    116 
    117 static inline KitProfileCounter metrics_counter_from_name(const char* name) {
    118   if (!name) return KIT_PROFILE_COUNTER_NONE;
    119 #define METRICS_COUNTER(s, id) \
    120   if (metrics_streq(name, s)) return id
    121   METRICS_COUNTER("compile.input_bytes",
    122                   KIT_PROFILE_COUNTER_COMPILE_INPUT_BYTES);
    123   METRICS_COUNTER("compile.obj_sections",
    124                   KIT_PROFILE_COUNTER_COMPILE_OBJ_SECTIONS);
    125   METRICS_COUNTER("compile.obj_relocs", KIT_PROFILE_COUNTER_COMPILE_OBJ_RELOCS);
    126   METRICS_COUNTER("cg.switch.table", KIT_PROFILE_COUNTER_CG_SWITCH_TABLE);
    127   METRICS_COUNTER("cg.switch.chain", KIT_PROFILE_COUNTER_CG_SWITCH_CHAIN);
    128   METRICS_COUNTER("opt.funcs", KIT_PROFILE_COUNTER_OPT_FUNCS);
    129   METRICS_COUNTER("opt.blocks", KIT_PROFILE_COUNTER_OPT_BLOCKS);
    130   METRICS_COUNTER("opt.pregs", KIT_PROFILE_COUNTER_OPT_PREGS);
    131   METRICS_COUNTER("opt.live_words", KIT_PROFILE_COUNTER_OPT_LIVE_WORDS);
    132   METRICS_COUNTER("opt.ranges", KIT_PROFILE_COUNTER_OPT_RANGES);
    133   METRICS_COUNTER("opt.range_points", KIT_PROFILE_COUNTER_OPT_RANGE_POINTS);
    134   METRICS_COUNTER("opt.range_raw_points",
    135                   KIT_PROFILE_COUNTER_OPT_RANGE_RAW_POINTS);
    136   METRICS_COUNTER("opt.range_max_per_preg",
    137                   KIT_PROFILE_COUNTER_OPT_RANGE_MAX_PER_PREG);
    138   METRICS_COUNTER("opt.range_max_length",
    139                   KIT_PROFILE_COUNTER_OPT_RANGE_MAX_LENGTH);
    140   METRICS_COUNTER("opt.range_whole_block_spans",
    141                   KIT_PROFILE_COUNTER_OPT_RANGE_WHOLE_BLOCK_SPANS);
    142   METRICS_COUNTER("opt.live.bitset_words_touched",
    143                   KIT_PROFILE_COUNTER_OPT_LIVE_BITSET_WORDS_TOUCHED);
    144   METRICS_COUNTER("opt.live.dataflow_iterations",
    145                   KIT_PROFILE_COUNTER_OPT_LIVE_DATAFLOW_ITERATIONS);
    146   METRICS_COUNTER("opt.live.dataflow_block_visits",
    147                   KIT_PROFILE_COUNTER_OPT_LIVE_DATAFLOW_BLOCK_VISITS);
    148   METRICS_COUNTER("opt.range.point_visits",
    149                   KIT_PROFILE_COUNTER_OPT_RANGE_POINT_VISITS);
    150   METRICS_COUNTER("opt.range.preg_scans",
    151                   KIT_PROFILE_COUNTER_OPT_RANGE_PREG_SCANS);
    152   METRICS_COUNTER("opt.range.live_words_touched",
    153                   KIT_PROFILE_COUNTER_OPT_RANGE_LIVE_WORDS_TOUCHED);
    154   METRICS_COUNTER("opt.conflict_bytes", KIT_PROFILE_COUNTER_OPT_CONFLICT_BYTES);
    155   METRICS_COUNTER("opt.coalesce.moves_seen",
    156                   KIT_PROFILE_COUNTER_OPT_COALESCE_MOVES_SEEN);
    157   METRICS_COUNTER("opt.coalesce.candidates",
    158                   KIT_PROFILE_COUNTER_OPT_COALESCE_CANDIDATES);
    159   METRICS_COUNTER("opt.coalesce.conflicts",
    160                   KIT_PROFILE_COUNTER_OPT_COALESCE_CONFLICTS);
    161   METRICS_COUNTER("opt.coalesce.merge_attempts",
    162                   KIT_PROFILE_COUNTER_OPT_COALESCE_MERGE_ATTEMPTS);
    163   METRICS_COUNTER("opt.coalesce.merges",
    164                   KIT_PROFILE_COUNTER_OPT_COALESCE_MERGES);
    165   METRICS_COUNTER("opt.inline.candidates",
    166                   KIT_PROFILE_COUNTER_OPT_INLINE_CANDIDATES);
    167   METRICS_COUNTER("opt.inline.refuse_policy",
    168                   KIT_PROFILE_COUNTER_OPT_INLINE_REFUSE_POLICY);
    169   METRICS_COUNTER("opt.inline.refuse_scc",
    170                   KIT_PROFILE_COUNTER_OPT_INLINE_REFUSE_SCC);
    171   METRICS_COUNTER("opt.inline.refuse_shape",
    172                   KIT_PROFILE_COUNTER_OPT_INLINE_REFUSE_SHAPE);
    173   METRICS_COUNTER("opt.inline.refuse_growth",
    174                   KIT_PROFILE_COUNTER_OPT_INLINE_REFUSE_GROWTH);
    175   METRICS_COUNTER("opt.inline.refuse_rewrite_shape",
    176                   KIT_PROFILE_COUNTER_OPT_INLINE_REFUSE_REWRITE_SHAPE);
    177   METRICS_COUNTER("opt.inline.refuse_rewrite",
    178                   KIT_PROFILE_COUNTER_OPT_INLINE_REFUSE_REWRITE);
    179   METRICS_COUNTER("opt.inline.refuse_shape_variadic",
    180                   KIT_PROFILE_COUNTER_OPT_INLINE_REFUSE_SHAPE_VARIADIC);
    181   METRICS_COUNTER("opt.inline.refuse_shape_entry",
    182                   KIT_PROFILE_COUNTER_OPT_INLINE_REFUSE_SHAPE_ENTRY);
    183   METRICS_COUNTER("opt.inline.refuse_shape_op",
    184                   KIT_PROFILE_COUNTER_OPT_INLINE_REFUSE_SHAPE_OP);
    185   METRICS_COUNTER("opt.inline.refuse_shape_ret_pos",
    186                   KIT_PROFILE_COUNTER_OPT_INLINE_REFUSE_SHAPE_RET_POS);
    187   METRICS_COUNTER("opt.inline.refuse_shape_ret_count",
    188                   KIT_PROFILE_COUNTER_OPT_INLINE_REFUSE_SHAPE_RET_COUNT);
    189   METRICS_COUNTER("opt.inline.refuse_shape_budget",
    190                   KIT_PROFILE_COUNTER_OPT_INLINE_REFUSE_SHAPE_BUDGET);
    191   METRICS_COUNTER("opt.inline.inlined", KIT_PROFILE_COUNTER_OPT_INLINE_INLINED);
    192   METRICS_COUNTER("opt.tiny_inline.candidates",
    193                   KIT_PROFILE_COUNTER_OPT_TINY_INLINE_CANDIDATES);
    194   METRICS_COUNTER("opt.tiny_inline.refuse_policy",
    195                   KIT_PROFILE_COUNTER_OPT_TINY_INLINE_REFUSE_POLICY);
    196   METRICS_COUNTER("opt.tiny_inline.refuse_scc",
    197                   KIT_PROFILE_COUNTER_OPT_TINY_INLINE_REFUSE_SCC);
    198   METRICS_COUNTER("opt.tiny_inline.refuse_shape",
    199                   KIT_PROFILE_COUNTER_OPT_TINY_INLINE_REFUSE_SHAPE);
    200   METRICS_COUNTER("opt.tiny_inline.refuse_budget",
    201                   KIT_PROFILE_COUNTER_OPT_TINY_INLINE_REFUSE_BUDGET);
    202   METRICS_COUNTER("opt.tiny_inline.refuse_rewrite_shape",
    203                   KIT_PROFILE_COUNTER_OPT_TINY_INLINE_REFUSE_REWRITE_SHAPE);
    204   METRICS_COUNTER("opt.tiny_inline.refuse_rewrite",
    205                   KIT_PROFILE_COUNTER_OPT_TINY_INLINE_REFUSE_REWRITE);
    206   METRICS_COUNTER("opt.tiny_inline.inlined",
    207                   KIT_PROFILE_COUNTER_OPT_TINY_INLINE_INLINED);
    208   METRICS_COUNTER("opt.native_emit.scavenges",
    209                   KIT_PROFILE_COUNTER_OPT_NATIVE_EMIT_SCAVENGES);
    210   METRICS_COUNTER("link.inputs", KIT_PROFILE_COUNTER_LINK_INPUTS);
    211   METRICS_COUNTER("link.sections", KIT_PROFILE_COUNTER_LINK_SECTIONS);
    212   METRICS_COUNTER("link.segments", KIT_PROFILE_COUNTER_LINK_SEGMENTS);
    213   METRICS_COUNTER("link.syms", KIT_PROFILE_COUNTER_LINK_SYMS);
    214   METRICS_COUNTER("link.relocs", KIT_PROFILE_COUNTER_LINK_RELOCS);
    215   METRICS_COUNTER("jit.input_section_bytes",
    216                   KIT_PROFILE_COUNTER_JIT_INPUT_SECTION_BYTES);
    217   METRICS_COUNTER("jit.master_size", KIT_PROFILE_COUNTER_JIT_MASTER_SIZE);
    218   METRICS_COUNTER("jit.nsegments", KIT_PROFILE_COUNTER_JIT_NSEGMENTS);
    219   METRICS_COUNTER("jit.segment_bytes", KIT_PROFILE_COUNTER_JIT_SEGMENT_BYTES);
    220 #undef METRICS_COUNTER
    221   return KIT_PROFILE_COUNTER_NONE;
    222 }
    223 
    224 static inline void metrics_scope_begin(Compiler* c, const char* name) {
    225   if (!profile_sink(c)) return;
    226   KitProfileScope scope = metrics_scope_from_name(name);
    227   if (scope != KIT_PROFILE_SCOPE_NONE) profile_scope_begin(c, scope);
    228 }
    229 
    230 static inline void metrics_scope_end(Compiler* c, const char* name) {
    231   if (!profile_sink(c)) return;
    232   KitProfileScope scope = metrics_scope_from_name(name);
    233   if (scope != KIT_PROFILE_SCOPE_NONE) profile_scope_end(c, scope);
    234 }
    235 
    236 static inline void metrics_count(Compiler* c, const char* name, u64 value) {
    237   if (!profile_sink(c)) return;
    238   KitProfileCounter counter = metrics_counter_from_name(name);
    239   if (counter != KIT_PROFILE_COUNTER_NONE) profile_count(c, counter, value);
    240 }
    241 
    242 #endif