11 #ifndef USE_DEBUG_COUNTER
12 #define USE_DEBUG_COUNTER 0
15 #ifdef RB_DEBUG_COUNTER
18 RB_DEBUG_COUNTER(mc_inline_hit)
19 RB_DEBUG_COUNTER(mc_inline_miss_klass)
20 RB_DEBUG_COUNTER(mc_inline_miss_invalidated)
21 RB_DEBUG_COUNTER(mc_inline_miss_empty)
22 RB_DEBUG_COUNTER(mc_inline_miss_same_cc)
23 RB_DEBUG_COUNTER(mc_inline_miss_same_cme)
24 RB_DEBUG_COUNTER(mc_inline_miss_same_def)
25 RB_DEBUG_COUNTER(mc_inline_miss_diff)
27 RB_DEBUG_COUNTER(cvar_write_inline_hit)
28 RB_DEBUG_COUNTER(cvar_read_inline_hit)
29 RB_DEBUG_COUNTER(cvar_inline_miss)
30 RB_DEBUG_COUNTER(cvar_class_invalidate)
31 RB_DEBUG_COUNTER(cvar_include_invalidate)
33 RB_DEBUG_COUNTER(mc_cme_complement)
34 RB_DEBUG_COUNTER(mc_cme_complement_hit)
36 RB_DEBUG_COUNTER(mc_search)
37 RB_DEBUG_COUNTER(mc_search_notfound)
38 RB_DEBUG_COUNTER(mc_search_super)
41 RB_DEBUG_COUNTER(ci_packed)
42 RB_DEBUG_COUNTER(ci_kw)
43 RB_DEBUG_COUNTER(ci_nokw)
44 RB_DEBUG_COUNTER(ci_runtime)
47 RB_DEBUG_COUNTER(cc_new)
48 RB_DEBUG_COUNTER(cc_temp)
49 RB_DEBUG_COUNTER(cc_found_in_ccs)
50 RB_DEBUG_COUNTER(cc_not_found_in_ccs)
52 RB_DEBUG_COUNTER(cc_ent_invalidate)
53 RB_DEBUG_COUNTER(cc_cme_invalidate)
55 RB_DEBUG_COUNTER(cc_invalidate_leaf)
56 RB_DEBUG_COUNTER(cc_invalidate_leaf_ccs)
57 RB_DEBUG_COUNTER(cc_invalidate_leaf_callable)
58 RB_DEBUG_COUNTER(cc_invalidate_tree)
59 RB_DEBUG_COUNTER(cc_invalidate_tree_cme)
60 RB_DEBUG_COUNTER(cc_invalidate_tree_callable)
61 RB_DEBUG_COUNTER(cc_invalidate_negative)
63 RB_DEBUG_COUNTER(ccs_free)
64 RB_DEBUG_COUNTER(ccs_maxlen)
65 RB_DEBUG_COUNTER(ccs_found)
66 RB_DEBUG_COUNTER(ccs_not_found)
69 RB_DEBUG_COUNTER(call0_public)
70 RB_DEBUG_COUNTER(call0_other)
71 RB_DEBUG_COUNTER(gccct_hit)
72 RB_DEBUG_COUNTER(gccct_miss)
73 RB_DEBUG_COUNTER(gccct_null)
76 RB_DEBUG_COUNTER(iseq_num)
77 RB_DEBUG_COUNTER(iseq_cd_num)
82 RB_DEBUG_COUNTER(ccf_general)
83 RB_DEBUG_COUNTER(ccf_iseq_setup)
84 RB_DEBUG_COUNTER(ccf_iseq_setup_0start)
85 RB_DEBUG_COUNTER(ccf_iseq_setup_tailcall_0start)
86 RB_DEBUG_COUNTER(ccf_iseq_fix)
87 RB_DEBUG_COUNTER(ccf_iseq_opt)
88 RB_DEBUG_COUNTER(ccf_iseq_kw1)
89 RB_DEBUG_COUNTER(ccf_iseq_kw2)
90 RB_DEBUG_COUNTER(ccf_cfunc)
91 RB_DEBUG_COUNTER(ccf_cfunc_with_frame)
92 RB_DEBUG_COUNTER(ccf_ivar)
93 RB_DEBUG_COUNTER(ccf_attrset)
94 RB_DEBUG_COUNTER(ccf_method_missing)
95 RB_DEBUG_COUNTER(ccf_zsuper)
96 RB_DEBUG_COUNTER(ccf_bmethod)
97 RB_DEBUG_COUNTER(ccf_opt_send)
98 RB_DEBUG_COUNTER(ccf_opt_call)
99 RB_DEBUG_COUNTER(ccf_opt_block_call)
100 RB_DEBUG_COUNTER(ccf_opt_struct_aref)
101 RB_DEBUG_COUNTER(ccf_opt_struct_aset)
102 RB_DEBUG_COUNTER(ccf_super_method)
114 RB_DEBUG_COUNTER(frame_push)
115 RB_DEBUG_COUNTER(frame_push_method)
116 RB_DEBUG_COUNTER(frame_push_block)
117 RB_DEBUG_COUNTER(frame_push_class)
118 RB_DEBUG_COUNTER(frame_push_top)
119 RB_DEBUG_COUNTER(frame_push_cfunc)
120 RB_DEBUG_COUNTER(frame_push_ifunc)
121 RB_DEBUG_COUNTER(frame_push_eval)
122 RB_DEBUG_COUNTER(frame_push_rescue)
123 RB_DEBUG_COUNTER(frame_push_dummy)
125 RB_DEBUG_COUNTER(frame_R2R)
126 RB_DEBUG_COUNTER(frame_R2C)
127 RB_DEBUG_COUNTER(frame_C2C)
128 RB_DEBUG_COUNTER(frame_C2R)
141 RB_DEBUG_COUNTER(ivar_get_ic_hit)
142 RB_DEBUG_COUNTER(ivar_get_ic_miss)
143 RB_DEBUG_COUNTER(ivar_get_ic_miss_serial)
144 RB_DEBUG_COUNTER(ivar_get_ic_miss_unset)
145 RB_DEBUG_COUNTER(ivar_get_ic_miss_noobject)
146 RB_DEBUG_COUNTER(ivar_set_ic_hit)
147 RB_DEBUG_COUNTER(ivar_set_ic_miss)
148 RB_DEBUG_COUNTER(ivar_set_ic_miss_serial)
149 RB_DEBUG_COUNTER(ivar_set_ic_miss_unset)
150 RB_DEBUG_COUNTER(ivar_set_ic_miss_iv_hit)
151 RB_DEBUG_COUNTER(ivar_set_ic_miss_noobject)
152 RB_DEBUG_COUNTER(ivar_get_base)
153 RB_DEBUG_COUNTER(ivar_set_base)
162 RB_DEBUG_COUNTER(lvar_get)
163 RB_DEBUG_COUNTER(lvar_get_dynamic)
164 RB_DEBUG_COUNTER(lvar_set)
165 RB_DEBUG_COUNTER(lvar_set_dynamic)
166 RB_DEBUG_COUNTER(lvar_set_slowpath)
176 RB_DEBUG_COUNTER(gc_count)
177 RB_DEBUG_COUNTER(gc_minor_newobj)
178 RB_DEBUG_COUNTER(gc_minor_malloc)
179 RB_DEBUG_COUNTER(gc_minor_method)
180 RB_DEBUG_COUNTER(gc_minor_capi)
181 RB_DEBUG_COUNTER(gc_minor_stress)
182 RB_DEBUG_COUNTER(gc_major_nofree)
183 RB_DEBUG_COUNTER(gc_major_oldgen)
184 RB_DEBUG_COUNTER(gc_major_shady)
185 RB_DEBUG_COUNTER(gc_major_force)
186 RB_DEBUG_COUNTER(gc_major_oldmalloc)
188 RB_DEBUG_COUNTER(gc_enter_start)
189 RB_DEBUG_COUNTER(gc_enter_mark_continue)
190 RB_DEBUG_COUNTER(gc_enter_sweep_continue)
191 RB_DEBUG_COUNTER(gc_enter_rest)
192 RB_DEBUG_COUNTER(gc_enter_finalizer)
194 RB_DEBUG_COUNTER(gc_isptr_trial)
195 RB_DEBUG_COUNTER(gc_isptr_range)
196 RB_DEBUG_COUNTER(gc_isptr_align)
197 RB_DEBUG_COUNTER(gc_isptr_maybe)
237 RB_DEBUG_COUNTER(obj_newobj)
238 RB_DEBUG_COUNTER(obj_newobj_slowpath)
239 RB_DEBUG_COUNTER(obj_newobj_wb_unprotected)
240 RB_DEBUG_COUNTER(obj_free)
241 RB_DEBUG_COUNTER(obj_promote)
242 RB_DEBUG_COUNTER(obj_wb_unprotect)
244 RB_DEBUG_COUNTER(obj_obj_embed)
245 RB_DEBUG_COUNTER(obj_obj_transient)
246 RB_DEBUG_COUNTER(obj_obj_ptr)
248 RB_DEBUG_COUNTER(obj_str_ptr)
249 RB_DEBUG_COUNTER(obj_str_embed)
250 RB_DEBUG_COUNTER(obj_str_shared)
251 RB_DEBUG_COUNTER(obj_str_nofree)
252 RB_DEBUG_COUNTER(obj_str_fstr)
254 RB_DEBUG_COUNTER(obj_ary_embed)
255 RB_DEBUG_COUNTER(obj_ary_transient)
256 RB_DEBUG_COUNTER(obj_ary_ptr)
257 RB_DEBUG_COUNTER(obj_ary_extracapa)
264 RB_DEBUG_COUNTER(obj_ary_shared_create)
265 RB_DEBUG_COUNTER(obj_ary_shared)
266 RB_DEBUG_COUNTER(obj_ary_shared_root_occupied)
268 RB_DEBUG_COUNTER(obj_hash_empty)
269 RB_DEBUG_COUNTER(obj_hash_1)
270 RB_DEBUG_COUNTER(obj_hash_2)
271 RB_DEBUG_COUNTER(obj_hash_3)
272 RB_DEBUG_COUNTER(obj_hash_4)
273 RB_DEBUG_COUNTER(obj_hash_5_8)
274 RB_DEBUG_COUNTER(obj_hash_g8)
276 RB_DEBUG_COUNTER(obj_hash_null)
277 RB_DEBUG_COUNTER(obj_hash_ar)
278 RB_DEBUG_COUNTER(obj_hash_st)
279 RB_DEBUG_COUNTER(obj_hash_transient)
280 RB_DEBUG_COUNTER(obj_hash_force_convert)
282 RB_DEBUG_COUNTER(obj_struct_embed)
283 RB_DEBUG_COUNTER(obj_struct_transient)
284 RB_DEBUG_COUNTER(obj_struct_ptr)
286 RB_DEBUG_COUNTER(obj_data_empty)
287 RB_DEBUG_COUNTER(obj_data_xfree)
288 RB_DEBUG_COUNTER(obj_data_imm_free)
289 RB_DEBUG_COUNTER(obj_data_zombie)
291 RB_DEBUG_COUNTER(obj_match_under4)
292 RB_DEBUG_COUNTER(obj_match_ge4)
293 RB_DEBUG_COUNTER(obj_match_ge8)
294 RB_DEBUG_COUNTER(obj_match_ptr)
296 RB_DEBUG_COUNTER(obj_iclass_ptr)
297 RB_DEBUG_COUNTER(obj_class_ptr)
298 RB_DEBUG_COUNTER(obj_module_ptr)
300 RB_DEBUG_COUNTER(obj_bignum_ptr)
301 RB_DEBUG_COUNTER(obj_bignum_embed)
302 RB_DEBUG_COUNTER(obj_float)
303 RB_DEBUG_COUNTER(obj_complex)
304 RB_DEBUG_COUNTER(obj_rational)
306 RB_DEBUG_COUNTER(obj_regexp_ptr)
307 RB_DEBUG_COUNTER(obj_file_ptr)
308 RB_DEBUG_COUNTER(obj_symbol)
310 RB_DEBUG_COUNTER(obj_imemo_ment)
311 RB_DEBUG_COUNTER(obj_imemo_iseq)
312 RB_DEBUG_COUNTER(obj_imemo_env)
313 RB_DEBUG_COUNTER(obj_imemo_tmpbuf)
314 RB_DEBUG_COUNTER(obj_imemo_ast)
315 RB_DEBUG_COUNTER(obj_imemo_cref)
316 RB_DEBUG_COUNTER(obj_imemo_svar)
317 RB_DEBUG_COUNTER(obj_imemo_throw_data)
318 RB_DEBUG_COUNTER(obj_imemo_ifunc)
319 RB_DEBUG_COUNTER(obj_imemo_memo)
320 RB_DEBUG_COUNTER(obj_imemo_parser_strterm)
321 RB_DEBUG_COUNTER(obj_imemo_callinfo)
322 RB_DEBUG_COUNTER(obj_imemo_callcache)
323 RB_DEBUG_COUNTER(obj_imemo_constcache)
326 RB_DEBUG_COUNTER(artable_hint_hit)
327 RB_DEBUG_COUNTER(artable_hint_miss)
328 RB_DEBUG_COUNTER(artable_hint_notfound)
334 RB_DEBUG_COUNTER(heap_xmalloc)
335 RB_DEBUG_COUNTER(heap_xrealloc)
336 RB_DEBUG_COUNTER(heap_xfree)
339 RB_DEBUG_COUNTER(theap_alloc)
340 RB_DEBUG_COUNTER(theap_alloc_fail)
341 RB_DEBUG_COUNTER(theap_evacuate)
344 RB_DEBUG_COUNTER(vm_sync_lock)
345 RB_DEBUG_COUNTER(vm_sync_lock_enter)
346 RB_DEBUG_COUNTER(vm_sync_lock_enter_nb)
347 RB_DEBUG_COUNTER(vm_sync_lock_enter_cr)
348 RB_DEBUG_COUNTER(vm_sync_barrier)
351 RB_DEBUG_COUNTER(mjit_exec)
352 RB_DEBUG_COUNTER(mjit_exec_not_added)
353 RB_DEBUG_COUNTER(mjit_exec_not_ready)
354 RB_DEBUG_COUNTER(mjit_exec_not_compiled)
355 RB_DEBUG_COUNTER(mjit_exec_call_func)
358 RB_DEBUG_COUNTER(mjit_add_iseq_to_process)
359 RB_DEBUG_COUNTER(mjit_unload_units)
362 RB_DEBUG_COUNTER(mjit_frame_VM2VM)
363 RB_DEBUG_COUNTER(mjit_frame_VM2JT)
364 RB_DEBUG_COUNTER(mjit_frame_JT2JT)
365 RB_DEBUG_COUNTER(mjit_frame_JT2VM)
368 RB_DEBUG_COUNTER(mjit_cancel)
369 RB_DEBUG_COUNTER(mjit_cancel_ivar_inline)
370 RB_DEBUG_COUNTER(mjit_cancel_exivar_inline)
371 RB_DEBUG_COUNTER(mjit_cancel_send_inline)
372 RB_DEBUG_COUNTER(mjit_cancel_opt_insn)
373 RB_DEBUG_COUNTER(mjit_cancel_invalidate_all)
374 RB_DEBUG_COUNTER(mjit_cancel_leave)
377 RB_DEBUG_COUNTER(mjit_length_unit_queue)
378 RB_DEBUG_COUNTER(mjit_length_active_units)
379 RB_DEBUG_COUNTER(mjit_length_compact_units)
380 RB_DEBUG_COUNTER(mjit_length_stale_units)
383 RB_DEBUG_COUNTER(mjit_compile_failures)
392 #ifndef RUBY_DEBUG_COUNTER_H
393 #define RUBY_DEBUG_COUNTER_H 1
395 #include "ruby/internal/config.h"
399 #if !defined(__GNUC__) && USE_DEBUG_COUNTER
400 #error "USE_DEBUG_COUNTER is not supported by other than __GNUC__"
403 enum rb_debug_counter_type {
404 #define RB_DEBUG_COUNTER(name) RB_DEBUG_COUNTER_##name,
407 #undef RB_DEBUG_COUNTER
410 #if USE_DEBUG_COUNTER
411 extern size_t rb_debug_counter[];
413 RUBY_EXTERN void rb_debug_counter_add_atomic(
enum rb_debug_counter_type
type,
int add);
416 rb_debug_counter_add(
enum rb_debug_counter_type
type,
int add,
int cond)
419 if (ruby_single_main_ractor != NULL) {
420 rb_debug_counter[(int)
type] += add;
423 rb_debug_counter_add_atomic(
type, add);
430 rb_debug_counter_max(
enum rb_debug_counter_type
type,
unsigned int num)
433 if (rb_debug_counter[(
int)
type] < num) {
434 rb_debug_counter[(int)
type] = num;
445 #define RB_DEBUG_COUNTER_INC(type) rb_debug_counter_add(RB_DEBUG_COUNTER_##type, 1, 1)
446 #define RB_DEBUG_COUNTER_INC_UNLESS(type, cond) (!rb_debug_counter_add(RB_DEBUG_COUNTER_##type, 1, !(cond)))
447 #define RB_DEBUG_COUNTER_INC_IF(type, cond) rb_debug_counter_add(RB_DEBUG_COUNTER_##type, 1, !!(cond))
448 #define RB_DEBUG_COUNTER_ADD(type, num) rb_debug_counter_add(RB_DEBUG_COUNTER_##type, (num), 1)
449 #define RB_DEBUG_COUNTER_SETMAX(type, num) rb_debug_counter_max(RB_DEBUG_COUNTER_##type, (unsigned int)(num))
452 #define RB_DEBUG_COUNTER_INC(type) ((void)0)
453 #define RB_DEBUG_COUNTER_INC_UNLESS(type, cond) (!!(cond))
454 #define RB_DEBUG_COUNTER_INC_IF(type, cond) (!!(cond))
455 #define RB_DEBUG_COUNTER_ADD(type, num) ((void)0)
456 #define RB_DEBUG_COUNTER_SETMAX(type, num) 0
459 void rb_debug_counter_show_results(
const char *msg);
461 RUBY_SYMBOL_EXPORT_BEGIN
463 size_t ruby_debug_counter_get(
const char **names_ptr,
size_t *counters_ptr);
464 void ruby_debug_counter_reset(
void);
465 void ruby_debug_counter_show_at_exit(
int enable);
467 RUBY_SYMBOL_EXPORT_END
#define RUBY_EXTERN
Declaration of externally visible global variables.
VALUE type(ANYARGS)
ANYARGS-ed function type.
uintptr_t VALUE
Type that represents a Ruby object.