xref: /csrg-svn/usr.bin/gprof/gprof.h (revision 7224)
1*7224Speter     /* sccsid:  @(#)gprof.h	1.13 (Berkeley) 06/18/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     /*
117129Speter      *	who am i, for error messages.
127129Speter      */
137129Speter char	*whoami;
147129Speter 
157129Speter     /*
167174Speter      * booleans
177174Speter      */
187174Speter typedef int	bool;
197174Speter #define	FALSE	0
207174Speter #define	TRUE	1
217174Speter 
227174Speter     /*
237174Speter      *	opcode of the `calls' instruction
247174Speter      */
257174Speter #define	CALLS	0xfb
267174Speter 
277174Speter     /*
284511Speter      *	ticks per second
294511Speter      */
304511Speter #define	HZ	60
314511Speter 
324511Speter typedef	short UNIT;		/* unit of profiling */
334511Speter char	*a_outname;
344511Speter #define	A_OUTNAME		"a.out"
354511Speter 
364560Speter char	*gmonname;
374560Speter #define	GMONNAME		"gmon.out"
384867Smckusic #define	GMONSUM			"gmon.sum"
394873Smckusic 
404873Smckusic     /*
414873Smckusic      *	the directory where the descriptions of the fields
424873Smckusic      *	of the profiles are kept.
434873Smckusic      */
444873Smckusic #define	BLURBLIB		"/usr/lib/"
454511Speter 
464511Speter     /*
474511Speter      *	a constructed arc,
484511Speter      *	    with pointers to the namelist entry of the parent and the child,
494511Speter      *	    a count of how many times this arc was traversed,
504511Speter      *	    and pointers to the next parent of this child and
514511Speter      *		the next child of this parent.
524511Speter      */
534511Speter struct arcstruct {
544511Speter     struct nl		*arc_parentp;	/* pointer to parent's nl entry */
554511Speter     struct nl		*arc_childp;	/* pointer to child's nl entry */
564511Speter     long		arc_count;	/* how calls from parent to child */
574511Speter     double		arc_time;	/* time inherited along arc */
584511Speter     double		arc_childtime;	/* childtime inherited along arc */
594511Speter     struct arcstruct	*arc_parentlist; /* parents-of-this-child list */
604511Speter     struct arcstruct	*arc_childlist;	/* children-of-this-parent list */
614511Speter };
624511Speter typedef struct arcstruct	arctype;
634511Speter 
647129Speter     /*
657129Speter      * The symbol table;
667129Speter      * for each external in the specified file we gather
677129Speter      * its address, the number of calls and compute its share of cpu time.
687129Speter      */
694511Speter struct nl {
707129Speter     char		*name;		/* the name */
717129Speter     unsigned long	value;		/* the pc entry point */
727129Speter     double		time;		/* ticks in this routine */
737129Speter     double		childtime;	/* cumulative ticks in children */
747129Speter     long		ncall;		/* how many times called */
757129Speter     long		selfcalls;	/* how many calls to self */
76*7224Speter     double		propfraction;	/* what % of time propagates */
77*7224Speter     double		propself;	/* how much self time propagates */
78*7224Speter     double		propchild;	/* how much child time propagates */
797174Speter     bool		printflag;	/* should this be printed? */
807129Speter     int			index;		/* index in the graph list */
817129Speter     int			toporder;	/* graph call chain top-sort order */
827129Speter     int			cycleno;	/* internal number of cycle on */
837129Speter     struct nl		*cyclehead;	/* pointer to head of cycle */
847129Speter     struct nl		*cnext;		/* pointer to next member of cycle */
857129Speter     arctype		*parents;	/* list of caller arcs */
867129Speter     arctype		*children;	/* list of callee arcs */
874511Speter };
884511Speter typedef struct nl	nltype;
894511Speter 
904511Speter nltype	*nl;			/* the whole namelist */
914511Speter nltype	*npe;			/* the virtual end of the namelist */
927129Speter int	nname;			/* the number of function names */
934511Speter 
944511Speter     /*
954511Speter      *	flag which marks a nl entry as topologically ``busy''
964511Speter      */
974511Speter #define	DFN_BUSY	-1
984511Speter 
994511Speter     /*
1007129Speter      *	namelist entries for cycle headers.
1017129Speter      *	the number of discovered cycles.
1024511Speter      */
1037129Speter nltype	*cyclenl;		/* cycle header namelist */
1047129Speter int	ncycle;			/* number of cycles discovered */
1054511Speter 
1067129Speter     /*
1077129Speter      * The header on the gmon.out file.
1087129Speter      * gmon.out consists of one of these headers,
1097129Speter      * and then an array of ncnt samples
1107129Speter      * representing the discretized program counter values.
1117129Speter      *	this should be a struct phdr, but since everything is done
1127129Speter      *	as UNITs, this is in UNITs too.
1137129Speter      */
1144511Speter struct hdr {
1157129Speter     UNIT	*lowpc;
1167129Speter     UNIT	*highpc;
1177129Speter     int	ncnt;
1184511Speter };
1194511Speter 
1204511Speter struct hdr	h;
1214511Speter 
1224511Speter int	debug;
1234511Speter 
1247129Speter     /*
1257129Speter      * Each discretized pc sample has
1267129Speter      * a count of the number of samples in its range
1277129Speter      */
1284511Speter unsigned UNIT	*samples;
1294511Speter 
1304751Speter unsigned long	s_lowpc;	/* lowpc from the profile file */
1314751Speter unsigned long	s_highpc;	/* highpc from the profile file */
1324751Speter unsigned lowpc, highpc;		/* range profiled, in UNIT's */
1334511Speter unsigned sampbytes;		/* number of bytes of samples */
1344511Speter int	nsamples;		/* number of samples */
1354511Speter double	actime;			/* accumulated time thus far for putprofline */
1364511Speter double	totime;			/* total time for all routines */
1377174Speter double	printtime;		/* total of time being printed */
1384511Speter double	scale;			/* scale factor converting samples to pc
1394511Speter 				   values: each sample covers scale bytes */
1404511Speter char	*strtab;		/* string table in core */
1414511Speter off_t	ssiz;			/* size of the string table */
1424511Speter struct	exec xbuf;		/* exec header of a.out */
1434722Speter unsigned char	*textspace;		/* text space of a.out in core */
1444511Speter 
1454855Speter     /*
1464855Speter      *	option flags, from a to z.
1474855Speter      */
1487174Speter bool	aflag;				/* suppress static functions */
1497174Speter bool	bflag;				/* blurbs, too */
1507174Speter bool	cflag;				/* discovered call graph, too */
1517174Speter bool	dflag;				/* debugging options */
1527174Speter bool	eflag;				/* specific functions excluded */
153*7224Speter bool	Eflag;				/* functions excluded with time */
1547174Speter bool	fflag;				/* specific functions requested */
155*7224Speter bool	Fflag;				/* functions requested with time */
1567174Speter bool	sflag;				/* sum multiple gmon.out files */
1577174Speter bool	zflag;				/* zero time/called functions, too */
1584511Speter 
1594511Speter     /*
160*7224Speter      *	structure for various string lists
161*7224Speter      */
162*7224Speter struct stringlist {
163*7224Speter     struct stringlist	*next;
164*7224Speter     char		*string;
165*7224Speter };
166*7224Speter struct stringlist	*elist;
167*7224Speter struct stringlist	*Elist;
168*7224Speter struct stringlist	*flist;
169*7224Speter struct stringlist	*Flist;
170*7224Speter 
171*7224Speter     /*
1724840Speter      *	register for pc relative addressing
1734840Speter      */
1744840Speter #define	PC	0xf
1754840Speter 
1764840Speter enum opermodes {
1774840Speter     literal, indexed, reg, regdef, autodec, autoinc, autoincdef,
1784840Speter     bytedisp, bytedispdef, worddisp, worddispdef, longdisp, longdispdef,
1794840Speter     immediate, absolute, byterel, bytereldef, wordrel, wordreldef,
1804840Speter     longrel, longreldef
1814840Speter };
1824840Speter typedef enum opermodes	operandenum;
1834840Speter 
1844840Speter struct modebyte {
1854840Speter     unsigned int	regfield:4;
1864840Speter     unsigned int	modefield:4;
1874840Speter };
1884840Speter 
1894840Speter     /*
1904840Speter      *	function declarations
1914840Speter      */
1924840Speter 		addarc();
1934840Speter int		arccmp();
1944511Speter arctype		*arclookup();
1954840Speter 		asgnsamples();
1964855Speter 		printblurb();
1974840Speter 		cyclelink();
1984840Speter 		dfn();
1994511Speter bool		dfn_busy();
2004840Speter 		dfn_findcycle();
2014840Speter bool		dfn_numbered();
2024840Speter 		dfn_post_visit();
2034840Speter 		dfn_pre_visit();
2044840Speter 		dfn_self_cycle();
2054840Speter 		doarcs();
2064840Speter 		done();
2074840Speter 		findcalls();
2084840Speter 		flatprofheader();
2094840Speter 		flatprofline();
2104844Speter bool		funcsymbol();
2114840Speter 		getnfile();
2124840Speter 		getpfile();
2134840Speter 		getstrtab();
2144840Speter 		getsymtab();
2154840Speter 		gettextspace();
2164840Speter 		gprofheader();
2174840Speter 		gprofline();
2184840Speter 		main();
2194840Speter unsigned long	max();
2204840Speter int		membercmp();
2214840Speter unsigned long	min();
2224840Speter nltype		*nllookup();
2234840Speter FILE		*openpfile();
2244840Speter long		operandlength();
2254840Speter operandenum	operandmode();
2264840Speter char		*operandname();
2274840Speter 		printchildren();
2284840Speter 		printcycle();
2294840Speter 		printgprof();
2304840Speter 		printmembers();
2314840Speter 		printname();
2324840Speter 		printparents();
2334840Speter 		printprof();
2344840Speter 		readsamples();
2354840Speter unsigned long	reladdr();
2364840Speter 		sortchildren();
2374840Speter 		sortmembers();
2384840Speter 		sortparents();
2394840Speter 		tally();
2404840Speter 		timecmp();
2414840Speter 		topcmp();
2424840Speter int		totalcmp();
2434840Speter 		valcmp();
2444511Speter 
2454511Speter #define	LESSTHAN	-1
2464511Speter #define	EQUALTO		0
2474511Speter #define	GREATERTHAN	1
2484511Speter 
2494511Speter #define	DFNDEBUG	1
2504511Speter #define	CYCLEDEBUG	2
2514511Speter #define	ARCDEBUG	4
2524511Speter #define	TALLYDEBUG	8
2534511Speter #define	TIMEDEBUG	16
2544511Speter #define	SAMPLEDEBUG	32
2554511Speter #define	AOUTDEBUG	64
2564722Speter #define	CALLSDEBUG	128
2574722Speter #define	LOOKUPDEBUG	256
258*7224Speter #define	PROPDEBUG	512
259*7224Speter #define	ANYDEBUG	1024
260