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]
23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
30 #pragma ident "%Z%%M% %I% %E% SMI"
39 #include <sys/types.h>
52 * who am i, for error messages.
62 * Alignment related constants
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))
92 typedef short UNIT
; /* unit of profiling */
93 typedef unsigned short unsigned_UNIT
; /* to remove warnings from gprof.c */
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
;
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"
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"
136 * with pointers to the calling site and the called site
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.
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.
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
;
192 fl_info_t aout_info
; /* saved file info for program exec */
193 fl_info_t gmonout_info
; /* current gmonout's 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.
227 * for each external in the specified file we gather
228 * its address, the number of calls and compute its share of cpu time.
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''
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.
291 struct hdr h
; /* header of profiled data */
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)
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
348 struct stringlist
*next
;
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 *);
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);
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
);
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
428 #endif /* _SGS_GPROF_H */