(root)/
glibc-2.38/
gmon/
sys/
gmon.h
       1  /*-
       2   * Copyright (c) 1982, 1986, 1992, 1993
       3   *	The Regents of the University of California.  All rights reserved.
       4   *
       5   * Redistribution and use in source and binary forms, with or without
       6   * modification, are permitted provided that the following conditions
       7   * are met:
       8   * 1. Redistributions of source code must retain the above copyright
       9   *    notice, this list of conditions and the following disclaimer.
      10   * 2. Redistributions in binary form must reproduce the above copyright
      11   *    notice, this list of conditions and the following disclaimer in the
      12   *    documentation and/or other materials provided with the distribution.
      13   * 4. Neither the name of the University nor the names of its contributors
      14   *    may be used to endorse or promote products derived from this software
      15   *    without specific prior written permission.
      16   *
      17   * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
      18   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      19   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      20   * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
      21   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      22   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      23   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      24   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      25   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      26   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      27   * SUCH DAMAGE.
      28   *
      29   *	@(#)gmon.h	8.2 (Berkeley) 1/4/94
      30   */
      31  
      32  #ifndef	_SYS_GMON_H
      33  #define	_SYS_GMON_H	1
      34  
      35  #include <features.h>
      36  
      37  #include <sys/types.h>
      38  
      39  /*
      40   * See gmon_out.h for gmon.out format.
      41   */
      42  
      43  /* structure emitted by "gcc -a".  This must match struct bb in
      44     gcc/libgcc2.c.  It is OK for gcc to declare a longer structure as
      45     long as the members below are present.  */
      46  struct __bb
      47  {
      48    long			zero_word;
      49    const char		*filename;
      50    long			*counts;
      51    long			ncounts;
      52    struct __bb		*next;
      53    const unsigned long	*addresses;
      54  };
      55  
      56  extern struct __bb *__bb_head;
      57  
      58  /*
      59   * histogram counters are unsigned shorts (according to the kernel).
      60   */
      61  #define	HISTCOUNTER	unsigned short
      62  
      63  /*
      64   * fraction of text space to allocate for histogram counters here, 1/2
      65   */
      66  #define	HISTFRACTION	2
      67  
      68  /*
      69   * Fraction of text space to allocate for from hash buckets.
      70   * The value of HASHFRACTION is based on the minimum number of bytes
      71   * of separation between two subroutine call points in the object code.
      72   * Given MIN_SUBR_SEPARATION bytes of separation the value of
      73   * HASHFRACTION is calculated as:
      74   *
      75   *	HASHFRACTION = MIN_SUBR_SEPARATION / (2 * sizeof(short) - 1);
      76   *
      77   * For example, on the VAX, the shortest two call sequence is:
      78   *
      79   *	calls	$0,(r0)
      80   *	calls	$0,(r0)
      81   *
      82   * which is separated by only three bytes, thus HASHFRACTION is
      83   * calculated as:
      84   *
      85   *	HASHFRACTION = 3 / (2 * 2 - 1) = 1
      86   *
      87   * Note that the division above rounds down, thus if MIN_SUBR_FRACTION
      88   * is less than three, this algorithm will not work!
      89   *
      90   * In practice, however, call instructions are rarely at a minimal
      91   * distance.  Hence, we will define HASHFRACTION to be 2 across all
      92   * architectures.  This saves a reasonable amount of space for
      93   * profiling data structures without (in practice) sacrificing
      94   * any granularity.
      95   */
      96  #define	HASHFRACTION	2
      97  
      98  /*
      99   * Percent of text space to allocate for tostructs.
     100   * This is a heuristic; we will fail with a warning when profiling programs
     101   * with a very large number of very small functions, but that's
     102   * normally OK.
     103   * 2 is probably still a good value for normal programs.
     104   * Profiling a test case with 64000 small functions will work if
     105   * you raise this value to 3 and link statically (which bloats the
     106   * text size, thus raising the number of arcs expected by the heuristic).
     107   */
     108  #define ARCDENSITY	3
     109  
     110  /*
     111   * Always allocate at least this many tostructs.  This
     112   * hides the inadequacy of the ARCDENSITY heuristic, at least
     113   * for small programs.
     114   *
     115   * Value can be overridden at runtime by glibc.gmon.minarcs tunable.
     116   */
     117  #define MINARCS		50
     118  
     119  /*
     120   * The type used to represent indices into gmonparam.tos[].
     121   */
     122  #define	ARCINDEX	unsigned long
     123  
     124  /*
     125   * Maximum number of arcs we want to allow.
     126   * Used to be max representable value of ARCINDEX minus 2, but now
     127   * that ARCINDEX is a long, that's too large; we don't really want
     128   * to allow a 48 gigabyte table.
     129   *
     130   * Value can be overridden at runtime by glibc.gmon.maxarcs tunable.
     131   */
     132  #define MAXARCS		(1 << 20)
     133  
     134  struct tostruct {
     135  	unsigned long	selfpc;
     136  	long		count;
     137  	ARCINDEX	link;
     138  };
     139  
     140  /*
     141   * a raw arc, with pointers to the calling site and
     142   * the called site and a count.
     143   */
     144  struct rawarc {
     145  	unsigned long	raw_frompc;
     146  	unsigned long	raw_selfpc;
     147  	long		raw_count;
     148  };
     149  
     150  /*
     151   * general rounding functions.
     152   */
     153  #define ROUNDDOWN(x,y)	(((x)/(y))*(y))
     154  #define ROUNDUP(x,y)	((((x)+(y)-1)/(y))*(y))
     155  
     156  /*
     157   * The profiling data structures are housed in this structure.
     158   */
     159  struct gmonparam {
     160  	long int	state;
     161  	unsigned short	*kcount;
     162  	unsigned long	kcountsize;
     163  	ARCINDEX	*froms;
     164  	unsigned long	fromssize;
     165  	struct tostruct	*tos;
     166  	unsigned long	tossize;
     167  	long		tolimit;
     168  	unsigned long	lowpc;
     169  	unsigned long	highpc;
     170  	unsigned long	textsize;
     171  	unsigned long	hashfraction;
     172  	long		log_hashfraction;
     173  };
     174  
     175  /*
     176   * Possible states of profiling.
     177   */
     178  #define	GMON_PROF_ON	0
     179  #define	GMON_PROF_BUSY	1
     180  #define	GMON_PROF_ERROR	2
     181  #define	GMON_PROF_OFF	3
     182  
     183  /*
     184   * Sysctl definitions for extracting profiling information from the kernel.
     185   */
     186  #define	GPROF_STATE	0	/* int: profiling enabling variable */
     187  #define	GPROF_COUNT	1	/* struct: profile tick count buffer */
     188  #define	GPROF_FROMS	2	/* struct: from location hash bucket */
     189  #define	GPROF_TOS	3	/* struct: destination/count structure */
     190  #define	GPROF_GMONPARAM	4	/* struct: profiling parameters (see above) */
     191  
     192  __BEGIN_DECLS
     193  
     194  /* Set up data structures and start profiling.  */
     195  extern void __monstartup (unsigned long __lowpc, unsigned long __highpc) __THROW;
     196  extern void monstartup (unsigned long __lowpc, unsigned long __highpc) __THROW;
     197  
     198  /* Clean up profiling and write out gmon.out.  */
     199  extern void _mcleanup (void) __THROW;
     200  
     201  __END_DECLS
     202  
     203  #endif /* sys/gmon.h */