diff options
Diffstat (limited to 'tools/perf/util/annotate.c')
-rw-r--r-- | tools/perf/util/annotate.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index e01af2b1a469..011ed2676604 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c | |||
@@ -16,6 +16,8 @@ | |||
16 | #include "annotate.h" | 16 | #include "annotate.h" |
17 | #include <pthread.h> | 17 | #include <pthread.h> |
18 | 18 | ||
19 | const char *disassembler_style; | ||
20 | |||
19 | int symbol__annotate_init(struct map *map __used, struct symbol *sym) | 21 | int symbol__annotate_init(struct map *map __used, struct symbol *sym) |
20 | { | 22 | { |
21 | struct annotation *notes = symbol__annotation(sym); | 23 | struct annotation *notes = symbol__annotation(sym); |
@@ -23,17 +25,17 @@ int symbol__annotate_init(struct map *map __used, struct symbol *sym) | |||
23 | return 0; | 25 | return 0; |
24 | } | 26 | } |
25 | 27 | ||
26 | int symbol__alloc_hist(struct symbol *sym, int nevents) | 28 | int symbol__alloc_hist(struct symbol *sym) |
27 | { | 29 | { |
28 | struct annotation *notes = symbol__annotation(sym); | 30 | struct annotation *notes = symbol__annotation(sym); |
29 | size_t sizeof_sym_hist = (sizeof(struct sym_hist) + | 31 | size_t sizeof_sym_hist = (sizeof(struct sym_hist) + |
30 | (sym->end - sym->start) * sizeof(u64)); | 32 | (sym->end - sym->start) * sizeof(u64)); |
31 | 33 | ||
32 | notes->src = zalloc(sizeof(*notes->src) + nevents * sizeof_sym_hist); | 34 | notes->src = zalloc(sizeof(*notes->src) + symbol_conf.nr_events * sizeof_sym_hist); |
33 | if (notes->src == NULL) | 35 | if (notes->src == NULL) |
34 | return -1; | 36 | return -1; |
35 | notes->src->sizeof_sym_hist = sizeof_sym_hist; | 37 | notes->src->sizeof_sym_hist = sizeof_sym_hist; |
36 | notes->src->nr_histograms = nevents; | 38 | notes->src->nr_histograms = symbol_conf.nr_events; |
37 | INIT_LIST_HEAD(¬es->src->source); | 39 | INIT_LIST_HEAD(¬es->src->source); |
38 | return 0; | 40 | return 0; |
39 | } | 41 | } |
@@ -308,9 +310,12 @@ fallback: | |||
308 | } | 310 | } |
309 | err = -ENOENT; | 311 | err = -ENOENT; |
310 | dso->annotate_warned = 1; | 312 | dso->annotate_warned = 1; |
311 | pr_err("Can't annotate %s: No vmlinux file%s was found in the " | 313 | pr_err("Can't annotate %s:\n\n" |
312 | "path.\nPlease use 'perf buildid-cache -av vmlinux' or " | 314 | "No vmlinux file%s\nwas found in the path.\n\n" |
313 | "--vmlinux vmlinux.\n", | 315 | "Please use:\n\n" |
316 | " perf buildid-cache -av vmlinux\n\n" | ||
317 | "or:\n\n" | ||
318 | " --vmlinux vmlinux", | ||
314 | sym->name, build_id_msg ?: ""); | 319 | sym->name, build_id_msg ?: ""); |
315 | goto out_free_filename; | 320 | goto out_free_filename; |
316 | } | 321 | } |
@@ -323,10 +328,15 @@ fallback: | |||
323 | dso, dso->long_name, sym, sym->name); | 328 | dso, dso->long_name, sym, sym->name); |
324 | 329 | ||
325 | snprintf(command, sizeof(command), | 330 | snprintf(command, sizeof(command), |
326 | "objdump --start-address=0x%016" PRIx64 | 331 | "objdump %s%s --start-address=0x%016" PRIx64 |
327 | " --stop-address=0x%016" PRIx64 " -dS -C %s|grep -v %s|expand", | 332 | " --stop-address=0x%016" PRIx64 |
333 | " -d %s %s -C %s|grep -v %s|expand", | ||
334 | disassembler_style ? "-M " : "", | ||
335 | disassembler_style ? disassembler_style : "", | ||
328 | map__rip_2objdump(map, sym->start), | 336 | map__rip_2objdump(map, sym->start), |
329 | map__rip_2objdump(map, sym->end), | 337 | map__rip_2objdump(map, sym->end+1), |
338 | symbol_conf.annotate_asm_raw ? "" : "--no-show-raw", | ||
339 | symbol_conf.annotate_src ? "-S" : "", | ||
330 | symfs_filename, filename); | 340 | symfs_filename, filename); |
331 | 341 | ||
332 | pr_debug("Executing: %s\n", command); | 342 | pr_debug("Executing: %s\n", command); |