--- gforth/vmgen-ex/profile.c 2001/04/29 11:28:24 1.1 +++ gforth/vmgen-ex/profile.c 2007/12/31 19:02:25 1.8 @@ -1,12 +1,12 @@ /* VM profiling support stuff - Copyright (C) 2001 Free Software Foundation, Inc. + Copyright (C) 2001,2003,2007 Free Software Foundation, Inc. This file is part of Gforth. Gforth is free software; you can redistribute it and/or 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. This program is distributed in the hope that it will be useful, @@ -15,8 +15,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + along with this program; if not, see http://www.gnu.org/licenses/. */ #include @@ -27,20 +26,26 @@ /* data structure: simple hash table with external chaining */ #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 { struct block_count *next; /* next in hash table */ struct block_count *fallthrough; /* the block that this one falls through to without SUPER_END */ Inst *ip; - long long count; + long_long count; char **insts; size_t ninsts; } block_count; block_count *blocks[HASH_SIZE]; - -#define hash(p) ((((Cell)(p))/sizeof(Inst))&(HASH_SIZE-1)) +Inst *vmcode_end; block_count *block_lookup(Inst *ip) { @@ -63,8 +68,8 @@ block_count *block_insert(Inst *ip) new->next = blocks[hash(ip)]; new->fallthrough = NULL; new->ip = ip; - new->count = 0LL; - new->insts = malloc(0); + new->count = (long_long)0; + new->insts = malloc(1); assert(new->insts != NULL); new->ninsts = 0; blocks[hash(ip)] = new; @@ -82,14 +87,12 @@ void vm_count_block(Inst *ip) block_insert(ip)->count++; } -#define VM_IS_INST(inst, n) ((inst) == vm_prim[n]) - void postprocess_block(block_count *b) { Inst *ip = b->ip; - block_count *next_block; + block_count *next_block=NULL; - do { + while (next_block == NULL && ipfallthrough = next_block; /* also update the counts of all following fallthrough blocks that