perf diff currently can only diff symbols(functions). We should expand it
to diff cycles of individual programs blocks as reported by timed LBR.
This would allow to identify changes in specific code accurately.

We need a new structure to maintain the basic block information, such as,
symbol(function), start/end address of this block, cycles. This patch
creates this structure and with some ops.

Signed-off-by: Jin Yao <yao....@linux.intel.com>
---
 tools/perf/util/symbol.c | 22 ++++++++++++++++++++++
 tools/perf/util/symbol.h | 23 +++++++++++++++++++++++
 2 files changed, 45 insertions(+)

diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index f4540f8..4e0a7b3 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -2351,3 +2351,25 @@ struct mem_info *mem_info__new(void)
                refcount_set(&mi->refcnt, 1);
        return mi;
 }
+
+struct block_info *block_info__get(struct block_info *bi)
+{
+       if (bi)
+               refcount_inc(&bi->refcnt);
+       return bi;
+}
+
+void block_info__put(struct block_info *bi)
+{
+       if (bi && refcount_dec_and_test(&bi->refcnt))
+               free(bi);
+}
+
+struct block_info *block_info__new(void)
+{
+       struct block_info *bi = zalloc(sizeof(*bi));
+
+       if (bi)
+               refcount_set(&bi->refcnt, 1);
+       return bi;
+}
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
index 9a8fe01..12755b4 100644
--- a/tools/perf/util/symbol.h
+++ b/tools/perf/util/symbol.h
@@ -131,6 +131,17 @@ struct mem_info {
        refcount_t              refcnt;
 };
 
+struct block_info {
+       struct symbol           *sym;
+       u64                     start;
+       u64                     end;
+       u64                     cycles;
+       u64                     cycles_aggr;
+       int                     num;
+       int                     num_aggr;
+       refcount_t              refcnt;
+};
+
 struct addr_location {
        struct machine *machine;
        struct thread *thread;
@@ -332,4 +343,16 @@ static inline void __mem_info__zput(struct mem_info **mi)
 
 #define mem_info__zput(mi) __mem_info__zput(&mi)
 
+struct block_info *block_info__new(void);
+struct block_info *block_info__get(struct block_info *bi);
+void   block_info__put(struct block_info *bi);
+
+static inline void __block_info__zput(struct block_info **bi)
+{
+       block_info__put(*bi);
+       *bi = NULL;
+}
+
+#define block_info__zput(bi) __block_info__zput(&bi)
+
 #endif /* __PERF_SYMBOL */
-- 
2.7.4

Reply via email to