1 /* gprof.h 1.19 83/08/11 */ 2 3 #include <stdio.h> 4 #include <sys/types.h> 5 #include <sys/stat.h> 6 #include <a.out.h> 7 #include "gcrt0.h" 8 9 #if vax 10 # include "vax.h" 11 #endif 12 #if sun 13 # include "sun.h" 14 #endif 15 16 17 /* 18 * who am i, for error messages. 19 */ 20 char *whoami; 21 22 /* 23 * booleans 24 */ 25 typedef int bool; 26 #define FALSE 0 27 #define TRUE 1 28 29 /* 30 * ticks per second 31 */ 32 long hz; 33 34 typedef short UNIT; /* unit of profiling */ 35 char *a_outname; 36 #define A_OUTNAME "a.out" 37 38 char *gmonname; 39 #define GMONNAME "gmon.out" 40 #define GMONSUM "gmon.sum" 41 42 /* 43 * blurbs on the flat and graph profiles. 44 */ 45 #define FLAT_BLURB "/usr/lib/gprof.flat.blurb" 46 #define CALLG_BLURB "/usr/lib/gprof.callg.blurb" 47 48 /* 49 * a constructed arc, 50 * with pointers to the namelist entry of the parent and the child, 51 * a count of how many times this arc was traversed, 52 * and pointers to the next parent of this child and 53 * the next child of this parent. 54 */ 55 struct arcstruct { 56 struct nl *arc_parentp; /* pointer to parent's nl entry */ 57 struct nl *arc_childp; /* pointer to child's nl entry */ 58 long arc_count; /* how calls from parent to child */ 59 double arc_time; /* time inherited along arc */ 60 double arc_childtime; /* childtime inherited along arc */ 61 struct arcstruct *arc_parentlist; /* parents-of-this-child list */ 62 struct arcstruct *arc_childlist; /* children-of-this-parent list */ 63 }; 64 typedef struct arcstruct arctype; 65 66 /* 67 * The symbol table; 68 * for each external in the specified file we gather 69 * its address, the number of calls and compute its share of cpu time. 70 */ 71 struct nl { 72 char *name; /* the name */ 73 unsigned long value; /* the pc entry point */ 74 unsigned long svalue; /* entry point aligned to histograms */ 75 double time; /* ticks in this routine */ 76 double childtime; /* cumulative ticks in children */ 77 long ncall; /* how many times called */ 78 long selfcalls; /* how many calls to self */ 79 double propfraction; /* what % of time propagates */ 80 double propself; /* how much self time propagates */ 81 double propchild; /* how much child time propagates */ 82 bool printflag; /* should this be printed? */ 83 int index; /* index in the graph list */ 84 int toporder; /* graph call chain top-sort order */ 85 int cycleno; /* internal number of cycle on */ 86 struct nl *cyclehead; /* pointer to head of cycle */ 87 struct nl *cnext; /* pointer to next member of cycle */ 88 arctype *parents; /* list of caller arcs */ 89 arctype *children; /* list of callee arcs */ 90 }; 91 typedef struct nl nltype; 92 93 nltype *nl; /* the whole namelist */ 94 nltype *npe; /* the virtual end of the namelist */ 95 int nname; /* the number of function names */ 96 97 /* 98 * flag which marks a nl entry as topologically ``busy'' 99 * flag which marks a nl entry as topologically ``not_numbered'' 100 */ 101 #define DFN_BUSY -1 102 #define DFN_NAN 0 103 104 /* 105 * namelist entries for cycle headers. 106 * the number of discovered cycles. 107 */ 108 nltype *cyclenl; /* cycle header namelist */ 109 int ncycle; /* number of cycles discovered */ 110 111 /* 112 * The header on the gmon.out file. 113 * gmon.out consists of one of these headers, 114 * and then an array of ncnt samples 115 * representing the discretized program counter values. 116 * this should be a struct phdr, but since everything is done 117 * as UNITs, this is in UNITs too. 118 */ 119 struct hdr { 120 UNIT *lowpc; 121 UNIT *highpc; 122 int ncnt; 123 }; 124 125 struct hdr h; 126 127 int debug; 128 129 /* 130 * Each discretized pc sample has 131 * a count of the number of samples in its range 132 */ 133 unsigned UNIT *samples; 134 135 unsigned long s_lowpc; /* lowpc from the profile file */ 136 unsigned long s_highpc; /* highpc from the profile file */ 137 unsigned lowpc, highpc; /* range profiled, in UNIT's */ 138 unsigned sampbytes; /* number of bytes of samples */ 139 int nsamples; /* number of samples */ 140 double actime; /* accumulated time thus far for putprofline */ 141 double totime; /* total time for all routines */ 142 double printtime; /* total of time being printed */ 143 double scale; /* scale factor converting samples to pc 144 values: each sample covers scale bytes */ 145 char *strtab; /* string table in core */ 146 off_t ssiz; /* size of the string table */ 147 struct exec xbuf; /* exec header of a.out */ 148 unsigned char *textspace; /* text space of a.out in core */ 149 150 /* 151 * option flags, from a to z. 152 */ 153 bool aflag; /* suppress static functions */ 154 bool bflag; /* blurbs, too */ 155 bool cflag; /* discovered call graph, too */ 156 bool dflag; /* debugging options */ 157 bool eflag; /* specific functions excluded */ 158 bool Eflag; /* functions excluded with time */ 159 bool fflag; /* specific functions requested */ 160 bool Fflag; /* functions requested with time */ 161 bool sflag; /* sum multiple gmon.out files */ 162 bool zflag; /* zero time/called functions, too */ 163 164 /* 165 * structure for various string lists 166 */ 167 struct stringlist { 168 struct stringlist *next; 169 char *string; 170 }; 171 struct stringlist *elist; 172 struct stringlist *Elist; 173 struct stringlist *flist; 174 struct stringlist *Flist; 175 176 /* 177 * function declarations 178 */ 179 addarc(); 180 int arccmp(); 181 arctype *arclookup(); 182 asgnsamples(); 183 printblurb(); 184 cyclelink(); 185 dfn(); 186 bool dfn_busy(); 187 dfn_findcycle(); 188 bool dfn_numbered(); 189 dfn_post_visit(); 190 dfn_pre_visit(); 191 dfn_self_cycle(); 192 doarcs(); 193 done(); 194 findcalls(); 195 flatprofheader(); 196 flatprofline(); 197 bool funcsymbol(); 198 getnfile(); 199 getpfile(); 200 getstrtab(); 201 getsymtab(); 202 gettextspace(); 203 gprofheader(); 204 gprofline(); 205 main(); 206 unsigned long max(); 207 int membercmp(); 208 unsigned long min(); 209 nltype *nllookup(); 210 FILE *openpfile(); 211 long operandlength(); 212 operandenum operandmode(); 213 char *operandname(); 214 printchildren(); 215 printcycle(); 216 printgprof(); 217 printmembers(); 218 printname(); 219 printparents(); 220 printprof(); 221 readsamples(); 222 unsigned long reladdr(); 223 sortchildren(); 224 sortmembers(); 225 sortparents(); 226 tally(); 227 timecmp(); 228 topcmp(); 229 int totalcmp(); 230 valcmp(); 231 232 #define LESSTHAN -1 233 #define EQUALTO 0 234 #define GREATERTHAN 1 235 236 #define DFNDEBUG 1 237 #define CYCLEDEBUG 2 238 #define ARCDEBUG 4 239 #define TALLYDEBUG 8 240 #define TIMEDEBUG 16 241 #define SAMPLEDEBUG 32 242 #define AOUTDEBUG 64 243 #define CALLSDEBUG 128 244 #define LOOKUPDEBUG 256 245 #define PROPDEBUG 512 246 #define ANYDEBUG 1024 247