Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf annotate: Return arch from symbol__disassemble() and save it in browser

In annotate browser, we will add support to check fused instructions.
While this is x86-specific feature so we need the annotate browser to
know what the arch it runs on.

symbol__disassemble() has figured out the arch. This patch just lets the
arch return from symbol__disassemble and save the arch in annotate
browser.

Signed-off-by: Yao Jin <yao.jin@linux.intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1497840958-4759-2-git-send-email-yao.jin@linux.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Jin Yao and committed by
Arnaldo Carvalho de Melo
dcaa3948 d3cef7fe

+19 -6
+1 -1
tools/perf/builtin-top.c
··· 134 134 return err; 135 135 } 136 136 137 - err = symbol__disassemble(sym, map, NULL, 0); 137 + err = symbol__disassemble(sym, map, NULL, 0, NULL); 138 138 if (err == 0) { 139 139 out_assign: 140 140 top->sym_filter_entry = he;
+5 -1
tools/perf/ui/browsers/annotate.c
··· 46 46 .jump_arrows = true, 47 47 }; 48 48 49 + struct arch; 50 + 49 51 struct annotate_browser { 50 52 struct ui_browser b; 51 53 struct rb_root entries; 52 54 struct rb_node *curr_hot; 53 55 struct disasm_line *selection; 54 56 struct disasm_line **offsets; 57 + struct arch *arch; 55 58 int nr_events; 56 59 u64 start; 57 60 int nr_asm_entries; ··· 1073 1070 (nr_pcnt - 1); 1074 1071 } 1075 1072 1076 - err = symbol__disassemble(sym, map, perf_evsel__env_arch(evsel), sizeof_bdl); 1073 + err = symbol__disassemble(sym, map, perf_evsel__env_arch(evsel), 1074 + sizeof_bdl, &browser.arch); 1077 1075 if (err) { 1078 1076 char msg[BUFSIZ]; 1079 1077 symbol__strerror_disassemble(sym, map, err, msg, sizeof(msg));
+2 -1
tools/perf/ui/gtk/annotate.c
··· 168 168 if (map->dso->annotate_warned) 169 169 return -1; 170 170 171 - err = symbol__disassemble(sym, map, perf_evsel__env_arch(evsel), 0); 171 + err = symbol__disassemble(sym, map, perf_evsel__env_arch(evsel), 172 + 0, NULL); 172 173 if (err) { 173 174 char msg[BUFSIZ]; 174 175 symbol__strerror_disassemble(sym, map, err, msg, sizeof(msg));
+8 -2
tools/perf/util/annotate.c
··· 1379 1379 return normalize_arch((char *)arch_name); 1380 1380 } 1381 1381 1382 - int symbol__disassemble(struct symbol *sym, struct map *map, const char *arch_name, size_t privsize) 1382 + int symbol__disassemble(struct symbol *sym, struct map *map, 1383 + const char *arch_name, size_t privsize, 1384 + struct arch **parch) 1383 1385 { 1384 1386 struct dso *dso = map->dso; 1385 1387 char command[PATH_MAX * 2]; ··· 1406 1404 arch = arch__find(arch_name); 1407 1405 if (arch == NULL) 1408 1406 return -ENOTSUP; 1407 + 1408 + if (parch) 1409 + *parch = arch; 1409 1410 1410 1411 if (arch->init) { 1411 1412 err = arch->init(arch); ··· 1906 1901 struct rb_root source_line = RB_ROOT; 1907 1902 u64 len; 1908 1903 1909 - if (symbol__disassemble(sym, map, perf_evsel__env_arch(evsel), 0) < 0) 1904 + if (symbol__disassemble(sym, map, perf_evsel__env_arch(evsel), 1905 + 0, NULL) < 0) 1910 1906 return -1; 1911 1907 1912 1908 len = symbol__size(sym);
+3 -1
tools/perf/util/annotate.h
··· 158 158 int symbol__alloc_hist(struct symbol *sym); 159 159 void symbol__annotate_zero_histograms(struct symbol *sym); 160 160 161 - int symbol__disassemble(struct symbol *sym, struct map *map, const char *arch_name, size_t privsize); 161 + int symbol__disassemble(struct symbol *sym, struct map *map, 162 + const char *arch_name, size_t privsize, 163 + struct arch **parch); 162 164 163 165 enum symbol_disassemble_errno { 164 166 SYMBOL_ANNOTATE_ERRNO__SUCCESS = 0,