block-range.h (1714B)
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 9struct 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 */ 22struct 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 38static 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 46struct block_range_iter { 47 struct block_range *start; 48 struct block_range *end; 49}; 50 51static inline struct block_range *block_range_iter(struct block_range_iter *iter) 52{ 53 return iter->start; 54} 55 56static 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 65static 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 72extern struct block_range *block_range__find(u64 addr); 73extern struct block_range_iter block_range__create(u64 start, u64 end); 74extern double block_range__coverage(struct block_range *br); 75 76#endif /* __PERF_BLOCK_RANGE_H */