xref: /csrg-svn/usr.bin/gprof/gprof.h (revision 4870)
1*4870Smckusic     /* sccsid:  @(#)gprof.h	1.9 (Berkeley) 11/12/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>
8*4870Smckusic #include "gcrt0.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"
214867Smckusic #define	GMONSUM			"gmon.sum"
224511Speter 
234511Speter     /*
244511Speter      *	a constructed arc,
254511Speter      *	    with pointers to the namelist entry of the parent and the child,
264511Speter      *	    a count of how many times this arc was traversed,
274511Speter      *	    and pointers to the next parent of this child and
284511Speter      *		the next child of this parent.
294511Speter      */
304511Speter struct arcstruct {
314511Speter     struct nl		*arc_parentp;	/* pointer to parent's nl entry */
324511Speter     struct nl		*arc_childp;	/* pointer to child's nl entry */
334511Speter     long		arc_count;	/* how calls from parent to child */
344511Speter     double		arc_time;	/* time inherited along arc */
354511Speter     double		arc_childtime;	/* childtime inherited along arc */
364511Speter     struct arcstruct	*arc_parentlist; /* parents-of-this-child list */
374511Speter     struct arcstruct	*arc_childlist;	/* children-of-this-parent list */
384511Speter };
394511Speter typedef struct arcstruct	arctype;
404511Speter 
414511Speter /*
424511Speter  * The symbol table;
434511Speter  * for each external in the specified file we gather
444511Speter  * its address, the number of calls and compute its share of cpu time.
454511Speter  */
464511Speter struct nl {
474511Speter 	char		*name;		/* the name */
484511Speter 	unsigned long	value;		/* the pc entry point */
494511Speter 	double		time;		/* ticks in this routine */
504560Speter 	double		childtime;	/* cumulative ticks in children */
514511Speter 	long		ncall;		/* how many times called */
524511Speter 	long		selfcalls;	/* how many calls to self */
534560Speter 	int		index;		/* index in the graph list */
544560Speter 	int		toporder;	/* graph call chain top-sort order */
554511Speter 	int		cycleno;	/* internal number of cycle on */
564511Speter 	struct nl	*cyclehead;	/* pointer to head of cycle */
574511Speter 	struct nl	*cnext;		/* pointer to next member of cycle */
584511Speter 	arctype		*parents;	/* list of caller arcs */
594511Speter 	arctype		*children;	/* list of callee arcs */
604511Speter };
614511Speter typedef struct nl	nltype;
624511Speter 
634511Speter nltype	*nl;			/* the whole namelist */
644511Speter nltype	*npe;			/* the virtual end of the namelist */
654511Speter int		nname;			/* the number of function names */
664511Speter 
674511Speter     /*
684511Speter      *	flag which marks a nl entry as topologically ``busy''
694511Speter      */
704511Speter #define	DFN_BUSY	-1
714511Speter 
724511Speter     /*
734511Speter      *	the number of cycles is estimated as this fraction of nnames
744511Speter      *	ncycles, the number of allocated cycle namelist entries,
754511Speter      *	not to be confused with cyclemax, the number of discovered cycles.
764511Speter      */
774511Speter #define	CYCLEFRACTION	( 0.10 )
784511Speter int	ncycles;		/* maximum allocated cycle headers */
794511Speter int	cyclemax;		/* number of cycles discovered */
804511Speter 
814511Speter /*
824560Speter  * The header on the gmon.out file.
834560Speter  * gmon.out consists of one of these headers,
844511Speter  * and then an array of ncnt samples
854511Speter  * representing the discretized program counter values.
864511Speter  *	this should be a struct phdr, but since everything is done
874511Speter  *	as UNITs, this is in UNITs too.
884511Speter  */
894511Speter struct hdr {
904511Speter 	UNIT	*lowpc;
914511Speter 	UNIT	*highpc;
924511Speter 	int	ncnt;
934511Speter };
944511Speter 
954511Speter struct hdr	h;
964511Speter 
974511Speter int	debug;
984511Speter 
994511Speter /*
1004511Speter  * Each discretized pc sample has
1014511Speter  * a count of the number of samples in its range
1024511Speter  */
1034511Speter unsigned UNIT	*samples;
1044511Speter 
1054751Speter unsigned long	s_lowpc;	/* lowpc from the profile file */
1064751Speter unsigned long	s_highpc;	/* highpc from the profile file */
1074751Speter unsigned lowpc, highpc;		/* range profiled, in UNIT's */
1084511Speter unsigned sampbytes;		/* number of bytes of samples */
1094511Speter int	nsamples;		/* number of samples */
1104511Speter double	actime;			/* accumulated time thus far for putprofline */
1114511Speter double	totime;			/* total time for all routines */
1124511Speter double	scale;			/* scale factor converting samples to pc
1134511Speter 				   values: each sample covers scale bytes */
1144511Speter char	*strtab;		/* string table in core */
1154511Speter off_t	ssiz;			/* size of the string table */
1164511Speter struct	exec xbuf;		/* exec header of a.out */
1174722Speter unsigned char	*textspace;		/* text space of a.out in core */
1184511Speter 
1194855Speter     /*
1204855Speter      *	option flags, from a to z.
1214855Speter      */
1224855Speter int	aflag;				/* static functions, too */
1234855Speter int	bflag;				/* blurbs, too */
1244844Speter int	cflag;				/* discovered call graph, too */
1254867Smckusic int	sflag;				/* sum multiple gmon.out files */
1264855Speter int	zflag;				/* zero time/called functions, too */
1274511Speter 
1284511Speter     /*
1294511Speter      * booleans
1304511Speter      */
1314511Speter typedef int	bool;
1324511Speter #define	FALSE	0
1334511Speter #define	TRUE	1
1344511Speter 
1354840Speter     /*
1364840Speter      *	opcode of the `calls' instruction
1374840Speter      */
1384840Speter #define	CALLS	0xfb
1394511Speter 
1404840Speter     /*
1414840Speter      *	register for pc relative addressing
1424840Speter      */
1434840Speter #define	PC	0xf
1444840Speter 
1454840Speter enum opermodes {
1464840Speter     literal, indexed, reg, regdef, autodec, autoinc, autoincdef,
1474840Speter     bytedisp, bytedispdef, worddisp, worddispdef, longdisp, longdispdef,
1484840Speter     immediate, absolute, byterel, bytereldef, wordrel, wordreldef,
1494840Speter     longrel, longreldef
1504840Speter };
1514840Speter typedef enum opermodes	operandenum;
1524840Speter 
1534840Speter struct modebyte {
1544840Speter     unsigned int	regfield:4;
1554840Speter     unsigned int	modefield:4;
1564840Speter };
1574840Speter 
1584840Speter     /*
1594840Speter      *	function declarations
1604840Speter      */
1614840Speter 		addarc();
1624840Speter int		arccmp();
1634511Speter arctype		*arclookup();
1644840Speter 		asgnsamples();
1654855Speter 		printblurb();
1664840Speter 		cyclelink();
1674840Speter 		dfn();
1684511Speter bool		dfn_busy();
1694840Speter 		dfn_findcycle();
1704840Speter bool		dfn_numbered();
1714840Speter 		dfn_post_visit();
1724840Speter 		dfn_pre_visit();
1734840Speter 		dfn_self_cycle();
1744840Speter 		doarcs();
1754840Speter 		done();
1764840Speter 		findcalls();
1774840Speter 		flatprofheader();
1784840Speter 		flatprofline();
1794844Speter bool		funcsymbol();
1804840Speter 		getnfile();
1814840Speter 		getpfile();
1824840Speter 		getstrtab();
1834840Speter 		getsymtab();
1844840Speter 		gettextspace();
1854840Speter 		gprofheader();
1864840Speter 		gprofline();
1874840Speter 		main();
1884840Speter unsigned long	max();
1894840Speter int		membercmp();
1904840Speter unsigned long	min();
1914840Speter nltype		*nllookup();
1924840Speter FILE		*openpfile();
1934840Speter long		operandlength();
1944840Speter operandenum	operandmode();
1954840Speter char		*operandname();
1964840Speter 		printchildren();
1974840Speter 		printcycle();
1984840Speter 		printgprof();
1994840Speter 		printmembers();
2004840Speter 		printname();
2014840Speter 		printparents();
2024840Speter 		printprof();
2034840Speter 		readsamples();
2044840Speter unsigned long	reladdr();
2054840Speter 		sortchildren();
2064840Speter 		sortmembers();
2074840Speter 		sortparents();
2084840Speter 		tally();
2094840Speter 		timecmp();
2104840Speter 		topcmp();
2114840Speter int		totalcmp();
2124840Speter 		valcmp();
2134511Speter 
2144511Speter #define	LESSTHAN	-1
2154511Speter #define	EQUALTO		0
2164511Speter #define	GREATERTHAN	1
2174511Speter 
2184511Speter #define	DFNDEBUG	1
2194511Speter #define	CYCLEDEBUG	2
2204511Speter #define	ARCDEBUG	4
2214511Speter #define	TALLYDEBUG	8
2224511Speter #define	TIMEDEBUG	16
2234511Speter #define	SAMPLEDEBUG	32
2244511Speter #define	AOUTDEBUG	64
2254722Speter #define	CALLSDEBUG	128
2264722Speter #define	LOOKUPDEBUG	256
2274722Speter #define	ANYDEBUG	512
228