xref: /csrg-svn/usr.bin/gprof/gprof.h (revision 4840)
1*4840Speter     /* sccsid:  @(#)gprof.h	1.5 (Berkeley) 11/09/81 */
24511Speter 
34511Speter #include <stdio.h>
44511Speter #include <sys/types.h>
54511Speter #include <sys/stat.h>
64511Speter #include <a.out.h>
74511Speter #include <pagsiz.h>
84511Speter #include "monitor.h"
94511Speter 
104511Speter     /*
114511Speter      *	ticks per second
124511Speter      */
134511Speter #define	HZ	60
144511Speter 
154511Speter typedef	short UNIT;		/* unit of profiling */
164511Speter char	*a_outname;
174511Speter #define	A_OUTNAME		"a.out"
184511Speter 
194560Speter char	*gmonname;
204560Speter #define	GMONNAME		"gmon.out"
214511Speter 
224511Speter     /*
234511Speter      *	a constructed arc,
244511Speter      *	    with pointers to the namelist entry of the parent and the child,
254511Speter      *	    a count of how many times this arc was traversed,
264511Speter      *	    and pointers to the next parent of this child and
274511Speter      *		the next child of this parent.
284511Speter      */
294511Speter struct arcstruct {
304511Speter     struct nl		*arc_parentp;	/* pointer to parent's nl entry */
314511Speter     struct nl		*arc_childp;	/* pointer to child's nl entry */
324511Speter     long		arc_count;	/* how calls from parent to child */
334511Speter     double		arc_time;	/* time inherited along arc */
344511Speter     double		arc_childtime;	/* childtime inherited along arc */
354511Speter     struct arcstruct	*arc_parentlist; /* parents-of-this-child list */
364511Speter     struct arcstruct	*arc_childlist;	/* children-of-this-parent list */
374511Speter };
384511Speter typedef struct arcstruct	arctype;
394511Speter 
404511Speter     /*
414511Speter      *	a raw arc,
424511Speter      *	    with pointers to the calling site and the called site
434511Speter      *	    and a count.
444511Speter      */
454511Speter struct rawarc {
464511Speter     unsigned long	raw_frompc;
474511Speter     unsigned long	raw_selfpc;
484511Speter     long		raw_count;
494511Speter };
504511Speter /*
514511Speter  * The symbol table;
524511Speter  * for each external in the specified file we gather
534511Speter  * its address, the number of calls and compute its share of cpu time.
544511Speter  */
554511Speter struct nl {
564511Speter 	char		*name;		/* the name */
574511Speter 	unsigned long	value;		/* the pc entry point */
584511Speter 	double		time;		/* ticks in this routine */
594560Speter 	double		childtime;	/* cumulative ticks in children */
604511Speter 	long		ncall;		/* how many times called */
614511Speter 	long		selfcalls;	/* how many calls to self */
624560Speter 	int		index;		/* index in the graph list */
634560Speter 	int		toporder;	/* graph call chain top-sort order */
644511Speter 	int		cycleno;	/* internal number of cycle on */
654511Speter 	struct nl	*cyclehead;	/* pointer to head of cycle */
664511Speter 	struct nl	*cnext;		/* pointer to next member of cycle */
674511Speter 	arctype		*parents;	/* list of caller arcs */
684511Speter 	arctype		*children;	/* list of callee arcs */
694511Speter };
704511Speter typedef struct nl	nltype;
714511Speter 
724511Speter nltype	*nl;			/* the whole namelist */
734511Speter nltype	*npe;			/* the virtual end of the namelist */
744511Speter int		nname;			/* the number of function names */
754511Speter 
764511Speter     /*
774511Speter      *	flag which marks a nl entry as topologically ``busy''
784511Speter      */
794511Speter #define	DFN_BUSY	-1
804511Speter 
814511Speter     /*
824511Speter      *	the number of cycles is estimated as this fraction of nnames
834511Speter      *	ncycles, the number of allocated cycle namelist entries,
844511Speter      *	not to be confused with cyclemax, the number of discovered cycles.
854511Speter      */
864511Speter #define	CYCLEFRACTION	( 0.10 )
874511Speter int	ncycles;		/* maximum allocated cycle headers */
884511Speter int	cyclemax;		/* number of cycles discovered */
894511Speter 
904511Speter /*
914560Speter  * The header on the gmon.out file.
924560Speter  * gmon.out consists of one of these headers,
934511Speter  * and then an array of ncnt samples
944511Speter  * representing the discretized program counter values.
954511Speter  *	this should be a struct phdr, but since everything is done
964511Speter  *	as UNITs, this is in UNITs too.
974511Speter  */
984511Speter struct hdr {
994511Speter 	UNIT	*lowpc;
1004511Speter 	UNIT	*highpc;
1014511Speter 	int	ncnt;
1024511Speter };
1034511Speter 
1044511Speter struct hdr	h;
1054511Speter 
1064511Speter int	debug;
1074511Speter 
1084511Speter /*
1094511Speter  * Each discretized pc sample has
1104511Speter  * a count of the number of samples in its range
1114511Speter  */
1124511Speter unsigned UNIT	*samples;
1134511Speter 
1144751Speter unsigned long	s_lowpc;	/* lowpc from the profile file */
1154751Speter unsigned long	s_highpc;	/* highpc from the profile file */
1164751Speter unsigned lowpc, highpc;		/* range profiled, in UNIT's */
1174511Speter unsigned sampbytes;		/* number of bytes of samples */
1184511Speter int	nsamples;		/* number of samples */
1194511Speter double	actime;			/* accumulated time thus far for putprofline */
1204511Speter double	totime;			/* total time for all routines */
1214511Speter double	scale;			/* scale factor converting samples to pc
1224511Speter 				   values: each sample covers scale bytes */
1234511Speter char	*strtab;		/* string table in core */
1244511Speter off_t	ssiz;			/* size of the string table */
1254511Speter struct	exec xbuf;		/* exec header of a.out */
1264722Speter unsigned char	*textspace;		/* text space of a.out in core */
1274511Speter 
1284511Speter int	zflg;
1294722Speter int	cflag;
1304511Speter 
1314511Speter     /*
1324511Speter      * booleans
1334511Speter      */
1344511Speter typedef int	bool;
1354511Speter #define	FALSE	0
1364511Speter #define	TRUE	1
1374511Speter 
138*4840Speter     /*
139*4840Speter      *	opcode of the `calls' instruction
140*4840Speter      */
141*4840Speter #define	CALLS	0xfb
1424511Speter 
143*4840Speter     /*
144*4840Speter      *	register for pc relative addressing
145*4840Speter      */
146*4840Speter #define	PC	0xf
147*4840Speter 
148*4840Speter enum opermodes {
149*4840Speter     literal, indexed, reg, regdef, autodec, autoinc, autoincdef,
150*4840Speter     bytedisp, bytedispdef, worddisp, worddispdef, longdisp, longdispdef,
151*4840Speter     immediate, absolute, byterel, bytereldef, wordrel, wordreldef,
152*4840Speter     longrel, longreldef
153*4840Speter };
154*4840Speter typedef enum opermodes	operandenum;
155*4840Speter 
156*4840Speter struct modebyte {
157*4840Speter     unsigned int	regfield:4;
158*4840Speter     unsigned int	modefield:4;
159*4840Speter };
160*4840Speter 
161*4840Speter     /*
162*4840Speter      *	function declarations
163*4840Speter      */
164*4840Speter 		addarc();
165*4840Speter int		arccmp();
1664511Speter arctype		*arclookup();
167*4840Speter 		asgnsamples();
168*4840Speter 		cyclelink();
169*4840Speter 		dfn();
1704511Speter bool		dfn_busy();
171*4840Speter 		dfn_findcycle();
172*4840Speter bool		dfn_numbered();
173*4840Speter 		dfn_post_visit();
174*4840Speter 		dfn_pre_visit();
175*4840Speter 		dfn_self_cycle();
176*4840Speter 		doarcs();
177*4840Speter 		done();
178*4840Speter 		findcalls();
179*4840Speter 		flatprofheader();
180*4840Speter 		flatprofline();
181*4840Speter 		getnfile();
182*4840Speter 		getpfile();
183*4840Speter 		getstrtab();
184*4840Speter 		getsymtab();
185*4840Speter 		gettextspace();
186*4840Speter 		gprofheader();
187*4840Speter 		gprofline();
188*4840Speter 		main();
189*4840Speter unsigned long	max();
190*4840Speter int		membercmp();
191*4840Speter unsigned long	min();
192*4840Speter nltype		*nllookup();
193*4840Speter FILE		*openpfile();
194*4840Speter long		operandlength();
195*4840Speter operandenum	operandmode();
196*4840Speter char		*operandname();
197*4840Speter 		printchildren();
198*4840Speter 		printcycle();
199*4840Speter 		printgprof();
200*4840Speter 		printmembers();
201*4840Speter 		printname();
202*4840Speter 		printparents();
203*4840Speter 		printprof();
204*4840Speter 		readsamples();
205*4840Speter unsigned long	reladdr();
206*4840Speter 		sortchildren();
207*4840Speter 		sortmembers();
208*4840Speter 		sortparents();
209*4840Speter 		tally();
210*4840Speter 		timecmp();
211*4840Speter 		topcmp();
212*4840Speter int		totalcmp();
213*4840Speter 		valcmp();
2144511Speter 
2154511Speter #define	LESSTHAN	-1
2164511Speter #define	EQUALTO		0
2174511Speter #define	GREATERTHAN	1
2184511Speter 
2194511Speter #define	DFNDEBUG	1
2204511Speter #define	CYCLEDEBUG	2
2214511Speter #define	ARCDEBUG	4
2224511Speter #define	TALLYDEBUG	8
2234511Speter #define	TIMEDEBUG	16
2244511Speter #define	SAMPLEDEBUG	32
2254511Speter #define	AOUTDEBUG	64
2264722Speter #define	CALLSDEBUG	128
2274722Speter #define	LOOKUPDEBUG	256
2284722Speter #define	ANYDEBUG	512
229