diff options
Diffstat (limited to 'utils/prof/cgprof/symbol.c')
-rw-r--r-- | utils/prof/cgprof/symbol.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/utils/prof/cgprof/symbol.c b/utils/prof/cgprof/symbol.c new file mode 100644 index 0000000000..133f59b2db --- /dev/null +++ b/utils/prof/cgprof/symbol.c @@ -0,0 +1,115 @@ +/* ------------------------------------------------------------------------ + * $Id: symbol.c,v 1.3 2003/08/01 14:50:50 panne Exp $ + * + * Copyright (C) 1995-2000 University of Oxford + * + * Permission to use, copy, modify, and distribute this software, + * and to incorporate it, in whole or in part, into other software, + * is hereby granted without fee, provided that + * (1) the above copyright notice and this permission notice appear in + * all copies of the source code, and the above copyright notice + * appear in clearly visible form on all supporting documentation + * and distribution media; + * (2) modified versions of this software be accompanied by a complete + * change history describing author, date, and modifications made; + * and + * (3) any redistribution of the software, in original or modified + * form, be without fee and subject to these same conditions. + * --------------------------------------------------------------------- */ + +#include <string.h> +#include "symbol.h" + +/* ----------------------------------------------------------------------------- + * Data structures + * -------------------------------------------------------------------------- */ +int symbol_table_next=0; +int symbol_table_size=0; +name_object *symbol_table=NULL; + +/* ----------------------------------------------------------------------------- + * Create/grow symbol table + * -------------------------------------------------------------------------- */ + +void enlargeSymbolTable() { + + if (symbol_table_size==0) { + symbol_table_next = 0; + symbol_table_size = SYMBOL_TABLE_INIT_SIZE; + symbol_table = calloc(symbol_table_size,sizeof(name_object)); + } else { + symbol_table_size += SYMBOL_TABLE_INIT_SIZE; + symbol_table = realloc(symbol_table, + symbol_table_size*sizeof(name_object)); + } + if (symbol_table==NULL) { + fprintf(stderr,"{enlargeSymbolTable} unable to allocate %d elements", + symbol_table_size); + exit(1); + } +} + +/* ----------------------------------------------------------------------------- + * Lookup/add name to symbol table + * -------------------------------------------------------------------------- */ + +name_id lookupSymbolTable(int type,int lineno,char* str) { + int i; + extern FILE *logFile; + + for(i=0;i<symbol_table_next;i++) { + if ((type==symbol_table[i].type) && + (strcmp(str,symbol_table[i].filename)==0) && + (type==CG_STACK || (lineno==symbol_table[i].lineno))) { + return i; + } + } + fprintf(logFile,"{lookupSymbolTable} %d at %s line %d\n",type,str,lineno); + if (symbol_table_next==symbol_table_size) enlargeSymbolTable(); + symbol_table[symbol_table_next].type = type; + symbol_table[symbol_table_next].lineno = lineno; + symbol_table[symbol_table_next].filename= malloc(1+strlen(str)); + if (symbol_table[symbol_table_next].filename==NULL) { + fprintf(stderr,"{lookupSymbolTable} failed to allocate space"); + exit(1); + } + strcpy(symbol_table[symbol_table_next].filename,str); + return (symbol_table_next++); +} + +/* ----------------------------------------------------------------------------- + * Comparison function to be used by \texttt{qsort} + * -------------------------------------------------------------------------- */ + +int cmp_symbol_entry(const int *x, const int *y) { + int i; + + if (symbol_table[*x].type==symbol_table[*y].type) { + i = strcmp(symbol_table[*x].filename,symbol_table[*y].filename); + if (i==0) return (symbol_table[*x].lineno - symbol_table[*y].lineno); + else return i; + } else { + if (symbol_table[*x].type==CG_STACK) return 1; + else return -1; + } +} + + +/* ----------------------------------------------------------------------------- + * Pretty print a symbol table entry + * -------------------------------------------------------------------------- */ + +void printSymbolTable_entry(int idx) { + extern FILE *logFile; + if (symbol_table[idx].type==CG_SSTEP) { + fprintf(logFile,"(line %d of %s) ",symbol_table[idx].lineno, + symbol_table[idx].filename); + } else { + fprintf(logFile,"%s ",symbol_table[idx].filename); + } +} + +void getNameFromSymbolTable(int idx, char* name) { + strcpy(name,symbol_table[idx].filename); +} + |