tools/perf/util/parse-events.c

Source file repositories/reference/linux-study-clean/tools/perf/util/parse-events.c

File Facts

System
Linux kernel
Corpus path
tools/perf/util/parse-events.c
Extension
.c
Size
80572 bytes
Lines
2927
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

struct add_tracepoint_multi_args {
	struct parse_events_state *parse_state;
	struct list_head *list;
	const char *sys_glob;
	const char *evt_glob;
	struct parse_events_error *err;
	struct parse_events_terms *head_config;
	YYLTYPE *loc;
	int found;
};

static int add_tracepoint_multi_event_cb(void *state, const char *sys_name, const char *evt_name)
{
	struct add_tracepoint_multi_args *args = state;
	int ret;

	if (!strglobmatch(evt_name, args->evt_glob))
		return 0;

	args->found++;
	ret = add_tracepoint(args->parse_state, args->list, sys_name, evt_name,
			     args->err, args->head_config, args->loc);

	return ret;
}

static int add_tracepoint_multi_event(struct add_tracepoint_multi_args *args, const char *sys_name)
{
	if (strpbrk(args->evt_glob, "*?") == NULL) {
		/* Not a glob. */
		args->found++;
		return add_tracepoint(args->parse_state, args->list, sys_name, args->evt_glob,
				      args->err, args->head_config, args->loc);
	}

	return tp_pmu__for_each_tp_event(sys_name, args, add_tracepoint_multi_event_cb);
}

static int add_tracepoint_multi_sys_cb(void *state, const char *sys_name)
{
	struct add_tracepoint_multi_args *args = state;

	if (!strglobmatch(sys_name, args->sys_glob))
		return 0;

	return add_tracepoint_multi_event(args, sys_name);
}

static int add_tracepoint_multi_sys(struct parse_events_state *parse_state,
				    struct list_head *list,
				    const char *sys_glob, const char *evt_glob,
				    struct parse_events_error *err,
				    struct parse_events_terms *head_config, YYLTYPE *loc)
{
	struct add_tracepoint_multi_args args = {
		.parse_state = parse_state,
		.list = list,
		.sys_glob = sys_glob,
		.evt_glob = evt_glob,
		.err = err,
		.head_config = head_config,
		.loc = loc,
		.found = 0,
	};
	int ret;

	if (strpbrk(sys_glob, "*?") == NULL) {
		/* Not a glob. */
		ret = add_tracepoint_multi_event(&args, sys_glob);
	} else {
		ret = tp_pmu__for_each_tp_sys(&args, add_tracepoint_multi_sys_cb);
	}
	if (args.found == 0) {
		tracepoint_error(err, ENOENT, sys_glob, evt_glob, loc->first_column);
		return -ENOENT;
	}
	return ret;
}

size_t default_breakpoint_len(void)
{
#if defined(__i386__)
	static int len;

	if (len == 0) {
		struct perf_env env = {};

		perf_env__init(&env);
		len = perf_env__kernel_is_64_bit(&env) ? sizeof(u64) : sizeof(long);
		perf_env__exit(&env);

Annotation

Implementation Notes