Diff for /gforth/vmgen-ex/profile.c between versions 1.1 and 1.7

version 1.1, 2001/04/29 11:28:24 version 1.7, 2007/12/31 18:40:26
Line 1 Line 1
 /* VM profiling support stuff  /* VM profiling support stuff
   
   Copyright (C) 2001 Free Software Foundation, Inc.    Copyright (C) 2001,2003 Free Software Foundation, Inc.
   
   This file is part of Gforth.    This file is part of Gforth.
   
   Gforth is free software; you can redistribute it and/or    Gforth is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License    modify it under the terms of the GNU General Public License
   as published by the Free Software Foundation; either version 2    as published by the Free Software Foundation, either version 3
   of the License, or (at your option) any later version.    of the License, or (at your option) any later version.
   
   This program is distributed in the hope that it will be useful,    This program is distributed in the hope that it will be useful,
Line 15 Line 15
   GNU General Public License for more details.    GNU General Public License for more details.
   
   You should have received a copy of the GNU General Public License    You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software    along with this program; if not, see http://www.gnu.org/licenses/.
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.  
 */  */
   
 #include <stdlib.h>  #include <stdlib.h>
Line 27 Line 26
 /* data structure: simple hash table with external chaining */  /* data structure: simple hash table with external chaining */
   
 #define HASH_SIZE (1<<20)  #define HASH_SIZE (1<<20)
   #define hash(p) ((((Cell)(p))/sizeof(Inst))&(HASH_SIZE-1))
   
   #ifdef __GNUC__
   typedef long long long_long;
   #else
   typedef long long_long;
   #endif
   
 typedef struct block_count {  typedef struct block_count {
   struct block_count *next; /* next in hash table */    struct block_count *next; /* next in hash table */
   struct block_count *fallthrough; /* the block that this one falls    struct block_count *fallthrough; /* the block that this one falls
                                        through to without SUPER_END */                                         through to without SUPER_END */
   Inst *ip;    Inst *ip;
   long long count;    long_long count;
   char **insts;    char **insts;
   size_t ninsts;    size_t ninsts;
 } block_count;  } block_count;
   
 block_count *blocks[HASH_SIZE];  block_count *blocks[HASH_SIZE];
   Inst *vmcode_end;
 #define hash(p) ((((Cell)(p))/sizeof(Inst))&(HASH_SIZE-1))  
   
 block_count *block_lookup(Inst *ip)  block_count *block_lookup(Inst *ip)
 {  {
Line 63  block_count *block_insert(Inst *ip) Line 68  block_count *block_insert(Inst *ip)
   new->next = blocks[hash(ip)];    new->next = blocks[hash(ip)];
   new->fallthrough = NULL;    new->fallthrough = NULL;
   new->ip = ip;    new->ip = ip;
   new->count = 0LL;    new->count = (long_long)0;
   new->insts = malloc(0);    new->insts = malloc(1);
   assert(new->insts != NULL);    assert(new->insts != NULL);
   new->ninsts = 0;    new->ninsts = 0;
   blocks[hash(ip)] = new;    blocks[hash(ip)] = new;
Line 82  void vm_count_block(Inst *ip) Line 87  void vm_count_block(Inst *ip)
   block_insert(ip)->count++;    block_insert(ip)->count++;
 }  }
   
 #define VM_IS_INST(inst, n) ((inst) == vm_prim[n])  
   
 void postprocess_block(block_count *b)  void postprocess_block(block_count *b)
 {  {
   Inst *ip = b->ip;    Inst *ip = b->ip;
   block_count *next_block;    block_count *next_block=NULL;
   
   do {    while (next_block == NULL && ip<vmcode_end) {
 #include "mini-profile.i"  #include "mini-profile.i"
     /* else */      /* else */
     {      {
Line 98  void postprocess_block(block_count *b) Line 101  void postprocess_block(block_count *b)
     }      }
   _endif_:    _endif_:
     next_block = block_lookup(ip);      next_block = block_lookup(ip);
   } while (next_block == NULL);    }
   /* we fell through, so set fallthrough and update the count */    /* we fell through, so set fallthrough and update the count */
   b->fallthrough = next_block;    b->fallthrough = next_block;
   /* also update the counts of all following fallthrough blocks that    /* also update the counts of all following fallthrough blocks that

Removed from v.1.1  
changed lines
  Added in v.1.7


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>