/* signal handler */ static void sampler_sample(int sig) { ScmVM *vm = Scm_VM(); if (vm->prof == NULL) return; if (vm->prof->state != SCM_PROFILER_RUNNING) return; if (vm->prof->currentSample >= SCM_PROF_SAMPLES_IN_BUFFER) { ITIMER_STOP(); sampler_flush(vm); ITIMER_START(); } int i = vm->prof->currentSample++; if (vm->base) { /* If vm->pc is RET and val0 is a subr, it is pretty likely that we're actually executing that subr. */ if (vm->pc && SCM_VM_INSN_CODE(*vm->pc) == SCM_VM_RET && SCM_SUBRP(vm->val0)) { vm->prof->samples[i].func = vm->val0; vm->prof->samples[i].pc = NULL; } else { vm->prof->samples[i].func = SCM_OBJ(vm->base); vm->prof->samples[i].pc = vm->pc; } } else { vm->prof->samples[i].func = SCM_FALSE; vm->prof->samples[i].pc = NULL; } vm->prof->totalSamples++; }
// staticで他から参照されてないって、どういうこと? static ScmWord fetch_insn_counting(ScmVM *vm, ScmWord code) { if (vm->base && vm->pc != vm->base->code) { insn2_freq[SCM_VM_INSN_CODE(code)][SCM_VM_INSN_CODE(*vm->pc)]++; } code = *vm->pc++; insn1_freq[SCM_VM_INSN_CODE(code)]++; switch (SCM_VM_INSN_CODE(code)) { // よくわからんが、codeごとにcountしてるみたい // 10*10の配列 case SCM_VM_LREF0: lref_freq[0][0]++; break; case SCM_VM_LREF1: lref_freq[0][1]++; break; case SCM_VM_LREF2: lref_freq[0][2]++; break; case SCM_VM_LREF3: lref_freq[0][3]++; break; case SCM_VM_LREF4: lref_freq[0][4]++; break; case SCM_VM_LREF10: lref_freq[1][0]++; break; case SCM_VM_LREF11: lref_freq[1][1]++; break; case SCM_VM_LREF12: lref_freq[1][2]++; break; case SCM_VM_LREF13: lref_freq[1][3]++; break; case SCM_VM_LREF14: lref_freq[1][4]++; break; case SCM_VM_LREF: { int dep = SCM_VM_INSN_ARG0(code); int off = SCM_VM_INSN_ARG1(code); if (dep >= LREF_FREQ_COUNT_MAX) dep=LREF_FREQ_COUNT_MAX-1; if (off >= LREF_FREQ_COUNT_MAX) off=LREF_FREQ_COUNT_MAX-1; lref_freq[dep][off]++; break; } case SCM_VM_LSET0: lset_freq[0][0]++; break; case SCM_VM_LSET1: lset_freq[0][1]++; break; case SCM_VM_LSET2: lset_freq[0][2]++; break; case SCM_VM_LSET3: lset_freq[0][3]++; break; case SCM_VM_LSET4: lset_freq[0][4]++; break; case SCM_VM_LSET: { int dep = SCM_VM_INSN_ARG0(code); int off = SCM_VM_INSN_ARG1(code); if (dep >= LREF_FREQ_COUNT_MAX) dep=LREF_FREQ_COUNT_MAX-1; if (off >= LREF_FREQ_COUNT_MAX) off=LREF_FREQ_COUNT_MAX-1; lset_freq[dep][off]++; break; } } return code; }