xref: /csrg-svn/usr.bin/gprof/gprof.h (revision 16851)
1*16851Smckusick /*	gprof.h	1.20	84/08/07	*/
24511Speter 
34511Speter #include <stdio.h>
44511Speter #include <sys/types.h>
54511Speter #include <sys/stat.h>
64511Speter #include <a.out.h>
74870Smckusic #include "gcrt0.h"
84511Speter 
911799Speter #if vax
1011799Speter #   include "vax.h"
1111799Speter #endif
1211799Speter #if sun
1311799Speter #    include "sun.h"
1411799Speter #endif
1511799Speter 
1611799Speter 
174511Speter     /*
187129Speter      *	who am i, for error messages.
197129Speter      */
207129Speter char	*whoami;
217129Speter 
227129Speter     /*
237174Speter      * booleans
247174Speter      */
257174Speter typedef int	bool;
267174Speter #define	FALSE	0
277174Speter #define	TRUE	1
287174Speter 
297174Speter     /*
304511Speter      *	ticks per second
314511Speter      */
3210250Speter long	hz;
334511Speter 
344511Speter typedef	short UNIT;		/* unit of profiling */
354511Speter char	*a_outname;
364511Speter #define	A_OUTNAME		"a.out"
374511Speter 
384560Speter char	*gmonname;
394560Speter #define	GMONNAME		"gmon.out"
404867Smckusic #define	GMONSUM			"gmon.sum"
414873Smckusic 
424873Smckusic     /*
4310286Speter      *	blurbs on the flat and graph profiles.
444873Smckusic      */
4510286Speter #define	FLAT_BLURB	"/usr/lib/gprof.flat.blurb"
4610286Speter #define	CALLG_BLURB	"/usr/lib/gprof.callg.blurb"
474511Speter 
484511Speter     /*
494511Speter      *	a constructed arc,
504511Speter      *	    with pointers to the namelist entry of the parent and the child,
514511Speter      *	    a count of how many times this arc was traversed,
524511Speter      *	    and pointers to the next parent of this child and
534511Speter      *		the next child of this parent.
544511Speter      */
554511Speter struct arcstruct {
564511Speter     struct nl		*arc_parentp;	/* pointer to parent's nl entry */
574511Speter     struct nl		*arc_childp;	/* pointer to child's nl entry */
584511Speter     long		arc_count;	/* how calls from parent to child */
594511Speter     double		arc_time;	/* time inherited along arc */
604511Speter     double		arc_childtime;	/* childtime inherited along arc */
614511Speter     struct arcstruct	*arc_parentlist; /* parents-of-this-child list */
624511Speter     struct arcstruct	*arc_childlist;	/* children-of-this-parent list */
634511Speter };
644511Speter typedef struct arcstruct	arctype;
654511Speter 
667129Speter     /*
677129Speter      * The symbol table;
687129Speter      * for each external in the specified file we gather
697129Speter      * its address, the number of calls and compute its share of cpu time.
707129Speter      */
714511Speter struct nl {
727129Speter     char		*name;		/* the name */
737129Speter     unsigned long	value;		/* the pc entry point */
7411799Speter     unsigned long	svalue;		/* entry point aligned to histograms */
757129Speter     double		time;		/* ticks in this routine */
767129Speter     double		childtime;	/* cumulative ticks in children */
777129Speter     long		ncall;		/* how many times called */
787129Speter     long		selfcalls;	/* how many calls to self */
797224Speter     double		propfraction;	/* what % of time propagates */
807224Speter     double		propself;	/* how much self time propagates */
817224Speter     double		propchild;	/* how much child time propagates */
827174Speter     bool		printflag;	/* should this be printed? */
837129Speter     int			index;		/* index in the graph list */
847129Speter     int			toporder;	/* graph call chain top-sort order */
857129Speter     int			cycleno;	/* internal number of cycle on */
867129Speter     struct nl		*cyclehead;	/* pointer to head of cycle */
877129Speter     struct nl		*cnext;		/* pointer to next member of cycle */
887129Speter     arctype		*parents;	/* list of caller arcs */
897129Speter     arctype		*children;	/* list of callee arcs */
904511Speter };
914511Speter typedef struct nl	nltype;
924511Speter 
934511Speter nltype	*nl;			/* the whole namelist */
944511Speter nltype	*npe;			/* the virtual end of the namelist */
957129Speter int	nname;			/* the number of function names */
964511Speter 
974511Speter     /*
984511Speter      *	flag which marks a nl entry as topologically ``busy''
9910284Speter      *	flag which marks a nl entry as topologically ``not_numbered''
1004511Speter      */
1014511Speter #define	DFN_BUSY	-1
10210284Speter #define	DFN_NAN		0
1034511Speter 
1044511Speter     /*
1057129Speter      *	namelist entries for cycle headers.
1067129Speter      *	the number of discovered cycles.
1074511Speter      */
1087129Speter nltype	*cyclenl;		/* cycle header namelist */
1097129Speter int	ncycle;			/* number of cycles discovered */
1104511Speter 
1117129Speter     /*
1127129Speter      * The header on the gmon.out file.
1137129Speter      * gmon.out consists of one of these headers,
1147129Speter      * and then an array of ncnt samples
1157129Speter      * representing the discretized program counter values.
1167129Speter      *	this should be a struct phdr, but since everything is done
1177129Speter      *	as UNITs, this is in UNITs too.
1187129Speter      */
1194511Speter struct hdr {
1207129Speter     UNIT	*lowpc;
1217129Speter     UNIT	*highpc;
1227129Speter     int	ncnt;
1234511Speter };
1244511Speter 
1254511Speter struct hdr	h;
1264511Speter 
1274511Speter int	debug;
1284511Speter 
1297129Speter     /*
1307129Speter      * Each discretized pc sample has
1317129Speter      * a count of the number of samples in its range
1327129Speter      */
1334511Speter unsigned UNIT	*samples;
1344511Speter 
1354751Speter unsigned long	s_lowpc;	/* lowpc from the profile file */
1364751Speter unsigned long	s_highpc;	/* highpc from the profile file */
1374751Speter unsigned lowpc, highpc;		/* range profiled, in UNIT's */
1384511Speter unsigned sampbytes;		/* number of bytes of samples */
1394511Speter int	nsamples;		/* number of samples */
1404511Speter double	actime;			/* accumulated time thus far for putprofline */
1414511Speter double	totime;			/* total time for all routines */
1427174Speter double	printtime;		/* total of time being printed */
1434511Speter double	scale;			/* scale factor converting samples to pc
1444511Speter 				   values: each sample covers scale bytes */
1454511Speter char	*strtab;		/* string table in core */
1464511Speter off_t	ssiz;			/* size of the string table */
1474511Speter struct	exec xbuf;		/* exec header of a.out */
1484722Speter unsigned char	*textspace;		/* text space of a.out in core */
1494511Speter 
1504855Speter     /*
1514855Speter      *	option flags, from a to z.
1524855Speter      */
1537174Speter bool	aflag;				/* suppress static functions */
1547174Speter bool	bflag;				/* blurbs, too */
1557174Speter bool	cflag;				/* discovered call graph, too */
1567174Speter bool	dflag;				/* debugging options */
1577174Speter bool	eflag;				/* specific functions excluded */
1587224Speter bool	Eflag;				/* functions excluded with time */
1597174Speter bool	fflag;				/* specific functions requested */
1607224Speter bool	Fflag;				/* functions requested with time */
1617174Speter bool	sflag;				/* sum multiple gmon.out files */
1627174Speter bool	zflag;				/* zero time/called functions, too */
1634511Speter 
1644511Speter     /*
1657224Speter      *	structure for various string lists
1667224Speter      */
1677224Speter struct stringlist {
1687224Speter     struct stringlist	*next;
1697224Speter     char		*string;
1707224Speter };
1717224Speter struct stringlist	*elist;
1727224Speter struct stringlist	*Elist;
1737224Speter struct stringlist	*flist;
1747224Speter struct stringlist	*Flist;
1757224Speter 
1767224Speter     /*
1774840Speter      *	function declarations
1784840Speter      */
1794840Speter 		addarc();
1804840Speter int		arccmp();
1814511Speter arctype		*arclookup();
1824840Speter 		asgnsamples();
1834855Speter 		printblurb();
1844840Speter 		cyclelink();
1854840Speter 		dfn();
1864511Speter bool		dfn_busy();
1874840Speter 		dfn_findcycle();
1884840Speter bool		dfn_numbered();
1894840Speter 		dfn_post_visit();
1904840Speter 		dfn_pre_visit();
1914840Speter 		dfn_self_cycle();
192*16851Smckusick nltype		**doarcs();
1934840Speter 		done();
1944840Speter 		findcalls();
1954840Speter 		flatprofheader();
1964840Speter 		flatprofline();
1974844Speter bool		funcsymbol();
1984840Speter 		getnfile();
1994840Speter 		getpfile();
2004840Speter 		getstrtab();
2014840Speter 		getsymtab();
2024840Speter 		gettextspace();
2034840Speter 		gprofheader();
2044840Speter 		gprofline();
2054840Speter 		main();
2064840Speter unsigned long	max();
2074840Speter int		membercmp();
2084840Speter unsigned long	min();
2094840Speter nltype		*nllookup();
2104840Speter FILE		*openpfile();
2114840Speter long		operandlength();
2124840Speter operandenum	operandmode();
2134840Speter char		*operandname();
2144840Speter 		printchildren();
2154840Speter 		printcycle();
2164840Speter 		printgprof();
2174840Speter 		printmembers();
2184840Speter 		printname();
2194840Speter 		printparents();
2204840Speter 		printprof();
2214840Speter 		readsamples();
2224840Speter unsigned long	reladdr();
2234840Speter 		sortchildren();
2244840Speter 		sortmembers();
2254840Speter 		sortparents();
2264840Speter 		tally();
2274840Speter 		timecmp();
2284840Speter 		topcmp();
2294840Speter int		totalcmp();
2304840Speter 		valcmp();
2314511Speter 
2324511Speter #define	LESSTHAN	-1
2334511Speter #define	EQUALTO		0
2344511Speter #define	GREATERTHAN	1
2354511Speter 
2364511Speter #define	DFNDEBUG	1
2374511Speter #define	CYCLEDEBUG	2
2384511Speter #define	ARCDEBUG	4
2394511Speter #define	TALLYDEBUG	8
2404511Speter #define	TIMEDEBUG	16
2414511Speter #define	SAMPLEDEBUG	32
2424511Speter #define	AOUTDEBUG	64
2434722Speter #define	CALLSDEBUG	128
2444722Speter #define	LOOKUPDEBUG	256
2457224Speter #define	PROPDEBUG	512
2467224Speter #define	ANYDEBUG	1024
247