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

From: Jin Yao
Date: Tue Mar 10 2020 - 03:04:05 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 2ad9e2dd7f77..3aa564151d84 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