77 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef __PERF_BLOCK_RANGE_H3#define __PERF_BLOCK_RANGE_H4 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 blocks13 * @node: treenode14 * @start: inclusive start of range15 * @end: inclusive end of range16 * @is_target: @start is a jump target17 * @is_branch: @end is a branch instruction18 * @coverage: number of blocks that cover this range19 * @taken: number of times the branch is taken (requires @is_branch)20 * @pred: number of times the taken branch was predicted21 */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 */77