Commit a46acc45 authored by Namhyung Kim's avatar Namhyung Kim Committed by Arnaldo Carvalho de Melo

perf annotate: Move 'widths' struct to 'struct annotated_source'

It's only used in 'perf annotate' output which means functions with
actual samples.  No need to consume memory for every symbol
('struct annotation').

Also move the 'max_line_len' field into it as it's related.
Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20240404175716.1225482-7-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent cee9b860
...@@ -205,13 +205,13 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser) ...@@ -205,13 +205,13 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)
ui_browser__set_color(browser, HE_COLORSET_JUMP_ARROWS); ui_browser__set_color(browser, HE_COLORSET_JUMP_ARROWS);
__ui_browser__line_arrow(browser, __ui_browser__line_arrow(browser,
pcnt_width + 2 + notes->widths.addr + width, pcnt_width + 2 + notes->src->widths.addr + width,
from, to); from, to);
diff = is_fused(ab, cursor); diff = is_fused(ab, cursor);
if (diff > 0) { if (diff > 0) {
ui_browser__mark_fused(browser, ui_browser__mark_fused(browser,
pcnt_width + 3 + notes->widths.addr + width, pcnt_width + 3 + notes->src->widths.addr + width,
from - diff, diff, to > from); from - diff, diff, to > from);
} }
} }
...@@ -983,7 +983,7 @@ int symbol__tui_annotate(struct map_symbol *ms, struct evsel *evsel, ...@@ -983,7 +983,7 @@ int symbol__tui_annotate(struct map_symbol *ms, struct evsel *evsel,
ui_helpline__push("Press ESC to exit"); ui_helpline__push("Press ESC to exit");
browser.b.width = notes->src->max_line_len; browser.b.width = notes->src->widths.max_line_len;
browser.b.nr_entries = notes->src->nr_entries; browser.b.nr_entries = notes->src->nr_entries;
browser.b.entries = &notes->src->source, browser.b.entries = &notes->src->source,
browser.b.width += 18; /* Percentage */ browser.b.width += 18; /* Percentage */
......
...@@ -1383,15 +1383,15 @@ static void annotation__set_index(struct annotation *notes) ...@@ -1383,15 +1383,15 @@ static void annotation__set_index(struct annotation *notes)
struct annotation_line *al; struct annotation_line *al;
struct annotated_source *src = notes->src; struct annotated_source *src = notes->src;
src->max_line_len = 0; src->widths.max_line_len = 0;
src->nr_entries = 0; src->nr_entries = 0;
src->nr_asm_entries = 0; src->nr_asm_entries = 0;
list_for_each_entry(al, &src->source, node) { list_for_each_entry(al, &src->source, node) {
size_t line_len = strlen(al->line); size_t line_len = strlen(al->line);
if (src->max_line_len < line_len) if (src->widths.max_line_len < line_len)
src->max_line_len = line_len; src->widths.max_line_len = line_len;
al->idx = src->nr_entries++; al->idx = src->nr_entries++;
if (al->offset != -1) if (al->offset != -1)
al->idx_asm = src->nr_asm_entries++; al->idx_asm = src->nr_asm_entries++;
...@@ -1429,26 +1429,26 @@ static int annotation__max_ins_name(struct annotation *notes) ...@@ -1429,26 +1429,26 @@ static int annotation__max_ins_name(struct annotation *notes)
static void static void
annotation__init_column_widths(struct annotation *notes, struct symbol *sym) annotation__init_column_widths(struct annotation *notes, struct symbol *sym)
{ {
notes->widths.addr = notes->widths.target = notes->src->widths.addr = notes->src->widths.target =
notes->widths.min_addr = hex_width(symbol__size(sym)); notes->src->widths.min_addr = hex_width(symbol__size(sym));
notes->widths.max_addr = hex_width(sym->end); notes->src->widths.max_addr = hex_width(sym->end);
notes->widths.jumps = width_jumps(notes->max_jump_sources); notes->src->widths.jumps = width_jumps(notes->max_jump_sources);
notes->widths.max_ins_name = annotation__max_ins_name(notes); notes->src->widths.max_ins_name = annotation__max_ins_name(notes);
} }
void annotation__update_column_widths(struct annotation *notes) void annotation__update_column_widths(struct annotation *notes)
{ {
if (annotate_opts.use_offset) if (annotate_opts.use_offset)
notes->widths.target = notes->widths.min_addr; notes->src->widths.target = notes->src->widths.min_addr;
else if (annotate_opts.full_addr) else if (annotate_opts.full_addr)
notes->widths.target = BITS_PER_LONG / 4; notes->src->widths.target = BITS_PER_LONG / 4;
else else
notes->widths.target = notes->widths.max_addr; notes->src->widths.target = notes->src->widths.max_addr;
notes->widths.addr = notes->widths.target; notes->src->widths.addr = notes->src->widths.target;
if (annotate_opts.show_nr_jumps) if (annotate_opts.show_nr_jumps)
notes->widths.addr += notes->widths.jumps + 1; notes->src->widths.addr += notes->src->widths.jumps + 1;
} }
void annotation__toggle_full_addr(struct annotation *notes, struct map_symbol *ms) void annotation__toggle_full_addr(struct annotation *notes, struct map_symbol *ms)
...@@ -1625,7 +1625,8 @@ static void disasm_line__write(struct disasm_line *dl, struct annotation *notes, ...@@ -1625,7 +1625,8 @@ static void disasm_line__write(struct disasm_line *dl, struct annotation *notes,
obj__printf(obj, " "); obj__printf(obj, " ");
} }
disasm_line__scnprintf(dl, bf, size, !annotate_opts.use_offset, notes->widths.max_ins_name); disasm_line__scnprintf(dl, bf, size, !annotate_opts.use_offset,
notes->src->widths.max_ins_name);
} }
static void ipc_coverage_string(char *bf, int size, struct annotation *notes) static void ipc_coverage_string(char *bf, int size, struct annotation *notes)
...@@ -1753,9 +1754,11 @@ static void __annotation_line__write(struct annotation_line *al, struct annotati ...@@ -1753,9 +1754,11 @@ static void __annotation_line__write(struct annotation_line *al, struct annotati
obj__printf(obj, "%-*s", width - pcnt_width - cycles_width, " "); obj__printf(obj, "%-*s", width - pcnt_width - cycles_width, " ");
else if (al->offset == -1) { else if (al->offset == -1) {
if (al->line_nr && annotate_opts.show_linenr) if (al->line_nr && annotate_opts.show_linenr)
printed = scnprintf(bf, sizeof(bf), "%-*d ", notes->widths.addr + 1, al->line_nr); printed = scnprintf(bf, sizeof(bf), "%-*d ",
notes->src->widths.addr + 1, al->line_nr);
else else
printed = scnprintf(bf, sizeof(bf), "%-*s ", notes->widths.addr, " "); printed = scnprintf(bf, sizeof(bf), "%-*s ",
notes->src->widths.addr, " ");
obj__printf(obj, bf); obj__printf(obj, bf);
obj__printf(obj, "%-*s", width - printed - pcnt_width - cycles_width + 1, al->line); obj__printf(obj, "%-*s", width - printed - pcnt_width - cycles_width + 1, al->line);
} else { } else {
...@@ -1773,7 +1776,7 @@ static void __annotation_line__write(struct annotation_line *al, struct annotati ...@@ -1773,7 +1776,7 @@ static void __annotation_line__write(struct annotation_line *al, struct annotati
if (annotate_opts.show_nr_jumps) { if (annotate_opts.show_nr_jumps) {
int prev; int prev;
printed = scnprintf(bf, sizeof(bf), "%*d ", printed = scnprintf(bf, sizeof(bf), "%*d ",
notes->widths.jumps, notes->src->widths.jumps,
al->jump_sources); al->jump_sources);
prev = obj__set_jumps_percent_color(obj, al->jump_sources, prev = obj__set_jumps_percent_color(obj, al->jump_sources,
current_entry); current_entry);
...@@ -1782,7 +1785,7 @@ static void __annotation_line__write(struct annotation_line *al, struct annotati ...@@ -1782,7 +1785,7 @@ static void __annotation_line__write(struct annotation_line *al, struct annotati
} }
print_addr: print_addr:
printed = scnprintf(bf, sizeof(bf), "%*" PRIx64 ": ", printed = scnprintf(bf, sizeof(bf), "%*" PRIx64 ": ",
notes->widths.target, addr); notes->src->widths.target, addr);
} else if (ins__is_call(&disasm_line(al)->ins) && } else if (ins__is_call(&disasm_line(al)->ins) &&
annotate_opts.offset_level >= ANNOTATION__OFFSET_CALL) { annotate_opts.offset_level >= ANNOTATION__OFFSET_CALL) {
goto print_addr; goto print_addr;
...@@ -1790,7 +1793,7 @@ static void __annotation_line__write(struct annotation_line *al, struct annotati ...@@ -1790,7 +1793,7 @@ static void __annotation_line__write(struct annotation_line *al, struct annotati
goto print_addr; goto print_addr;
} else { } else {
printed = scnprintf(bf, sizeof(bf), "%-*s ", printed = scnprintf(bf, sizeof(bf), "%-*s ",
notes->widths.addr, " "); notes->src->widths.addr, " ");
} }
} }
......
...@@ -250,7 +250,7 @@ struct cyc_hist { ...@@ -250,7 +250,7 @@ struct cyc_hist {
* @nr_entries: Number of annotated_line in the source list. * @nr_entries: Number of annotated_line in the source list.
* @nr_asm_entries: Number of annotated_line with actual asm instruction in the * @nr_asm_entries: Number of annotated_line with actual asm instruction in the
* source list. * source list.
* @max_line_len: Maximum length of objdump output in an annotated_line. * @widths: Precalculated width of each column in the TUI output.
* *
* disasm_lines are allocated, percentages calculated and all sorted by percentage * disasm_lines are allocated, percentages calculated and all sorted by percentage
* when the annotation is about to be presented, so the percentages are for * when the annotation is about to be presented, so the percentages are for
...@@ -265,7 +265,15 @@ struct annotated_source { ...@@ -265,7 +265,15 @@ struct annotated_source {
int nr_histograms; int nr_histograms;
int nr_entries; int nr_entries;
int nr_asm_entries; int nr_asm_entries;
u16 max_line_len; struct {
u8 addr;
u8 jumps;
u8 target;
u8 min_addr;
u8 max_addr;
u8 max_ins_name;
u16 max_line_len;
} widths;
}; };
struct annotation_line *annotated_source__get_line(struct annotated_source *src, struct annotation_line *annotated_source__get_line(struct annotated_source *src,
...@@ -302,14 +310,6 @@ struct LOCKABLE annotation { ...@@ -302,14 +310,6 @@ struct LOCKABLE annotation {
u64 start; u64 start;
int nr_events; int nr_events;
int max_jump_sources; int max_jump_sources;
struct {
u8 addr;
u8 jumps;
u8 target;
u8 min_addr;
u8 max_addr;
u8 max_ins_name;
} widths;
struct annotated_source *src; struct annotated_source *src;
struct annotated_branch *branch; struct annotated_branch *branch;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment