(linenum→info "unix/slp.c:2238")

gauche/0.8.12/src/vmstat.c

    1: /*
    2:  * vmstat.c - statistics gathering code for vm.c
    3:  *
    4:  *   Copyright (c) 2005-2007  Shiro Kawai  <shiro@acm.org>
    5:  * 
    6:  *   Redistribution and use in source and binary forms, with or without
    7:  *   modification, are permitted provided that the following conditions
    8:  *   are met:
    9:  * 
   10:  *   1. Redistributions of source code must retain the above copyright
   11:  *      notice, this list of conditions and the following disclaimer.
   12:  *
   13:  *   2. Redistributions in binary form must reproduce the above copyright
   14:  *      notice, this list of conditions and the following disclaimer in the
   15:  *      documentation and/or other materials provided with the distribution.
   16:  *
   17:  *   3. Neither the name of the authors nor the names of its contributors
   18:  *      may be used to endorse or promote products derived from this
   19:  *      software without specific prior written permission.
   20:  *
   21:  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   22:  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   23:  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
   24:  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
   25:  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   26:  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
   27:  *   TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   28:  *   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   29:  *   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   30:  *   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   31:  *   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   32:  *
   33:  *  $Id: vmstat.c,v 1.2 2007/03/02 07:39:14 shirok Exp $
   34:  */
   35: 
   36: /* This file is included from vm.c */
   37: 
   38: #ifdef COUNT_INSN_FREQUENCY
   39: /* for statistics */
   40: static u_long insn1_freq[SCM_VM_NUM_INSNS];
   41: static u_long insn2_freq[SCM_VM_NUM_INSNS][SCM_VM_NUM_INSNS];
   42: 
   43: #define LREF_FREQ_COUNT_MAX 10
   44: static u_long lref_freq[LREF_FREQ_COUNT_MAX][LREF_FREQ_COUNT_MAX];
   45: static u_long lset_freq[LREF_FREQ_COUNT_MAX][LREF_FREQ_COUNT_MAX];
   46: 
   47: static ScmWord fetch_insn_counting(ScmVM *vm, ScmWord code)
   48: {
   49:     if (vm->base && vm->pc != vm->base->code) {
   50:         insn2_freq[SCM_VM_INSN_CODE(code)][SCM_VM_INSN_CODE(*vm->pc)]++;
   51:     }
   52:     code = *vm->pc++;
   53:     insn1_freq[SCM_VM_INSN_CODE(code)]++; 
   54:     switch (SCM_VM_INSN_CODE(code)) {
   55:     case SCM_VM_LREF0: lref_freq[0][0]++; break;
   56:     case SCM_VM_LREF1: lref_freq[0][1]++; break;
   57:     case SCM_VM_LREF2: lref_freq[0][2]++; break;
   58:     case SCM_VM_LREF3: lref_freq[0][3]++; break;
   59:     case SCM_VM_LREF4: lref_freq[0][4]++; break;
   60:     case SCM_VM_LREF10: lref_freq[1][0]++; break;
   61:     case SCM_VM_LREF11: lref_freq[1][1]++; break;
   62:     case SCM_VM_LREF12: lref_freq[1][2]++; break;
   63:     case SCM_VM_LREF13: lref_freq[1][3]++; break;
   64:     case SCM_VM_LREF14: lref_freq[1][4]++; break;
   65:     case SCM_VM_LREF:
   66:     {
   67:         int dep = SCM_VM_INSN_ARG0(code);
   68:         int off = SCM_VM_INSN_ARG1(code);
   69:         if (dep >= LREF_FREQ_COUNT_MAX) dep=LREF_FREQ_COUNT_MAX-1;
   70:         if (off >= LREF_FREQ_COUNT_MAX) off=LREF_FREQ_COUNT_MAX-1;
   71:         lref_freq[dep][off]++;
   72:         break;
   73:     }
   74:     case SCM_VM_LSET0: lset_freq[0][0]++;
   75:     case SCM_VM_LSET1: lset_freq[0][1]++;
   76:     case SCM_VM_LSET2: lset_freq[0][2]++;
   77:     case SCM_VM_LSET3: lset_freq[0][3]++;
   78:     case SCM_VM_LSET4: lset_freq[0][4]++;
   79:     case SCM_VM_LSET:
   80:     {
   81:         int dep = SCM_VM_INSN_ARG0(code);
   82:         int off = SCM_VM_INSN_ARG1(code);
   83:         if (dep >= LREF_FREQ_COUNT_MAX) dep=LREF_FREQ_COUNT_MAX-1;
   84:         if (off >= LREF_FREQ_COUNT_MAX) off=LREF_FREQ_COUNT_MAX-1;
   85:         lset_freq[dep][off]++;
   86:         break;
   87:     }
   88:     }
   89:     return code;
   90: }
   91: 
   92: static void dump_insn_frequency(void *data)
   93: {
   94:     int i, j;
   95:     Scm_Printf(SCM_CUROUT, "(:instruction-frequencies (");
   96:     for (i=0; i<SCM_VM_NUM_INSNS; i++) {
   97:         Scm_Printf(SCM_CUROUT, "(%s %d", Scm_VMInsnName(i), insn1_freq[i]);
   98:         for (j=0; j<SCM_VM_NUM_INSNS; j++) {
   99:             Scm_Printf(SCM_CUROUT, " %d", insn2_freq[i][j]);
  100:         }
  101:         Scm_Printf(SCM_CUROUT, ")\n");
  102:     }
  103:     Scm_Printf(SCM_CUROUT, ")\n :lref-frequencies (");
  104:     for (i=0; i<LREF_FREQ_COUNT_MAX; i++) {
  105:         Scm_Printf(SCM_CUROUT, "(");
  106:         for (j=0; j<LREF_FREQ_COUNT_MAX; j++) {
  107:             Scm_Printf(SCM_CUROUT, "%d ", lref_freq[i][j]);
  108:         }
  109:         Scm_Printf(SCM_CUROUT, ")\n");
  110:     }
  111:     Scm_Printf(SCM_CUROUT, ")\n :lset-frequencies (");
  112:     for (i=0; i<LREF_FREQ_COUNT_MAX; i++) {
  113:         Scm_Printf(SCM_CUROUT, "(");
  114:         for (j=0; j<LREF_FREQ_COUNT_MAX; j++) {
  115:             Scm_Printf(SCM_CUROUT, "%d ", lset_freq[i][j]);
  116:         }
  117:         Scm_Printf(SCM_CUROUT, ")\n");
  118:     }
  119:     Scm_Printf(SCM_CUROUT, ")\n");
  120:     Scm_Printf(SCM_CUROUT, ")\n");
  121: }
  122: 
  123: #endif /*COUNT_INSN_FREQUENCY*/
  124: 
Syntax (Markdown)