1  /*
       2   * Copyright (c) 1983, 1991, 1993, 2001
       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   * 3. 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  #ifndef gmon_h
      30  #define gmon_h
      31  
      32  /* Size of the 4.4BSD gmon header */
      33  #define GMON_HDRSIZE_BSD44_32 (4 + 4 + 4 + 4 + 4 + (3 * 4))
      34  #define GMON_HDRSIZE_BSD44_64 (8 + 8 + 4 + 4 + 4 + (3 * 4))
      35  
      36  /* *INDENT-OFF* */
      37  /* For documentation purposes only.
      38  
      39     struct raw_phdr
      40      {
      41        char low_pc[sizeof(void *)];   -- base pc address of sample buffer
      42        char high_pc[sizeof(void *)];  -- max pc address of sampled buffer
      43        char ncnt[4];		     -- size of sample buffer (plus this
      44  				        header)
      45  
      46        char version[4];		     -- version number
      47        char profrate[4];		     -- profiling clock rate
      48        char spare[3*4];		     -- reserved
      49      };
      50  */
      51  /* *INDENT-ON* */
      52  
      53  #define GMONVERSION     0x00051879
      54  
      55  /* Size of the old BSD gmon header */
      56  #define GMON_HDRSIZE_OLDBSD_32 (4 + 4 + 4)
      57  
      58  /* FIXME: Checking host compiler defines here means that we can't
      59     use a cross gprof alpha OSF.  */
      60  #if defined(__alpha__) && defined (__osf__)
      61  #define GMON_HDRSIZE_OLDBSD_64 (8 + 8 + 4 + 4)
      62  #else
      63  #define GMON_HDRSIZE_OLDBSD_64 (8 + 8 + 4)
      64  #endif
      65  
      66  /* *INDENT-OFF* */
      67  /* For documentation purposes only.
      68  
      69    struct old_raw_phdr
      70      {
      71        char low_pc[sizeof(void *)];  -- base pc address of sample buffer
      72        char high_pc[sizeof(void *)]  -- max pc address of sampled buffer
      73        char ncnt[4];		    -- size of sample buffer (plus this
      74  				       header)
      75  
      76        if defined (__alpha__) && defined (__osf__)
      77        char pad[4];		    -- DEC's OSF v3.0 uses 4 bytes of padding
      78  				    -- to bring the header to a size that is a
      79  				    -- multiple of 8.
      80        endif
      81      };
      82  */
      83  /* *INDENT-ON* */
      84  
      85  /*
      86   * Histogram counters are unsigned shorts:
      87   */
      88  #define	HISTCOUNTER unsigned short
      89  
      90  /*
      91   * Fraction of text space to allocate for histogram counters here, 1/2:
      92   */
      93  #define	HISTFRACTION	2
      94  
      95  /*
      96   * Fraction of text space to allocate for from hash buckets.  The
      97   * value of HASHFRACTION is based on the minimum number of bytes of
      98   * separation between two subroutine call points in the object code.
      99   * Given MIN_SUBR_SEPARATION bytes of separation the value of
     100   * HASHFRACTION is calculated as:
     101   *
     102   *      HASHFRACTION = MIN_SUBR_SEPARATION / (2 * sizeof(short) - 1);
     103   *
     104   * For the VAX, the shortest two call sequence is:
     105   *
     106   *      calls   $0,(r0)
     107   *      calls   $0,(r0)
     108   *
     109   * which is separated by only three bytes, thus HASHFRACTION is
     110   * calculated as:
     111   *
     112   *      HASHFRACTION = 3 / (2 * 2 - 1) = 1
     113   *
     114   * Note that the division above rounds down, thus if MIN_SUBR_FRACTION
     115   * is less than three, this algorithm will not work!
     116   */
     117  #define	HASHFRACTION 1
     118  
     119  /*
     120   * Percent of text space to allocate for tostructs with a minimum:
     121   */
     122  #define ARCDENSITY	2
     123  #define MINARCS		50
     124  
     125  struct tostruct
     126    {
     127      char *selfpc;
     128      int count;
     129      unsigned short link;
     130    };
     131  
     132  /*
     133   * A raw arc, with pointers to the calling site and the called site
     134   * and a count.  Everything is defined in terms of characters so
     135   * as to get a packed representation (otherwise, different compilers
     136   * might introduce different padding):
     137   */
     138  
     139  /* *INDENT-OFF* */
     140  /* For documentation purposes only.
     141  
     142    struct raw_arc
     143      {
     144        char from_pc[sizeof(void *)];
     145        char self_pc[sizeof(void *)];
     146        char count[sizeof(long)];
     147      };
     148  */
     149  /* *INDENT-ON* */
     150  
     151  /*
     152   * General rounding functions:
     153   */
     154  #define ROUNDDOWN(x,y)	(((x)/(y))*(y))
     155  #define ROUNDUP(x,y)	((((x)+(y)-1)/(y))*(y))
     156  
     157  #endif /* gmon_h */