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