/* 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 evsel;
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 evsel *evsel, 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 evsel *evsel,
			      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 */
