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