version 1.4, 2001/03/04 13:39:35
|
version 1.14, 2007/12/31 18:40:25
|
Line 1
|
Line 1
|
/* VM profiling support stuff |
/* 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. |
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 "config.h" |
#include "config.h" |
|
#include "forth.h" |
#include <stdlib.h> |
#include <stdlib.h> |
#include <stdio.h> |
#include <stdio.h> |
#include <assert.h> |
#include <assert.h> |
#include "forth.h" |
|
|
|
|
|
/* data structure: simple hash table with external chaining */ |
/* data structure: simple hash table with external chaining */ |
Line 85 void vm_count_block(Xt *ip)
|
Line 84 void vm_count_block(Xt *ip)
|
} |
} |
|
|
#ifdef DIRECT_THREADED |
#ifdef DIRECT_THREADED |
#define VM_IS_INST(inst, n) ((inst) == vm_prims[(n)+DOESJUMP+1]) |
#define VM_IS_INST(inst, n) ((inst) == vm_prims[n]) |
#else |
#else |
#define VM_IS_INST(inst, n) ((inst) == &(vm_prims[(n)+DOESJUMP+1])) |
#define VM_IS_INST(inst, n) ((inst) == &(vm_prims[n])) |
#endif |
#endif |
|
|
void postprocess_block(block_count *b) |
void postprocess_block(block_count *b) |
Line 102 void postprocess_block(block_count *b)
|
Line 101 void postprocess_block(block_count *b)
|
add_inst(b,"unknown"); |
add_inst(b,"unknown"); |
ip++; |
ip++; |
} |
} |
|
_endif_: |
next_block = block_lookup(ip); |
next_block = block_lookup(ip); |
} while (next_block == NULL); |
} while (next_block == NULL); |
/* we fell through, so set fallthrough and update the count */ |
/* we fell through, so set fallthrough and update the count */ |
Line 127 void postprocess(void)
|
Line 127 void postprocess(void)
|
} |
} |
} |
} |
|
|
#if 0 |
#if 1 |
|
/* full basic blocks only */ |
void print_block(FILE *file, block_count *b) |
void print_block(FILE *file, block_count *b) |
{ |
{ |
size_t i; |
size_t i; |
Line 137 void print_block(FILE *file, block_count
|
Line 138 void print_block(FILE *file, block_count
|
fprintf(file, "%s ", b->insts[i]); |
fprintf(file, "%s ", b->insts[i]); |
putc('\n', file); |
putc('\n', file); |
} |
} |
#endif |
#elif 0 |
|
/* full basic blocks and all their prefixes */ |
|
void print_block(FILE *file, block_count *b) |
|
{ |
|
size_t i,j; |
|
|
|
for (j=1; j<=b->ninsts; j++) { |
|
fprintf(file,"%14lld\t",b->count); |
|
for (i=0; i<j; i++) |
|
fprintf(file, "%s ", b->insts[i]); |
|
putc('\n', file); |
|
} |
|
} |
|
#else |
|
/* all subsequences up to length 12 */ |
void print_block(FILE *file, block_count *b) |
void print_block(FILE *file, block_count *b) |
{ |
{ |
size_t i,j,k; |
size_t i,j,k; |
|
|
for (i=2; i<12; i++) |
for (i=1; i<2; i++) |
for (j=0; i+j<=b->ninsts; j++) { |
for (j=0; i+j<=b->ninsts; j++) { |
fprintf(file,"%14lld\t",b->count); |
fprintf(file,"%14lld\t",b->count); |
for (k=j; k<i+j; k++) |
for (k=j; k<i+j; k++) |
Line 151 void print_block(FILE *file, block_count
|
Line 165 void print_block(FILE *file, block_count
|
putc('\n', file); |
putc('\n', file); |
} |
} |
} |
} |
|
#endif |
|
|
void vm_print_profile(FILE *file) |
void vm_print_profile(FILE *file) |
{ |
{ |