[PATCH v2 10/14] perf util: Enable block source line comparison

From: Jin Yao
Date: Fri Mar 13 2020 - 03:12:33 EST


Previously we only supported address comparison, but it was not good
for the case that address might be changed if source code was updated.

This patch enables for the source line comparison.

1. If all of the source lines in a block are not changed (or only
moved some offsets as a whole), we think the block is not changed.

2. If we can aware any source line in this block is changed,
we think this block is changed.

3. If 1 and 2 are both not matched, fallback to address comparison.

Signed-off-by: Jin Yao <yao.jin@xxxxxxxxxxxxxxx>
---
tools/perf/util/block-info.c | 24 +++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/block-info.c b/tools/perf/util/block-info.c
index 96b7b81cabd5..4d0275fbd0df 100644
--- a/tools/perf/util/block-info.c
+++ b/tools/perf/util/block-info.c
@@ -93,11 +93,12 @@ struct block_info *block_info__new(void)
}

int64_t __block_info__cmp(struct hist_entry *left, struct hist_entry *right,
- struct srclist *src_list __maybe_unused)
+ struct srclist *src_list)
{
struct block_info *bi_l = left->block_info;
struct block_info *bi_r = right->block_info;
int cmp;
+ bool changed;

if (!bi_l->sym || !bi_r->sym) {
if (!bi_l->sym && !bi_r->sym)
@@ -112,6 +113,27 @@ int64_t __block_info__cmp(struct hist_entry *left, struct hist_entry *right,
if (cmp)
return cmp;

+ if (src_list && bi_l->line && bi_r->line) {
+ if (block_same_srcfiles(bi_l->line, bi_r->line) &&
+ bi_l->line->start_rel) {
+
+ if (block_srclist_matched(src_list,
+ bi_l->line->start_rel,
+ bi_l->line->start_nr,
+ bi_l->line->end_nr,
+ bi_r->line->start_nr,
+ bi_r->line->end_nr,
+ &changed)) {
+ bi_l->srcline_matched = true;
+ return 0;
+ } else if (changed) {
+ bi_l->block_changed = true;
+ return 0;
+ } else
+ return -1;
+ }
+ }
+
if (bi_l->start != bi_r->start)
return (int64_t)(bi_r->start - bi_l->start);

--
2.17.1