builtin-buildid-list.c 2.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
/*
 * builtin-buildid-list.c
 *
 * Builtin buildid-list command: list buildids in perf.data
 *
 * Copyright (C) 2009, Red Hat Inc.
 * Copyright (C) 2009, Arnaldo Carvalho de Melo <acme@redhat.com>
 */
#include "builtin.h"
#include "perf.h"
#include "util/cache.h"
#include "util/debug.h"
#include "util/parse-options.h"
14
#include "util/session.h"
15 16 17 18
#include "util/symbol.h"

static char const *input_name = "perf.data";
static int force;
19
static bool with_hits;
20

21
static const char * const buildid_list_usage[] = {
22
	"perf buildid-list [<options>]",
23 24 25 26
	NULL
};

static const struct option options[] = {
27
	OPT_BOOLEAN('H', "with-hits", &with_hits, "Show only DSOs with hits"),
28 29 30 31
	OPT_STRING('i', "input", &input_name, "file",
		    "input file name"),
	OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
	OPT_BOOLEAN('v', "verbose", &verbose,
32
		    "be more verbose"),
33 34 35
	OPT_END()
};

36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
static int build_id_list__process_event(event_t *event,
					struct perf_session *session)
{
	struct addr_location al;
	u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
	struct thread *thread = perf_session__findnew(session, event->ip.pid);

	if (thread == NULL) {
		pr_err("problem processing %d event, skipping it.\n",
			event->header.type);
		return -1;
	}

	thread__find_addr_map(thread, session, cpumode, MAP__FUNCTION,
			      event->ip.ip, &al);

	if (al.map != NULL)
		al.map->dso->hit = 1;

	return 0;
}

static struct perf_event_ops build_id_list__event_ops = {
	.sample	= build_id_list__process_event,
	.mmap	= event__process_mmap,
	.fork	= event__process_task,
};

64 65 66
static int __cmd_buildid_list(void)
{
	int err = -1;
67 68 69
	struct perf_session *session;

	session = perf_session__new(input_name, O_RDONLY, force);
70 71
	if (session == NULL)
		return -1;
72

73 74 75 76
	if (with_hits)
		perf_session__process_events(session, &build_id_list__event_ops);

	dsos__fprintf_buildid(stdout, with_hits);
77

78
	perf_session__delete(session);
79 80 81 82 83 84 85 86 87
	return err;
}

int cmd_buildid_list(int argc, const char **argv, const char *prefix __used)
{
	argc = parse_options(argc, argv, options, buildid_list_usage, 0);
	setup_pager();
	return __cmd_buildid_list();
}