]>
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 <[email protected]> | |
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 | 17 | #include "util/symbol.h" |
f5fc1412 | 18 | #include "util/data.h" |
c34984b2 | 19 | |
f2add9cd ACM |
20 | static int sysfs__fprintf_build_id(FILE *fp) |
21 | { | |
22 | u8 kallsyms_build_id[BUILD_ID_SIZE]; | |
23 | char sbuild_id[BUILD_ID_SIZE * 2 + 1]; | |
24 | ||
25 | if (sysfs__read_build_id("/sys/kernel/notes", kallsyms_build_id, | |
26 | sizeof(kallsyms_build_id)) != 0) | |
27 | return -1; | |
28 | ||
29 | build_id__sprintf(kallsyms_build_id, sizeof(kallsyms_build_id), | |
30 | sbuild_id); | |
31 | fprintf(fp, "%s\n", sbuild_id); | |
32 | return 0; | |
33 | } | |
34 | ||
7a6f205d | 35 | static int filename__fprintf_build_id(const char *name, FILE *fp) |
f2add9cd | 36 | { |
7a6f205d ACM |
37 | u8 build_id[BUILD_ID_SIZE]; |
38 | char sbuild_id[BUILD_ID_SIZE * 2 + 1]; | |
f2add9cd | 39 | |
7a6f205d ACM |
40 | if (filename__read_build_id(name, build_id, |
41 | sizeof(build_id)) != sizeof(build_id)) | |
42 | return 0; | |
43 | ||
44 | build_id__sprintf(build_id, sizeof(build_id), sbuild_id); | |
45 | return fprintf(fp, "%s\n", sbuild_id); | |
46 | } | |
47 | ||
417c2ff6 ACM |
48 | static bool dso__skip_buildid(struct dso *dso, int with_hits) |
49 | { | |
50 | return with_hits && !dso->hit; | |
51 | } | |
52 | ||
70cb4e96 | 53 | static int perf_session__list_build_ids(bool force, bool with_hits) |
1b549504 RR |
54 | { |
55 | struct perf_session *session; | |
f5fc1412 JO |
56 | struct perf_data_file file = { |
57 | .path = input_name, | |
58 | .mode = PERF_DATA_MODE_READ, | |
59 | .force = force, | |
60 | }; | |
1b549504 | 61 | |
166ccc9c | 62 | symbol__elf_init(); |
efad1415 RR |
63 | /* |
64 | * See if this is an ELF file first: | |
65 | */ | |
f0bf9107 | 66 | if (filename__fprintf_build_id(input_name, stdout)) |
efad1415 RR |
67 | goto out; |
68 | ||
f5fc1412 | 69 | session = perf_session__new(&file, false, &build_id__mark_dso_hit_ops); |
f0bf9107 ACM |
70 | if (session == NULL) |
71 | return -1; | |
299c3452 SE |
72 | /* |
73 | * in pipe-mode, the only way to get the buildids is to parse | |
74 | * the record stream. Buildids are stored as RECORD_HEADER_BUILD_ID | |
75 | */ | |
cc9784bd | 76 | if (with_hits || perf_data_file__is_pipe(&file)) |
1b549504 RR |
77 | perf_session__process_events(session, &build_id__mark_dso_hit_ops); |
78 | ||
417c2ff6 | 79 | perf_session__fprintf_dsos_buildid(session, stdout, dso__skip_buildid, with_hits); |
1b549504 | 80 | perf_session__delete(session); |
f0bf9107 | 81 | out: |
1b549504 RR |
82 | return 0; |
83 | } | |
84 | ||
1d037ca1 IT |
85 | int cmd_buildid_list(int argc, const char **argv, |
86 | const char *prefix __maybe_unused) | |
c34984b2 | 87 | { |
6ee41497 ACM |
88 | bool show_kernel = false; |
89 | bool with_hits = false; | |
90 | bool force = false; | |
6ee41497 ACM |
91 | const struct option options[] = { |
92 | OPT_BOOLEAN('H', "with-hits", &with_hits, "Show only DSOs with hits"), | |
93 | OPT_STRING('i', "input", &input_name, "file", "input file name"), | |
94 | OPT_BOOLEAN('f', "force", &force, "don't complain, do it"), | |
95 | OPT_BOOLEAN('k', "kernel", &show_kernel, "Show current kernel build id"), | |
96 | OPT_INCR('v', "verbose", &verbose, "be more verbose"), | |
97 | OPT_END() | |
98 | }; | |
99 | const char * const buildid_list_usage[] = { | |
100 | "perf buildid-list [<options>]", | |
101 | NULL | |
102 | }; | |
103 | ||
c34984b2 ACM |
104 | argc = parse_options(argc, argv, options, buildid_list_usage, 0); |
105 | setup_pager(); | |
6ee41497 ACM |
106 | |
107 | if (show_kernel) | |
108 | return sysfs__fprintf_build_id(stdout); | |
109 | ||
70cb4e96 | 110 | return perf_session__list_build_ids(force, with_hits); |
c34984b2 | 111 | } |