1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 270fbe057SPeter Zijlstra #ifndef __PERF_BLOCK_RANGE_H 370fbe057SPeter Zijlstra #define __PERF_BLOCK_RANGE_H 470fbe057SPeter Zijlstra 5*e7a795d3SArnaldo Carvalho de Melo #include <stdbool.h> 6*e7a795d3SArnaldo Carvalho de Melo #include <linux/rbtree.h> 7*e7a795d3SArnaldo Carvalho de Melo #include <linux/types.h> 8*e7a795d3SArnaldo Carvalho de Melo 9*e7a795d3SArnaldo Carvalho de Melo struct symbol; 1070fbe057SPeter Zijlstra 1170fbe057SPeter Zijlstra /* 1270fbe057SPeter Zijlstra * struct block_range - non-overlapping parts of basic blocks 1370fbe057SPeter Zijlstra * @node: treenode 1470fbe057SPeter Zijlstra * @start: inclusive start of range 1570fbe057SPeter Zijlstra * @end: inclusive end of range 1670fbe057SPeter Zijlstra * @is_target: @start is a jump target 1770fbe057SPeter Zijlstra * @is_branch: @end is a branch instruction 1870fbe057SPeter Zijlstra * @coverage: number of blocks that cover this range 1970fbe057SPeter Zijlstra * @taken: number of times the branch is taken (requires @is_branch) 2070fbe057SPeter Zijlstra * @pred: number of times the taken branch was predicted 2170fbe057SPeter Zijlstra */ 2270fbe057SPeter Zijlstra struct block_range { 2370fbe057SPeter Zijlstra struct rb_node node; 2470fbe057SPeter Zijlstra 2570fbe057SPeter Zijlstra struct symbol *sym; 2670fbe057SPeter Zijlstra 2770fbe057SPeter Zijlstra u64 start; 2870fbe057SPeter Zijlstra u64 end; 2970fbe057SPeter Zijlstra 3070fbe057SPeter Zijlstra int is_target, is_branch; 3170fbe057SPeter Zijlstra 3270fbe057SPeter Zijlstra u64 coverage; 3370fbe057SPeter Zijlstra u64 entry; 3470fbe057SPeter Zijlstra u64 taken; 3570fbe057SPeter Zijlstra u64 pred; 3670fbe057SPeter Zijlstra }; 3770fbe057SPeter Zijlstra block_range__next(struct block_range * br)3870fbe057SPeter Zijlstrastatic inline struct block_range *block_range__next(struct block_range *br) 3970fbe057SPeter Zijlstra { 4070fbe057SPeter Zijlstra struct rb_node *n = rb_next(&br->node); 4170fbe057SPeter Zijlstra if (!n) 4270fbe057SPeter Zijlstra return NULL; 4370fbe057SPeter Zijlstra return rb_entry(n, struct block_range, node); 4470fbe057SPeter Zijlstra } 4570fbe057SPeter Zijlstra 4670fbe057SPeter Zijlstra struct block_range_iter { 4770fbe057SPeter Zijlstra struct block_range *start; 4870fbe057SPeter Zijlstra struct block_range *end; 4970fbe057SPeter Zijlstra }; 5070fbe057SPeter Zijlstra block_range_iter(struct block_range_iter * iter)5170fbe057SPeter Zijlstrastatic inline struct block_range *block_range_iter(struct block_range_iter *iter) 5270fbe057SPeter Zijlstra { 5370fbe057SPeter Zijlstra return iter->start; 5470fbe057SPeter Zijlstra } 5570fbe057SPeter Zijlstra block_range_iter__next(struct block_range_iter * iter)5670fbe057SPeter Zijlstrastatic inline bool block_range_iter__next(struct block_range_iter *iter) 5770fbe057SPeter Zijlstra { 5870fbe057SPeter Zijlstra if (iter->start == iter->end) 5970fbe057SPeter Zijlstra return false; 6070fbe057SPeter Zijlstra 6170fbe057SPeter Zijlstra iter->start = block_range__next(iter->start); 6270fbe057SPeter Zijlstra return true; 6370fbe057SPeter Zijlstra } 6470fbe057SPeter Zijlstra block_range_iter__valid(struct block_range_iter * iter)6570fbe057SPeter Zijlstrastatic inline bool block_range_iter__valid(struct block_range_iter *iter) 6670fbe057SPeter Zijlstra { 6770fbe057SPeter Zijlstra if (!iter->start || !iter->end) 6870fbe057SPeter Zijlstra return false; 6970fbe057SPeter Zijlstra return true; 7070fbe057SPeter Zijlstra } 7170fbe057SPeter Zijlstra 7270fbe057SPeter Zijlstra extern struct block_range *block_range__find(u64 addr); 7370fbe057SPeter Zijlstra extern struct block_range_iter block_range__create(u64 start, u64 end); 7470fbe057SPeter Zijlstra extern double block_range__coverage(struct block_range *br); 7570fbe057SPeter Zijlstra 7670fbe057SPeter Zijlstra #endif /* __PERF_BLOCK_RANGE_H */ 77