brintos

brintos / linux-shallow public Read only

0
0
Text · 1.7 KiB · ec0fb53 Raw
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