| |
| #ifndef __PERF_BLOCK_RANGE_H |
| #define __PERF_BLOCK_RANGE_H |
| |
| #include <stdbool.h> |
| #include <linux/rbtree.h> |
| #include <linux/types.h> |
| |
| struct symbol; |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| struct block_range { |
| <------>struct rb_node node; |
| |
| <------>struct symbol *sym; |
| |
| <------>u64 start; |
| <------>u64 end; |
| |
| <------>int is_target, is_branch; |
| |
| <------>u64 coverage; |
| <------>u64 entry; |
| <------>u64 taken; |
| <------>u64 pred; |
| }; |
| |
| static inline struct block_range *block_range__next(struct block_range *br) |
| { |
| <------>struct rb_node *n = rb_next(&br->node); |
| <------>if (!n) |
| <------><------>return NULL; |
| <------>return rb_entry(n, struct block_range, node); |
| } |
| |
| struct block_range_iter { |
| <------>struct block_range *start; |
| <------>struct block_range *end; |
| }; |
| |
| static inline struct block_range *block_range_iter(struct block_range_iter *iter) |
| { |
| <------>return iter->start; |
| } |
| |
| static inline bool block_range_iter__next(struct block_range_iter *iter) |
| { |
| <------>if (iter->start == iter->end) |
| <------><------>return false; |
| |
| <------>iter->start = block_range__next(iter->start); |
| <------>return true; |
| } |
| |
| static inline bool block_range_iter__valid(struct block_range_iter *iter) |
| { |
| <------>if (!iter->start || !iter->end) |
| <------><------>return false; |
| <------>return true; |
| } |
| |
| extern struct block_range *block_range__find(u64 addr); |
| extern struct block_range_iter block_range__create(u64 start, u64 end); |
| extern double block_range__coverage(struct block_range *br); |
| |
| #endif |
| |