Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef __PERF_BLOCK_RANGE_H
0003 #define __PERF_BLOCK_RANGE_H
0004 
0005 #include <stdbool.h>
0006 #include <linux/rbtree.h>
0007 #include <linux/types.h>
0008 
0009 struct symbol;
0010 
0011 /*
0012  * struct block_range - non-overlapping parts of basic blocks
0013  * @node:   treenode
0014  * @start:  inclusive start of range
0015  * @end:    inclusive end of range
0016  * @is_target:  @start is a jump target
0017  * @is_branch:  @end is a branch instruction
0018  * @coverage:   number of blocks that cover this range
0019  * @taken:  number of times the branch is taken (requires @is_branch)
0020  * @pred:   number of times the taken branch was predicted
0021  */
0022 struct block_range {
0023     struct rb_node node;
0024 
0025     struct symbol *sym;
0026 
0027     u64 start;
0028     u64 end;
0029 
0030     int is_target, is_branch;
0031 
0032     u64 coverage;
0033     u64 entry;
0034     u64 taken;
0035     u64 pred;
0036 };
0037 
0038 static inline struct block_range *block_range__next(struct block_range *br)
0039 {
0040     struct rb_node *n = rb_next(&br->node);
0041     if (!n)
0042         return NULL;
0043     return rb_entry(n, struct block_range, node);
0044 }
0045 
0046 struct block_range_iter {
0047     struct block_range *start;
0048     struct block_range *end;
0049 };
0050 
0051 static inline struct block_range *block_range_iter(struct block_range_iter *iter)
0052 {
0053     return iter->start;
0054 }
0055 
0056 static inline bool block_range_iter__next(struct block_range_iter *iter)
0057 {
0058     if (iter->start == iter->end)
0059         return false;
0060 
0061     iter->start = block_range__next(iter->start);
0062     return true;
0063 }
0064 
0065 static inline bool block_range_iter__valid(struct block_range_iter *iter)
0066 {
0067     if (!iter->start || !iter->end)
0068         return false;
0069     return true;
0070 }
0071 
0072 extern struct block_range *block_range__find(u64 addr);
0073 extern struct block_range_iter block_range__create(u64 start, u64 end);
0074 extern double block_range__coverage(struct block_range *br);
0075 
0076 #endif /* __PERF_BLOCK_RANGE_H */