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