/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __PERF_BLOCK_RANGE_H
#define __PERF_BLOCK_RANGE_H

#include "symbol.h"

/*
 * struct block_range - non-overlapping parts of basic blocks
 * @node:	treenode
 * @start:	inclusive start of range
 * @end:	inclusive end of range
 * @is_target:	@start is a jump target
 * @is_branch:	@end is a branch instruction
 * @coverage:	number of blocks that cover this range
 * @taken:	number of times the branch is taken (requires @is_branch)
 * @pred:	number of times the taken branch was predicted
 */
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 /* __PERF_BLOCK_RANGE_H */
