1*4511Speter /* sccsid: @(#)gprof.h 1.1 (Berkeley) 10/15/81 */ 2*4511Speter 3*4511Speter #include <stdio.h> 4*4511Speter #include <sys/types.h> 5*4511Speter #include <sys/stat.h> 6*4511Speter #include <a.out.h> 7*4511Speter #include <pagsiz.h> 8*4511Speter #include "monitor.h" 9*4511Speter 10*4511Speter /* 11*4511Speter * ticks per second 12*4511Speter */ 13*4511Speter #define HZ 60 14*4511Speter 15*4511Speter typedef short UNIT; /* unit of profiling */ 16*4511Speter char *a_outname; 17*4511Speter #define A_OUTNAME "a.out" 18*4511Speter 19*4511Speter char *dmonname; 20*4511Speter #define DMONNAME "dmon.out" 21*4511Speter 22*4511Speter /* 23*4511Speter * a constructed arc, 24*4511Speter * with pointers to the namelist entry of the parent and the child, 25*4511Speter * a count of how many times this arc was traversed, 26*4511Speter * and pointers to the next parent of this child and 27*4511Speter * the next child of this parent. 28*4511Speter */ 29*4511Speter struct arcstruct { 30*4511Speter struct nl *arc_parentp; /* pointer to parent's nl entry */ 31*4511Speter struct nl *arc_childp; /* pointer to child's nl entry */ 32*4511Speter long arc_count; /* how calls from parent to child */ 33*4511Speter double arc_time; /* time inherited along arc */ 34*4511Speter double arc_childtime; /* childtime inherited along arc */ 35*4511Speter struct arcstruct *arc_parentlist; /* parents-of-this-child list */ 36*4511Speter struct arcstruct *arc_childlist; /* children-of-this-parent list */ 37*4511Speter }; 38*4511Speter typedef struct arcstruct arctype; 39*4511Speter 40*4511Speter /* 41*4511Speter * a raw arc, 42*4511Speter * with pointers to the calling site and the called site 43*4511Speter * and a count. 44*4511Speter */ 45*4511Speter struct rawarc { 46*4511Speter unsigned long raw_frompc; 47*4511Speter unsigned long raw_selfpc; 48*4511Speter long raw_count; 49*4511Speter }; 50*4511Speter /* 51*4511Speter * The symbol table; 52*4511Speter * for each external in the specified file we gather 53*4511Speter * its address, the number of calls and compute its share of cpu time. 54*4511Speter */ 55*4511Speter struct nl { 56*4511Speter char *name; /* the name */ 57*4511Speter unsigned long value; /* the pc entry point */ 58*4511Speter double time; /* ticks in this routine */ 59*4511Speter double childtime; /* cumulative ticks in dynamic childs */ 60*4511Speter long ncall; /* how many times called */ 61*4511Speter long selfcalls; /* how many calls to self */ 62*4511Speter int index; /* index in the dynamic list */ 63*4511Speter int toporder; /* dynamic call chain top-sort order */ 64*4511Speter int cycleno; /* internal number of cycle on */ 65*4511Speter struct nl *cyclehead; /* pointer to head of cycle */ 66*4511Speter struct nl *cnext; /* pointer to next member of cycle */ 67*4511Speter arctype *parents; /* list of caller arcs */ 68*4511Speter arctype *children; /* list of callee arcs */ 69*4511Speter }; 70*4511Speter typedef struct nl nltype; 71*4511Speter 72*4511Speter nltype *nl; /* the whole namelist */ 73*4511Speter nltype *npe; /* the virtual end of the namelist */ 74*4511Speter int nname; /* the number of function names */ 75*4511Speter 76*4511Speter /* 77*4511Speter * flag which marks a nl entry as topologically ``busy'' 78*4511Speter */ 79*4511Speter #define DFN_BUSY -1 80*4511Speter 81*4511Speter /* 82*4511Speter * the number of cycles is estimated as this fraction of nnames 83*4511Speter * ncycles, the number of allocated cycle namelist entries, 84*4511Speter * not to be confused with cyclemax, the number of discovered cycles. 85*4511Speter */ 86*4511Speter #define CYCLEFRACTION ( 0.10 ) 87*4511Speter int ncycles; /* maximum allocated cycle headers */ 88*4511Speter int cyclemax; /* number of cycles discovered */ 89*4511Speter 90*4511Speter /* 91*4511Speter * The header on the dmon.out file. 92*4511Speter * dmon.out consists of one of these headers, 93*4511Speter * and then an array of ncnt samples 94*4511Speter * representing the discretized program counter values. 95*4511Speter * this should be a struct phdr, but since everything is done 96*4511Speter * as UNITs, this is in UNITs too. 97*4511Speter */ 98*4511Speter struct hdr { 99*4511Speter UNIT *lowpc; 100*4511Speter UNIT *highpc; 101*4511Speter int ncnt; 102*4511Speter }; 103*4511Speter 104*4511Speter struct hdr h; 105*4511Speter 106*4511Speter int debug; 107*4511Speter 108*4511Speter /* 109*4511Speter * Each discretized pc sample has 110*4511Speter * a count of the number of samples in its range 111*4511Speter */ 112*4511Speter unsigned UNIT *samples; 113*4511Speter 114*4511Speter unsigned lowpc, highpc; /* range profiled */ 115*4511Speter unsigned sampbytes; /* number of bytes of samples */ 116*4511Speter int nsamples; /* number of samples */ 117*4511Speter double actime; /* accumulated time thus far for putprofline */ 118*4511Speter double totime; /* total time for all routines */ 119*4511Speter double scale; /* scale factor converting samples to pc 120*4511Speter values: each sample covers scale bytes */ 121*4511Speter char *strtab; /* string table in core */ 122*4511Speter off_t ssiz; /* size of the string table */ 123*4511Speter struct exec xbuf; /* exec header of a.out */ 124*4511Speter 125*4511Speter int zflg; 126*4511Speter 127*4511Speter /* 128*4511Speter * booleans 129*4511Speter */ 130*4511Speter typedef int bool; 131*4511Speter #define FALSE 0 132*4511Speter #define TRUE 1 133*4511Speter 134*4511Speter int timecmp(); 135*4511Speter int valcmp(); 136*4511Speter int totalcmp(); 137*4511Speter 138*4511Speter nltype *nllookup(); 139*4511Speter arctype *arclookup(); 140*4511Speter bool dfn_busy(); 141*4511Speter 142*4511Speter #define LESSTHAN -1 143*4511Speter #define EQUALTO 0 144*4511Speter #define GREATERTHAN 1 145*4511Speter 146*4511Speter #define DFNDEBUG 1 147*4511Speter #define CYCLEDEBUG 2 148*4511Speter #define ARCDEBUG 4 149*4511Speter #define TALLYDEBUG 8 150*4511Speter #define TIMEDEBUG 16 151*4511Speter #define SAMPLEDEBUG 32 152*4511Speter #define AOUTDEBUG 64 153*4511Speter #define ANYDEBUG 128 154