1*21965Sdist /* 2*21965Sdist * Copyright (c) 1983 Regents of the University of California. 3*21965Sdist * All rights reserved. The Berkeley software License Agreement 4*21965Sdist * specifies the terms and conditions for redistribution. 5*21965Sdist * 6*21965Sdist * @(#)gprof.h 5.1 (Berkeley) 06/04/85 7*21965Sdist */ 84511Speter 94511Speter #include <stdio.h> 104511Speter #include <sys/types.h> 114511Speter #include <sys/stat.h> 124511Speter #include <a.out.h> 134870Smckusic #include "gcrt0.h" 144511Speter 1511799Speter #if vax 1611799Speter # include "vax.h" 1711799Speter #endif 1811799Speter #if sun 1911799Speter # include "sun.h" 2011799Speter #endif 2111799Speter 2211799Speter 234511Speter /* 247129Speter * who am i, for error messages. 257129Speter */ 267129Speter char *whoami; 277129Speter 287129Speter /* 297174Speter * booleans 307174Speter */ 317174Speter typedef int bool; 327174Speter #define FALSE 0 337174Speter #define TRUE 1 347174Speter 357174Speter /* 364511Speter * ticks per second 374511Speter */ 3810250Speter long hz; 394511Speter 404511Speter typedef short UNIT; /* unit of profiling */ 414511Speter char *a_outname; 424511Speter #define A_OUTNAME "a.out" 434511Speter 444560Speter char *gmonname; 454560Speter #define GMONNAME "gmon.out" 464867Smckusic #define GMONSUM "gmon.sum" 474873Smckusic 484873Smckusic /* 4910286Speter * blurbs on the flat and graph profiles. 504873Smckusic */ 5116862Smckusick #define FLAT_BLURB "/usr/lib/gprof.flat" 5216862Smckusick #define CALLG_BLURB "/usr/lib/gprof.callg" 534511Speter 544511Speter /* 554511Speter * a constructed arc, 564511Speter * with pointers to the namelist entry of the parent and the child, 574511Speter * a count of how many times this arc was traversed, 584511Speter * and pointers to the next parent of this child and 594511Speter * the next child of this parent. 604511Speter */ 614511Speter struct arcstruct { 624511Speter struct nl *arc_parentp; /* pointer to parent's nl entry */ 634511Speter struct nl *arc_childp; /* pointer to child's nl entry */ 644511Speter long arc_count; /* how calls from parent to child */ 654511Speter double arc_time; /* time inherited along arc */ 664511Speter double arc_childtime; /* childtime inherited along arc */ 674511Speter struct arcstruct *arc_parentlist; /* parents-of-this-child list */ 684511Speter struct arcstruct *arc_childlist; /* children-of-this-parent list */ 694511Speter }; 704511Speter typedef struct arcstruct arctype; 714511Speter 727129Speter /* 737129Speter * The symbol table; 747129Speter * for each external in the specified file we gather 757129Speter * its address, the number of calls and compute its share of cpu time. 767129Speter */ 774511Speter struct nl { 787129Speter char *name; /* the name */ 797129Speter unsigned long value; /* the pc entry point */ 8011799Speter unsigned long svalue; /* entry point aligned to histograms */ 817129Speter double time; /* ticks in this routine */ 827129Speter double childtime; /* cumulative ticks in children */ 837129Speter long ncall; /* how many times called */ 847129Speter long selfcalls; /* how many calls to self */ 857224Speter double propfraction; /* what % of time propagates */ 867224Speter double propself; /* how much self time propagates */ 877224Speter double propchild; /* how much child time propagates */ 887174Speter bool printflag; /* should this be printed? */ 897129Speter int index; /* index in the graph list */ 907129Speter int toporder; /* graph call chain top-sort order */ 917129Speter int cycleno; /* internal number of cycle on */ 927129Speter struct nl *cyclehead; /* pointer to head of cycle */ 937129Speter struct nl *cnext; /* pointer to next member of cycle */ 947129Speter arctype *parents; /* list of caller arcs */ 957129Speter arctype *children; /* list of callee arcs */ 964511Speter }; 974511Speter typedef struct nl nltype; 984511Speter 994511Speter nltype *nl; /* the whole namelist */ 1004511Speter nltype *npe; /* the virtual end of the namelist */ 1017129Speter int nname; /* the number of function names */ 1024511Speter 1034511Speter /* 1044511Speter * flag which marks a nl entry as topologically ``busy'' 10510284Speter * flag which marks a nl entry as topologically ``not_numbered'' 1064511Speter */ 1074511Speter #define DFN_BUSY -1 10810284Speter #define DFN_NAN 0 1094511Speter 1104511Speter /* 1117129Speter * namelist entries for cycle headers. 1127129Speter * the number of discovered cycles. 1134511Speter */ 1147129Speter nltype *cyclenl; /* cycle header namelist */ 1157129Speter int ncycle; /* number of cycles discovered */ 1164511Speter 1177129Speter /* 1187129Speter * The header on the gmon.out file. 1197129Speter * gmon.out consists of one of these headers, 1207129Speter * and then an array of ncnt samples 1217129Speter * representing the discretized program counter values. 1227129Speter * this should be a struct phdr, but since everything is done 1237129Speter * as UNITs, this is in UNITs too. 1247129Speter */ 1254511Speter struct hdr { 1267129Speter UNIT *lowpc; 1277129Speter UNIT *highpc; 1287129Speter int ncnt; 1294511Speter }; 1304511Speter 1314511Speter struct hdr h; 1324511Speter 1334511Speter int debug; 1344511Speter 1357129Speter /* 1367129Speter * Each discretized pc sample has 1377129Speter * a count of the number of samples in its range 1387129Speter */ 1394511Speter unsigned UNIT *samples; 1404511Speter 1414751Speter unsigned long s_lowpc; /* lowpc from the profile file */ 1424751Speter unsigned long s_highpc; /* highpc from the profile file */ 1434751Speter unsigned lowpc, highpc; /* range profiled, in UNIT's */ 1444511Speter unsigned sampbytes; /* number of bytes of samples */ 1454511Speter int nsamples; /* number of samples */ 1464511Speter double actime; /* accumulated time thus far for putprofline */ 1474511Speter double totime; /* total time for all routines */ 1487174Speter double printtime; /* total of time being printed */ 1494511Speter double scale; /* scale factor converting samples to pc 1504511Speter values: each sample covers scale bytes */ 1514511Speter char *strtab; /* string table in core */ 1524511Speter off_t ssiz; /* size of the string table */ 1534511Speter struct exec xbuf; /* exec header of a.out */ 1544722Speter unsigned char *textspace; /* text space of a.out in core */ 1554511Speter 1564855Speter /* 1574855Speter * option flags, from a to z. 1584855Speter */ 1597174Speter bool aflag; /* suppress static functions */ 1607174Speter bool bflag; /* blurbs, too */ 1617174Speter bool cflag; /* discovered call graph, too */ 1627174Speter bool dflag; /* debugging options */ 1637174Speter bool eflag; /* specific functions excluded */ 1647224Speter bool Eflag; /* functions excluded with time */ 1657174Speter bool fflag; /* specific functions requested */ 1667224Speter bool Fflag; /* functions requested with time */ 1677174Speter bool sflag; /* sum multiple gmon.out files */ 1687174Speter bool zflag; /* zero time/called functions, too */ 1694511Speter 1704511Speter /* 1717224Speter * structure for various string lists 1727224Speter */ 1737224Speter struct stringlist { 1747224Speter struct stringlist *next; 1757224Speter char *string; 1767224Speter }; 1777224Speter struct stringlist *elist; 1787224Speter struct stringlist *Elist; 1797224Speter struct stringlist *flist; 1807224Speter struct stringlist *Flist; 1817224Speter 1827224Speter /* 1834840Speter * function declarations 1844840Speter */ 1854840Speter addarc(); 1864840Speter int arccmp(); 1874511Speter arctype *arclookup(); 1884840Speter asgnsamples(); 1894855Speter printblurb(); 1904840Speter cyclelink(); 1914840Speter dfn(); 1924511Speter bool dfn_busy(); 1934840Speter dfn_findcycle(); 1944840Speter bool dfn_numbered(); 1954840Speter dfn_post_visit(); 1964840Speter dfn_pre_visit(); 1974840Speter dfn_self_cycle(); 19816851Smckusick nltype **doarcs(); 1994840Speter done(); 2004840Speter findcalls(); 2014840Speter flatprofheader(); 2024840Speter flatprofline(); 2034844Speter bool funcsymbol(); 2044840Speter getnfile(); 2054840Speter getpfile(); 2064840Speter getstrtab(); 2074840Speter getsymtab(); 2084840Speter gettextspace(); 2094840Speter gprofheader(); 2104840Speter gprofline(); 2114840Speter main(); 2124840Speter unsigned long max(); 2134840Speter int membercmp(); 2144840Speter unsigned long min(); 2154840Speter nltype *nllookup(); 2164840Speter FILE *openpfile(); 2174840Speter long operandlength(); 2184840Speter operandenum operandmode(); 2194840Speter char *operandname(); 2204840Speter printchildren(); 2214840Speter printcycle(); 2224840Speter printgprof(); 2234840Speter printmembers(); 2244840Speter printname(); 2254840Speter printparents(); 2264840Speter printprof(); 2274840Speter readsamples(); 2284840Speter unsigned long reladdr(); 2294840Speter sortchildren(); 2304840Speter sortmembers(); 2314840Speter sortparents(); 2324840Speter tally(); 2334840Speter timecmp(); 2344840Speter topcmp(); 2354840Speter int totalcmp(); 2364840Speter valcmp(); 2374511Speter 2384511Speter #define LESSTHAN -1 2394511Speter #define EQUALTO 0 2404511Speter #define GREATERTHAN 1 2414511Speter 2424511Speter #define DFNDEBUG 1 2434511Speter #define CYCLEDEBUG 2 2444511Speter #define ARCDEBUG 4 2454511Speter #define TALLYDEBUG 8 2464511Speter #define TIMEDEBUG 16 2474511Speter #define SAMPLEDEBUG 32 2484511Speter #define AOUTDEBUG 64 2494722Speter #define CALLSDEBUG 128 2504722Speter #define LOOKUPDEBUG 256 2517224Speter #define PROPDEBUG 512 2527224Speter #define ANYDEBUG 1024 253