version 1.3, 2002/06/02 15:46:17
|
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 29
|
Line 28
|
#define HASH_SIZE (1<<20) |
#define HASH_SIZE (1<<20) |
#define hash(p) ((((Cell)(p))/sizeof(Inst))&(HASH_SIZE-1)) |
#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; |
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; |