OSDN Git Service

perf annotate: Add symbol__annotate function
authorJiri Olsa <jolsa@kernel.org>
Wed, 11 Oct 2017 15:01:28 +0000 (17:01 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 13 Nov 2017 12:39:58 +0000 (09:39 -0300)
Add symbol__annotate function to have generic annotation function to be
called for all annotation sources.

It calls the generic annotation init and then the specific annotation
data retrieval function.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20171011150158.11895-6-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-top.c
tools/perf/ui/browsers/annotate.c
tools/perf/ui/gtk/annotate.c
tools/perf/util/annotate.c
tools/perf/util/annotate.h

index 477a869..adfeeb4 100644 (file)
@@ -134,7 +134,7 @@ static int perf_top__parse_source(struct perf_top *top, struct hist_entry *he)
                return err;
        }
 
-       err = symbol__disassemble(sym, map, NULL, 0, NULL, NULL);
+       err = symbol__annotate(sym, map, NULL, 0, NULL, NULL);
        if (err == 0) {
 out_assign:
                top->sym_filter_entry = he;
index d1aff2f..d77994c 100644 (file)
@@ -1120,9 +1120,9 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,
                  (nr_pcnt - 1);
        }
 
-       err = symbol__disassemble(sym, map, perf_evsel__env_arch(evsel),
-                                 sizeof_bdl, &browser.arch,
-                                 perf_evsel__env_cpuid(evsel));
+       err = symbol__annotate(sym, map, perf_evsel__env_arch(evsel),
+                              sizeof_bdl, &browser.arch,
+                              perf_evsel__env_cpuid(evsel));
        if (err) {
                char msg[BUFSIZ];
                symbol__strerror_disassemble(sym, map, err, msg, sizeof(msg));
index 162f157..b498f1a 100644 (file)
@@ -169,8 +169,8 @@ static int symbol__gtk_annotate(struct symbol *sym, struct map *map,
        if (map->dso->annotate_warned)
                return -1;
 
-       err = symbol__disassemble(sym, map, perf_evsel__env_arch(evsel),
-                                 0, NULL, NULL);
+       err = symbol__annotate(sym, map, perf_evsel__env_arch(evsel),
+                              0, NULL, NULL);
        if (err) {
                char msg[BUFSIZ];
                symbol__strerror_disassemble(sym, map, err, msg, sizeof(msg));
index e8b6900..f009391 100644 (file)
@@ -1425,13 +1425,11 @@ static const char *annotate__norm_arch(const char *arch_name)
        return normalize_arch((char *)arch_name);
 }
 
-int symbol__disassemble(struct symbol *sym, struct map *map,
-                       const char *arch_name, size_t privsize,
-                       struct arch **parch, char *cpuid)
+static int symbol__disassemble(struct symbol *sym, struct map *map,
+                              size_t privsize, struct arch *arch)
 {
        struct dso *dso = map->dso;
        char command[PATH_MAX * 2];
-       struct arch *arch = NULL;
        FILE *file;
        char symfs_filename[PATH_MAX];
        struct kcore_extract kce;
@@ -1445,25 +1443,6 @@ int symbol__disassemble(struct symbol *sym, struct map *map,
        if (err)
                return err;
 
-       arch_name = annotate__norm_arch(arch_name);
-       if (!arch_name)
-               return -1;
-
-       arch = arch__find(arch_name);
-       if (arch == NULL)
-               return -ENOTSUP;
-
-       if (parch)
-               *parch = arch;
-
-       if (arch->init) {
-               err = arch->init(arch, cpuid);
-               if (err) {
-                       pr_err("%s: failed to initialize %s arch priv area\n", __func__, arch->name);
-                       return err;
-               }
-       }
-
        pr_debug("%s: filename=%s, sym=%s, start=%#" PRIx64 ", end=%#" PRIx64 "\n", __func__,
                 symfs_filename, sym->name, map->unmap_ip(map, sym->start),
                 map->unmap_ip(map, sym->end));
@@ -1581,6 +1560,35 @@ out_close_stdout:
        goto out_remove_tmp;
 }
 
+int symbol__annotate(struct symbol *sym, struct map *map,
+                    const char *arch_name, size_t privsize,
+                    struct arch **parch, char *cpuid)
+{
+       struct arch *arch;
+       int err;
+
+       arch_name = annotate__norm_arch(arch_name);
+       if (!arch_name)
+               return -1;
+
+       arch = arch__find(arch_name);
+       if (arch == NULL)
+               return -ENOTSUP;
+
+       if (parch)
+               *parch = arch;
+
+       if (arch->init) {
+               err = arch->init(arch, cpuid);
+               if (err) {
+                       pr_err("%s: failed to initialize %s arch priv area\n", __func__, arch->name);
+                       return err;
+               }
+       }
+
+       return symbol__disassemble(sym, map, privsize, arch);
+}
+
 static void insert_source_line(struct rb_root *root, struct source_line *src_line)
 {
        struct source_line *iter;
@@ -1954,8 +1962,8 @@ int symbol__tty_annotate(struct symbol *sym, struct map *map,
        struct rb_root source_line = RB_ROOT;
        u64 len;
 
-       if (symbol__disassemble(sym, map, perf_evsel__env_arch(evsel),
-                               0, NULL, NULL) < 0)
+       if (symbol__annotate(sym, map, perf_evsel__env_arch(evsel),
+                            0, NULL, NULL) < 0)
                return -1;
 
        len = symbol__size(sym);
index a822c0a..e577f9d 100644 (file)
@@ -173,9 +173,9 @@ int hist_entry__inc_addr_samples(struct hist_entry *he, struct perf_sample *samp
 int symbol__alloc_hist(struct symbol *sym);
 void symbol__annotate_zero_histograms(struct symbol *sym);
 
-int symbol__disassemble(struct symbol *sym, struct map *map,
-                       const char *arch_name, size_t privsize,
-                       struct arch **parch, char *cpuid);
+int symbol__annotate(struct symbol *sym, struct map *map,
+                    const char *arch_name, size_t privsize,
+                    struct arch **parch, char *cpuid);
 
 enum symbol_disassemble_errno {
        SYMBOL_ANNOTATE_ERRNO__SUCCESS          = 0,