Commit | Line | Data |
---|---|---|
c34984b2 ACM |
1 | /* |
2 | * builtin-buildid-list.c | |
3 | * | |
7a6f205d ACM |
4 | * Builtin buildid-list command: list buildids in perf.data, in the running |
5 | * kernel and in ELF files. | |
c34984b2 ACM |
6 | * |
7 | * Copyright (C) 2009, Red Hat Inc. | |
8 | * Copyright (C) 2009, Arnaldo Carvalho de Melo <acme@redhat.com> | |
9 | */ | |
10 | #include "builtin.h" | |
11 | #include "perf.h" | |
7b2567c1 | 12 | #include "util/build-id.h" |
c34984b2 | 13 | #include "util/cache.h" |
c34984b2 | 14 | #include "util/debug.h" |
c34984b2 | 15 | #include "util/parse-options.h" |
94c744b6 | 16 | #include "util/session.h" |
c34984b2 ACM |
17 | #include "util/symbol.h" |
18 | ||
7a6f205d ACM |
19 | #include <libelf.h> |
20 | ||
c34984b2 | 21 | static char const *input_name = "perf.data"; |
c0555642 | 22 | static bool force; |
f2add9cd | 23 | static bool show_kernel; |
88d3d9b7 | 24 | static bool with_hits; |
c34984b2 | 25 | |
0422a4fc | 26 | static const char * const buildid_list_usage[] = { |
b9b1e1c7 | 27 | "perf buildid-list [<options>]", |
c34984b2 ACM |
28 | NULL |
29 | }; | |
30 | ||
31 | static const struct option options[] = { | |
88d3d9b7 | 32 | OPT_BOOLEAN('H', "with-hits", &with_hits, "Show only DSOs with hits"), |
c34984b2 ACM |
33 | OPT_STRING('i', "input", &input_name, "file", |
34 | "input file name"), | |
35 | OPT_BOOLEAN('f', "force", &force, "don't complain, do it"), | |
f2add9cd | 36 | OPT_BOOLEAN('k', "kernel", &show_kernel, "Show current kernel build id"), |
c0555642 | 37 | OPT_INCR('v', "verbose", &verbose, |
1124ba73 | 38 | "be more verbose"), |
c34984b2 ACM |
39 | OPT_END() |
40 | }; | |
41 | ||
f2add9cd | 42 | static int perf_session__list_build_ids(void) |
c34984b2 | 43 | { |
75be6cf4 ACM |
44 | struct perf_session *session; |
45 | ||
21ef97f0 IM |
46 | session = perf_session__new(input_name, O_RDONLY, force, false, |
47 | &build_id__mark_dso_hit_ops); | |
94c744b6 ACM |
48 | if (session == NULL) |
49 | return -1; | |
c34984b2 | 50 | |
88ca895d | 51 | if (with_hits) |
7b2567c1 | 52 | perf_session__process_events(session, &build_id__mark_dso_hit_ops); |
88d3d9b7 | 53 | |
cbf69680 | 54 | perf_session__fprintf_dsos_buildid(session, stdout, with_hits); |
c34984b2 | 55 | |
94c744b6 | 56 | perf_session__delete(session); |
bbde588b | 57 | return 0; |
c34984b2 ACM |
58 | } |
59 | ||
f2add9cd ACM |
60 | static int sysfs__fprintf_build_id(FILE *fp) |
61 | { | |
62 | u8 kallsyms_build_id[BUILD_ID_SIZE]; | |
63 | char sbuild_id[BUILD_ID_SIZE * 2 + 1]; | |
64 | ||
65 | if (sysfs__read_build_id("/sys/kernel/notes", kallsyms_build_id, | |
66 | sizeof(kallsyms_build_id)) != 0) | |
67 | return -1; | |
68 | ||
69 | build_id__sprintf(kallsyms_build_id, sizeof(kallsyms_build_id), | |
70 | sbuild_id); | |
71 | fprintf(fp, "%s\n", sbuild_id); | |
72 | return 0; | |
73 | } | |
74 | ||
7a6f205d | 75 | static int filename__fprintf_build_id(const char *name, FILE *fp) |
f2add9cd | 76 | { |
7a6f205d ACM |
77 | u8 build_id[BUILD_ID_SIZE]; |
78 | char sbuild_id[BUILD_ID_SIZE * 2 + 1]; | |
f2add9cd | 79 | |
7a6f205d ACM |
80 | if (filename__read_build_id(name, build_id, |
81 | sizeof(build_id)) != sizeof(build_id)) | |
82 | return 0; | |
83 | ||
84 | build_id__sprintf(build_id, sizeof(build_id), sbuild_id); | |
85 | return fprintf(fp, "%s\n", sbuild_id); | |
86 | } | |
87 | ||
88 | static int __cmd_buildid_list(void) | |
89 | { | |
f2add9cd ACM |
90 | if (show_kernel) |
91 | return sysfs__fprintf_build_id(stdout); | |
92 | ||
7a6f205d ACM |
93 | elf_version(EV_CURRENT); |
94 | /* | |
95 | * See if this is an ELF file first: | |
96 | */ | |
97 | if (filename__fprintf_build_id(input_name, stdout)) | |
98 | return 0; | |
99 | ||
f2add9cd ACM |
100 | return perf_session__list_build_ids(); |
101 | } | |
102 | ||
c34984b2 ACM |
103 | int cmd_buildid_list(int argc, const char **argv, const char *prefix __used) |
104 | { | |
105 | argc = parse_options(argc, argv, options, buildid_list_usage, 0); | |
106 | setup_pager(); | |
107 | return __cmd_buildid_list(); | |
108 | } |