1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Add VM insns counter like debug_counter (#2789)

This commit is contained in:
Takashi Kokubun 2019-12-28 00:44:09 -08:00 committed by GitHub
parent bf04fe086b
commit a994b0aee7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
Notes: git 2019-12-28 17:44:33 +09:00
Merged-By: k0kubun <takashikkbn@gmail.com>
2 changed files with 36 additions and 1 deletions

View file

@ -15,6 +15,36 @@
static void vm_analysis_insn(int insn);
#endif
#if USE_INSNS_COUNTER
static size_t rb_insns_counter[VM_INSTRUCTION_SIZE];
static void
vm_insns_counter_count_insn(int insn)
{
rb_insns_counter[insn]++;
}
__attribute__((destructor))
static void
vm_insns_counter_show_results_at_exit(void)
{
int insn_end = (ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)
? VM_INSTRUCTION_SIZE : VM_INSTRUCTION_SIZE / 2;
size_t total = 0;
for (int insn = 0; insn < insn_end; insn++)
total += rb_insns_counter[insn];
for (int insn = 0; insn < insn_end; insn++) {
fprintf(stderr, "[RUBY_INSNS_COUNTER]\t%-32s%'12"PRIuSIZE" (%4.1f%%)\n",
insn_name(insn), rb_insns_counter[insn],
100.0 * rb_insns_counter[insn] / total);
}
}
#else
static void vm_insns_counter_count_insn(int insn) {}
#endif
#if VMDEBUG > 0
#define DECL_SC_REG(type, r, reg) register type reg_##r

View file

@ -41,6 +41,10 @@ typedef rb_iseq_t *ISEQ;
#define throwdebug if(0)printf
/* #define throwdebug printf */
#ifndef USE_INSNS_COUNTER
#define USE_INSNS_COUNTER 0
#endif
/************************************************/
#if defined(DISPATCH_XXX)
error !
@ -75,7 +79,8 @@ error !
(reg_pc - reg_cfp->iseq->body->iseq_encoded), \
(reg_cfp->pc - reg_cfp->iseq->body->iseq_encoded), \
RSTRING_PTR(rb_iseq_path(reg_cfp->iseq)), \
rb_iseq_line_no(reg_cfp->iseq, reg_pc - reg_cfp->iseq->body->iseq_encoded));
rb_iseq_line_no(reg_cfp->iseq, reg_pc - reg_cfp->iseq->body->iseq_encoded)); \
if (USE_INSNS_COUNTER) vm_insns_counter_count_insn(BIN(insn));
#define INSN_DISPATCH_SIG(insn)