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