1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __PERF_BLOCK_RANGE_H 3 #define __PERF_BLOCK_RANGE_H 4 5 #include <stdbool.h> 6 #include <linux/rbtree.h> 7 #include <linux/types.h> 8 9 struct symbol; 10 11 /* 12 * struct block_range - non-overlapping parts of basic blocks 13 * @node: treenode 14 * @start: inclusive start of range 15 * @end: inclusive end of range 16 * @is_target: @start is a jump target 17 * @is_branch: @end is a branch instruction 18 * @coverage: number of blocks that cover this range 19 * @taken: number of times the branch is taken (requires @is_branch) 20 * @pred: number of times the taken branch was predicted 21 */ 22 struct block_range { 23 struct rb_node node; 24 25 struct symbol *sym; 26 27 u64 start; 28 u64 end; 29 30 int is_target, is_branch; 31 32 u64 coverage; 33 u64 entry; 34 u64 taken; 35 u64 pred; 36 }; 37 38 static inline struct block_range *block_range__next(struct block_range *br) 39 { 40 struct rb_node *n = rb_next(&br->node); 41 if (!n) 42 return NULL; 43 return rb_entry(n, struct block_range, node); 44 } 45 46 struct block_range_iter { 47 struct block_range *start; 48 struct block_range *end; 49 }; 50 51 static inline struct block_range *block_range_iter(struct block_range_iter *iter) 52 { 53 return iter->start; 54 } 55 56 static inline bool block_range_iter__next(struct block_range_iter *iter) 57 { 58 if (iter->start == iter->end) 59 return false; 60 61 iter->start = block_range__next(iter->start); 62 return true; 63 } 64 65 static inline bool block_range_iter__valid(struct block_range_iter *iter) 66 { 67 if (!iter->start || !iter->end) 68 return false; 69 return true; 70 } 71 72 extern struct block_range *block_range__find(u64 addr); 73 extern struct block_range_iter block_range__create(u64 start, u64 end); 74 extern double block_range__coverage(struct block_range *br); 75 76 #endif /* __PERF_BLOCK_RANGE_H */ 77