gprof.h revision 38928
11590Srgrimes/* 21590Srgrimes * Copyright (c) 1983, 1993 31590Srgrimes * The Regents of the University of California. All rights reserved. 41590Srgrimes * 51590Srgrimes * Redistribution and use in source and binary forms, with or without 61590Srgrimes * modification, are permitted provided that the following conditions 71590Srgrimes * are met: 81590Srgrimes * 1. Redistributions of source code must retain the above copyright 91590Srgrimes * notice, this list of conditions and the following disclaimer. 101590Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 111590Srgrimes * notice, this list of conditions and the following disclaimer in the 121590Srgrimes * documentation and/or other materials provided with the distribution. 131590Srgrimes * 3. All advertising materials mentioning features or use of this software 141590Srgrimes * must display the following acknowledgement: 151590Srgrimes * This product includes software developed by the University of 161590Srgrimes * California, Berkeley and its contributors. 171590Srgrimes * 4. Neither the name of the University nor the names of its contributors 181590Srgrimes * may be used to endorse or promote products derived from this software 191590Srgrimes * without specific prior written permission. 201590Srgrimes * 211590Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 221590Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 231590Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 241590Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 251590Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 261590Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 271590Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 281590Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 291590Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 301590Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 311590Srgrimes * SUCH DAMAGE. 321590Srgrimes * 331590Srgrimes * @(#)gprof.h 8.1 (Berkeley) 6/6/93 341590Srgrimes */ 351590Srgrimes 361590Srgrimes#include <sys/types.h> 371590Srgrimes#include <sys/stat.h> 381590Srgrimes#include <sys/gmon.h> 391590Srgrimes 401590Srgrimes#include <stdio.h> 411590Srgrimes#include <stdlib.h> 421590Srgrimes 431590Srgrimes#if vax 441590Srgrimes# include "vax.h" 451590Srgrimes#endif 461590Srgrimes#if sparc 471590Srgrimes# include "sparc.h" 481590Srgrimes#endif 491590Srgrimes#if tahoe 501590Srgrimes# include "tahoe.h" 511590Srgrimes#endif 521590Srgrimes#if hp300 531590Srgrimes# include "hp300.h" 541590Srgrimes#endif 551590Srgrimes#if luna68k 561590Srgrimes# include "luna68k.h" 571590Srgrimes#endif 581590Srgrimes#if i386 591590Srgrimes# include "i386.h" 601590Srgrimes#endif 611590Srgrimes#if mips 621590Srgrimes# include "mips.h" 631590Srgrimes#endif 641590Srgrimes 651590Srgrimes 661590Srgrimes /* 671590Srgrimes * booleans 681590Srgrimes */ 691590Srgrimestypedef int bool; 701590Srgrimes#define FALSE 0 711590Srgrimes#define TRUE 1 721590Srgrimes 731590Srgrimes /* 741590Srgrimes * ticks per second 751590Srgrimes */ 761590Srgrimeslong hz; 771590Srgrimes 7813108Sbde#ifdef GPROF4 7927379Sbdetypedef int64_t UNIT; 8013108Sbde#else 811590Srgrimestypedef u_short UNIT; /* unit of profiling */ 8213108Sbde#endif 831590Srgrimeschar *a_outname; 841590Srgrimes#define A_OUTNAME "a.out" 851590Srgrimes 861590Srgrimeschar *gmonname; 871590Srgrimes#define GMONNAME "gmon.out" 881590Srgrimes#define GMONSUM "gmon.sum" 891590Srgrimes 901590Srgrimes /* 911590Srgrimes * a constructed arc, 921590Srgrimes * with pointers to the namelist entry of the parent and the child, 931590Srgrimes * a count of how many times this arc was traversed, 941590Srgrimes * and pointers to the next parent of this child and 951590Srgrimes * the next child of this parent. 961590Srgrimes */ 971590Srgrimesstruct arcstruct { 981590Srgrimes struct nl *arc_parentp; /* pointer to parent's nl entry */ 991590Srgrimes struct nl *arc_childp; /* pointer to child's nl entry */ 1001590Srgrimes long arc_count; /* num calls from parent to child */ 1011590Srgrimes double arc_time; /* time inherited along arc */ 1021590Srgrimes double arc_childtime; /* childtime inherited along arc */ 1031590Srgrimes struct arcstruct *arc_parentlist; /* parents-of-this-child list */ 1041590Srgrimes struct arcstruct *arc_childlist; /* children-of-this-parent list */ 1051590Srgrimes struct arcstruct *arc_next; /* list of arcs on cycle */ 1061590Srgrimes unsigned short arc_cyclecnt; /* num cycles involved in */ 1071590Srgrimes unsigned short arc_flags; /* see below */ 1081590Srgrimes}; 1091590Srgrimestypedef struct arcstruct arctype; 1101590Srgrimes 1111590Srgrimes /* 1121590Srgrimes * arc flags 1131590Srgrimes */ 1141590Srgrimes#define DEADARC 0x01 /* time should not propagate across the arc */ 1151590Srgrimes#define ONLIST 0x02 /* arc is on list of arcs in cycles */ 1161590Srgrimes 1171590Srgrimes /* 1181590Srgrimes * The symbol table; 1191590Srgrimes * for each external in the specified file we gather 1201590Srgrimes * its address, the number of calls and compute its share of cpu time. 1211590Srgrimes */ 1221590Srgrimesstruct nl { 12338928Sjdp const char *name; /* the name */ 1241590Srgrimes unsigned long value; /* the pc entry point */ 1251590Srgrimes unsigned long svalue; /* entry point aligned to histograms */ 1261590Srgrimes double time; /* ticks in this routine */ 1271590Srgrimes double childtime; /* cumulative ticks in children */ 1281590Srgrimes long ncall; /* how many times called */ 1291590Srgrimes long npropcall; /* times called by live arcs */ 1301590Srgrimes long selfcalls; /* how many calls to self */ 1311590Srgrimes double propfraction; /* what % of time propagates */ 1321590Srgrimes double propself; /* how much self time propagates */ 1331590Srgrimes double propchild; /* how much child time propagates */ 1341590Srgrimes short printflag; /* should this be printed? */ 1351590Srgrimes short flags; /* see below */ 1361590Srgrimes int index; /* index in the graph list */ 1371590Srgrimes int toporder; /* graph call chain top-sort order */ 1381590Srgrimes int cycleno; /* internal number of cycle on */ 1391590Srgrimes int parentcnt; /* number of live parent arcs */ 1401590Srgrimes struct nl *cyclehead; /* pointer to head of cycle */ 1411590Srgrimes struct nl *cnext; /* pointer to next member of cycle */ 1421590Srgrimes arctype *parents; /* list of caller arcs */ 1431590Srgrimes arctype *children; /* list of callee arcs */ 1441590Srgrimes}; 1451590Srgrimestypedef struct nl nltype; 1461590Srgrimes 1471590Srgrimesnltype *nl; /* the whole namelist */ 1481590Srgrimesnltype *npe; /* the virtual end of the namelist */ 1491590Srgrimesint nname; /* the number of function names */ 1501590Srgrimes 1511590Srgrimes#define HASCYCLEXIT 0x08 /* node has arc exiting from cycle */ 1521590Srgrimes#define CYCLEHEAD 0x10 /* node marked as head of a cycle */ 1531590Srgrimes#define VISITED 0x20 /* node visited during a cycle */ 1541590Srgrimes 1551590Srgrimes /* 1561590Srgrimes * The cycle list. 1571590Srgrimes * for each subcycle within an identified cycle, we gather 1581590Srgrimes * its size and the list of included arcs. 1591590Srgrimes */ 1601590Srgrimesstruct cl { 1611590Srgrimes int size; /* length of cycle */ 1621590Srgrimes struct cl *next; /* next member of list */ 1631590Srgrimes arctype *list[1]; /* list of arcs in cycle */ 1641590Srgrimes /* actually longer */ 1651590Srgrimes}; 1661590Srgrimestypedef struct cl cltype; 1671590Srgrimes 1681590Srgrimesarctype *archead; /* the head of arcs in current cycle list */ 1691590Srgrimescltype *cyclehead; /* the head of the list */ 1701590Srgrimesint cyclecnt; /* the number of cycles found */ 1711590Srgrimes#define CYCLEMAX 100 /* maximum cycles before cutting one of them */ 1721590Srgrimes 1731590Srgrimes /* 1741590Srgrimes * flag which marks a nl entry as topologically ``busy'' 1751590Srgrimes * flag which marks a nl entry as topologically ``not_numbered'' 1761590Srgrimes */ 1771590Srgrimes#define DFN_BUSY -1 1781590Srgrimes#define DFN_NAN 0 1791590Srgrimes 1808874Srgrimes /* 1811590Srgrimes * namelist entries for cycle headers. 1821590Srgrimes * the number of discovered cycles. 1831590Srgrimes */ 1841590Srgrimesnltype *cyclenl; /* cycle header namelist */ 1851590Srgrimesint ncycle; /* number of cycles discovered */ 1861590Srgrimes 1871590Srgrimes /* 1881590Srgrimes * The header on the gmon.out file. 1891590Srgrimes * gmon.out consists of a struct phdr (defined in gmon.h) 1901590Srgrimes * and then an array of ncnt samples representing the 1911590Srgrimes * discretized program counter values. 1921590Srgrimes * 1931590Srgrimes * Backward compatible old style header 1941590Srgrimes */ 1951590Srgrimesstruct ophdr { 1961590Srgrimes UNIT *lpc; 1971590Srgrimes UNIT *hpc; 1981590Srgrimes int ncnt; 1991590Srgrimes}; 2001590Srgrimes 2011590Srgrimesint debug; 2021590Srgrimes 2031590Srgrimes /* 2041590Srgrimes * Each discretized pc sample has 2051590Srgrimes * a count of the number of samples in its range 2061590Srgrimes */ 2071590SrgrimesUNIT *samples; 2081590Srgrimes 2091590Srgrimesunsigned long s_lowpc; /* lowpc from the profile file */ 2101590Srgrimesunsigned long s_highpc; /* highpc from the profile file */ 2111590Srgrimesunsigned lowpc, highpc; /* range profiled, in UNIT's */ 2121590Srgrimesunsigned sampbytes; /* number of bytes of samples */ 2131590Srgrimesint nsamples; /* number of samples */ 2141590Srgrimesdouble actime; /* accumulated time thus far for putprofline */ 2151590Srgrimesdouble totime; /* total time for all routines */ 2161590Srgrimesdouble printtime; /* total of time being printed */ 2171590Srgrimesdouble scale; /* scale factor converting samples to pc 2181590Srgrimes values: each sample covers scale bytes */ 2191590Srgrimesunsigned char *textspace; /* text space of a.out in core */ 2201590Srgrimesint cyclethreshold; /* with -C, minimum cycle size to ignore */ 2211590Srgrimes 2221590Srgrimes /* 2231590Srgrimes * option flags, from a to z. 2241590Srgrimes */ 2251590Srgrimesbool aflag; /* suppress static functions */ 2261590Srgrimesbool bflag; /* blurbs, too */ 2271590Srgrimesbool cflag; /* discovered call graph, too */ 2281590Srgrimesbool Cflag; /* find cut-set to eliminate cycles */ 2291590Srgrimesbool dflag; /* debugging options */ 2301590Srgrimesbool eflag; /* specific functions excluded */ 2311590Srgrimesbool Eflag; /* functions excluded with time */ 2321590Srgrimesbool fflag; /* specific functions requested */ 2331590Srgrimesbool Fflag; /* functions requested with time */ 2341590Srgrimesbool kflag; /* arcs to be deleted */ 2351590Srgrimesbool sflag; /* sum multiple gmon.out files */ 23638928Sjdpbool uflag; /* suppress symbols hidden from C */ 2371590Srgrimesbool zflag; /* zero time/called functions, too */ 2381590Srgrimes 2391590Srgrimes /* 2401590Srgrimes * structure for various string lists 2411590Srgrimes */ 2421590Srgrimesstruct stringlist { 2431590Srgrimes struct stringlist *next; 2441590Srgrimes char *string; 2451590Srgrimes}; 2461590Srgrimesstruct stringlist *elist; 2471590Srgrimesstruct stringlist *Elist; 2481590Srgrimesstruct stringlist *flist; 2491590Srgrimesstruct stringlist *Flist; 2501590Srgrimesstruct stringlist *kfromlist; 2511590Srgrimesstruct stringlist *ktolist; 2521590Srgrimes 2531590Srgrimes /* 2541590Srgrimes * function declarations 2551590Srgrimes */ 2561590Srgrimes/* 2571590Srgrimes addarc(); 2581590Srgrimes*/ 25938928Sjdpint aout_getnfile(const char *, char ***); 2601590Srgrimesint arccmp(); 2611590Srgrimesarctype *arclookup(); 2621590Srgrimes/* 2631590Srgrimes asgnsamples(); 2641590Srgrimes printblurb(); 2651590Srgrimes cyclelink(); 2661590Srgrimes dfn(); 2671590Srgrimes*/ 2681590Srgrimesbool dfn_busy(); 2691590Srgrimes/* 2701590Srgrimes dfn_findcycle(); 2711590Srgrimes*/ 2721590Srgrimesbool dfn_numbered(); 2731590Srgrimes/* 2741590Srgrimes dfn_post_visit(); 2751590Srgrimes dfn_pre_visit(); 2761590Srgrimes dfn_self_cycle(); 2771590Srgrimes*/ 2781590Srgrimesnltype **doarcs(); 2791590Srgrimes/* 2801590Srgrimes done(); 28138928Sjdp*/ 28238928Sjdpint elf_getnfile(const char *, char ***); 28338928Sjdp/* 2841590Srgrimes findcalls(); 2851590Srgrimes flatprofheader(); 2861590Srgrimes flatprofline(); 2871590Srgrimes*/ 2881590Srgrimes/* 2891590Srgrimes getpfile(); 2901590Srgrimes gprofheader(); 2911590Srgrimes gprofline(); 2921590Srgrimes main(); 2931590Srgrimes*/ 2941590Srgrimesunsigned long max(); 2951590Srgrimesint membercmp(); 2961590Srgrimesunsigned long min(); 2971590Srgrimesnltype *nllookup(); 2981590SrgrimesFILE *openpfile(); 2991590Srgrimeslong operandlength(); 3001590Srgrimesoperandenum operandmode(); 3011590Srgrimeschar *operandname(); 3021590Srgrimes/* 3031590Srgrimes printchildren(); 3041590Srgrimes printcycle(); 3051590Srgrimes printgprof(); 3061590Srgrimes printmembers(); 3071590Srgrimes printname(); 3081590Srgrimes printparents(); 3091590Srgrimes printprof(); 3101590Srgrimes readsamples(); 3111590Srgrimes*/ 3121590Srgrimesunsigned long reladdr(); 3131590Srgrimes/* 3141590Srgrimes sortchildren(); 3151590Srgrimes sortmembers(); 3161590Srgrimes sortparents(); 3171590Srgrimes tally(); 3181590Srgrimes timecmp(); 3191590Srgrimes topcmp(); 3201590Srgrimes*/ 3211590Srgrimesint totalcmp(); 3221590Srgrimes/* 3231590Srgrimes valcmp(); 3241590Srgrimes*/ 3251590Srgrimes 3261590Srgrimes#define LESSTHAN -1 3271590Srgrimes#define EQUALTO 0 3281590Srgrimes#define GREATERTHAN 1 3291590Srgrimes 3301590Srgrimes#define DFNDEBUG 1 3311590Srgrimes#define CYCLEDEBUG 2 3321590Srgrimes#define ARCDEBUG 4 3331590Srgrimes#define TALLYDEBUG 8 3341590Srgrimes#define TIMEDEBUG 16 3351590Srgrimes#define SAMPLEDEBUG 32 3361590Srgrimes#define AOUTDEBUG 64 3371590Srgrimes#define CALLDEBUG 128 3381590Srgrimes#define LOOKUPDEBUG 256 3391590Srgrimes#define PROPDEBUG 512 3401590Srgrimes#define BREAKCYCLE 1024 3411590Srgrimes#define SUBCYCLELIST 2048 3421590Srgrimes#define ANYDEBUG 4096 343