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