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

#include <stdbool.h>

#include <linux/types.h>

struct perf_session;
union perf_event;
struct evlist;
struct perf_sample;
struct perf_tool;
struct machine;
struct ordered_events;

typedef int (*event_sample)(const struct perf_tool *tool, union perf_event *event,
			    struct perf_sample *sample,
			    struct machine *machine);

typedef int (*event_op)(const struct perf_tool *tool, union perf_event *event,
			struct perf_sample *sample, struct machine *machine);

typedef int (*event_attr_op)(const struct perf_tool *tool,
			     union perf_event *event,
			     struct evlist **pevlist);

typedef int (*event_op2)(const struct perf_tool *tool, struct perf_session *session,
			 union perf_event *event);
typedef s64 (*event_op3)(const struct perf_tool *tool, struct perf_session *session,
			 union perf_event *event);
typedef int (*event_op4)(const struct perf_tool *tool, struct perf_session *session,
			 union perf_event *event, u64 data, const char *str);

typedef int (*event_oe)(const struct perf_tool *tool, union perf_event *event,
			struct ordered_events *oe);

enum show_feature_header {
	SHOW_FEAT_NO_HEADER = 0,
	SHOW_FEAT_HEADER,
	SHOW_FEAT_HEADER_FULL_INFO,
};

struct perf_tool {
	event_sample	sample,
			read,
			callchain_deferred;
	event_op	mmap,
			mmap2,
			comm,
			namespaces,
			cgroup,
			fork,
			exit,
			lost,
			lost_samples,
			aux,
			itrace_start,
			aux_output_hw_id,
			context_switch,
			throttle,
			unthrottle,
			ksymbol,
			bpf,
			text_poke;

	event_attr_op	attr;
	event_attr_op	event_update;
	event_op2	tracing_data;
	event_oe	finished_round;
	event_op2	build_id,
			id_index,
			auxtrace_info,
			auxtrace_error,
			time_conv,
			thread_map,
			cpu_map,
			stat_config,
			stat,
			stat_round,
			feature,
			finished_init,
			bpf_metadata,
			schedstat_cpu,
			schedstat_domain;
	event_op4	compressed;
	event_op3	auxtrace;
	bool		ordered_events;
	bool		ordering_requires_timestamps;
	bool		namespace_events;
	bool		cgroup_events;
	bool		no_warn;
	bool		dont_split_sample_group;
	bool		merge_deferred_callchains;
	enum show_feature_header show_feat_hdr;
};

void perf_tool__init(struct perf_tool *tool, bool ordered_events);

bool perf_tool__compressed_is_stub(const struct perf_tool *tool);

int process_event_sample_stub(const struct perf_tool *tool,
			      union perf_event *event,
			      struct perf_sample *sample,
			      struct machine *machine);

struct delegate_tool {
	/** @tool: The actual tool that calls the delegate. */
	struct perf_tool tool;
	/** @delegate: The tool that is delegated to. */
	struct perf_tool *delegate;
};

void delegate_tool__init(struct delegate_tool *tool, struct perf_tool *delegate);

#endif /* __PERF_TOOL_H */
