xref: /csrg-svn/usr.bin/gprof/gprof.h (revision 4511)
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