linux/tools/perf/util/block-range.h
<<
>>
Prefs
   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 */
  77