|
|
1.1 ! root 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) 6/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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.