8322 nl: misleading-indentation
[unleashed/tickless.git] / usr / src / cmd / sgs / gprof / common / gprof.h
blobe62ddaf45c557c6971f8596df54541bf594fd332
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
19 * CDDL HEADER END
23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 #ifndef _SGS_GPROF_H
28 #define _SGS_GPROF_H
30 #pragma ident "%Z%%M% %I% %E% SMI"
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
36 #include <stdio.h>
37 #include <stdlib.h>
38 #include <string.h>
39 #include <sys/types.h>
40 #include <sys/stat.h>
41 #include <fcntl.h>
42 #include <sys/mman.h>
43 #include <elf.h>
45 #include "sparc.h"
46 #include "gelf.h"
47 #include "monv.h"
48 #include "sgs.h"
52 * who am i, for error messages.
54 extern char *whoami;
57 * booleans
59 typedef Boolean bool;
62 * Alignment related constants
64 #define PGSZ 4096
65 #define STRUCT_ALIGN 8
68 * Macros related to structure alignment
70 #define FLOOR(x, align) (((Address) x) & ~((align) - 1l))
71 #define CEIL(x, align) FLOOR(((Address) x) + (align) - 1l, align)
73 #define PROFHDR_SZ (CEIL(sizeof (ProfHeader), STRUCT_ALIGN))
74 #define PROFMODLIST_SZ (CEIL(sizeof (ProfModuleList), STRUCT_ALIGN))
75 #define PROFMOD_SZ (CEIL(sizeof (ProfModule), STRUCT_ALIGN))
76 #define PROFBUF_SZ (CEIL(sizeof (ProfBuffer), STRUCT_ALIGN))
77 #define PROFCGRAPH_SZ (CEIL(sizeof (ProfCallGraph), STRUCT_ALIGN))
78 #define PROFFUNC_SZ (CEIL(sizeof (ProfFunction), STRUCT_ALIGN))
80 #define HDR_FILLER (PROFHDR_SZ - sizeof (ProfHeader))
81 #define MODLIST_FILLER (PROFMODLIST_SZ - sizeof (ProfModuleList))
82 #define MOD_FILLER (PROFMOD_SZ - sizeof (ProfModule))
83 #define BUF_FILLER (PROFBUF_SZ - sizeof (ProfBuffer))
84 #define CGRAPH_FILLER (PROFCGRAPH_SZ - sizeof (ProfCallGraph))
85 #define FUNC_FILLER (PROFFUNC_SZ - sizeof (ProfFunction))
88 * ticks per second
90 long hz;
92 typedef short UNIT; /* unit of profiling */
93 typedef unsigned short unsigned_UNIT; /* to remove warnings from gprof.c */
94 char *a_outname;
95 char *prog_name; /* keep the program name for error messages */
96 #define A_OUTNAME "a.out"
98 typedef unsigned long long pctype;
99 typedef uint32_t pctype32;
100 typedef size_t sztype;
103 * Type definition for the arc count.
105 typedef long long actype;
106 typedef int32_t actype32;
108 char *gmonname;
109 #define GMONNAME "gmon.out"
110 #define GMONSUM "gmon.sum"
113 * Special symbols used for profiling of shared libraries through
114 * the run-time linker.
116 #define PRF_ETEXT "_etext"
117 #define PRF_EXTSYM "<external>"
118 #define PRF_MEMTERM "_END_OF_VIRTUAL_MEMORY"
119 #define PRF_SYMCNT 3
122 * Special symbol needed to determine the program exec's end addr.
123 * Note that since this symbol doesn't get added to the nameslist,
124 * it doesn't have to be counted in PRF_SYMCNT
126 #define PRF_END "_end"
129 * blurbs on the flat and graph profiles.
131 #define FLAT_BLURB "/usr/share/lib/ccs/gprof.flat.blurb"
132 #define CALLG_BLURB "/usr/share/lib/ccs/gprof.callg.blurb"
135 * a raw arc,
136 * with pointers to the calling site and the called site
137 * and a count.
139 struct rawarc {
140 pctype raw_frompc;
141 pctype raw_selfpc;
142 actype raw_count;
145 struct rawarc32 {
146 pctype32 raw_frompc;
147 pctype32 raw_selfpc;
148 actype32 raw_count;
152 * a constructed arc,
153 * with pointers to the namelist entry of the parent and the child,
154 * a count of how many times this arc was traversed,
155 * and pointers to the next parent of this child and
156 * the next child of this parent.
158 struct arcstruct {
159 struct nl *arc_parentp; /* pointer to parent's nl entry */
160 struct nl *arc_childp; /* pointer to child's nl entry */
161 actype arc_count; /* how calls from parent to child */
162 double arc_time; /* time inherited along arc */
163 double arc_childtime; /* childtime inherited along arc */
164 struct arcstruct *arc_parentlist; /* parents-of-this-child list */
165 struct arcstruct *arc_childlist; /* children-of-this-parent list */
167 typedef struct arcstruct arctype;
171 * Additions for new-style gmon.out
173 bool old_style; /* gmon.out versioned/non-versioned ? */
176 * Executable file info.
178 * All info that is required to identify a file or see if it has changed
179 * relative to another file.
181 struct fl_info {
182 dev_t dev; /* device associated with this file */
183 ino_t ino; /* i-number of this file */
184 time_t mtime; /* last modified time of this file */
185 off_t size; /* size of file */
187 typedef struct fl_info fl_info_t;
190 * Saved file info.
192 fl_info_t aout_info; /* saved file info for program exec */
193 fl_info_t gmonout_info; /* current gmonout's info */
197 * Module info.
199 struct mod_info {
200 struct mod_info *next; /* ptr to next in the modules list */
201 char *name; /* name of this module */
202 int id; /* id, used while printing */
203 bool active; /* is this module active or not ? */
204 struct nl *nl; /* ptr to nameslist for this module */
205 struct nl *npe; /* virtual end of module's namelist */
206 sztype nname; /* number of funcs in this module */
207 GElf_Addr txt_origin; /* module's start as given in file */
208 GElf_Addr data_end; /* module's end addr as in file */
209 Address load_base; /* actual pcaddr where modl's loaded */
210 Address load_end; /* actual pcaddr where modl ends */
212 typedef struct mod_info mod_info_t;
214 sztype total_names; /* from all modules */
217 * List of shared object modules. Note that this always includes the
218 * program executable as the first element.
220 mod_info_t modules;
221 sztype n_modules;
226 * The symbol table;
227 * for each external in the specified file we gather
228 * its address, the number of calls and compute its share of cpu time.
230 struct nl {
231 char *name; /* the name */
232 mod_info_t *module; /* module to which this belongs */
233 pctype value; /* the pc entry point */
234 pctype svalue; /* entry point aligned to histograms */
235 unsigned long sz; /* function size */
236 unsigned char syminfo; /* sym info */
237 size_t nticks; /* ticks in this routine */
238 double time; /* ticks in this routine as double */
239 double childtime; /* cumulative ticks in children */
240 actype ncall; /* how many times called */
241 actype selfcalls; /* how many calls to self */
242 double propfraction; /* what % of time propagates */
243 double propself; /* how much self time propagates */
244 double propchild; /* how much child time propagates */
245 bool printflag; /* should this be printed? */
246 int index; /* index in the graph list */
247 int toporder; /* graph call chain top-sort order */
248 int cycleno; /* internal number of cycle on */
249 struct nl *cyclehead; /* pointer to head of cycle */
250 struct nl *cnext; /* pointer to next member of cycle */
251 arctype *parents; /* list of caller arcs */
252 arctype *children; /* list of callee arcs */
253 unsigned long ncallers; /* no. of callers - dumpsum use only */
255 typedef struct nl nltype;
258 * flag which marks a nl entry as topologically ``busy''
259 * flag which marks a nl entry as topologically ``not_numbered''
261 #define DFN_BUSY -1
262 #define DFN_NAN 0
265 * namelist entries for cycle headers.
266 * the number of discovered cycles.
268 nltype *cyclenl; /* cycle header namelist */
269 int ncycle; /* number of cycles discovered */
272 * The header on the gmon.out file.
273 * old-style gmon.out consists of one of these headers,
274 * and then an array of ncnt samples
275 * representing the discretized program counter values.
276 * this should be a struct phdr, but since everything is done
277 * as UNITs, this is in UNITs too.
279 struct hdr {
280 pctype lowpc;
281 pctype highpc;
282 pctype ncnt;
285 struct hdr32 {
286 pctype32 lowpc;
287 pctype32 highpc;
288 pctype32 ncnt;
291 struct hdr h; /* header of profiled data */
293 int debug;
294 int number_funcs_toprint;
297 * Each discretized pc sample has
298 * a count of the number of samples in its range
300 unsigned short *samples;
302 pctype s_lowpc; /* lowpc from profile file in o-s gmon.out */
303 pctype s_highpc; /* highpc from profile file in o-s gmon.out */
304 sztype sampbytes; /* number of bytes of samples in o-s gmon.out */
305 sztype nsamples; /* number of samples for old-style gmon.out */
307 double actime; /* accumulated time thus far for putprofline */
308 double totime; /* total time for all routines */
309 double printtime; /* total of time being printed */
310 double scale; /* scale factor converting samples to pc */
311 /* values: each sample covers scale bytes */
312 /* -- all this is for old-style gmon.out only */
314 unsigned char *textspace; /* text space of a.out in core */
315 bool first_file; /* for difference option */
318 * Total number of pcsamples read so far (across gmon.out's)
320 Size n_pcsamples;
323 * option flags, from a to z.
325 bool aflag; /* suppress static functions */
326 bool bflag; /* blurbs, too */
327 bool Bflag; /* big pc's (i.e. 64 bits) */
328 bool cflag; /* discovered call graph, too */
329 bool Cflag; /* gprofing c++ -- need demangling */
330 bool dflag; /* debugging options */
331 bool Dflag; /* difference option */
332 bool eflag; /* specific functions excluded */
333 bool Eflag; /* functions excluded with time */
334 bool fflag; /* specific functions requested */
335 bool Fflag; /* functions requested with time */
336 bool lflag; /* exclude LOCAL syms in output */
337 bool sflag; /* sum multiple gmon.out files */
338 bool zflag; /* zero time/called functions, too */
339 bool nflag; /* print only n functions in report */
340 bool rflag; /* profiling input generated by */
341 /* run-time linker */
345 * structure for various string lists
347 struct stringlist {
348 struct stringlist *next;
349 char *string;
351 extern struct stringlist *elist;
352 extern struct stringlist *Elist;
353 extern struct stringlist *flist;
354 extern struct stringlist *Flist;
357 * function declarations
359 void addlist(struct stringlist *, char *);
360 void addarc(nltype *, nltype *, actype);
361 int arccmp(arctype *, arctype *);
362 arctype *arclookup(nltype *, nltype *);
363 void printblurb(char *);
364 void dfn(nltype *);
365 bool dfn_busy(nltype *);
366 void dfn_findcycle(nltype *);
367 bool dfn_numbered(nltype *);
368 void dfn_post_visit(nltype *);
369 void dfn_pre_visit(nltype *);
370 void dfn_self_cycle(nltype *);
371 nltype **doarcs(void);
372 void done(void);
373 void findcalls(nltype *, pctype, pctype);
374 void flatprofheader(void);
375 void flatprofline(nltype *);
376 bool is_shared_obj(char *);
377 void getnfile(char *);
378 void process_namelist(mod_info_t *);
379 void gprofheader(void);
380 void gprofline(nltype *);
381 int pc_cmp(const void *arg1, const void *arg2);
382 int membercmp(nltype *, nltype *);
383 nltype *nllookup(mod_info_t *, pctype, pctype *);
384 bool onlist(struct stringlist *, char *);
385 void printchildren(nltype *);
386 void printcycle(nltype *);
387 void printgprof(nltype **);
388 void printindex(void);
389 void printmembers(nltype *);
390 void printmodules(void);
391 void printname(nltype *);
392 void printparents(nltype *);
393 void printprof(void);
394 void sortchildren(nltype *);
395 void sortmembers(nltype *);
396 void sortparents(nltype *);
397 int timecmp(const void *arg1, const void *arg2);
398 int totalcmp(const void *arg1, const void *arg2);
400 #define LESSTHAN -1
401 #define EQUALTO 0
402 #define GREATERTHAN 1
405 * Macros related to debug messages.
407 #define DFNDEBUG 0x0001
408 #define CYCLEDEBUG 0x0002
409 #define ARCDEBUG 0x0004
410 #define TALLYDEBUG 0x0008
411 #define TIMEDEBUG 0x0010
412 #define SAMPLEDEBUG 0x0020
413 #define ELFDEBUG 0x0040
414 #define CALLSDEBUG 0x0080
415 #define LOOKUPDEBUG 0x0100
416 #define PROPDEBUG 0x0200
417 #define ANYDEBUG 0x0400
419 #define MONOUTDEBUG 0x0800
420 #define MODULEDEBUG 0x1000
421 #define CGRAPHDEBUG 0x2000
422 #define PCSMPLDEBUG 0x4000
424 #ifdef __cplusplus
426 #endif
428 #endif /* _SGS_GPROF_H */