From 8109a9af1ffcfd8c2e128862a9c20324221fdd8b Mon Sep 17 00:00:00 2001 From: Bruce Evans Date: Wed, 6 Mar 2002 09:47:36 +0000 Subject: [PATCH] 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. --- usr.bin/gprof/gprof.c | 20 ++++++++++---------- usr.bin/gprof/gprof.h | 8 +++++++- usr.bin/gprof/printgprof.c | 4 ++-- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/usr.bin/gprof/gprof.c b/usr.bin/gprof/gprof.c index 1d43fe6998e9..8d529cb3c601 100644 --- a/usr.bin/gprof/gprof.c +++ b/usr.bin/gprof/gprof.c @@ -48,8 +48,6 @@ static const char rcsid[] = #include #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; } } } diff --git a/usr.bin/gprof/gprof.h b/usr.bin/gprof/gprof.h index 4d2b949402df..c37c00eee4b1 100644 --- a/usr.bin/gprof/gprof.h +++ b/usr.bin/gprof/gprof.h @@ -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" diff --git a/usr.bin/gprof/printgprof.c b/usr.bin/gprof/printgprof.c index 945ff8d36bea..80698cfd65ad 100644 --- a/usr.bin/gprof/printgprof.c +++ b/usr.bin/gprof/printgprof.c @@ -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 );