xref: /original-bsd/usr.bin/gprof/gprof.h (revision 0b685140)
1     /* sccsid:  @(#)gprof.h	1.10 (Berkeley) 11/12/81 */
2 
3 #include <stdio.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <a.out.h>
7 #include <pagsiz.h>
8 #include "gcrt0.h"
9 
10     /*
11      *	ticks per second
12      */
13 #define	HZ	60
14 
15 typedef	short UNIT;		/* unit of profiling */
16 char	*a_outname;
17 #define	A_OUTNAME		"a.out"
18 
19 char	*gmonname;
20 #define	GMONNAME		"gmon.out"
21 #define	GMONSUM			"gmon.sum"
22 
23     /*
24      *	the directory where the descriptions of the fields
25      *	of the profiles are kept.
26      */
27 #define	BLURBLIB		"/usr/lib/"
28 
29     /*
30      *	a constructed arc,
31      *	    with pointers to the namelist entry of the parent and the child,
32      *	    a count of how many times this arc was traversed,
33      *	    and pointers to the next parent of this child and
34      *		the next child of this parent.
35      */
36 struct arcstruct {
37     struct nl		*arc_parentp;	/* pointer to parent's nl entry */
38     struct nl		*arc_childp;	/* pointer to child's nl entry */
39     long		arc_count;	/* how calls from parent to child */
40     double		arc_time;	/* time inherited along arc */
41     double		arc_childtime;	/* childtime inherited along arc */
42     struct arcstruct	*arc_parentlist; /* parents-of-this-child list */
43     struct arcstruct	*arc_childlist;	/* children-of-this-parent list */
44 };
45 typedef struct arcstruct	arctype;
46 
47 /*
48  * The symbol table;
49  * for each external in the specified file we gather
50  * its address, the number of calls and compute its share of cpu time.
51  */
52 struct nl {
53 	char		*name;		/* the name */
54 	unsigned long	value;		/* the pc entry point */
55 	double		time;		/* ticks in this routine */
56 	double		childtime;	/* cumulative ticks in children */
57 	long		ncall;		/* how many times called */
58 	long		selfcalls;	/* how many calls to self */
59 	int		index;		/* index in the graph list */
60 	int		toporder;	/* graph call chain top-sort order */
61 	int		cycleno;	/* internal number of cycle on */
62 	struct nl	*cyclehead;	/* pointer to head of cycle */
63 	struct nl	*cnext;		/* pointer to next member of cycle */
64 	arctype		*parents;	/* list of caller arcs */
65 	arctype		*children;	/* list of callee arcs */
66 };
67 typedef struct nl	nltype;
68 
69 nltype	*nl;			/* the whole namelist */
70 nltype	*npe;			/* the virtual end of the namelist */
71 int		nname;			/* the number of function names */
72 
73     /*
74      *	flag which marks a nl entry as topologically ``busy''
75      */
76 #define	DFN_BUSY	-1
77 
78     /*
79      *	the number of cycles is estimated as this fraction of nnames
80      *	ncycles, the number of allocated cycle namelist entries,
81      *	not to be confused with cyclemax, the number of discovered cycles.
82      */
83 #define	CYCLEFRACTION	( 0.10 )
84 int	ncycles;		/* maximum allocated cycle headers */
85 int	cyclemax;		/* number of cycles discovered */
86 
87 /*
88  * The header on the gmon.out file.
89  * gmon.out consists of one of these headers,
90  * and then an array of ncnt samples
91  * representing the discretized program counter values.
92  *	this should be a struct phdr, but since everything is done
93  *	as UNITs, this is in UNITs too.
94  */
95 struct hdr {
96 	UNIT	*lowpc;
97 	UNIT	*highpc;
98 	int	ncnt;
99 };
100 
101 struct hdr	h;
102 
103 int	debug;
104 
105 /*
106  * Each discretized pc sample has
107  * a count of the number of samples in its range
108  */
109 unsigned UNIT	*samples;
110 
111 unsigned long	s_lowpc;	/* lowpc from the profile file */
112 unsigned long	s_highpc;	/* highpc from the profile file */
113 unsigned lowpc, highpc;		/* range profiled, in UNIT's */
114 unsigned sampbytes;		/* number of bytes of samples */
115 int	nsamples;		/* number of samples */
116 double	actime;			/* accumulated time thus far for putprofline */
117 double	totime;			/* total time for all routines */
118 double	scale;			/* scale factor converting samples to pc
119 				   values: each sample covers scale bytes */
120 char	*strtab;		/* string table in core */
121 off_t	ssiz;			/* size of the string table */
122 struct	exec xbuf;		/* exec header of a.out */
123 unsigned char	*textspace;		/* text space of a.out in core */
124 
125     /*
126      *	option flags, from a to z.
127      */
128 int	aflag;				/* static functions, too */
129 int	bflag;				/* blurbs, too */
130 int	cflag;				/* discovered call graph, too */
131 int	sflag;				/* sum multiple gmon.out files */
132 int	zflag;				/* zero time/called functions, too */
133 
134     /*
135      * booleans
136      */
137 typedef int	bool;
138 #define	FALSE	0
139 #define	TRUE	1
140 
141     /*
142      *	opcode of the `calls' instruction
143      */
144 #define	CALLS	0xfb
145 
146     /*
147      *	register for pc relative addressing
148      */
149 #define	PC	0xf
150 
151 enum opermodes {
152     literal, indexed, reg, regdef, autodec, autoinc, autoincdef,
153     bytedisp, bytedispdef, worddisp, worddispdef, longdisp, longdispdef,
154     immediate, absolute, byterel, bytereldef, wordrel, wordreldef,
155     longrel, longreldef
156 };
157 typedef enum opermodes	operandenum;
158 
159 struct modebyte {
160     unsigned int	regfield:4;
161     unsigned int	modefield:4;
162 };
163 
164     /*
165      *	function declarations
166      */
167 		addarc();
168 int		arccmp();
169 arctype		*arclookup();
170 		asgnsamples();
171 		printblurb();
172 		cyclelink();
173 		dfn();
174 bool		dfn_busy();
175 		dfn_findcycle();
176 bool		dfn_numbered();
177 		dfn_post_visit();
178 		dfn_pre_visit();
179 		dfn_self_cycle();
180 		doarcs();
181 		done();
182 		findcalls();
183 		flatprofheader();
184 		flatprofline();
185 bool		funcsymbol();
186 		getnfile();
187 		getpfile();
188 		getstrtab();
189 		getsymtab();
190 		gettextspace();
191 		gprofheader();
192 		gprofline();
193 		main();
194 unsigned long	max();
195 int		membercmp();
196 unsigned long	min();
197 nltype		*nllookup();
198 FILE		*openpfile();
199 long		operandlength();
200 operandenum	operandmode();
201 char		*operandname();
202 		printchildren();
203 		printcycle();
204 		printgprof();
205 		printmembers();
206 		printname();
207 		printparents();
208 		printprof();
209 		readsamples();
210 unsigned long	reladdr();
211 		sortchildren();
212 		sortmembers();
213 		sortparents();
214 		tally();
215 		timecmp();
216 		topcmp();
217 int		totalcmp();
218 		valcmp();
219 
220 #define	LESSTHAN	-1
221 #define	EQUALTO		0
222 #define	GREATERTHAN	1
223 
224 #define	DFNDEBUG	1
225 #define	CYCLEDEBUG	2
226 #define	ARCDEBUG	4
227 #define	TALLYDEBUG	8
228 #define	TIMEDEBUG	16
229 #define	SAMPLEDEBUG	32
230 #define	AOUTDEBUG	64
231 #define	CALLSDEBUG	128
232 #define	LOOKUPDEBUG	256
233 #define	ANYDEBUG	512
234