target: Correct profiling calculation
1. high_pc should be (maximum sample + 1) (Refer to gprof source code) 2. bucket index should be sample offset --------------- x (number of bucket) sample range For example, if minimum sample is 0 and maximum sample is 5 and the number of bucket is 3. a = sampled_address - 0 b = 3 c = 6 (a, b, c refer to source code variables) sampled_address = 0, => a = 0, => bucket_index = 0 sampled_address = 1, => a = 1, => bucket_index = 0 sampled_address = 2, => a = 2, => bucket_index = 1 sampled_address = 3, => a = 3, => bucket_index = 1 sampled_address = 4, => a = 4, => bucket_index = 2 sampled_address = 5, => a = 5, => bucket_index = 2 Change-Id: Ia9fa0e4d9c7183e3e9d7ceaf73e63729f07aa2ce Signed-off-by: Hsiangkai Wang <hsiangkai@gmail.com> Reviewed-on: http://openocd.zylin.com/1607 Tested-by: jenkins Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
This commit is contained in:
parent
a4bacdcb84
commit
d4d62ea8a8
|
@ -3387,7 +3387,11 @@ static void writeGmon(uint32_t *samples, uint32_t sampleNum, const char *filenam
|
||||||
max = samples[i];
|
max = samples[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
int addressSpace = (max - min + 1);
|
/* max should be (largest sample + 1)
|
||||||
|
* Refer to binutils/gprof/hist.c (find_histogram_for_pc) */
|
||||||
|
max++;
|
||||||
|
|
||||||
|
int addressSpace = max - min;
|
||||||
assert(addressSpace >= 2);
|
assert(addressSpace >= 2);
|
||||||
|
|
||||||
static const uint32_t maxBuckets = 16 * 1024; /* maximum buckets. */
|
static const uint32_t maxBuckets = 16 * 1024; /* maximum buckets. */
|
||||||
|
@ -3403,8 +3407,8 @@ static void writeGmon(uint32_t *samples, uint32_t sampleNum, const char *filenam
|
||||||
for (i = 0; i < sampleNum; i++) {
|
for (i = 0; i < sampleNum; i++) {
|
||||||
uint32_t address = samples[i];
|
uint32_t address = samples[i];
|
||||||
long long a = address - min;
|
long long a = address - min;
|
||||||
long long b = numBuckets - 1;
|
long long b = numBuckets;
|
||||||
long long c = addressSpace - 1;
|
long long c = addressSpace;
|
||||||
int index_t = (a * b) / c; /* danger!!!! int32 overflows */
|
int index_t = (a * b) / c; /* danger!!!! int32 overflows */
|
||||||
buckets[index_t]++;
|
buckets[index_t]++;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue