1*fae548d3Szrj /* 2*fae548d3Szrj * Copyright (c) 1983, 1991, 1993, 2001 3*fae548d3Szrj * The Regents of the University of California. All rights reserved. 4*fae548d3Szrj * 5*fae548d3Szrj * Redistribution and use in source and binary forms, with or without 6*fae548d3Szrj * modification, are permitted provided that the following conditions 7*fae548d3Szrj * are met: 8*fae548d3Szrj * 1. Redistributions of source code must retain the above copyright 9*fae548d3Szrj * notice, this list of conditions and the following disclaimer. 10*fae548d3Szrj * 2. Redistributions in binary form must reproduce the above copyright 11*fae548d3Szrj * notice, this list of conditions and the following disclaimer in the 12*fae548d3Szrj * documentation and/or other materials provided with the distribution. 13*fae548d3Szrj * 3. Neither the name of the University nor the names of its contributors 14*fae548d3Szrj * may be used to endorse or promote products derived from this software 15*fae548d3Szrj * without specific prior written permission. 16*fae548d3Szrj * 17*fae548d3Szrj * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18*fae548d3Szrj * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*fae548d3Szrj * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*fae548d3Szrj * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21*fae548d3Szrj * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*fae548d3Szrj * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23*fae548d3Szrj * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24*fae548d3Szrj * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25*fae548d3Szrj * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26*fae548d3Szrj * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27*fae548d3Szrj * SUCH DAMAGE. 28*fae548d3Szrj */ 29*fae548d3Szrj #ifndef gmon_h 30*fae548d3Szrj #define gmon_h 31*fae548d3Szrj 32*fae548d3Szrj /* Size of the 4.4BSD gmon header */ 33*fae548d3Szrj #define GMON_HDRSIZE_BSD44_32 (4 + 4 + 4 + 4 + 4 + (3 * 4)) 34*fae548d3Szrj #define GMON_HDRSIZE_BSD44_64 (8 + 8 + 4 + 4 + 4 + (3 * 4)) 35*fae548d3Szrj 36*fae548d3Szrj /* *INDENT-OFF* */ 37*fae548d3Szrj /* For documentation purposes only. 38*fae548d3Szrj 39*fae548d3Szrj struct raw_phdr 40*fae548d3Szrj { 41*fae548d3Szrj char low_pc[sizeof(void *)]; -- base pc address of sample buffer 42*fae548d3Szrj char high_pc[sizeof(void *)]; -- max pc address of sampled buffer 43*fae548d3Szrj char ncnt[4]; -- size of sample buffer (plus this 44*fae548d3Szrj header) 45*fae548d3Szrj 46*fae548d3Szrj char version[4]; -- version number 47*fae548d3Szrj char profrate[4]; -- profiling clock rate 48*fae548d3Szrj char spare[3*4]; -- reserved 49*fae548d3Szrj }; 50*fae548d3Szrj */ 51*fae548d3Szrj /* *INDENT-ON* */ 52*fae548d3Szrj 53*fae548d3Szrj #define GMONVERSION 0x00051879 54*fae548d3Szrj 55*fae548d3Szrj /* Size of the old BSD gmon header */ 56*fae548d3Szrj #define GMON_HDRSIZE_OLDBSD_32 (4 + 4 + 4) 57*fae548d3Szrj 58*fae548d3Szrj /* FIXME: Checking host compiler defines here means that we can't 59*fae548d3Szrj use a cross gprof alpha OSF. */ 60*fae548d3Szrj #if defined(__alpha__) && defined (__osf__) 61*fae548d3Szrj #define GMON_HDRSIZE_OLDBSD_64 (8 + 8 + 4 + 4) 62*fae548d3Szrj #else 63*fae548d3Szrj #define GMON_HDRSIZE_OLDBSD_64 (8 + 8 + 4) 64*fae548d3Szrj #endif 65*fae548d3Szrj 66*fae548d3Szrj /* *INDENT-OFF* */ 67*fae548d3Szrj /* For documentation purposes only. 68*fae548d3Szrj 69*fae548d3Szrj struct old_raw_phdr 70*fae548d3Szrj { 71*fae548d3Szrj char low_pc[sizeof(void *)]; -- base pc address of sample buffer 72*fae548d3Szrj char high_pc[sizeof(void *)] -- max pc address of sampled buffer 73*fae548d3Szrj char ncnt[4]; -- size of sample buffer (plus this 74*fae548d3Szrj header) 75*fae548d3Szrj 76*fae548d3Szrj if defined (__alpha__) && defined (__osf__) 77*fae548d3Szrj char pad[4]; -- DEC's OSF v3.0 uses 4 bytes of padding 78*fae548d3Szrj -- to bring the header to a size that is a 79*fae548d3Szrj -- multiple of 8. 80*fae548d3Szrj endif 81*fae548d3Szrj }; 82*fae548d3Szrj */ 83*fae548d3Szrj /* *INDENT-ON* */ 84*fae548d3Szrj 85*fae548d3Szrj /* 86*fae548d3Szrj * Histogram counters are unsigned shorts: 87*fae548d3Szrj */ 88*fae548d3Szrj #define HISTCOUNTER unsigned short 89*fae548d3Szrj 90*fae548d3Szrj /* 91*fae548d3Szrj * Fraction of text space to allocate for histogram counters here, 1/2: 92*fae548d3Szrj */ 93*fae548d3Szrj #define HISTFRACTION 2 94*fae548d3Szrj 95*fae548d3Szrj /* 96*fae548d3Szrj * Fraction of text space to allocate for from hash buckets. The 97*fae548d3Szrj * value of HASHFRACTION is based on the minimum number of bytes of 98*fae548d3Szrj * separation between two subroutine call points in the object code. 99*fae548d3Szrj * Given MIN_SUBR_SEPARATION bytes of separation the value of 100*fae548d3Szrj * HASHFRACTION is calculated as: 101*fae548d3Szrj * 102*fae548d3Szrj * HASHFRACTION = MIN_SUBR_SEPARATION / (2 * sizeof(short) - 1); 103*fae548d3Szrj * 104*fae548d3Szrj * For the VAX, the shortest two call sequence is: 105*fae548d3Szrj * 106*fae548d3Szrj * calls $0,(r0) 107*fae548d3Szrj * calls $0,(r0) 108*fae548d3Szrj * 109*fae548d3Szrj * which is separated by only three bytes, thus HASHFRACTION is 110*fae548d3Szrj * calculated as: 111*fae548d3Szrj * 112*fae548d3Szrj * HASHFRACTION = 3 / (2 * 2 - 1) = 1 113*fae548d3Szrj * 114*fae548d3Szrj * Note that the division above rounds down, thus if MIN_SUBR_FRACTION 115*fae548d3Szrj * is less than three, this algorithm will not work! 116*fae548d3Szrj */ 117*fae548d3Szrj #define HASHFRACTION 1 118*fae548d3Szrj 119*fae548d3Szrj /* 120*fae548d3Szrj * Percent of text space to allocate for tostructs with a minimum: 121*fae548d3Szrj */ 122*fae548d3Szrj #define ARCDENSITY 2 123*fae548d3Szrj #define MINARCS 50 124*fae548d3Szrj 125*fae548d3Szrj struct tostruct 126*fae548d3Szrj { 127*fae548d3Szrj char *selfpc; 128*fae548d3Szrj int count; 129*fae548d3Szrj unsigned short link; 130*fae548d3Szrj }; 131*fae548d3Szrj 132*fae548d3Szrj /* 133*fae548d3Szrj * A raw arc, with pointers to the calling site and the called site 134*fae548d3Szrj * and a count. Everything is defined in terms of characters so 135*fae548d3Szrj * as to get a packed representation (otherwise, different compilers 136*fae548d3Szrj * might introduce different padding): 137*fae548d3Szrj */ 138*fae548d3Szrj 139*fae548d3Szrj /* *INDENT-OFF* */ 140*fae548d3Szrj /* For documentation purposes only. 141*fae548d3Szrj 142*fae548d3Szrj struct raw_arc 143*fae548d3Szrj { 144*fae548d3Szrj char from_pc[sizeof(void *)]; 145*fae548d3Szrj char self_pc[sizeof(void *)]; 146*fae548d3Szrj char count[sizeof(long)]; 147*fae548d3Szrj }; 148*fae548d3Szrj */ 149*fae548d3Szrj /* *INDENT-ON* */ 150*fae548d3Szrj 151*fae548d3Szrj /* 152*fae548d3Szrj * General rounding functions: 153*fae548d3Szrj */ 154*fae548d3Szrj #define ROUNDDOWN(x,y) (((x)/(y))*(y)) 155*fae548d3Szrj #define ROUNDUP(x,y) ((((x)+(y)-1)/(y))*(y)) 156*fae548d3Szrj 157*fae548d3Szrj #endif /* gmon_h */ 158