Пример #1
0
Файл: prof.c Проект: jmuk/Gauche
/* 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++;
}
Пример #2
0
// 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;
}