xref: /csrg-svn/usr.bin/gprof/gprof.h (revision 7129)
1*7129Speter     /* sccsid:  @(#)gprof.h	1.11 (Berkeley) 06/08/82 */
24511Speter 
34511Speter #include <stdio.h>
44511Speter #include <sys/types.h>
54511Speter #include <sys/stat.h>
64511Speter #include <a.out.h>
74511Speter #include <pagsiz.h>
84870Smckusic #include "gcrt0.h"
94511Speter 
104511Speter     /*
11*7129Speter      *	who am i, for error messages.
12*7129Speter      */
13*7129Speter char	*whoami;
14*7129Speter 
15*7129Speter     /*
164511Speter      *	ticks per second
174511Speter      */
184511Speter #define	HZ	60
194511Speter 
204511Speter typedef	short UNIT;		/* unit of profiling */
214511Speter char	*a_outname;
224511Speter #define	A_OUTNAME		"a.out"
234511Speter 
244560Speter char	*gmonname;
254560Speter #define	GMONNAME		"gmon.out"
264867Smckusic #define	GMONSUM			"gmon.sum"
274873Smckusic 
284873Smckusic     /*
294873Smckusic      *	the directory where the descriptions of the fields
304873Smckusic      *	of the profiles are kept.
314873Smckusic      */
324873Smckusic #define	BLURBLIB		"/usr/lib/"
334511Speter 
344511Speter     /*
354511Speter      *	a constructed arc,
364511Speter      *	    with pointers to the namelist entry of the parent and the child,
374511Speter      *	    a count of how many times this arc was traversed,
384511Speter      *	    and pointers to the next parent of this child and
394511Speter      *		the next child of this parent.
404511Speter      */
414511Speter struct arcstruct {
424511Speter     struct nl		*arc_parentp;	/* pointer to parent's nl entry */
434511Speter     struct nl		*arc_childp;	/* pointer to child's nl entry */
444511Speter     long		arc_count;	/* how calls from parent to child */
454511Speter     double		arc_time;	/* time inherited along arc */
464511Speter     double		arc_childtime;	/* childtime inherited along arc */
474511Speter     struct arcstruct	*arc_parentlist; /* parents-of-this-child list */
484511Speter     struct arcstruct	*arc_childlist;	/* children-of-this-parent list */
494511Speter };
504511Speter typedef struct arcstruct	arctype;
514511Speter 
52*7129Speter     /*
53*7129Speter      * The symbol table;
54*7129Speter      * for each external in the specified file we gather
55*7129Speter      * its address, the number of calls and compute its share of cpu time.
56*7129Speter      */
574511Speter struct nl {
58*7129Speter     char		*name;		/* the name */
59*7129Speter     unsigned long	value;		/* the pc entry point */
60*7129Speter     double		time;		/* ticks in this routine */
61*7129Speter     double		childtime;	/* cumulative ticks in children */
62*7129Speter     long		ncall;		/* how many times called */
63*7129Speter     long		selfcalls;	/* how many calls to self */
64*7129Speter     int			index;		/* index in the graph list */
65*7129Speter     int			toporder;	/* graph call chain top-sort order */
66*7129Speter     int			cycleno;	/* internal number of cycle on */
67*7129Speter     struct nl		*cyclehead;	/* pointer to head of cycle */
68*7129Speter     struct nl		*cnext;		/* pointer to next member of cycle */
69*7129Speter     arctype		*parents;	/* list of caller arcs */
70*7129Speter     arctype		*children;	/* list of callee arcs */
714511Speter };
724511Speter typedef struct nl	nltype;
734511Speter 
744511Speter nltype	*nl;			/* the whole namelist */
754511Speter nltype	*npe;			/* the virtual end of the namelist */
76*7129Speter int	nname;			/* the number of function names */
774511Speter 
784511Speter     /*
794511Speter      *	flag which marks a nl entry as topologically ``busy''
804511Speter      */
814511Speter #define	DFN_BUSY	-1
824511Speter 
834511Speter     /*
84*7129Speter      *	namelist entries for cycle headers.
85*7129Speter      *	the number of discovered cycles.
864511Speter      */
87*7129Speter nltype	*cyclenl;		/* cycle header namelist */
88*7129Speter int	ncycle;			/* number of cycles discovered */
894511Speter 
90*7129Speter     /*
91*7129Speter      * The header on the gmon.out file.
92*7129Speter      * gmon.out consists of one of these headers,
93*7129Speter      * and then an array of ncnt samples
94*7129Speter      * representing the discretized program counter values.
95*7129Speter      *	this should be a struct phdr, but since everything is done
96*7129Speter      *	as UNITs, this is in UNITs too.
97*7129Speter      */
984511Speter struct hdr {
99*7129Speter     UNIT	*lowpc;
100*7129Speter     UNIT	*highpc;
101*7129Speter     int	ncnt;
1024511Speter };
1034511Speter 
1044511Speter struct hdr	h;
1054511Speter 
1064511Speter int	debug;
1074511Speter 
108*7129Speter     /*
109*7129Speter      * Each discretized pc sample has
110*7129Speter      * a count of the number of samples in its range
111*7129Speter      */
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 
1284855Speter     /*
1294855Speter      *	option flags, from a to z.
1304855Speter      */
1314855Speter int	aflag;				/* static functions, too */
1324855Speter int	bflag;				/* blurbs, too */
1334844Speter int	cflag;				/* discovered call graph, too */
1344867Smckusic int	sflag;				/* sum multiple gmon.out files */
1354855Speter int	zflag;				/* zero time/called functions, too */
1364511Speter 
1374511Speter     /*
1384511Speter      * booleans
1394511Speter      */
1404511Speter typedef int	bool;
1414511Speter #define	FALSE	0
1424511Speter #define	TRUE	1
1434511Speter 
1444840Speter     /*
1454840Speter      *	opcode of the `calls' instruction
1464840Speter      */
1474840Speter #define	CALLS	0xfb
1484511Speter 
1494840Speter     /*
1504840Speter      *	register for pc relative addressing
1514840Speter      */
1524840Speter #define	PC	0xf
1534840Speter 
1544840Speter enum opermodes {
1554840Speter     literal, indexed, reg, regdef, autodec, autoinc, autoincdef,
1564840Speter     bytedisp, bytedispdef, worddisp, worddispdef, longdisp, longdispdef,
1574840Speter     immediate, absolute, byterel, bytereldef, wordrel, wordreldef,
1584840Speter     longrel, longreldef
1594840Speter };
1604840Speter typedef enum opermodes	operandenum;
1614840Speter 
1624840Speter struct modebyte {
1634840Speter     unsigned int	regfield:4;
1644840Speter     unsigned int	modefield:4;
1654840Speter };
1664840Speter 
1674840Speter     /*
1684840Speter      *	function declarations
1694840Speter      */
1704840Speter 		addarc();
1714840Speter int		arccmp();
1724511Speter arctype		*arclookup();
1734840Speter 		asgnsamples();
1744855Speter 		printblurb();
1754840Speter 		cyclelink();
1764840Speter 		dfn();
1774511Speter bool		dfn_busy();
1784840Speter 		dfn_findcycle();
1794840Speter bool		dfn_numbered();
1804840Speter 		dfn_post_visit();
1814840Speter 		dfn_pre_visit();
1824840Speter 		dfn_self_cycle();
1834840Speter 		doarcs();
1844840Speter 		done();
1854840Speter 		findcalls();
1864840Speter 		flatprofheader();
1874840Speter 		flatprofline();
1884844Speter bool		funcsymbol();
1894840Speter 		getnfile();
1904840Speter 		getpfile();
1914840Speter 		getstrtab();
1924840Speter 		getsymtab();
1934840Speter 		gettextspace();
1944840Speter 		gprofheader();
1954840Speter 		gprofline();
1964840Speter 		main();
1974840Speter unsigned long	max();
1984840Speter int		membercmp();
1994840Speter unsigned long	min();
2004840Speter nltype		*nllookup();
2014840Speter FILE		*openpfile();
2024840Speter long		operandlength();
2034840Speter operandenum	operandmode();
2044840Speter char		*operandname();
2054840Speter 		printchildren();
2064840Speter 		printcycle();
2074840Speter 		printgprof();
2084840Speter 		printmembers();
2094840Speter 		printname();
2104840Speter 		printparents();
2114840Speter 		printprof();
2124840Speter 		readsamples();
2134840Speter unsigned long	reladdr();
2144840Speter 		sortchildren();
2154840Speter 		sortmembers();
2164840Speter 		sortparents();
2174840Speter 		tally();
2184840Speter 		timecmp();
2194840Speter 		topcmp();
2204840Speter int		totalcmp();
2214840Speter 		valcmp();
2224511Speter 
2234511Speter #define	LESSTHAN	-1
2244511Speter #define	EQUALTO		0
2254511Speter #define	GREATERTHAN	1
2264511Speter 
2274511Speter #define	DFNDEBUG	1
2284511Speter #define	CYCLEDEBUG	2
2294511Speter #define	ARCDEBUG	4
2304511Speter #define	TALLYDEBUG	8
2314511Speter #define	TIMEDEBUG	16
2324511Speter #define	SAMPLEDEBUG	32
2334511Speter #define	AOUTDEBUG	64
2344722Speter #define	CALLSDEBUG	128
2354722Speter #define	LOOKUPDEBUG	256
2364722Speter #define	ANYDEBUG	512
237