Fixed some misspellings of 2 as sizeof(UNIT) so that they won't break

things when sizeof(UNIT) becomes a runtime parameter.  The relevant 2
is the one in profil(2)'s scaling of pc's to bucket numbers:

	   bucket = (pc - offset) / 2 * profil_scale / 65536

gprof(1) must duplicate this scaling, bug for bug compatibly, so it
must first do an integer division by 2 although this mainly makes
scales larger than 65536 useless.  sizeof(UNIT) was already wrong in
gprof4, but there were no problems because the fake profil scale is a
multiple of 2.

There are also some rounding bugs in the scaling, but these are only
problems if profil(2) is used directly to create unusual (and not
useful) scales.
This commit is contained in:
Bruce Evans 2002-03-06 09:47:36 +00:00
parent 97b6284457
commit 8109a9af1f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=91735
3 changed files with 19 additions and 13 deletions

View File

@ -48,8 +48,6 @@ static const char rcsid[] =
#include <err.h>
#include "gprof.h"
#define UNITS_TO_CODE (OFFSET_OF_CODE / sizeof(UNIT))
static int valcmp(const void *, const void *);
@ -306,8 +304,8 @@ openpfile(filename)
}
s_lowpc = (unsigned long) gmonhdr.lpc;
s_highpc = (unsigned long) gmonhdr.hpc;
lowpc = (unsigned long)gmonhdr.lpc / sizeof(UNIT);
highpc = (unsigned long)gmonhdr.hpc / sizeof(UNIT);
lowpc = (unsigned long)gmonhdr.lpc / HISTORICAL_SCALE_2;
highpc = (unsigned long)gmonhdr.hpc / HISTORICAL_SCALE_2;
sampbytes = gmonhdr.ncnt - size;
nsamples = sampbytes / sizeof (UNIT);
# ifdef DEBUG
@ -525,8 +523,8 @@ asgnsamples()
# ifdef DEBUG
if (debug & SAMPLEDEBUG) {
printf("[asgnsamples] (0x%lx->0x%lx-0x%lx) %s gets %f ticks %lu overlap\n",
nl[j].value/sizeof(UNIT), svalue0, svalue1,
nl[j].name,
nl[j].value / HISTORICAL_SCALE_2,
svalue0, svalue1, nl[j].name,
overlap * time / scale, overlap);
}
# endif DEBUG
@ -573,17 +571,19 @@ alignentries()
unsigned long bucket_of_code;
for (nlp = nl; nlp < npe; nlp++) {
nlp -> svalue = nlp -> value / sizeof(UNIT);
nlp -> svalue = nlp -> value / HISTORICAL_SCALE_2;
bucket_of_entry = (nlp->svalue - lowpc) / scale;
bucket_of_code = (nlp->svalue + UNITS_TO_CODE - lowpc) / scale;
bucket_of_code = (nlp->svalue + OFFSET_OF_CODE / HISTORICAL_SCALE_2 -
lowpc) / scale;
if (bucket_of_entry < bucket_of_code) {
# ifdef DEBUG
if (debug & SAMPLEDEBUG) {
printf("[alignentries] pushing svalue 0x%lx to 0x%lx\n",
nlp->svalue, nlp->svalue + UNITS_TO_CODE);
nlp->svalue,
nlp->svalue + OFFSET_OF_CODE / HISTORICAL_SCALE_2);
}
# endif DEBUG
nlp->svalue += UNITS_TO_CODE;
nlp->svalue += OFFSET_OF_CODE / HISTORICAL_SCALE_2;
}
}
}

View File

@ -77,6 +77,13 @@ typedef int bool;
#define FALSE 0
#define TRUE 1
/*
* Historical scale factor in profil(2)'s algorithm for converting
* pc addresses to bucket numbers. This now just complicates the
* scaling and makes bucket:pc densities of more than 1/2 useless.
*/
#define HISTORICAL_SCALE_2 2
/*
* ticks per second
*/
@ -87,7 +94,6 @@ typedef int64_t UNIT;
#else
typedef u_short UNIT; /* unit of profiling */
#endif
#define UNITS_TO_CODE (OFFSET_OF_CODE / sizeof(UNIT))
char *a_outname;
#define A_OUTNAME "a.out"

View File

@ -100,7 +100,7 @@ flatprofheader()
printblurb( _PATH_FLAT_BLURB );
}
printf( "\ngranularity: each sample hit covers %g byte(s)" ,
scale * sizeof(UNIT) );
scale * HISTORICAL_SCALE_2 );
if ( totime > 0.0 ) {
printf( " for %.2f%% of %.2f seconds\n\n" ,
100.0/totime , totime / hz );
@ -161,7 +161,7 @@ gprofheader()
printblurb( _PATH_CALLG_BLURB );
}
printf( "\ngranularity: each sample hit covers %g byte(s)" ,
scale * sizeof(UNIT) );
scale * HISTORICAL_SCALE_2 );
if ( printtime > 0.0 ) {
printf( " for %.2f%% of %.2f seconds\n\n" ,
100.0/printtime , printtime / hz );