]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - tools/perf/builtin-annotate.c
perf symbols: Rename find_symbol routines to find_function
[karo-tx-linux.git] / tools / perf / builtin-annotate.c
index 6d63c2eea2c7dc519d089756a5e80835ff649f2b..18ac5eaefc363ec69c71fd835c0b598e09fa1182 100644 (file)
@@ -24,6 +24,7 @@
 #include "util/thread.h"
 #include "util/sort.h"
 #include "util/hist.h"
+#include "util/process_events.h"
 
 static char            const *input_name = "perf.data";
 
@@ -53,13 +54,18 @@ struct sym_priv {
        struct sym_ext  *ext;
 };
 
+static struct symbol_conf symbol_conf = {
+       .priv_size        = sizeof(struct sym_priv),
+       .try_vmlinux_path = true,
+};
+
 static const char *sym_hist_filter;
 
-static int symbol_filter(struct map *map, struct symbol *sym)
+static int symbol_filter(struct map *map __used, struct symbol *sym)
 {
        if (sym_hist_filter == NULL ||
            strcmp(sym->name, sym_hist_filter) == 0) {
-               struct sym_priv *priv = dso__sym_priv(map->dso, sym);
+               struct sym_priv *priv = symbol__priv(sym);
                const int size = (sizeof(*priv->hist) +
                                  (sym->end - sym->start) * sizeof(u64));
 
@@ -92,7 +98,7 @@ static void hist_hit(struct hist_entry *he, u64 ip)
        if (!sym || !he->map)
                return;
 
-       priv = dso__sym_priv(he->map->dso, sym);
+       priv = symbol__priv(sym);
        if (!priv->hist)
                return;
 
@@ -156,7 +162,7 @@ process_sample_event(event_t *event, unsigned long offset, unsigned long head)
 
        if (event->header.misc & PERF_RECORD_MISC_KERNEL) {
                level = 'k';
-               sym = kernel_maps__find_symbol(ip, &map);
+               sym = kernel_maps__find_function(ip, &map, symbol_filter);
                dump_printf(" ...... dso: %s\n",
                            map ? map->dso->long_name : "<not found>");
        } else if (event->header.misc & PERF_RECORD_MISC_USER) {
@@ -165,7 +171,7 @@ process_sample_event(event_t *event, unsigned long offset, unsigned long head)
                if (map != NULL) {
 got_map:
                        ip = map->map_ip(map, ip);
-                       sym = map->dso->find_symbol(map->dso, ip);
+                       sym = map__find_function(map, ip, symbol_filter);
                } else {
                        /*
                         * If this is outside of all known maps,
@@ -199,33 +205,6 @@ got_map:
        return 0;
 }
 
-static int
-process_mmap_event(event_t *event, unsigned long offset, unsigned long head)
-{
-       struct map *map = map__new(&event->mmap, NULL, 0,
-                                  sizeof(struct sym_priv), symbol_filter);
-       struct thread *thread = threads__findnew(event->mmap.pid);
-
-       dump_printf("%p [%p]: PERF_RECORD_MMAP %d: [%p(%p) @ %p]: %s\n",
-               (void *)(offset + head),
-               (void *)(long)(event->header.size),
-               event->mmap.pid,
-               (void *)(long)event->mmap.start,
-               (void *)(long)event->mmap.len,
-               (void *)(long)event->mmap.pgoff,
-               event->mmap.filename);
-
-       if (thread == NULL || map == NULL) {
-               dump_printf("problem processing PERF_RECORD_MMAP, skipping event.\n");
-               return 0;
-       }
-
-       thread__insert_map(thread, map);
-       total_mmap++;
-
-       return 0;
-}
-
 static int
 process_comm_event(event_t *event, unsigned long offset, unsigned long head)
 {
@@ -246,33 +225,6 @@ process_comm_event(event_t *event, unsigned long offset, unsigned long head)
        return 0;
 }
 
-static int
-process_fork_event(event_t *event, unsigned long offset, unsigned long head)
-{
-       struct thread *thread = threads__findnew(event->fork.pid);
-       struct thread *parent = threads__findnew(event->fork.ppid);
-
-       dump_printf("%p [%p]: PERF_RECORD_FORK: %d:%d\n",
-               (void *)(offset + head),
-               (void *)(long)(event->header.size),
-               event->fork.pid, event->fork.ppid);
-
-       /*
-        * A thread clone will have the same PID for both
-        * parent and child.
-        */
-       if (thread == parent)
-               return 0;
-
-       if (!thread || !parent || thread__fork(thread, parent)) {
-               dump_printf("problem processing PERF_RECORD_FORK, skipping event.\n");
-               return -1;
-       }
-       total_fork++;
-
-       return 0;
-}
-
 static int
 process_event(event_t *event, unsigned long offset, unsigned long head)
 {
@@ -287,7 +239,7 @@ process_event(event_t *event, unsigned long offset, unsigned long head)
                return process_comm_event(event, offset, head);
 
        case PERF_RECORD_FORK:
-               return process_fork_event(event, offset, head);
+               return process_task_event(event, offset, head);
        /*
         * We dont process them right now but they are fine:
         */
@@ -355,7 +307,7 @@ static int parse_line(FILE *file, struct hist_entry *he, u64 len)
                unsigned int hits = 0;
                double percent = 0.0;
                const char *color;
-               struct sym_priv *priv = dso__sym_priv(he->map->dso, sym);
+               struct sym_priv *priv = symbol__priv(sym);
                struct sym_ext *sym_ext = priv->ext;
                struct sym_hist *h = priv->hist;
 
@@ -422,7 +374,7 @@ static void insert_source_line(struct sym_ext *sym_ext)
 
 static void free_source_line(struct hist_entry *he, int len)
 {
-       struct sym_priv *priv = dso__sym_priv(he->map->dso, he->sym);
+       struct sym_priv *priv = symbol__priv(he->sym);
        struct sym_ext *sym_ext = priv->ext;
        int i;
 
@@ -446,7 +398,7 @@ get_source_line(struct hist_entry *he, int len, const char *filename)
        int i;
        char cmd[PATH_MAX * 2];
        struct sym_ext *sym_ext;
-       struct sym_priv *priv = dso__sym_priv(he->map->dso, sym);
+       struct sym_priv *priv = symbol__priv(sym);
        struct sym_hist *h = priv->hist;
 
        if (!h->sum)
@@ -589,7 +541,7 @@ static void find_annotations(void)
                if (he->sym == NULL)
                        continue;
 
-               priv = dso__sym_priv(he->map->dso, he->sym);
+               priv = symbol__priv(he->sym);
                if (priv->hist == NULL)
                        continue;
 
@@ -637,11 +589,6 @@ static int __cmd_annotate(void)
                exit(0);
        }
 
-       if (load_kernel(sizeof(struct sym_priv), symbol_filter) < 0) {
-               perror("failed to load kernel symbols");
-               return EXIT_FAILURE;
-       }
-
 remap:
        buf = (char *)mmap(NULL, page_size * mmap_window, PROT_READ,
                           MAP_SHARED, input, offset);
@@ -742,8 +689,9 @@ static const struct option options[] = {
                    "be more verbose (show symbol address, etc)"),
        OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
                    "dump raw trace in ASCII"),
-       OPT_STRING('k', "vmlinux", &vmlinux_name, "file", "vmlinux pathname"),
-       OPT_BOOLEAN('m', "modules", &modules,
+       OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
+                  "file", "vmlinux pathname"),
+       OPT_BOOLEAN('m', "modules", &symbol_conf.use_modules,
                    "load module symbols - WARNING: use only with -k and LIVE kernel"),
        OPT_BOOLEAN('l', "print-line", &print_line,
                    "print matching source lines (may be slow)"),
@@ -769,7 +717,8 @@ static void setup_sorting(void)
 
 int cmd_annotate(int argc, const char **argv, const char *prefix __used)
 {
-       symbol__init();
+       if (symbol__init(&symbol_conf) < 0)
+               return -1;
 
        page_size = getpagesize();