struct perf_annotate *ann)
 {
        if (!ann->use_stdio2)
-               return symbol__tty_annotate(he->ms.sym, he->ms.map, evsel, &ann->opts);
+               return symbol__tty_annotate(&he->ms, evsel, &ann->opts);
 
-       return symbol__tty_annotate2(he->ms.sym, he->ms.map, evsel, &ann->opts);
+       return symbol__tty_annotate2(&he->ms, evsel, &ann->opts);
 }
 
 static void hists__find_annotations(struct hists *hists,
 
        if (rep->symbol_ipc && sym && !sym->annotate2) {
                struct evsel *evsel = hists_to_evsel(he->hists);
 
-               symbol__annotate2(sym, he->ms.map, evsel,
+               symbol__annotate2(&he->ms, evsel,
                                  &annotation__default_options, NULL);
        }
 
 
                return err;
        }
 
-       err = symbol__annotate(sym, map, evsel, 0, &top->annotation_opts, NULL);
+       err = symbol__annotate(&he->ms, evsel, 0, &top->annotation_opts, NULL);
        if (err == 0) {
                top->sym_filter_entry = he;
        } else {
                char msg[BUFSIZ];
-               symbol__strerror_disassemble(sym, map, err, msg, sizeof(msg));
+               symbol__strerror_disassemble(&he->ms, err, msg, sizeof(msg));
                pr_err("Couldn't annotate %s: %s\n", sym->name, msg);
        }
 
        printf("Showing %s for %s\n", perf_evsel__name(top->sym_evsel), symbol->name);
        printf("  Events  Pcnt (>=%d%%)\n", top->annotation_opts.min_pcnt);
 
-       more = symbol__annotate_printf(symbol, he->ms.map, top->sym_evsel, &top->annotation_opts);
+       more = symbol__annotate_printf(&he->ms, top->sym_evsel, &top->annotation_opts);
 
        if (top->evlist->enabled) {
                if (top->zero)
 
                                    struct evsel *evsel,
                                    struct hist_browser_timer *hbt)
 {
-       struct map_symbol *ms = browser->b.priv;
+       struct map_symbol *ms = browser->b.priv, target_ms;
        struct disasm_line *dl = disasm_line(browser->selection);
        struct annotation *notes;
        char title[SYM_TITLE_MAX_SIZE];
                return true;
        }
 
+       target_ms.map = ms->map;
+       target_ms.sym = dl->ops.target.sym;
        pthread_mutex_unlock(¬es->lock);
-       symbol__tui_annotate(dl->ops.target.sym, ms->map, evsel, hbt, browser->opts);
+       symbol__tui_annotate(&target_ms, evsel, hbt, browser->opts);
        sym_title(ms->sym, ms->map, title, sizeof(title), browser->opts->percent_type);
        ui_browser__show_title(&browser->b, title);
        return true;
                             struct hist_browser_timer *hbt,
                             struct annotation_options *opts)
 {
-       return symbol__tui_annotate(ms->sym, ms->map, evsel, hbt, opts);
+       return symbol__tui_annotate(ms, evsel, hbt, opts);
 }
 
 int hist_entry__tui_annotate(struct hist_entry *he, struct evsel *evsel,
        return map_symbol__tui_annotate(&he->ms, evsel, hbt, opts);
 }
 
-int symbol__tui_annotate(struct symbol *sym, struct map *map,
-                        struct evsel *evsel,
+int symbol__tui_annotate(struct map_symbol *ms, struct evsel *evsel,
                         struct hist_browser_timer *hbt,
                         struct annotation_options *opts)
 {
+       struct symbol *sym = ms->sym;
        struct annotation *notes = symbol__annotation(sym);
-       struct map_symbol ms = {
-               .map = map,
-               .sym = sym,
-       };
        struct annotate_browser browser = {
                .b = {
                        .refresh = annotate_browser__refresh,
                        .write   = annotate_browser__write,
                        .filter  = disasm_line__filter,
                        .extra_title_lines = 1, /* for hists__scnprintf_title() */
-                       .priv    = &ms,
+                       .priv    = ms,
                        .use_navkeypressed = true,
                },
                .opts = opts,
        if (sym == NULL)
                return -1;
 
-       if (map->dso->annotate_warned)
+       if (ms->map->dso->annotate_warned)
                return -1;
 
-       err = symbol__annotate2(sym, map, evsel, opts, &browser.arch);
+       err = symbol__annotate2(ms, evsel, opts, &browser.arch);
        if (err) {
                char msg[BUFSIZ];
-               symbol__strerror_disassemble(sym, map, err, msg, sizeof(msg));
+               symbol__strerror_disassemble(ms, err, msg, sizeof(msg));
                ui__error("Couldn't annotate %s:\n%s", sym->name, msg);
                goto out_free_offsets;
        }
 
        return ret;
 }
 
-static int perf_gtk__get_offset(char *buf, size_t size, struct symbol *sym,
-                               struct map *map, struct disasm_line *dl)
+static int perf_gtk__get_offset(char *buf, size_t size, struct map_symbol *ms,
+                               struct disasm_line *dl)
 {
-       u64 start = map__rip_2objdump(map, sym->start);
+       u64 start = map__rip_2objdump(ms->map, ms->sym->start);
 
        strcpy(buf, "");
 
        return ret;
 }
 
-static int perf_gtk__annotate_symbol(GtkWidget *window, struct symbol *sym,
-                               struct map *map, struct evsel *evsel,
+static int perf_gtk__annotate_symbol(GtkWidget *window, struct map_symbol *ms,
+                               struct evsel *evsel,
                                struct hist_browser_timer *hbt __maybe_unused)
 {
+       struct symbol *sym = ms->sym;
        struct disasm_line *pos, *n;
        struct annotation *notes;
        GType col_types[MAX_ANN_COLS];
 
                if (ret)
                        gtk_list_store_set(store, &iter, ANN_COL__PERCENT, s, -1);
-               if (perf_gtk__get_offset(s, sizeof(s), sym, map, pos))
+               if (perf_gtk__get_offset(s, sizeof(s), ms, pos))
                        gtk_list_store_set(store, &iter, ANN_COL__OFFSET, s, -1);
                if (perf_gtk__get_line(s, sizeof(s), pos))
                        gtk_list_store_set(store, &iter, ANN_COL__LINE, s, -1);
        return 0;
 }
 
-static int symbol__gtk_annotate(struct symbol *sym, struct map *map,
-                               struct evsel *evsel,
+static int symbol__gtk_annotate(struct map_symbol *ms, struct evsel *evsel,
                                struct hist_browser_timer *hbt)
 {
+       struct symbol *sym = ms->sym;
        GtkWidget *window;
        GtkWidget *notebook;
        GtkWidget *scrolled_window;
        GtkWidget *tab_label;
        int err;
 
-       if (map->dso->annotate_warned)
+       if (ms->map->dso->annotate_warned)
                return -1;
 
-       err = symbol__annotate(sym, map, evsel, 0, &annotation__default_options, NULL);
+       err = symbol__annotate(ms, evsel, 0, &annotation__default_options, NULL);
        if (err) {
                char msg[BUFSIZ];
-               symbol__strerror_disassemble(sym, map, err, msg, sizeof(msg));
+               symbol__strerror_disassemble(ms, err, msg, sizeof(msg));
                ui__error("Couldn't annotate %s: %s\n", sym->name, msg);
                return -1;
        }
        gtk_notebook_append_page(GTK_NOTEBOOK(notebook), scrolled_window,
                                 tab_label);
 
-       perf_gtk__annotate_symbol(scrolled_window, sym, map, evsel, hbt);
+       perf_gtk__annotate_symbol(scrolled_window, ms, evsel, hbt);
        return 0;
 }
 
                             struct evsel *evsel,
                             struct hist_browser_timer *hbt)
 {
-       return symbol__gtk_annotate(he->ms.sym, he->ms.map, evsel, hbt);
+       return symbol__gtk_annotate(&he->ms, evsel, hbt);
 }
 
 void perf_gtk__show_annotations(void)
 
        }
 }
 
-int symbol__strerror_disassemble(struct symbol *sym __maybe_unused, struct map *map,
-                             int errnum, char *buf, size_t buflen)
+int symbol__strerror_disassemble(struct map_symbol *ms, int errnum, char *buf, size_t buflen)
 {
-       struct dso *dso = map->dso;
+       struct dso *dso = ms->map->dso;
 
        BUG_ON(buflen == 0);
 
        annotation__calc_percent(notes, evsel, symbol__size(sym));
 }
 
-int symbol__annotate(struct symbol *sym, struct map *map,
-                    struct evsel *evsel, size_t privsize,
-                    struct annotation_options *options,
-                    struct arch **parch)
+int symbol__annotate(struct map_symbol *ms, struct evsel *evsel, size_t privsize,
+                    struct annotation_options *options, struct arch **parch)
 {
+       struct symbol *sym = ms->sym;
        struct annotation *notes = symbol__annotation(sym);
        struct annotate_args args = {
                .privsize       = privsize,
                }
        }
 
-       args.ms.map = map;
-       args.ms.sym = sym;
-       notes->start = map__rip_2objdump(map, sym->start);
+       args.ms = *ms;
+       notes->start = map__rip_2objdump(ms->map, sym->start);
 
        return symbol__disassemble(sym, &args);
 }
        return 0;
 }
 
-int symbol__annotate_printf(struct symbol *sym, struct map *map,
-                           struct evsel *evsel,
+int symbol__annotate_printf(struct map_symbol *ms, struct evsel *evsel,
                            struct annotation_options *opts)
 {
+       struct map *map = ms->map;
+       struct symbol *sym = ms->sym;
        struct dso *dso = map->dso;
        char *filename;
        const char *d_filename;
        resort_source_line(root, &tmp_root);
 }
 
-static void symbol__calc_lines(struct symbol *sym, struct map *map,
-                              struct rb_root *root,
+static void symbol__calc_lines(struct map_symbol *ms, struct rb_root *root,
                               struct annotation_options *opts)
 {
-       struct annotation *notes = symbol__annotation(sym);
+       struct annotation *notes = symbol__annotation(ms->sym);
 
-       annotation__calc_lines(notes, map, root, opts);
+       annotation__calc_lines(notes, ms->map, root, opts);
 }
 
-int symbol__tty_annotate2(struct symbol *sym, struct map *map,
-                         struct evsel *evsel,
+int symbol__tty_annotate2(struct map_symbol *ms, struct evsel *evsel,
                          struct annotation_options *opts)
 {
-       struct dso *dso = map->dso;
+       struct dso *dso = ms->map->dso;
+       struct symbol *sym = ms->sym;
        struct rb_root source_line = RB_ROOT;
        struct hists *hists = evsel__hists(evsel);
        char buf[1024];
 
-       if (symbol__annotate2(sym, map, evsel, opts, NULL) < 0)
+       if (symbol__annotate2(ms, evsel, opts, NULL) < 0)
                return -1;
 
        if (opts->print_lines) {
                srcline_full_filename = opts->full_path;
-               symbol__calc_lines(sym, map, &source_line, opts);
+               symbol__calc_lines(ms, &source_line, opts);
                print_summary(&source_line, dso->long_name);
        }
 
        return 0;
 }
 
-int symbol__tty_annotate(struct symbol *sym, struct map *map,
-                        struct evsel *evsel,
+int symbol__tty_annotate(struct map_symbol *ms, struct evsel *evsel,
                         struct annotation_options *opts)
 {
-       struct dso *dso = map->dso;
+       struct dso *dso = ms->map->dso;
+       struct symbol *sym = ms->sym;
        struct rb_root source_line = RB_ROOT;
 
-       if (symbol__annotate(sym, map, evsel, 0, opts, NULL) < 0)
+       if (symbol__annotate(ms, evsel, 0, opts, NULL) < 0)
                return -1;
 
        symbol__calc_percent(sym, evsel);
 
        if (opts->print_lines) {
                srcline_full_filename = opts->full_path;
-               symbol__calc_lines(sym, map, &source_line, opts);
+               symbol__calc_lines(ms, &source_line, opts);
                print_summary(&source_line, dso->long_name);
        }
 
-       symbol__annotate_printf(sym, map, evsel, opts);
+       symbol__annotate_printf(ms, evsel, opts);
 
        annotated_source__purge(symbol__annotation(sym)->src);
 
                                 wops->write_graph);
 }
 
-int symbol__annotate2(struct symbol *sym, struct map *map, struct evsel *evsel,
+int symbol__annotate2(struct map_symbol *ms, struct evsel *evsel,
                      struct annotation_options *options, struct arch **parch)
 {
+       struct symbol *sym = ms->sym;
        struct annotation *notes = symbol__annotation(sym);
        size_t size = symbol__size(sym);
        int nr_pcnt = 1, err;
        if (perf_evsel__is_group_event(evsel))
                nr_pcnt = evsel->core.nr_members;
 
-       err = symbol__annotate(sym, map, evsel, 0, options, parch);
+       err = symbol__annotate(ms, evsel, 0, options, parch);
        if (err)
                goto out_free_offsets;
 
 
 struct annotated_source *symbol__hists(struct symbol *sym, int nr_hists);
 void symbol__annotate_zero_histograms(struct symbol *sym);
 
-int symbol__annotate(struct symbol *sym, struct map *map,
+int symbol__annotate(struct map_symbol *ms,
                     struct evsel *evsel, size_t privsize,
                     struct annotation_options *options,
                     struct arch **parch);
-int symbol__annotate2(struct symbol *sym, struct map *map,
+int symbol__annotate2(struct map_symbol *ms,
                      struct evsel *evsel,
                      struct annotation_options *options,
                      struct arch **parch);
        __SYMBOL_ANNOTATE_ERRNO__END,
 };
 
-int symbol__strerror_disassemble(struct symbol *sym, struct map *map,
-                                int errnum, char *buf, size_t buflen);
+int symbol__strerror_disassemble(struct map_symbol *ms, int errnum, char *buf, size_t buflen);
 
-int symbol__annotate_printf(struct symbol *sym, struct map *map,
-                           struct evsel *evsel,
+int symbol__annotate_printf(struct map_symbol *ms, struct evsel *evsel,
                            struct annotation_options *options);
 void symbol__annotate_zero_histogram(struct symbol *sym, int evidx);
 void symbol__annotate_decay_histogram(struct symbol *sym, int evidx);
 
 bool ui__has_annotation(void);
 
-int symbol__tty_annotate(struct symbol *sym, struct map *map,
-                        struct evsel *evsel, struct annotation_options *opts);
+int symbol__tty_annotate(struct map_symbol *ms, struct evsel *evsel, struct annotation_options *opts);
 
-int symbol__tty_annotate2(struct symbol *sym, struct map *map,
-                         struct evsel *evsel, struct annotation_options *opts);
+int symbol__tty_annotate2(struct map_symbol *ms, struct evsel *evsel, struct annotation_options *opts);
 
 #ifdef HAVE_SLANG_SUPPORT
-int symbol__tui_annotate(struct symbol *sym, struct map *map,
-                        struct evsel *evsel,
+int symbol__tui_annotate(struct map_symbol *ms, struct evsel *evsel,
                         struct hist_browser_timer *hbt,
                         struct annotation_options *opts);
 #else
-static inline int symbol__tui_annotate(struct symbol *sym __maybe_unused,
-                               struct map *map __maybe_unused,
+static inline int symbol__tui_annotate(struct map_symbol *ms __maybe_unused,
                                struct evsel *evsel  __maybe_unused,
                                struct hist_browser_timer *hbt __maybe_unused,
                                struct annotation_options *opts __maybe_unused)