| .. | .. |
|---|
| 1 | 1 | // SPDX-License-Identifier: GPL-2.0 |
|---|
| 2 | 2 | #include "gtk.h" |
|---|
| 3 | +#include "util/sort.h" |
|---|
| 3 | 4 | #include "util/debug.h" |
|---|
| 4 | 5 | #include "util/annotate.h" |
|---|
| 5 | 6 | #include "util/evsel.h" |
|---|
| 7 | +#include "util/map.h" |
|---|
| 8 | +#include "util/dso.h" |
|---|
| 9 | +#include "util/symbol.h" |
|---|
| 6 | 10 | #include "ui/helpline.h" |
|---|
| 7 | 11 | #include <inttypes.h> |
|---|
| 8 | 12 | #include <signal.h> |
|---|
| .. | .. |
|---|
| 50 | 54 | return ret; |
|---|
| 51 | 55 | } |
|---|
| 52 | 56 | |
|---|
| 53 | | -static int perf_gtk__get_offset(char *buf, size_t size, struct symbol *sym, |
|---|
| 54 | | - struct map *map, struct disasm_line *dl) |
|---|
| 57 | +static int perf_gtk__get_offset(char *buf, size_t size, struct map_symbol *ms, |
|---|
| 58 | + struct disasm_line *dl) |
|---|
| 55 | 59 | { |
|---|
| 56 | | - u64 start = map__rip_2objdump(map, sym->start); |
|---|
| 60 | + u64 start = map__rip_2objdump(ms->map, ms->sym->start); |
|---|
| 57 | 61 | |
|---|
| 58 | 62 | strcpy(buf, ""); |
|---|
| 59 | 63 | |
|---|
| .. | .. |
|---|
| 87 | 91 | return ret; |
|---|
| 88 | 92 | } |
|---|
| 89 | 93 | |
|---|
| 90 | | -static int perf_gtk__annotate_symbol(GtkWidget *window, struct symbol *sym, |
|---|
| 91 | | - struct map *map, struct perf_evsel *evsel, |
|---|
| 94 | +static int perf_gtk__annotate_symbol(GtkWidget *window, struct map_symbol *ms, |
|---|
| 95 | + struct evsel *evsel, |
|---|
| 92 | 96 | struct hist_browser_timer *hbt __maybe_unused) |
|---|
| 93 | 97 | { |
|---|
| 98 | + struct symbol *sym = ms->sym; |
|---|
| 94 | 99 | struct disasm_line *pos, *n; |
|---|
| 95 | 100 | struct annotation *notes; |
|---|
| 96 | 101 | GType col_types[MAX_ANN_COLS]; |
|---|
| .. | .. |
|---|
| 125 | 130 | |
|---|
| 126 | 131 | gtk_list_store_append(store, &iter); |
|---|
| 127 | 132 | |
|---|
| 128 | | - if (perf_evsel__is_group_event(evsel)) { |
|---|
| 129 | | - for (i = 0; i < evsel->nr_members; i++) { |
|---|
| 133 | + if (evsel__is_group_event(evsel)) { |
|---|
| 134 | + for (i = 0; i < evsel->core.nr_members; i++) { |
|---|
| 130 | 135 | ret += perf_gtk__get_percent(s + ret, |
|---|
| 131 | 136 | sizeof(s) - ret, |
|---|
| 132 | 137 | sym, pos, |
|---|
| .. | .. |
|---|
| 140 | 145 | |
|---|
| 141 | 146 | if (ret) |
|---|
| 142 | 147 | gtk_list_store_set(store, &iter, ANN_COL__PERCENT, s, -1); |
|---|
| 143 | | - if (perf_gtk__get_offset(s, sizeof(s), sym, map, pos)) |
|---|
| 148 | + if (perf_gtk__get_offset(s, sizeof(s), ms, pos)) |
|---|
| 144 | 149 | gtk_list_store_set(store, &iter, ANN_COL__OFFSET, s, -1); |
|---|
| 145 | 150 | if (perf_gtk__get_line(s, sizeof(s), pos)) |
|---|
| 146 | 151 | gtk_list_store_set(store, &iter, ANN_COL__LINE, s, -1); |
|---|
| .. | .. |
|---|
| 149 | 154 | gtk_container_add(GTK_CONTAINER(window), view); |
|---|
| 150 | 155 | |
|---|
| 151 | 156 | list_for_each_entry_safe(pos, n, ¬es->src->source, al.node) { |
|---|
| 152 | | - list_del(&pos->al.node); |
|---|
| 157 | + list_del_init(&pos->al.node); |
|---|
| 153 | 158 | disasm_line__free(pos); |
|---|
| 154 | 159 | } |
|---|
| 155 | 160 | |
|---|
| 156 | 161 | return 0; |
|---|
| 157 | 162 | } |
|---|
| 158 | 163 | |
|---|
| 159 | | -static int symbol__gtk_annotate(struct symbol *sym, struct map *map, |
|---|
| 160 | | - struct perf_evsel *evsel, |
|---|
| 164 | +static int symbol__gtk_annotate(struct map_symbol *ms, struct evsel *evsel, |
|---|
| 161 | 165 | struct hist_browser_timer *hbt) |
|---|
| 162 | 166 | { |
|---|
| 167 | + struct symbol *sym = ms->sym; |
|---|
| 163 | 168 | GtkWidget *window; |
|---|
| 164 | 169 | GtkWidget *notebook; |
|---|
| 165 | 170 | GtkWidget *scrolled_window; |
|---|
| 166 | 171 | GtkWidget *tab_label; |
|---|
| 167 | 172 | int err; |
|---|
| 168 | 173 | |
|---|
| 169 | | - if (map->dso->annotate_warned) |
|---|
| 174 | + if (ms->map->dso->annotate_warned) |
|---|
| 170 | 175 | return -1; |
|---|
| 171 | 176 | |
|---|
| 172 | | - err = symbol__annotate(sym, map, evsel, 0, &annotation__default_options, NULL); |
|---|
| 177 | + err = symbol__annotate(ms, evsel, &annotation__default_options, NULL); |
|---|
| 173 | 178 | if (err) { |
|---|
| 174 | 179 | char msg[BUFSIZ]; |
|---|
| 175 | | - symbol__strerror_disassemble(sym, map, err, msg, sizeof(msg)); |
|---|
| 180 | + symbol__strerror_disassemble(ms, err, msg, sizeof(msg)); |
|---|
| 176 | 181 | ui__error("Couldn't annotate %s: %s\n", sym->name, msg); |
|---|
| 177 | 182 | return -1; |
|---|
| 178 | 183 | } |
|---|
| .. | .. |
|---|
| 230 | 235 | gtk_notebook_append_page(GTK_NOTEBOOK(notebook), scrolled_window, |
|---|
| 231 | 236 | tab_label); |
|---|
| 232 | 237 | |
|---|
| 233 | | - perf_gtk__annotate_symbol(scrolled_window, sym, map, evsel, hbt); |
|---|
| 238 | + perf_gtk__annotate_symbol(scrolled_window, ms, evsel, hbt); |
|---|
| 234 | 239 | return 0; |
|---|
| 235 | 240 | } |
|---|
| 236 | 241 | |
|---|
| 237 | 242 | int hist_entry__gtk_annotate(struct hist_entry *he, |
|---|
| 238 | | - struct perf_evsel *evsel, |
|---|
| 243 | + struct evsel *evsel, |
|---|
| 239 | 244 | struct hist_browser_timer *hbt) |
|---|
| 240 | 245 | { |
|---|
| 241 | | - return symbol__gtk_annotate(he->ms.sym, he->ms.map, evsel, hbt); |
|---|
| 246 | + return symbol__gtk_annotate(&he->ms, evsel, hbt); |
|---|
| 242 | 247 | } |
|---|
| 243 | 248 | |
|---|
| 244 | 249 | void perf_gtk__show_annotations(void) |
|---|