--- gforth/engine/profile.c 2001/02/27 21:17:11 1.1 +++ gforth/engine/profile.c 2007/12/31 18:40:25 1.14 @@ -1,12 +1,12 @@ /* VM profiling support stuff - Copyright (C) 2001 Free Software Foundation, Inc. + Copyright (C) 2001,2002,2003 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,14 +15,15 @@ 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 "config.h" +#include "forth.h" #include #include -#include "forth.h" +#include + /* data structure: simple hash table with external chaining */ @@ -65,6 +66,7 @@ block_count *block_insert(Xt *ip) new->ip = ip; new->count = 0LL; new->insts = malloc(0); + assert(new->insts != NULL); new->ninsts = 0; blocks[hash(ip)] = new; return new; @@ -72,7 +74,7 @@ block_count *block_insert(Xt *ip) void add_inst(block_count *b, char *inst) { - b->insts = realloc(b->insts, b->ninsts * sizeof(char *)); + b->insts = realloc(b->insts, (b->ninsts+1) * sizeof(char *)); b->insts[b->ninsts++] = inst; } @@ -81,8 +83,11 @@ void vm_count_block(Xt *ip) block_insert(ip)->count++; } -/* !! fix this */ -#define VM_INST(n) NULL +#ifdef DIRECT_THREADED +#define VM_IS_INST(inst, n) ((inst) == vm_prims[n]) +#else +#define VM_IS_INST(inst, n) ((inst) == &(vm_prims[n])) +#endif void postprocess_block(block_count *b) { @@ -96,6 +101,7 @@ void postprocess_block(block_count *b) add_inst(b,"unknown"); ip++; } + _endif_: next_block = block_lookup(ip); } while (next_block == NULL); /* we fell through, so set fallthrough and update the count */ @@ -121,10 +127,45 @@ void postprocess(void) } } +#if 1 +/* full basic blocks only */ +void print_block(FILE *file, block_count *b) +{ + size_t i; + + fprintf(file,"%14lld\t",b->count); + for (i=0; ininsts; i++) + fprintf(file, "%s ", b->insts[i]); + putc('\n', file); +} +#elif 0 +/* full basic blocks and all their prefixes */ void print_block(FILE *file, block_count *b) { - fprintf(file,"%12lld ip=%p\n",b->count,b->ip); + size_t i,j; + + for (j=1; j<=b->ninsts; j++) { + fprintf(file,"%14lld\t",b->count); + for (i=0; iinsts[i]); + putc('\n', file); + } +} +#else +/* all subsequences up to length 12 */ +void print_block(FILE *file, block_count *b) +{ + size_t i,j,k; + + for (i=1; i<2; i++) + for (j=0; i+j<=b->ninsts; j++) { + fprintf(file,"%14lld\t",b->count); + for (k=j; kinsts[k]); + putc('\n', file); + } } +#endif void vm_print_profile(FILE *file) {