Blame view

tools/perf/builtin-buildid-list.c 2.62 KB
c34984b2b   Arnaldo Carvalho de Melo   perf buildid-list...
1
2
3
  /*
   * builtin-buildid-list.c
   *
7a6f205d6   Arnaldo Carvalho de Melo   perf buildid-list...
4
5
   * Builtin buildid-list command: list buildids in perf.data, in the running
   * kernel and in ELF files.
c34984b2b   Arnaldo Carvalho de Melo   perf buildid-list...
6
7
8
9
10
11
   *
   * Copyright (C) 2009, Red Hat Inc.
   * Copyright (C) 2009, Arnaldo Carvalho de Melo <acme@redhat.com>
   */
  #include "builtin.h"
  #include "perf.h"
7b2567c1f   Arnaldo Carvalho de Melo   perf build-id: Mo...
12
  #include "util/build-id.h"
c34984b2b   Arnaldo Carvalho de Melo   perf buildid-list...
13
  #include "util/cache.h"
c34984b2b   Arnaldo Carvalho de Melo   perf buildid-list...
14
  #include "util/debug.h"
c34984b2b   Arnaldo Carvalho de Melo   perf buildid-list...
15
  #include "util/parse-options.h"
94c744b6c   Arnaldo Carvalho de Melo   perf tools: Intro...
16
  #include "util/session.h"
c34984b2b   Arnaldo Carvalho de Melo   perf buildid-list...
17
  #include "util/symbol.h"
7a6f205d6   Arnaldo Carvalho de Melo   perf buildid-list...
18
  #include <libelf.h>
efad14150   Robert Richter   perf report: Acce...
19
  static const char *input_name;
c05556421   Ian Munsie   perf: Fix endiann...
20
  static bool force;
f2add9cd6   Arnaldo Carvalho de Melo   perf buildid-list...
21
  static bool show_kernel;
88d3d9b7c   Arnaldo Carvalho de Melo   perf buildid-list...
22
  static bool with_hits;
c34984b2b   Arnaldo Carvalho de Melo   perf buildid-list...
23

0422a4fc2   Arnaldo Carvalho de Melo   perf diff: Fix us...
24
  static const char * const buildid_list_usage[] = {
b9b1e1c71   Arnaldo Carvalho de Melo   perf buildid-list...
25
  	"perf buildid-list [<options>]",
c34984b2b   Arnaldo Carvalho de Melo   perf buildid-list...
26
27
28
29
  	NULL
  };
  
  static const struct option options[] = {
88d3d9b7c   Arnaldo Carvalho de Melo   perf buildid-list...
30
  	OPT_BOOLEAN('H', "with-hits", &with_hits, "Show only DSOs with hits"),
c34984b2b   Arnaldo Carvalho de Melo   perf buildid-list...
31
32
33
  	OPT_STRING('i', "input", &input_name, "file",
  		    "input file name"),
  	OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
f2add9cd6   Arnaldo Carvalho de Melo   perf buildid-list...
34
  	OPT_BOOLEAN('k', "kernel", &show_kernel, "Show current kernel build id"),
c05556421   Ian Munsie   perf: Fix endiann...
35
  	OPT_INCR('v', "verbose", &verbose,
1124ba73b   Arnaldo Carvalho de Melo   perf buildid-list...
36
  		    "be more verbose"),
c34984b2b   Arnaldo Carvalho de Melo   perf buildid-list...
37
38
  	OPT_END()
  };
f2add9cd6   Arnaldo Carvalho de Melo   perf buildid-list...
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
  static int sysfs__fprintf_build_id(FILE *fp)
  {
  	u8 kallsyms_build_id[BUILD_ID_SIZE];
  	char sbuild_id[BUILD_ID_SIZE * 2 + 1];
  
  	if (sysfs__read_build_id("/sys/kernel/notes", kallsyms_build_id,
  				 sizeof(kallsyms_build_id)) != 0)
  		return -1;
  
  	build_id__sprintf(kallsyms_build_id, sizeof(kallsyms_build_id),
  			  sbuild_id);
  	fprintf(fp, "%s
  ", sbuild_id);
  	return 0;
  }
7a6f205d6   Arnaldo Carvalho de Melo   perf buildid-list...
54
  static int filename__fprintf_build_id(const char *name, FILE *fp)
f2add9cd6   Arnaldo Carvalho de Melo   perf buildid-list...
55
  {
7a6f205d6   Arnaldo Carvalho de Melo   perf buildid-list...
56
57
  	u8 build_id[BUILD_ID_SIZE];
  	char sbuild_id[BUILD_ID_SIZE * 2 + 1];
f2add9cd6   Arnaldo Carvalho de Melo   perf buildid-list...
58

7a6f205d6   Arnaldo Carvalho de Melo   perf buildid-list...
59
60
61
62
63
64
65
66
  	if (filename__read_build_id(name, build_id,
  				    sizeof(build_id)) != sizeof(build_id))
  		return 0;
  
  	build_id__sprintf(build_id, sizeof(build_id), sbuild_id);
  	return fprintf(fp, "%s
  ", sbuild_id);
  }
1b5495043   Robert Richter   perf tools: Movin...
67
68
69
  static int perf_session__list_build_ids(void)
  {
  	struct perf_session *session;
efad14150   Robert Richter   perf report: Acce...
70
  	elf_version(EV_CURRENT);
1b5495043   Robert Richter   perf tools: Movin...
71
72
73
74
  	session = perf_session__new(input_name, O_RDONLY, force, false,
  				    &build_id__mark_dso_hit_ops);
  	if (session == NULL)
  		return -1;
efad14150   Robert Richter   perf report: Acce...
75
76
77
78
79
  	/*
  	 * See if this is an ELF file first:
  	 */
  	if (filename__fprintf_build_id(session->filename, stdout))
  		goto out;
1b5495043   Robert Richter   perf tools: Movin...
80
81
82
83
  	if (with_hits)
  		perf_session__process_events(session, &build_id__mark_dso_hit_ops);
  
  	perf_session__fprintf_dsos_buildid(session, stdout, with_hits);
efad14150   Robert Richter   perf report: Acce...
84
  out:
1b5495043   Robert Richter   perf tools: Movin...
85
86
87
  	perf_session__delete(session);
  	return 0;
  }
7a6f205d6   Arnaldo Carvalho de Melo   perf buildid-list...
88
89
  static int __cmd_buildid_list(void)
  {
f2add9cd6   Arnaldo Carvalho de Melo   perf buildid-list...
90
91
92
93
94
  	if (show_kernel)
  		return sysfs__fprintf_build_id(stdout);
  
  	return perf_session__list_build_ids();
  }
c34984b2b   Arnaldo Carvalho de Melo   perf buildid-list...
95
96
97
98
99
100
  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();
  }