perf annotate: Use generic annotation line
Subsystems (2)
Jiri Olsa
reviewercover perf annotate: Use generic annotation line
hi,
I'm working on script profiling support and came up with some generic annotation code changes, which IMO make the code simpler and more generic.
The main idea of this patchset is to have generic struct (annotation_line), which holds the common profile data. Having this we can easily add new types, like script annotation support. Currently there's disasm_line support only.
It's also available at:
git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git perf/annotate
I'm getting same annotation results for this patchset as in the current perf, but I might have missed something.
thanks,
jirka
--- tools/perf/arch/arm/annotate/instructions.c | 3 +- tools/perf/arch/arm64/annotate/instructions.c | 3 +- tools/perf/arch/powerpc/annotate/instructions.c | 4 +- tools/perf/arch/s390/annotate/instructions.c | 4 +- tools/perf/arch/x86/annotate/instructions.c | 14 +++ tools/perf/builtin-top.c | 2 +- tools/perf/ui/browsers/annotate.c | 404 +++++++++++++++++++++++++++++++++++------------------------------------- tools/perf/ui/gtk/annotate.c | 23 ++--- tools/perf/util/annotate.c | 635 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------ tools/perf/util/annotate.h | 76 ++++++++------ 10 files changed, 609 insertions(+), 559 deletions(-)
Jiri Olsa
reviewerPATCH 1/35 perf annotate: Remove arch::cpuid_parse callback
There's no need for extra cpuid_parse arch callback, it can be handled directly in init callback.
Adding the init function to x86 to cover the cpuid initialization.
--- tools/perf/arch/arm/annotate/instructions.c | 3 ++- tools/perf/arch/arm64/annotate/instructions.c | 3 ++- tools/perf/arch/powerpc/annotate/instructions.c | 4 +++- tools/perf/arch/s390/annotate/instructions.c | 4 +++- tools/perf/arch/x86/annotate/instructions.c | 14 ++++++++++++++ tools/perf/util/annotate.c | 10 +++------- 6 files changed, 27 insertions(+), 11 deletions(-)
tools/perf/arch/arm/annotate/instructions.c +2 -1
@@ -1,3 +1,4 @@ +#include <linux/compiler.h> #include <sys/types.h> #include <regex.h>
@@ -23,7 +24,7 @@ static struct ins_ops *arm__associate_instruction_ops(struct arch *arch, const creturn ops; } -static int arm__annotate_init (struct arch *arch) +static int arm__annotate_init (struct arch *arch,char *cpuid__maybe_unused ) {struct arm_annotate *arm;int err;
tools/perf/arch/arm64/annotate/instructions.c +2 -1
@@ -1,3 +1,4 @@ +#include <linux/compiler.h> #include <sys/types.h> #include <regex.h>
@@ -25,7 +26,7 @@ static struct ins_ops *arm64__associate_instruction_ops(struct arch *arch, constreturn ops; } -static int arm64__annotate_init (struct arch *arch) +static int arm64__annotate_init (struct arch *arch,char *cpuid__maybe_unused ) {struct arm64_annotate *arm;int err;
tools/perf/arch/powerpc/annotate/instructions.c +3 -1
@@ -1,3 +1,5 @@ +#include <linux/compiler.h> +static struct ins_ops *powerpc__associate_instruction_ops (struct arch *arch,const char *name) {int i;
@@ -46,7 +48,7 @@ static struct ins_ops *powerpc__associate_instruction_ops(struct arch *arch, conreturn ops; } -static int powerpc__annotate_init (struct arch *arch) +static int powerpc__annotate_init (struct arch *arch,char *cpuid__maybe_unused ) {if (!arch->initialized) { arch->initialized = true;
tools/perf/arch/s390/annotate/instructions.c +3 -1
@@ -1,3 +1,5 @@ +#include <linux/compiler.h> +static struct ins_ops *s390__associate_ins_ops (struct arch *arch,const char *name) {struct ins_ops *ops =NULL ;
@@ -19,7 +21,7 @@ static struct ins_ops *s390__associate_ins_ops(struct arch *arch, const char *nareturn ops; } -static int s390__annotate_init (struct arch *arch) +static int s390__annotate_init (struct arch *arch,char *cpuid__maybe_unused ) {if (!arch->initialized) { arch->initialized = true;
tools/perf/arch/x86/annotate/instructions.c +14 -0
@@ -122,3 +122,17 @@ static int x86__cpuid_parse(struct arch *arch, char *cpuid)return -1 ; } + +static int x86__annotate_init (struct arch *arch,char *cpuid) +{ +int err =0 ; + +if (arch->initialized) +return 0 ; + +if (cpuid) + err =x86__cpuid_parse (arch, cpuid); + + arch->initialized = true; +return err; +}
tools/perf/util/annotate.c +3 -7
@@ -49,10 +49,9 @@ struct arch {void *priv;unsigned int model;unsigned int family; -int (*init)(struct arch *arch); +int (*init)(struct arch *arch,char *cpuid);bool (*ins_is_fused)(struct arch *arch,const char *ins1,const char *ins2); -int (*cpuid_parse)(struct arch *arch,char *cpuid);struct {char comment_char;char skip_functions_char;
@@ -132,10 +131,10 @@ static struct arch architectures[] = { }, { .name = "x86", + .init = x86__annotate_init, .instructions = x86__instructions, .nr_instructions = ARRAY_SIZE(x86__instructions), .ins_is_fused = x86__ins_is_fused, - .cpuid_parse = x86__cpuid_parse, .objdump = { .comment_char = '#', },
@@ -1447,16 +1446,13 @@ int symbol__disassemble(struct symbol *sym, struct map *map, *parch = arch;if (arch->init) { - err = arch->init (arch); + err = arch->init (arch, cpuid);if (err) {pr_err ("%s: failed to initialize %s arch priv area\n" , __func__, arch->name);return err; } } -if (arch->cpuid_parse && cpuid) - arch->cpuid_parse (arch, cpuid); -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));
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Remove arch::cpuid_parse callback
perf annotate: Remove arch::cpuid_parse callback
Commit-ID: 696e2457e9fd285034cd30cd8c93ece5e6cfe35a Gitweb: https://git.kernel.org/tip/696e2457e9fd285034cd30cd8c93ece5e6cfe35a Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:24 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 23 Oct 2017 11:20:54 -0300
perf annotate: Remove arch::cpuid_parse callback
There's no need for extra cpuid_parse arch callback, it can be handled directly in init callback.
Adding the init function to x86 to cover the cpuid initialization.
--- tools/perf/arch/arm/annotate/instructions.c | 3 ++- tools/perf/arch/arm64/annotate/instructions.c | 3 ++- tools/perf/arch/powerpc/annotate/instructions.c | 4 +++- tools/perf/arch/s390/annotate/instructions.c | 4 +++- tools/perf/arch/x86/annotate/instructions.c | 14 ++++++++++++++ tools/perf/util/annotate.c | 10 +++------- 6 files changed, 27 insertions(+), 11 deletions(-)
tools/perf/arch/arm/annotate/instructions.c +2 -1
@@ -1,3 +1,4 @@ +#include <linux/compiler.h> #include <sys/types.h> #include <regex.h>
@@ -23,7 +24,7 @@ static struct ins_ops *arm__associate_instruction_ops(struct arch *arch, const creturn ops; } -static int arm__annotate_init (struct arch *arch) +static int arm__annotate_init (struct arch *arch,char *cpuid__maybe_unused ) {struct arm_annotate *arm;int err;
tools/perf/arch/arm64/annotate/instructions.c +2 -1
@@ -1,3 +1,4 @@ +#include <linux/compiler.h> #include <sys/types.h> #include <regex.h>
@@ -25,7 +26,7 @@ static struct ins_ops *arm64__associate_instruction_ops(struct arch *arch, constreturn ops; } -static int arm64__annotate_init (struct arch *arch) +static int arm64__annotate_init (struct arch *arch,char *cpuid__maybe_unused ) {struct arm64_annotate *arm;int err;
tools/perf/arch/powerpc/annotate/instructions.c +3 -1
@@ -1,3 +1,5 @@ +#include <linux/compiler.h> +static struct ins_ops *powerpc__associate_instruction_ops (struct arch *arch,const char *name) {int i;
@@ -46,7 +48,7 @@ static struct ins_ops *powerpc__associate_instruction_ops(struct arch *arch, conreturn ops; } -static int powerpc__annotate_init (struct arch *arch) +static int powerpc__annotate_init (struct arch *arch,char *cpuid__maybe_unused ) {if (!arch->initialized) { arch->initialized = true;
tools/perf/arch/s390/annotate/instructions.c +3 -1
@@ -1,3 +1,5 @@ +#include <linux/compiler.h> +static struct ins_ops *s390__associate_ins_ops (struct arch *arch,const char *name) {struct ins_ops *ops =NULL ;
@@ -19,7 +21,7 @@ static struct ins_ops *s390__associate_ins_ops(struct arch *arch, const char *nareturn ops; } -static int s390__annotate_init (struct arch *arch) +static int s390__annotate_init (struct arch *arch,char *cpuid__maybe_unused ) {if (!arch->initialized) { arch->initialized = true;
tools/perf/arch/x86/annotate/instructions.c +14 -0
@@ -122,3 +122,17 @@ static int x86__cpuid_parse(struct arch *arch, char *cpuid)return -1 ; } + +static int x86__annotate_init (struct arch *arch,char *cpuid) +{ +int err =0 ; + +if (arch->initialized) +return 0 ; + +if (cpuid) + err =x86__cpuid_parse (arch, cpuid); + + arch->initialized = true; +return err; +}
tools/perf/util/annotate.c +3 -7
@@ -49,10 +49,9 @@ struct arch {void *priv;unsigned int model;unsigned int family; -int (*init)(struct arch *arch); +int (*init)(struct arch *arch,char *cpuid);bool (*ins_is_fused)(struct arch *arch,const char *ins1,const char *ins2); -int (*cpuid_parse)(struct arch *arch,char *cpuid);struct {char comment_char;char skip_functions_char;
@@ -132,10 +131,10 @@ static struct arch architectures[] = { }, { .name = "x86", + .init = x86__annotate_init, .instructions = x86__instructions, .nr_instructions = ARRAY_SIZE(x86__instructions), .ins_is_fused = x86__ins_is_fused, - .cpuid_parse = x86__cpuid_parse, .objdump = { .comment_char = '#', },
@@ -1447,16 +1446,13 @@ int symbol__disassemble(struct symbol *sym, struct map *map, *parch = arch;if (arch->init) { - err = arch->init (arch); + err = arch->init (arch, cpuid);if (err) {pr_err ("%s: failed to initialize %s arch priv area\n" , __func__, arch->name);return err; } } -if (arch->cpuid_parse && cpuid) - arch->cpuid_parse (arch, cpuid); -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));
Jiri Olsa
reviewerPATCH 2/35 perf annotate: Add annotation_line struct
In reply to Jiri OlsaIn order to make the annotation support generic, I'm adding 'struct annotation_line', which will hold all generic data common to any annotation source (it's coming on following patches). Having this, we can add different annotation line support than objdump disasm.
--- tools/perf/ui/browsers/annotate.c | 34 +++++++++++++++++----------------- tools/perf/ui/gtk/annotate.c | 6 +++--- tools/perf/util/annotate.c | 20 ++++++++++---------- tools/perf/util/annotate.h | 20 ++++++++++++-------- 4 files changed, 42 insertions(+), 38 deletions(-)
tools/perf/ui/browsers/annotate.c +17 -17
@@ -83,7 +83,7 @@ static bool disasm_line__filter(struct ui_browser *browser __maybe_unused, void *entry) {if (annotate_browser__opts.hide_src_code) { - struct disasm_line *dl = list_entry(entry, struct disasm_line, node); + struct disasm_line *dl = list_entry(entry, struct disasm_line, al.node);return dl->offset ==-1 ; }
@@ -122,7 +122,7 @@ static int annotate_browser__cycles_width(struct annotate_browser *ab)static void annotate_browser__write (struct ui_browser *browser,void *entry,int row) { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); - struct disasm_line *dl = list_entry(entry, struct disasm_line, node); + struct disasm_line *dl = list_entry(entry, struct disasm_line, al.node);struct browser_disasm_line *bdl =disasm_line__browser (dl);bool current_entry =ui_browser__is_current_entry (browser, row); bool change_color = (!annotate_browser__opts.hide_src_code &&
@@ -285,7 +285,7 @@ static bool disasm_line__is_valid_jump(struct disasm_line *dl, struct symbol *systatic bool is_fused (struct annotate_browser *ab,struct disasm_line *cursor) { -struct disasm_line *pos =list_prev_entry (cursor, node); +struct disasm_line *pos =list_prev_entry (cursor, al.node);const char *name;if (!pos)
@@ -403,16 +403,16 @@ static void annotate_browser__set_top(struct annotate_browser *browser, browser->b.top_idx = browser->b.index = idx;while (browser->b.top_idx !=0 && back !=0 ) { - pos = list_entry(pos->node.prev, struct disasm_line, node); + pos = list_entry(pos->al.node.prev, struct disasm_line, al.node); -if (disasm_line__filter (&browser->b, &pos->node)) +if (disasm_line__filter (&browser->b, &pos->al.node))continue ; --browser->b.top_idx; --back; } - browser->b.top = pos; + browser->b.top = &pos->al; browser->b.navkeypressed = true; }
@@ -445,7 +445,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,pthread_mutex_lock (¬es->lock); -list_for_each_entry (pos, ¬es->src->source, node) { +list_for_each_entry (pos, ¬es->src->source, al.node) {struct browser_disasm_line *bpos =disasm_line__browser (pos);const char *path =NULL ;double max_percent =0.0 ;
@@ -491,7 +491,7 @@ static bool annotate_browser__toggle_source(struct annotate_browser *browser)off_t offset = browser->b.index - browser->b.top_idx; browser->b.seek (&browser->b, offset,SEEK_CUR ); - dl = list_entry(browser->b.top, struct disasm_line, node); + dl = list_entry(browser->b.top, struct disasm_line, al.node); bdl =disasm_line__browser (dl);if (annotate_browser__opts.hide_src_code) {
@@ -588,10 +588,10 @@ struct disasm_line *annotate_browser__find_offset(struct annotate_browser *browsstruct disasm_line *pos; *idx =0 ; -list_for_each_entry (pos, ¬es->src->source, node) { +list_for_each_entry (pos, ¬es->src->source, al.node) {if (pos->offset == offset)return pos; -if (!disasm_line__filter (&browser->b, &pos->node)) +if (!disasm_line__filter (&browser->b, &pos->al.node)) ++*idx; }
@@ -629,8 +629,8 @@ struct disasm_line *annotate_browser__find_string(struct annotate_browser *browsstruct disasm_line *pos = browser->selection; *idx = browser->b.index; -list_for_each_entry_continue (pos, ¬es->src->source, node) { -if (disasm_line__filter (&browser->b, &pos->node)) +list_for_each_entry_continue (pos, ¬es->src->source, al.node) { +if (disasm_line__filter (&browser->b, &pos->al.node))continue ; ++*idx;
@@ -668,8 +668,8 @@ struct disasm_line *annotate_browser__find_string_reverse(struct annotate_browsestruct disasm_line *pos = browser->selection; *idx = browser->b.index; -list_for_each_entry_continue_reverse (pos, ¬es->src->source, node) { -if (disasm_line__filter (&browser->b, &pos->node)) +list_for_each_entry_continue_reverse (pos, ¬es->src->source, al.node) { +if (disasm_line__filter (&browser->b, &pos->al.node))continue ; --*idx;
@@ -1133,7 +1133,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, notes =symbol__annotation (sym); browser.start =map__rip_2objdump (map, sym->start); -list_for_each_entry (pos, ¬es->src->source, node) { +list_for_each_entry (pos, ¬es->src->source, al.node) {struct browser_disasm_line *bpos;size_t line_len =strlen (pos->line);
@@ -1173,8 +1173,8 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,annotate_browser__update_addr_width (&browser); ret =annotate_browser__run (&browser, evsel, hbt); -list_for_each_entry_safe (pos, n, ¬es->src->source, node) { -list_del (&pos->node); +list_for_each_entry_safe (pos, n, ¬es->src->source, al.node) { +list_del (&pos->al.node);disasm_line__free (pos); }
tools/perf/ui/gtk/annotate.c +3 -3
@@ -118,7 +118,7 @@ static int perf_gtk__annotate_symbol(GtkWidget *window, struct symbol *sym,gtk_tree_view_set_model (GTK_TREE_VIEW (view),GTK_TREE_MODEL (store));g_object_unref (GTK_TREE_MODEL (store)); -list_for_each_entry (pos, ¬es->src->source, node) { +list_for_each_entry (pos, ¬es->src->source, al.node) {GtkTreeIter iter;int ret =0 ;
@@ -147,8 +147,8 @@ static int perf_gtk__annotate_symbol(GtkWidget *window, struct symbol *sym,gtk_container_add (GTK_CONTAINER (window), view); -list_for_each_entry_safe (pos, n, ¬es->src->source, node) { -list_del (&pos->node); +list_for_each_entry_safe (pos, n, ¬es->src->source, al.node) { +list_del (&pos->al.node);disasm_line__free (pos); }
tools/perf/util/annotate.c +10 -10
@@ -921,12 +921,12 @@ int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool rstatic void disasm__add (struct list_head *head,struct disasm_line *line) { -list_add_tail (&line->node, head); +list_add_tail (&line->al.node, head); }struct disasm_line *disasm__get_next_ip_line (struct list_head *head,struct disasm_line *pos) { -list_for_each_entry_continue (pos, head, node) +list_for_each_entry_continue (pos, head, al.node)if (pos->offset >=0 )return pos;
@@ -1112,7 +1112,7 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 streturn 1 ;if (queue !=NULL ) { -list_for_each_entry_from (queue, ¬es->src->source, node) { +list_for_each_entry_from (queue, ¬es->src->source, al.node) {if (queue == dl)break ; disasm_line__print(queue, sym, start, evsel, len,
@@ -1295,7 +1295,7 @@ static void delete_last_nop(struct symbol *sym)struct disasm_line *dl;while (!list_empty (list)) { - dl = list_entry(list->prev, struct disasm_line, node); + dl = list_entry(list->prev, struct disasm_line, al.node);if (dl->ins.ops) {if (dl->ins.ops != &nop_ops)
@@ -1307,7 +1307,7 @@ static void delete_last_nop(struct symbol *sym)return ; } -list_del (&dl->node); +list_del (&dl->al.node);disasm_line__free (dl); } }
@@ -1834,7 +1834,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,if (verbose >0 )symbol__annotate_hits (sym, evsel); -list_for_each_entry (pos, ¬es->src->source, node) { +list_for_each_entry (pos, ¬es->src->source, al.node) {if (context && queue ==NULL ) { queue = pos; queue_len =0 ;
@@ -1864,7 +1864,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,if (!context)break ;if (queue_len == context) - queue =list_entry (queue->node.next,typeof (*queue), node); + queue =list_entry (queue->al.node.next,typeof (*queue), al.node);else ++queue_len;break ;
@@ -1901,8 +1901,8 @@ void disasm__purge(struct list_head *head) {struct disasm_line *pos, *n; -list_for_each_entry_safe (pos, n, head, node) { -list_del (&pos->node); +list_for_each_entry_safe (pos, n, head, al.node) { +list_del (&pos->al.node);disasm_line__free (pos); } }
@@ -1929,7 +1929,7 @@ size_t disasm__fprintf(struct list_head *head, FILE *fp)struct disasm_line *pos;size_t printed =0 ; -list_for_each_entry (pos, head, node) +list_for_each_entry (pos, head, al.node) printed +=disasm_line__fprintf (pos, fp);return printed;
tools/perf/util/annotate.h +12 -8
@@ -58,15 +58,19 @@ bool ins__is_fused(struct arch *arch, const char *ins1, const char *ins2);struct annotation ; +struct annotation_line { +struct list_head node; +}; +struct disasm_line { -struct list_head node; -s64 offset; -char *line; -struct ins ins; -int line_nr; -float ipc; -u64 cycles; -struct ins_operands ops; +struct annotation_line al; +s64 offset; +char *line; +struct ins ins; +int line_nr; +float ipc; +u64 cycles; +struct ins_operands ops; };static inline bool disasm_line__has_offset (const struct disasm_line *dl)
Signature · 1 line
2.13.6
Arnaldo Carvalho de Melo
maintainerRe: [PATCH 02/35] perf annotate: Add annotation_line struct
Em Wed, Oct 11, 2017 at 05:01:25PM +0200, Jiri Olsa escreveu:
Quoted 5 lines
In order to make the annotation support generic, I'm adding 'struct
annotation_line', which will hold all generic data common to any annotation source (it's coming on following patches). Having this, we can add different annotation line support than objdump disasm.
Such as? What other "annotation line support" other than "objdump disasm"?
- Arnaldo
Quoted 275 lines
Signed-off-by Jiri Olsa <[email protected]>--- tools/perf/ui/browsers/annotate.c | 34 +++++++++++++++++----------------- tools/perf/ui/gtk/annotate.c | 6 +++--- tools/perf/util/annotate.c | 20 ++++++++++---------- tools/perf/util/annotate.h | 20 ++++++++++++-------- 4 files changed, 42 insertions(+), 38 deletions(-)tools/perf/ui/browsers/annotate.c +17
-17@@ -83,7 +83,7 @@ static bool disasm_line__filter(struct ui_browser *browser __maybe_unused, void *entry) {if (annotate_browser__opts.hide_src_code) { - struct disasm_line *dl = list_entry(entry, struct disasm_line, node); + struct disasm_line *dl = list_entry(entry, struct disasm_line, al.node);return dl->offset ==-1 ; }@@ -122,7 +122,7 @@ static int annotate_browser__cycles_width(struct annotate_browser *ab)static void annotate_browser__write (struct ui_browser *browser,void *entry,int row) { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); - struct disasm_line *dl = list_entry(entry, struct disasm_line, node); + struct disasm_line *dl = list_entry(entry, struct disasm_line, al.node);struct browser_disasm_line *bdl =disasm_line__browser (dl);bool current_entry =ui_browser__is_current_entry (browser, row); bool change_color = (!annotate_browser__opts.hide_src_code &&@@ -285,7 +285,7 @@ static bool disasm_line__is_valid_jump(struct disasm_line *dl, struct symbol *systatic bool is_fused (struct annotate_browser *ab,struct disasm_line *cursor) { -struct disasm_line *pos =list_prev_entry (cursor, node); +struct disasm_line *pos =list_prev_entry (cursor, al.node);const char *name;if (!pos)@@ -403,16 +403,16 @@ static void annotate_browser__set_top(struct annotate_browser *browser, browser->b.top_idx = browser->b.index = idx;while (browser->b.top_idx !=0 && back !=0 ) { - pos = list_entry(pos->node.prev, struct disasm_line, node); + pos = list_entry(pos->al.node.prev, struct disasm_line, al.node); -if (disasm_line__filter (&browser->b, &pos->node)) +if (disasm_line__filter (&browser->b, &pos->al.node))continue ; --browser->b.top_idx; --back; } - browser->b.top = pos; + browser->b.top = &pos->al; browser->b.navkeypressed = true; }@@ -445,7 +445,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,pthread_mutex_lock (¬es->lock); -list_for_each_entry (pos, ¬es->src->source, node) { +list_for_each_entry (pos, ¬es->src->source, al.node) {struct browser_disasm_line *bpos =disasm_line__browser (pos);const char *path =NULL ;double max_percent =0.0 ;@@ -491,7 +491,7 @@ static bool annotate_browser__toggle_source(struct annotate_browser *browser)off_t offset = browser->b.index - browser->b.top_idx; browser->b.seek (&browser->b, offset,SEEK_CUR ); - dl = list_entry(browser->b.top, struct disasm_line, node); + dl = list_entry(browser->b.top, struct disasm_line, al.node); bdl =disasm_line__browser (dl);if (annotate_browser__opts.hide_src_code) {@@ -588,10 +588,10 @@ struct disasm_line *annotate_browser__find_offset(struct annotate_browser *browsstruct disasm_line *pos; *idx =0 ; -list_for_each_entry (pos, ¬es->src->source, node) { +list_for_each_entry (pos, ¬es->src->source, al.node) {if (pos->offset == offset)return pos; -if (!disasm_line__filter (&browser->b, &pos->node)) +if (!disasm_line__filter (&browser->b, &pos->al.node)) ++*idx; }@@ -629,8 +629,8 @@ struct disasm_line *annotate_browser__find_string(struct annotate_browser *browsstruct disasm_line *pos = browser->selection; *idx = browser->b.index; -list_for_each_entry_continue (pos, ¬es->src->source, node) { -if (disasm_line__filter (&browser->b, &pos->node)) +list_for_each_entry_continue (pos, ¬es->src->source, al.node) { +if (disasm_line__filter (&browser->b, &pos->al.node))continue ; ++*idx;@@ -668,8 +668,8 @@ struct disasm_line *annotate_browser__find_string_reverse(struct annotate_browsestruct disasm_line *pos = browser->selection; *idx = browser->b.index; -list_for_each_entry_continue_reverse (pos, ¬es->src->source, node) { -if (disasm_line__filter (&browser->b, &pos->node)) +list_for_each_entry_continue_reverse (pos, ¬es->src->source, al.node) { +if (disasm_line__filter (&browser->b, &pos->al.node))continue ; --*idx;@@ -1133,7 +1133,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, notes =symbol__annotation (sym); browser.start =map__rip_2objdump (map, sym->start); -list_for_each_entry (pos, ¬es->src->source, node) { +list_for_each_entry (pos, ¬es->src->source, al.node) {struct browser_disasm_line *bpos;size_t line_len =strlen (pos->line);@@ -1173,8 +1173,8 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,annotate_browser__update_addr_width (&browser); ret =annotate_browser__run (&browser, evsel, hbt); -list_for_each_entry_safe (pos, n, ¬es->src->source, node) { -list_del (&pos->node); +list_for_each_entry_safe (pos, n, ¬es->src->source, al.node) { +list_del (&pos->al.node);disasm_line__free (pos); }tools/perf/ui/gtk/annotate.c +3
-3@@ -118,7 +118,7 @@ static int perf_gtk__annotate_symbol(GtkWidget *window, struct symbol *sym,gtk_tree_view_set_model (GTK_TREE_VIEW (view),GTK_TREE_MODEL (store));g_object_unref (GTK_TREE_MODEL (store)); -list_for_each_entry (pos, ¬es->src->source, node) { +list_for_each_entry (pos, ¬es->src->source, al.node) {GtkTreeIter iter;int ret =0 ;@@ -147,8 +147,8 @@ static int perf_gtk__annotate_symbol(GtkWidget *window, struct symbol *sym,gtk_container_add (GTK_CONTAINER (window), view); -list_for_each_entry_safe (pos, n, ¬es->src->source, node) { -list_del (&pos->node); +list_for_each_entry_safe (pos, n, ¬es->src->source, al.node) { +list_del (&pos->al.node);disasm_line__free (pos); }tools/perf/util/annotate.c +10
-10@@ -921,12 +921,12 @@ int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool rstatic void disasm__add (struct list_head *head,struct disasm_line *line) { -list_add_tail (&line->node, head); +list_add_tail (&line->al.node, head); }struct disasm_line *disasm__get_next_ip_line (struct list_head *head,struct disasm_line *pos) { -list_for_each_entry_continue (pos, head, node) +list_for_each_entry_continue (pos, head, al.node)if (pos->offset >=0 )return pos;@@ -1112,7 +1112,7 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 streturn 1 ;if (queue !=NULL ) { -list_for_each_entry_from (queue, ¬es->src->source, node) { +list_for_each_entry_from (queue, ¬es->src->source, al.node) {if (queue == dl)break ; disasm_line__print(queue, sym, start, evsel, len,@@ -1295,7 +1295,7 @@ static void delete_last_nop(struct symbol *sym)struct disasm_line *dl;while (!list_empty (list)) { - dl = list_entry(list->prev, struct disasm_line, node); + dl = list_entry(list->prev, struct disasm_line, al.node);if (dl->ins.ops) {if (dl->ins.ops != &nop_ops)@@ -1307,7 +1307,7 @@ static void delete_last_nop(struct symbol *sym)return ; } -list_del (&dl->node); +list_del (&dl->al.node);disasm_line__free (dl); } }@@ -1834,7 +1834,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,if (verbose >0 )symbol__annotate_hits (sym, evsel); -list_for_each_entry (pos, ¬es->src->source, node) { +list_for_each_entry (pos, ¬es->src->source, al.node) {if (context && queue ==NULL ) { queue = pos; queue_len =0 ;@@ -1864,7 +1864,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,if (!context)break ;if (queue_len == context) - queue =list_entry (queue->node.next,typeof (*queue), node); + queue =list_entry (queue->al.node.next,typeof (*queue), al.node);else ++queue_len;break ;@@ -1901,8 +1901,8 @@ void disasm__purge(struct list_head *head) {struct disasm_line *pos, *n; -list_for_each_entry_safe (pos, n, head, node) { -list_del (&pos->node); +list_for_each_entry_safe (pos, n, head, al.node) { +list_del (&pos->al.node);disasm_line__free (pos); } }@@ -1929,7 +1929,7 @@ size_t disasm__fprintf(struct list_head *head, FILE *fp)struct disasm_line *pos;size_t printed =0 ; -list_for_each_entry (pos, head, node) +list_for_each_entry (pos, head, al.node) printed +=disasm_line__fprintf (pos, fp);return printed;tools/perf/util/annotate.h +12
-8@@ -58,15 +58,19 @@ bool ins__is_fused(struct arch *arch, const char *ins1, const char *ins2);struct annotation ; +struct annotation_line { +struct list_head node; +}; +struct disasm_line { -struct list_head node; -s64 offset; -char *line; -struct ins ins; -int line_nr; -float ipc; -u64 cycles; -struct ins_operands ops; +struct annotation_line al; +s64 offset; +char *line; +struct ins ins; +int line_nr; +float ipc; +u64 cycles; +struct ins_operands ops; };static inline bool disasm_line__has_offset (const struct disasm_line *dl)Signature · 1 line
2.13.6
Re: [PATCH 02/35] perf annotate: Add annotation_line struct
Quoted 9 lines · Arnaldo Carvalho de Melo
Em Wed, Oct 11, 2017 at 05:01:25PM +0200, Jiri Olsa escreveu:
Quoted 5 lines
In order to make the annotation support generic, I'm adding 'struct
annotation_line', which will hold all generic data common to any annotation source (it's coming on following patches). Having this, we can add different annotation line support than objdump disasm.Such as? What other "annotation line support" other than "objdump disasm"?
such a python script.. sent in the email earlier
jirka
---
Percent | Source code & Disassembly of [python_stack] for cycles:ppp (50 samples)
[_parse /usr/lib64/python3.6/sre_parse.py]
---------------------------------------------------------------------------------------
: # parse a simple pattern
0.00 : 5584195c1600: subpattern = SubPattern(state)
:
: # precompute constants into local variables
2.00 : 5584195c1608: subpatternappend = subpattern.append
0.00 : 5584195c160e: sourceget = source.get
2.00 : 5584195c1614: sourcematch = source.match
0.00 : 5584195c161a: _len = len
0.00 : 5584195c161e: _ord = ord
:
0.00 : 5584195c1622: while True:
:
6.00 : 5584195c1626: this = source.next
4.00 : 5584195c162c: if this is None:
0.00 : 5584195c1634: break # end of pattern
2.00 : 5584195c1636: if this in "|)":
0.00 : 5584195c163e: break # end of subpattern
10.00 : 5584195c1640: sourceget()
:
4.00 : 5584195c1646: if verbose:
: # skip whitespace and comments
4.00 : 5584195c164a: if this in WHITESPACE:...
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Add annotation_line struct
In reply to Jiri Olsaperf annotate: Add annotation_line struct
Commit-ID: a17c4ca0ddef659d33fb6661995bd74e1a6a6101 Gitweb: https://git.kernel.org/tip/a17c4ca0ddef659d33fb6661995bd74e1a6a6101 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:25 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 13 Nov 2017 09:39:57 -0300
perf annotate: Add annotation_line struct
In order to make the annotation support generic, addadding 'struct annotation_line', which will hold generic data common to annotation sources (such as the one for python scripts, coming on upcoming patches).
Having this, we can add different annotation line support other than objdump disasm.
--- tools/perf/ui/browsers/annotate.c | 34 +++++++++++++++++----------------- tools/perf/ui/gtk/annotate.c | 6 +++--- tools/perf/util/annotate.c | 20 ++++++++++---------- tools/perf/util/annotate.h | 20 ++++++++++++-------- 4 files changed, 42 insertions(+), 38 deletions(-)
tools/perf/ui/browsers/annotate.c +17 -17
@@ -84,7 +84,7 @@ static bool disasm_line__filter(struct ui_browser *browser __maybe_unused, void *entry) {if (annotate_browser__opts.hide_src_code) { - struct disasm_line *dl = list_entry(entry, struct disasm_line, node); + struct disasm_line *dl = list_entry(entry, struct disasm_line, al.node);return dl->offset ==-1 ; }
@@ -123,7 +123,7 @@ static int annotate_browser__cycles_width(struct annotate_browser *ab)static void annotate_browser__write (struct ui_browser *browser,void *entry,int row) { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); - struct disasm_line *dl = list_entry(entry, struct disasm_line, node); + struct disasm_line *dl = list_entry(entry, struct disasm_line, al.node);struct browser_disasm_line *bdl =disasm_line__browser (dl);bool current_entry =ui_browser__is_current_entry (browser, row); bool change_color = (!annotate_browser__opts.hide_src_code &&
@@ -286,7 +286,7 @@ static bool disasm_line__is_valid_jump(struct disasm_line *dl, struct symbol *systatic bool is_fused (struct annotate_browser *ab,struct disasm_line *cursor) { -struct disasm_line *pos =list_prev_entry (cursor, node); +struct disasm_line *pos =list_prev_entry (cursor, al.node);const char *name;if (!pos)
@@ -404,16 +404,16 @@ static void annotate_browser__set_top(struct annotate_browser *browser, browser->b.top_idx = browser->b.index = idx;while (browser->b.top_idx !=0 && back !=0 ) { - pos = list_entry(pos->node.prev, struct disasm_line, node); + pos = list_entry(pos->al.node.prev, struct disasm_line, al.node); -if (disasm_line__filter (&browser->b, &pos->node)) +if (disasm_line__filter (&browser->b, &pos->al.node))continue ; --browser->b.top_idx; --back; } - browser->b.top = pos; + browser->b.top = &pos->al; browser->b.navkeypressed = true; }
@@ -446,7 +446,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,pthread_mutex_lock (¬es->lock); -list_for_each_entry (pos, ¬es->src->source, node) { +list_for_each_entry (pos, ¬es->src->source, al.node) {struct browser_disasm_line *bpos =disasm_line__browser (pos);const char *path =NULL ;double max_percent =0.0 ;
@@ -492,7 +492,7 @@ static bool annotate_browser__toggle_source(struct annotate_browser *browser)off_t offset = browser->b.index - browser->b.top_idx; browser->b.seek (&browser->b, offset,SEEK_CUR ); - dl = list_entry(browser->b.top, struct disasm_line, node); + dl = list_entry(browser->b.top, struct disasm_line, al.node); bdl =disasm_line__browser (dl);if (annotate_browser__opts.hide_src_code) {
@@ -589,10 +589,10 @@ struct disasm_line *annotate_browser__find_offset(struct annotate_browser *browsstruct disasm_line *pos; *idx =0 ; -list_for_each_entry (pos, ¬es->src->source, node) { +list_for_each_entry (pos, ¬es->src->source, al.node) {if (pos->offset == offset)return pos; -if (!disasm_line__filter (&browser->b, &pos->node)) +if (!disasm_line__filter (&browser->b, &pos->al.node)) ++*idx; }
@@ -630,8 +630,8 @@ struct disasm_line *annotate_browser__find_string(struct annotate_browser *browsstruct disasm_line *pos = browser->selection; *idx = browser->b.index; -list_for_each_entry_continue (pos, ¬es->src->source, node) { -if (disasm_line__filter (&browser->b, &pos->node)) +list_for_each_entry_continue (pos, ¬es->src->source, al.node) { +if (disasm_line__filter (&browser->b, &pos->al.node))continue ; ++*idx;
@@ -669,8 +669,8 @@ struct disasm_line *annotate_browser__find_string_reverse(struct annotate_browsestruct disasm_line *pos = browser->selection; *idx = browser->b.index; -list_for_each_entry_continue_reverse (pos, ¬es->src->source, node) { -if (disasm_line__filter (&browser->b, &pos->node)) +list_for_each_entry_continue_reverse (pos, ¬es->src->source, al.node) { +if (disasm_line__filter (&browser->b, &pos->al.node))continue ; --*idx;
@@ -1134,7 +1134,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, notes =symbol__annotation (sym); browser.start =map__rip_2objdump (map, sym->start); -list_for_each_entry (pos, ¬es->src->source, node) { +list_for_each_entry (pos, ¬es->src->source, al.node) {struct browser_disasm_line *bpos;size_t line_len =strlen (pos->line);
@@ -1174,8 +1174,8 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,annotate_browser__update_addr_width (&browser); ret =annotate_browser__run (&browser, evsel, hbt); -list_for_each_entry_safe (pos, n, ¬es->src->source, node) { -list_del (&pos->node); +list_for_each_entry_safe (pos, n, ¬es->src->source, al.node) { +list_del (&pos->al.node);disasm_line__free (pos); }
tools/perf/ui/gtk/annotate.c +3 -3
@@ -119,7 +119,7 @@ static int perf_gtk__annotate_symbol(GtkWidget *window, struct symbol *sym,gtk_tree_view_set_model (GTK_TREE_VIEW (view),GTK_TREE_MODEL (store));g_object_unref (GTK_TREE_MODEL (store)); -list_for_each_entry (pos, ¬es->src->source, node) { +list_for_each_entry (pos, ¬es->src->source, al.node) {GtkTreeIter iter;int ret =0 ;
@@ -148,8 +148,8 @@ static int perf_gtk__annotate_symbol(GtkWidget *window, struct symbol *sym,gtk_container_add (GTK_CONTAINER (window), view); -list_for_each_entry_safe (pos, n, ¬es->src->source, node) { -list_del (&pos->node); +list_for_each_entry_safe (pos, n, ¬es->src->source, al.node) { +list_del (&pos->al.node);disasm_line__free (pos); }
tools/perf/util/annotate.c +10 -10
@@ -931,12 +931,12 @@ int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool rstatic void disasm__add (struct list_head *head,struct disasm_line *line) { -list_add_tail (&line->node, head); +list_add_tail (&line->al.node, head); }struct disasm_line *disasm__get_next_ip_line (struct list_head *head,struct disasm_line *pos) { -list_for_each_entry_continue (pos, head, node) +list_for_each_entry_continue (pos, head, al.node)if (pos->offset >=0 )return pos;
@@ -1122,7 +1122,7 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 streturn 1 ;if (queue !=NULL ) { -list_for_each_entry_from (queue, ¬es->src->source, node) { +list_for_each_entry_from (queue, ¬es->src->source, al.node) {if (queue == dl)break ; disasm_line__print(queue, sym, start, evsel, len,
@@ -1305,7 +1305,7 @@ static void delete_last_nop(struct symbol *sym)struct disasm_line *dl;while (!list_empty (list)) { - dl = list_entry(list->prev, struct disasm_line, node); + dl = list_entry(list->prev, struct disasm_line, al.node);if (dl->ins.ops) {if (dl->ins.ops != &nop_ops)
@@ -1317,7 +1317,7 @@ static void delete_last_nop(struct symbol *sym)return ; } -list_del (&dl->node); +list_del (&dl->al.node);disasm_line__free (dl); } }
@@ -1844,7 +1844,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,if (verbose >0 )symbol__annotate_hits (sym, evsel); -list_for_each_entry (pos, ¬es->src->source, node) { +list_for_each_entry (pos, ¬es->src->source, al.node) {if (context && queue ==NULL ) { queue = pos; queue_len =0 ;
@@ -1874,7 +1874,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,if (!context)break ;if (queue_len == context) - queue =list_entry (queue->node.next,typeof (*queue), node); + queue =list_entry (queue->al.node.next,typeof (*queue), al.node);else ++queue_len;break ;
@@ -1911,8 +1911,8 @@ void disasm__purge(struct list_head *head) {struct disasm_line *pos, *n; -list_for_each_entry_safe (pos, n, head, node) { -list_del (&pos->node); +list_for_each_entry_safe (pos, n, head, al.node) { +list_del (&pos->al.node);disasm_line__free (pos); } }
@@ -1939,7 +1939,7 @@ size_t disasm__fprintf(struct list_head *head, FILE *fp)struct disasm_line *pos;size_t printed =0 ; -list_for_each_entry (pos, head, node) +list_for_each_entry (pos, head, al.node) printed +=disasm_line__fprintf (pos, fp);return printed;
tools/perf/util/annotate.h +12 -8
@@ -59,15 +59,19 @@ bool ins__is_fused(struct arch *arch, const char *ins1, const char *ins2);struct annotation ; +struct annotation_line { +struct list_head node; +}; +struct disasm_line { -struct list_head node; -s64 offset; -char *line; -struct ins ins; -int line_nr; -float ipc; -u64 cycles; -struct ins_operands ops; +struct annotation_line al; +s64 offset; +char *line; +struct ins ins; +int line_nr; +float ipc; +u64 cycles; +struct ins_operands ops; };static inline bool disasm_line__has_offset (const struct disasm_line *dl)
Jiri Olsa
reviewerPATCH 3/35 perf annotate: Move line/offset into annotation_line struct
In reply to Jiri OlsaMoving line/line_nr/offset into annotation_line struct to be used as generic members for any annotation source.
--- tools/perf/ui/browsers/annotate.c | 45 ++++++++++++++++++++------------------- tools/perf/ui/gtk/annotate.c | 14 ++++++------ tools/perf/util/annotate.c | 41 ++++++++++++++++++----------------- tools/perf/util/annotate.h | 6 +++--- 4 files changed, 54 insertions(+), 52 deletions(-)
tools/perf/ui/browsers/annotate.c +23 -22
@@ -83,8 +83,9 @@ static bool disasm_line__filter(struct ui_browser *browser __maybe_unused, void *entry) {if (annotate_browser__opts.hide_src_code) { - struct disasm_line *dl = list_entry(entry, struct disasm_line, al.node); -return dl->offset ==-1 ; + struct annotation_line *al = list_entry(entry, struct annotation_line, node); + +return al->offset ==-1 ; }return false;
@@ -140,7 +141,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int percent_max = bdl->samples[i].percent; } -if ((row ==0 ) && (dl->offset ==-1 || percent_max ==0.0 )) { +if ((row ==0 ) && (dl->al.offset ==-1 || percent_max ==0.0 )) {if (ab->have_cycles) {if (dl->ipc ==0.0 && dl->cycles ==0 ) show_title = true;
@@ -148,7 +149,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int show_title = true; } -if (dl->offset !=-1 && percent_max !=0.0 ) { +if (dl->al.offset !=-1 && percent_max !=0.0 ) {for (i =0 ; i < ab->nr_events; i++) { ui_browser__set_percent_color(browser, bdl->samples[i].percent,
@@ -198,19 +199,19 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intif (!browser->navkeypressed) width +=1 ; -if (!*dl->line) +if (!*dl->al.line)ui_browser__write_nstring (browser," " , width - pcnt_width - cycles_width); -else if (dl->offset ==-1 ) { -if (dl->line_nr && annotate_browser__opts.show_linenr) +else if (dl->al.offset ==-1 ) { +if (dl->al.line_nr && annotate_browser__opts.show_linenr) printed =scnprintf (bf,sizeof (bf),"%-*d " , - ab->addr_width +1 , dl->line_nr); + ab->addr_width +1 , dl->al.line_nr);else printed =scnprintf (bf,sizeof (bf),"%*s " , ab->addr_width," " );ui_browser__write_nstring (browser, bf, printed); -ui_browser__write_nstring (browser, dl->line, width - printed - pcnt_width - cycles_width +1 ); +ui_browser__write_nstring (browser, dl->al.line, width - printed - pcnt_width - cycles_width +1 ); }else { -u64 addr = dl->offset; +u64 addr = dl->al.offset;int color =-1 ;if (!annotate_browser__opts.use_offset)
@@ -246,7 +247,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intui_browser__set_color (browser, color);if (dl->ins.ops && dl->ins.ops->scnprintf) {if (ins__is_jump (&dl->ins)) { -bool fwd = dl->ops.target.offset > dl->offset; +bool fwd = dl->ops.target.offset > dl->al.offset;ui_browser__write_graph (browser, fwd ?SLSMG_DARROW_CHAR :SLSMG_UARROW_CHAR );
@@ -451,7 +452,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,double max_percent =0.0 ;int i; -if (pos->offset ==-1 ) { +if (pos->al.offset ==-1 ) {RB_CLEAR_NODE (&bpos->rb_node);continue ; }
@@ -463,8 +464,8 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser, bpos->samples[i].percent =disasm__calc_percent (notes, evsel->idx + i, - pos->offset, - next ? next->offset : len, + pos->al.offset, + next ? next->al.offset : len, &path, &sample); bpos->samples[i].he = sample;
@@ -589,7 +590,7 @@ struct disasm_line *annotate_browser__find_offset(struct annotate_browser *brows *idx =0 ;list_for_each_entry (pos, ¬es->src->source, al.node) { -if (pos->offset == offset) +if (pos->al.offset == offset)return pos;if (!disasm_line__filter (&browser->b, &pos->al.node)) ++*idx;
@@ -635,7 +636,7 @@ struct disasm_line *annotate_browser__find_string(struct annotate_browser *brows ++*idx; -if (pos->line &&strstr (pos->line, s) !=NULL ) +if (pos->al.line &&strstr (pos->al.line, s) !=NULL )return pos; }
@@ -674,7 +675,7 @@ struct disasm_line *annotate_browser__find_string_reverse(struct annotate_browse --*idx; -if (pos->line &&strstr (pos->line, s) !=NULL ) +if (pos->al.line &&strstr (pos->al.line, s) !=NULL )return pos; }
@@ -900,7 +901,7 @@ static int annotate_browser__run(struct annotate_browser *browser,case K_RIGHT :if (browser->selection ==NULL )ui_helpline__puts ("Huh? No selection. Report to [email protected]" ); -else if (browser->selection->offset ==-1 ) +else if (browser->selection->al.offset ==-1 )ui_helpline__puts ("Actions are only available for assembly lines." );else if (!browser->selection->ins.ops) goto show_sup_ins;
@@ -1135,13 +1136,13 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,list_for_each_entry (pos, ¬es->src->source, al.node) {struct browser_disasm_line *bpos; -size_t line_len =strlen (pos->line); +size_t line_len =strlen (pos->al.line);if (browser.b.width < line_len) browser.b.width = line_len; bpos =disasm_line__browser (pos); bpos->idx = browser.nr_entries++; -if (pos->offset !=-1 ) { +if (pos->al.offset !=-1 ) { bpos->idx_asm = browser.nr_asm_entries++;/* * FIXME: short term bandaid to cope with assembly
@@ -1150,8 +1151,8 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,* * E.g. copy_user_generic_unrolled */ -if (pos->offset < (s64 )size) - browser.offsets[pos->offset] = pos; +if (pos->al.offset < (s64 )size) + browser.offsets[pos->al.offset] = pos; }else bpos->idx_asm =-1 ; }
tools/perf/ui/gtk/annotate.c +7 -7
@@ -30,14 +30,14 @@ static int perf_gtk__get_percent(char *buf, size_t size, struct symbol *sym,strcpy (buf,"" ); -if (dl->offset == (s64) -1 ) +if (dl->al.offset == (s64) -1 )return 0 ; symhist =annotation__histogram (symbol__annotation (sym), evidx); -if (!symbol_conf.event_group && !symhist->addr[dl->offset].nr_samples) +if (!symbol_conf.event_group && !symhist->addr[dl->al.offset].nr_samples)return 0 ; - percent =100.0 * symhist->addr[dl->offset].nr_samples / symhist->nr_samples; + percent =100.0 * symhist->addr[dl->al.offset].nr_samples / symhist->nr_samples; markup =perf_gtk__get_percent_color (percent);if (markup)
@@ -56,16 +56,16 @@ static int perf_gtk__get_offset(char *buf, size_t size, struct symbol *sym,strcpy (buf,"" ); -if (dl->offset == (s64) -1 ) +if (dl->al.offset == (s64) -1 )return 0 ; -return scnprintf (buf, size,"%" PRIx64, start + dl->offset); +return scnprintf (buf, size,"%" PRIx64, start + dl->al.offset); }static int perf_gtk__get_line (char *buf,size_t size,struct disasm_line *dl) {int ret =0 ; -char *line =g_markup_escape_text (dl->line,-1 ); +char *line =g_markup_escape_text (dl->al.line,-1 );const char *markup ="<span fgcolor='gray'>" ;strcpy (buf,"" );
@@ -73,7 +73,7 @@ static int perf_gtk__get_line(char *buf, size_t size, struct disasm_line *dl)if (!line)return 0 ; -if (dl->offset != (s64) -1 ) +if (dl->al.offset != (s64) -1 ) markup =NULL ;if (markup)
tools/perf/util/annotate.c +21 -20
113 lines not on this page · raw message
tools/perf/util/annotate.h +3 -3
@@ -60,14 +60,14 @@ struct annotation;struct annotation_line {struct list_head node; +s64 offset; +char *line; +int line_nr; };struct disasm_line {struct annotation_line al; -s64 offset; -char *line;struct ins ins; -int line_nr;float ipc;u64 cycles;struct ins_operands ops;
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Move line/offset into annotation_line struct
perf annotate: Move line/offset into annotation_line struct
Commit-ID: d5490b9647e6e41b203186ed0d73b4103f139fda Gitweb: https://git.kernel.org/tip/d5490b9647e6e41b203186ed0d73b4103f139fda Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:26 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 13 Nov 2017 09:39:57 -0300
perf annotate: Move line/offset into annotation_line struct
Move the line/line_nr/offset menbers to the annotation_line struct to be used as generic members for any annotation source.
--- tools/perf/ui/browsers/annotate.c | 45 ++++++++++++++++++++------------------- tools/perf/ui/gtk/annotate.c | 14 ++++++------ tools/perf/util/annotate.c | 41 ++++++++++++++++++----------------- tools/perf/util/annotate.h | 6 +++--- 4 files changed, 54 insertions(+), 52 deletions(-)
tools/perf/ui/browsers/annotate.c +23 -22
@@ -84,8 +84,9 @@ static bool disasm_line__filter(struct ui_browser *browser __maybe_unused, void *entry) {if (annotate_browser__opts.hide_src_code) { - struct disasm_line *dl = list_entry(entry, struct disasm_line, al.node); -return dl->offset ==-1 ; + struct annotation_line *al = list_entry(entry, struct annotation_line, node); + +return al->offset ==-1 ; }return false;
@@ -141,7 +142,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int percent_max = bdl->samples[i].percent; } -if ((row ==0 ) && (dl->offset ==-1 || percent_max ==0.0 )) { +if ((row ==0 ) && (dl->al.offset ==-1 || percent_max ==0.0 )) {if (ab->have_cycles) {if (dl->ipc ==0.0 && dl->cycles ==0 ) show_title = true;
@@ -149,7 +150,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int show_title = true; } -if (dl->offset !=-1 && percent_max !=0.0 ) { +if (dl->al.offset !=-1 && percent_max !=0.0 ) {for (i =0 ; i < ab->nr_events; i++) { ui_browser__set_percent_color(browser, bdl->samples[i].percent,
@@ -199,19 +200,19 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intif (!browser->navkeypressed) width +=1 ; -if (!*dl->line) +if (!*dl->al.line)ui_browser__write_nstring (browser," " , width - pcnt_width - cycles_width); -else if (dl->offset ==-1 ) { -if (dl->line_nr && annotate_browser__opts.show_linenr) +else if (dl->al.offset ==-1 ) { +if (dl->al.line_nr && annotate_browser__opts.show_linenr) printed =scnprintf (bf,sizeof (bf),"%-*d " , - ab->addr_width +1 , dl->line_nr); + ab->addr_width +1 , dl->al.line_nr);else printed =scnprintf (bf,sizeof (bf),"%*s " , ab->addr_width," " );ui_browser__write_nstring (browser, bf, printed); -ui_browser__write_nstring (browser, dl->line, width - printed - pcnt_width - cycles_width +1 ); +ui_browser__write_nstring (browser, dl->al.line, width - printed - pcnt_width - cycles_width +1 ); }else { -u64 addr = dl->offset; +u64 addr = dl->al.offset;int color =-1 ;if (!annotate_browser__opts.use_offset)
@@ -247,7 +248,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intui_browser__set_color (browser, color);if (dl->ins.ops && dl->ins.ops->scnprintf) {if (ins__is_jump (&dl->ins)) { -bool fwd = dl->ops.target.offset > dl->offset; +bool fwd = dl->ops.target.offset > dl->al.offset;ui_browser__write_graph (browser, fwd ?SLSMG_DARROW_CHAR :SLSMG_UARROW_CHAR );
@@ -452,7 +453,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,double max_percent =0.0 ;int i; -if (pos->offset ==-1 ) { +if (pos->al.offset ==-1 ) {RB_CLEAR_NODE (&bpos->rb_node);continue ; }
@@ -464,8 +465,8 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser, bpos->samples[i].percent =disasm__calc_percent (notes, evsel->idx + i, - pos->offset, - next ? next->offset : len, + pos->al.offset, + next ? next->al.offset : len, &path, &sample); bpos->samples[i].he = sample;
@@ -590,7 +591,7 @@ struct disasm_line *annotate_browser__find_offset(struct annotate_browser *brows *idx =0 ;list_for_each_entry (pos, ¬es->src->source, al.node) { -if (pos->offset == offset) +if (pos->al.offset == offset)return pos;if (!disasm_line__filter (&browser->b, &pos->al.node)) ++*idx;
@@ -636,7 +637,7 @@ struct disasm_line *annotate_browser__find_string(struct annotate_browser *brows ++*idx; -if (pos->line &&strstr (pos->line, s) !=NULL ) +if (pos->al.line &&strstr (pos->al.line, s) !=NULL )return pos; }
@@ -675,7 +676,7 @@ struct disasm_line *annotate_browser__find_string_reverse(struct annotate_browse --*idx; -if (pos->line &&strstr (pos->line, s) !=NULL ) +if (pos->al.line &&strstr (pos->al.line, s) !=NULL )return pos; }
@@ -901,7 +902,7 @@ show_help:case K_RIGHT :if (browser->selection ==NULL )ui_helpline__puts ("Huh? No selection. Report to [email protected]" ); -else if (browser->selection->offset ==-1 ) +else if (browser->selection->al.offset ==-1 )ui_helpline__puts ("Actions are only available for assembly lines." );else if (!browser->selection->ins.ops) goto show_sup_ins;
@@ -1136,13 +1137,13 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,list_for_each_entry (pos, ¬es->src->source, al.node) {struct browser_disasm_line *bpos; -size_t line_len =strlen (pos->line); +size_t line_len =strlen (pos->al.line);if (browser.b.width < line_len) browser.b.width = line_len; bpos =disasm_line__browser (pos); bpos->idx = browser.nr_entries++; -if (pos->offset !=-1 ) { +if (pos->al.offset !=-1 ) { bpos->idx_asm = browser.nr_asm_entries++;/* * FIXME: short term bandaid to cope with assembly
@@ -1151,8 +1152,8 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,* * E.g. copy_user_generic_unrolled */ -if (pos->offset < (s64 )size) - browser.offsets[pos->offset] = pos; +if (pos->al.offset < (s64 )size) + browser.offsets[pos->al.offset] = pos; }else bpos->idx_asm =-1 ; }
tools/perf/ui/gtk/annotate.c +7 -7
@@ -31,14 +31,14 @@ static int perf_gtk__get_percent(char *buf, size_t size, struct symbol *sym,strcpy (buf,"" ); -if (dl->offset == (s64) -1 ) +if (dl->al.offset == (s64) -1 )return 0 ; symhist =annotation__histogram (symbol__annotation (sym), evidx); -if (!symbol_conf.event_group && !symhist->addr[dl->offset].nr_samples) +if (!symbol_conf.event_group && !symhist->addr[dl->al.offset].nr_samples)return 0 ; - percent =100.0 * symhist->addr[dl->offset].nr_samples / symhist->nr_samples; + percent =100.0 * symhist->addr[dl->al.offset].nr_samples / symhist->nr_samples; markup =perf_gtk__get_percent_color (percent);if (markup)
@@ -57,16 +57,16 @@ static int perf_gtk__get_offset(char *buf, size_t size, struct symbol *sym,strcpy (buf,"" ); -if (dl->offset == (s64) -1 ) +if (dl->al.offset == (s64) -1 )return 0 ; -return scnprintf (buf, size,"%" PRIx64, start + dl->offset); +return scnprintf (buf, size,"%" PRIx64, start + dl->al.offset); }static int perf_gtk__get_line (char *buf,size_t size,struct disasm_line *dl) {int ret =0 ; -char *line =g_markup_escape_text (dl->line,-1 ); +char *line =g_markup_escape_text (dl->al.line,-1 );const char *markup ="<span fgcolor='gray'>" ;strcpy (buf,"" );
@@ -74,7 +74,7 @@ static int perf_gtk__get_line(char *buf, size_t size, struct disasm_line *dl)if (!line)return 0 ; -if (dl->offset != (s64) -1 ) +if (dl->al.offset != (s64) -1 ) markup =NULL ;if (markup)
tools/perf/util/annotate.c +21 -20
113 lines not on this page · raw message
tools/perf/util/annotate.h +3 -3
@@ -61,14 +61,14 @@ struct annotation;struct annotation_line {struct list_head node; +s64 offset; +char *line; +int line_nr; };struct disasm_line {struct annotation_line al; -s64 offset; -char *line;struct ins ins; -int line_nr;float ipc;u64 cycles;struct ins_operands ops;
Jiri Olsa
reviewerPATCH 4/35 perf annotate: Move ipc/cycles into annotation_line struct
In reply to Jiri OlsaMoving ipc/cycles into annotation_line struct to be used as generic members for any annotation source.
--- tools/perf/ui/browsers/annotate.c | 16 ++++++++-------- tools/perf/util/annotate.h | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-)
tools/perf/ui/browsers/annotate.c +8 -8
@@ -143,7 +143,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intif ((row ==0 ) && (dl->al.offset ==-1 || percent_max ==0.0 )) {if (ab->have_cycles) { -if (dl->ipc ==0.0 && dl->cycles ==0 ) +if (dl->al.ipc ==0.0 && dl->al.cycles ==0 ) show_title = true; }else show_title = true;
@@ -177,16 +177,16 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int } }if (ab->have_cycles) { -if (dl->ipc) -ui_browser__printf (browser,"%*.2f " ,IPC_WIDTH -1 , dl->ipc); +if (dl->al.ipc) +ui_browser__printf (browser,"%*.2f " ,IPC_WIDTH -1 , dl->al.ipc);else if (!show_title)ui_browser__write_nstring (browser," " ,IPC_WIDTH );else ui_browser__printf (browser,"%*s " ,IPC_WIDTH -1 ,"IPC" ); -if (dl->cycles) +if (dl->al.cycles)ui_browser__printf (browser,"%*" PRIu64" " , -CYCLES_WIDTH -1 , dl->cycles); +CYCLES_WIDTH -1 , dl->al.cycles);else if (!show_title)ui_browser__write_nstring (browser," " ,CYCLES_WIDTH );else
@@ -473,7 +473,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser, max_percent = bpos->samples[i].percent; } -if (max_percent <0.01 && pos->ipc ==0 ) { +if (max_percent <0.01 && pos->al.ipc ==0 ) {RB_CLEAR_NODE (&bpos->rb_node);continue ; }
@@ -993,7 +993,7 @@ static void count_and_fill(struct annotate_browser *browser, u64 start, u64 end,struct disasm_line *dl = browser->offsets[offset];if (dl) - dl->ipc = ipc; + dl->al.ipc = ipc; } } }
@@ -1024,7 +1024,7 @@ static void annotate__compute_ipc(struct annotate_browser *browser, size_t size,count_and_fill (browser, ch->start, offset, ch); dl = browser->offsets[offset];if (dl && ch->num_aggr) - dl->cycles = ch->cycles_aggr / ch->num_aggr; + dl->al.cycles = ch->cycles_aggr / ch->num_aggr; browser->have_cycles = true; } }
tools/perf/util/annotate.h +2 -2
@@ -63,13 +63,13 @@ struct annotation_line {s64 offset;char *line;int line_nr; +float ipc; +u64 cycles; };struct disasm_line {struct annotation_line al;struct ins ins; -float ipc; -u64 cycles;struct ins_operands ops; };
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Move ipc/cycles into annotation_line struct
perf annotate: Move ipc/cycles into annotation_line struct
Commit-ID: 37236d5e0b6a765319dec3e64d828cb44ebecac6 Gitweb: https://git.kernel.org/tip/37236d5e0b6a765319dec3e64d828cb44ebecac6 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:27 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 13 Nov 2017 09:39:58 -0300
perf annotate: Move ipc/cycles into annotation_line struct
Move ipc/cycles into annotation_line struct to be used as generic members for any annotation source.
--- tools/perf/ui/browsers/annotate.c | 16 ++++++++-------- tools/perf/util/annotate.h | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-)
tools/perf/ui/browsers/annotate.c +8 -8
@@ -144,7 +144,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intif ((row ==0 ) && (dl->al.offset ==-1 || percent_max ==0.0 )) {if (ab->have_cycles) { -if (dl->ipc ==0.0 && dl->cycles ==0 ) +if (dl->al.ipc ==0.0 && dl->al.cycles ==0 ) show_title = true; }else show_title = true;
@@ -178,16 +178,16 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int } }if (ab->have_cycles) { -if (dl->ipc) -ui_browser__printf (browser,"%*.2f " ,IPC_WIDTH -1 , dl->ipc); +if (dl->al.ipc) +ui_browser__printf (browser,"%*.2f " ,IPC_WIDTH -1 , dl->al.ipc);else if (!show_title)ui_browser__write_nstring (browser," " ,IPC_WIDTH );else ui_browser__printf (browser,"%*s " ,IPC_WIDTH -1 ,"IPC" ); -if (dl->cycles) +if (dl->al.cycles)ui_browser__printf (browser,"%*" PRIu64" " , -CYCLES_WIDTH -1 , dl->cycles); +CYCLES_WIDTH -1 , dl->al.cycles);else if (!show_title)ui_browser__write_nstring (browser," " ,CYCLES_WIDTH );else
@@ -474,7 +474,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser, max_percent = bpos->samples[i].percent; } -if (max_percent <0.01 && pos->ipc ==0 ) { +if (max_percent <0.01 && pos->al.ipc ==0 ) {RB_CLEAR_NODE (&bpos->rb_node);continue ; }
@@ -994,7 +994,7 @@ static void count_and_fill(struct annotate_browser *browser, u64 start, u64 end,struct disasm_line *dl = browser->offsets[offset];if (dl) - dl->ipc = ipc; + dl->al.ipc = ipc; } } }
@@ -1025,7 +1025,7 @@ static void annotate__compute_ipc(struct annotate_browser *browser, size_t size,count_and_fill (browser, ch->start, offset, ch); dl = browser->offsets[offset];if (dl && ch->num_aggr) - dl->cycles = ch->cycles_aggr / ch->num_aggr; + dl->al.cycles = ch->cycles_aggr / ch->num_aggr; browser->have_cycles = true; } }
tools/perf/util/annotate.h +2 -2
@@ -64,13 +64,13 @@ struct annotation_line {s64 offset;char *line;int line_nr; +float ipc; +u64 cycles; };struct disasm_line {struct annotation_line al;struct ins ins; -float ipc; -u64 cycles;struct ins_operands ops; };
Jiri Olsa
reviewerPATCH 5/35 perf annotate: Add symbol__annotate function
In reply to Jiri OlsaAdding symbol__annotate function to have generic annotation function to be called for any annotation source.
It calls the generic annotation init and then the specific annotation data retrieval function.
--- tools/perf/builtin-top.c | 2 +- tools/perf/ui/browsers/annotate.c | 6 ++-- tools/perf/ui/gtk/annotate.c | 4 +-- tools/perf/util/annotate.c | 58 ++++++++++++++++++++++----------------- tools/perf/util/annotate.h | 6 ++-- 5 files changed, 42 insertions(+), 34 deletions(-)
tools/perf/builtin-top.c +1 -1
@@ -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;
tools/perf/ui/browsers/annotate.c +3 -3
@@ -1119,9 +1119,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));
tools/perf/ui/gtk/annotate.c +2 -2
@@ -168,8 +168,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));
tools/perf/util/annotate.c +33 -25
85 lines not on this page · raw message
tools/perf/util/annotate.h +3 -3
@@ -172,9 +172,9 @@ int hist_entry__inc_addr_samples(struct hist_entry *he, struct perf_sample *sampint 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 ,
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Add symbol__annotate function
perf annotate: Add symbol__annotate function
Commit-ID: c34df25b40c20b478634b954a709749aebdc241a Gitweb: https://git.kernel.org/tip/c34df25b40c20b478634b954a709749aebdc241a Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:28 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 13 Nov 2017 09:39:58 -0300
perf annotate: Add symbol__annotate function
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.
--- tools/perf/builtin-top.c | 2 +- tools/perf/ui/browsers/annotate.c | 6 ++-- tools/perf/ui/gtk/annotate.c | 4 +-- tools/perf/util/annotate.c | 58 ++++++++++++++++++++++----------------- tools/perf/util/annotate.h | 6 ++-- 5 files changed, 42 insertions(+), 34 deletions(-)
tools/perf/builtin-top.c +1 -1
@@ -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;
tools/perf/ui/browsers/annotate.c +3 -3
@@ -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));
tools/perf/ui/gtk/annotate.c +2 -2
@@ -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));
tools/perf/util/annotate.c +33 -25
85 lines not on this page · raw message
tools/perf/util/annotate.h +3 -3
@@ -173,9 +173,9 @@ int hist_entry__inc_addr_samples(struct hist_entry *he, struct perf_sample *sampint 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 ,
Jiri Olsa
reviewerPATCH 6/35 perf annotate: Add struct annotate_args
In reply to Jiri OlsaAdding struct annotate_args to reduce the number of arguments, that need to travel all the way to line allocation. This makes the code easier to read and ease up the changes for following patches.
--- tools/perf/util/annotate.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-)
tools/perf/util/annotate.c +18 -9
@@ -868,12 +868,17 @@ static int disasm_line__parse(char *line, const char **namep, char **rawp)return -1 ; } -static struct disasm_line *disasm_line__new (s64 offset,char *line, -size_t privsize,int line_nr, +struct annotate_args { +size_t privsize; +}; + +static struct disasm_line *disasm_line__new (struct annotate_args *args, +s64 offset,char *line, +int line_nr,struct arch *arch,struct map *map) { -struct disasm_line *dl =zalloc (sizeof (*dl) + privsize); +struct disasm_line *dl =zalloc (sizeof (*dl) + args->privsize);if (dl !=NULL ) { dl->al.offset = offset;
@@ -1207,8 +1212,8 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 st* The ops.raw part will be parsed further according to type of the instruction. */ static int symbol__parse_objdump_line (struct symbol *sym,struct map *map, -struct arch *arch, -FILE *file,size_t privsize, +struct arch *arch,FILE *file, +struct annotate_args *args,int *line_nr) {struct annotation *notes =symbol__annotation (sym);
@@ -1254,7 +1259,7 @@ static int symbol__parse_objdump_line(struct symbol *sym, struct map *map, parsed_line = tmp2 +1 ; } - dl =disasm_line__new (offset, parsed_line, privsize, *line_nr, arch, map); + dl =disasm_line__new (args, offset, parsed_line, *line_nr, arch, map);free (line); (*line_nr)++;
@@ -1416,7 +1421,8 @@ static const char *annotate__norm_arch(const char *arch_name) }static int symbol__disassemble (struct symbol *sym,struct map *map, -size_t privsize,struct arch *arch) +struct annotate_args *args, +struct arch *arch) {struct dso *dso = map->dso;char command[PATH_MAX *2 ];
@@ -1516,7 +1522,7 @@ static int symbol__disassemble(struct symbol *sym, struct map *map,* can associate it with the instructions till the next one. * See disasm_line__new() and struct disasm_line::line_nr. */ -if (symbol__parse_objdump_line (sym, map, arch, file, privsize, +if (symbol__parse_objdump_line (sym, map, arch, file, args, &lineno) <0 )break ; nline++;
@@ -1554,6 +1560,9 @@ int symbol__annotate(struct symbol *sym, struct map *map, const char *arch_name, size_t privsize, struct arch **parch, char *cpuid) { + struct annotate_args args = { + .privsize = privsize, + };struct arch *arch;int err;
@@ -1576,7 +1585,7 @@ int symbol__annotate(struct symbol *sym, struct map *map, } } -return symbol__disassemble (sym, map, privsize, arch); +return symbol__disassemble (sym, map, &args, arch); }static void insert_source_line (struct rb_root *root,struct source_line *src_line)
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Add struct annotate_args
perf annotate: Add struct annotate_args
Commit-ID: ea07c5aaed33d23875cd59da8b0892f76e882ccd Gitweb: https://git.kernel.org/tip/ea07c5aaed33d23875cd59da8b0892f76e882ccd Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:29 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 13 Nov 2017 09:39:58 -0300
perf annotate: Add struct annotate_args
Adding struct annotate_args to reduce the number of arguments, that need to travel all the way to line allocation. This makes the code easier to read and ease up the changes for following patches.
--- tools/perf/util/annotate.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-)
tools/perf/util/annotate.c +18 -9
@@ -878,12 +878,17 @@ out_free_name:return -1 ; } -static struct disasm_line *disasm_line__new (s64 offset,char *line, -size_t privsize,int line_nr, +struct annotate_args { +size_t privsize; +}; + +static struct disasm_line *disasm_line__new (struct annotate_args *args, +s64 offset,char *line, +int line_nr,struct arch *arch,struct map *map) { -struct disasm_line *dl =zalloc (sizeof (*dl) + privsize); +struct disasm_line *dl =zalloc (sizeof (*dl) + args->privsize);if (dl !=NULL ) { dl->al.offset = offset;
@@ -1217,8 +1222,8 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 st* The ops.raw part will be parsed further according to type of the instruction. */ static int symbol__parse_objdump_line (struct symbol *sym,struct map *map, -struct arch *arch, -FILE *file,size_t privsize, +struct arch *arch,FILE *file, +struct annotate_args *args,int *line_nr) {struct annotation *notes =symbol__annotation (sym);
@@ -1264,7 +1269,7 @@ static int symbol__parse_objdump_line(struct symbol *sym, struct map *map, parsed_line = tmp2 +1 ; } - dl =disasm_line__new (offset, parsed_line, privsize, *line_nr, arch, map); + dl =disasm_line__new (args, offset, parsed_line, *line_nr, arch, map);free (line); (*line_nr)++;
@@ -1426,7 +1431,8 @@ static const char *annotate__norm_arch(const char *arch_name) }static int symbol__disassemble (struct symbol *sym,struct map *map, -size_t privsize,struct arch *arch) +struct annotate_args *args, +struct arch *arch) {struct dso *dso = map->dso;char command[PATH_MAX *2 ];
@@ -1526,7 +1532,7 @@ static int symbol__disassemble(struct symbol *sym, struct map *map,* can associate it with the instructions till the next one. * See disasm_line__new() and struct disasm_line::line_nr. */ -if (symbol__parse_objdump_line (sym, map, arch, file, privsize, +if (symbol__parse_objdump_line (sym, map, arch, file, args, &lineno) <0 )break ; nline++;
@@ -1564,6 +1570,9 @@ int symbol__annotate(struct symbol *sym, struct map *map, const char *arch_name, size_t privsize, struct arch **parch, char *cpuid) { + struct annotate_args args = { + .privsize = privsize, + };struct arch *arch;int err;
@@ -1586,7 +1595,7 @@ int symbol__annotate(struct symbol *sym, struct map *map, } } -return symbol__disassemble (sym, map, privsize, arch); +return symbol__disassemble (sym, map, &args, arch); }static void insert_source_line (struct rb_root *root,struct source_line *src_line)
Jiri Olsa
reviewerPATCH 7/35 perf annotate: Add arch into struct annotate_args
In reply to Jiri OlsaAdding arch into struct annotate_args to reduce the number of arguments that need to travel all the way to line allocation.
--- tools/perf/util/annotate.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-)
tools/perf/util/annotate.c +8 -9
@@ -870,12 +870,12 @@ static int disasm_line__parse(char *line, const char **namep, char **rawp)struct annotate_args {size_t privsize; +struct arch *arch; };static struct disasm_line *disasm_line__new (struct annotate_args *args,s64 offset,char *line,int line_nr, -struct arch *arch,struct map *map) {struct disasm_line *dl =zalloc (sizeof (*dl) + args->privsize);
@@ -892,7 +892,7 @@ static struct disasm_line *disasm_line__new(struct annotate_args *args,if (disasm_line__parse (dl->al.line, &dl->ins.name, &dl->ops.raw) <0 ) goto out_free_line; -disasm_line__init_ins (dl, arch, map); +disasm_line__init_ins (dl, args->arch, map); } }
@@ -1212,7 +1212,7 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 st* The ops.raw part will be parsed further according to type of the instruction. */ static int symbol__parse_objdump_line (struct symbol *sym,struct map *map, -struct arch *arch,FILE *file, +FILE *file,struct annotate_args *args,int *line_nr) {
@@ -1259,7 +1259,7 @@ static int symbol__parse_objdump_line(struct symbol *sym, struct map *map, parsed_line = tmp2 +1 ; } - dl =disasm_line__new (args, offset, parsed_line, *line_nr, arch, map); + dl =disasm_line__new (args, offset, parsed_line, *line_nr, map);free (line); (*line_nr)++;
@@ -1421,8 +1421,7 @@ static const char *annotate__norm_arch(const char *arch_name) }static int symbol__disassemble (struct symbol *sym,struct map *map, -struct annotate_args *args, -struct arch *arch) +struct annotate_args *args) {struct dso *dso = map->dso;char command[PATH_MAX *2 ];
@@ -1522,7 +1521,7 @@ static int symbol__disassemble(struct symbol *sym, struct map *map,* can associate it with the instructions till the next one. * See disasm_line__new() and struct disasm_line::line_nr. */ -if (symbol__parse_objdump_line (sym, map, arch, file, args, +if (symbol__parse_objdump_line (sym, map, file, args, &lineno) <0 )break ; nline++;
@@ -1570,7 +1569,7 @@ int symbol__annotate(struct symbol *sym, struct map *map,if (!arch_name)return -1 ; - arch =arch__find (arch_name); + args.arch = arch =arch__find (arch_name);if (arch ==NULL )return -ENOTSUP ;
@@ -1585,7 +1584,7 @@ int symbol__annotate(struct symbol *sym, struct map *map, } } -return symbol__disassemble (sym, map, &args, arch); +return symbol__disassemble (sym, map, &args); }static void insert_source_line (struct rb_root *root,struct source_line *src_line)
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Add arch into struct annotate_args
perf annotate: Add arch into struct annotate_args
Commit-ID: 24fe7b88934b702442597662643222cd0a6a44a6 Gitweb: https://git.kernel.org/tip/24fe7b88934b702442597662643222cd0a6a44a6 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:30 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 13 Nov 2017 09:39:58 -0300
perf annotate: Add arch into struct annotate_args
Add arch into struct annotate_args to reduce the number of arguments that need to travel all the way to line allocation.
--- tools/perf/util/annotate.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-)
tools/perf/util/annotate.c +8 -9
@@ -880,12 +880,12 @@ out_free_name:struct annotate_args {size_t privsize; +struct arch *arch; };static struct disasm_line *disasm_line__new (struct annotate_args *args,s64 offset,char *line,int line_nr, -struct arch *arch,struct map *map) {struct disasm_line *dl =zalloc (sizeof (*dl) + args->privsize);
@@ -902,7 +902,7 @@ static struct disasm_line *disasm_line__new(struct annotate_args *args,if (disasm_line__parse (dl->al.line, &dl->ins.name, &dl->ops.raw) <0 ) goto out_free_line; -disasm_line__init_ins (dl, arch, map); +disasm_line__init_ins (dl, args->arch, map); } }
@@ -1222,7 +1222,7 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 st* The ops.raw part will be parsed further according to type of the instruction. */ static int symbol__parse_objdump_line (struct symbol *sym,struct map *map, -struct arch *arch,FILE *file, +FILE *file,struct annotate_args *args,int *line_nr) {
@@ -1269,7 +1269,7 @@ static int symbol__parse_objdump_line(struct symbol *sym, struct map *map, parsed_line = tmp2 +1 ; } - dl =disasm_line__new (args, offset, parsed_line, *line_nr, arch, map); + dl =disasm_line__new (args, offset, parsed_line, *line_nr, map);free (line); (*line_nr)++;
@@ -1431,8 +1431,7 @@ static const char *annotate__norm_arch(const char *arch_name) }static int symbol__disassemble (struct symbol *sym,struct map *map, -struct annotate_args *args, -struct arch *arch) +struct annotate_args *args) {struct dso *dso = map->dso;char command[PATH_MAX *2 ];
@@ -1532,7 +1531,7 @@ static int symbol__disassemble(struct symbol *sym, struct map *map,* can associate it with the instructions till the next one. * See disasm_line__new() and struct disasm_line::line_nr. */ -if (symbol__parse_objdump_line (sym, map, arch, file, args, +if (symbol__parse_objdump_line (sym, map, file, args, &lineno) <0 )break ; nline++;
@@ -1580,7 +1579,7 @@ int symbol__annotate(struct symbol *sym, struct map *map,if (!arch_name)return -1 ; - arch =arch__find (arch_name); + args.arch = arch =arch__find (arch_name);if (arch ==NULL )return -ENOTSUP ;
@@ -1595,7 +1594,7 @@ int symbol__annotate(struct symbol *sym, struct map *map, } } -return symbol__disassemble (sym, map, &args, arch); +return symbol__disassemble (sym, map, &args); }static void insert_source_line (struct rb_root *root,struct source_line *src_line)
Jiri Olsa
reviewerPATCH 8/35 perf annotate: Add map into struct annotate_args
In reply to Jiri OlsaAdding map into struct annotate_args to reduce the number of arguments that need to travel all the way to line allocation.
--- tools/perf/util/annotate.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)
tools/perf/util/annotate.c +11 -11
@@ -871,12 +871,12 @@ static int disasm_line__parse(char *line, const char **namep, char **rawp)struct annotate_args {size_t privsize;struct arch *arch; +struct map *map; };static struct disasm_line *disasm_line__new (struct annotate_args *args,s64 offset,char *line, -int line_nr, -struct map *map) +int line_nr) {struct disasm_line *dl =zalloc (sizeof (*dl) + args->privsize);
@@ -892,7 +892,7 @@ static struct disasm_line *disasm_line__new(struct annotate_args *args,if (disasm_line__parse (dl->al.line, &dl->ins.name, &dl->ops.raw) <0 ) goto out_free_line; -disasm_line__init_ins (dl, args->arch, map); +disasm_line__init_ins (dl, args->arch, args->map); } }
@@ -1211,11 +1211,11 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 st* means that it's not a disassembly line so should be treated differently. * The ops.raw part will be parsed further according to type of the instruction. */ -static int symbol__parse_objdump_line (struct symbol *sym,struct map *map, -FILE *file, +static int symbol__parse_objdump_line (struct symbol *sym,FILE *file,struct annotate_args *args,int *line_nr) { +struct map *map = args->map;struct annotation *notes =symbol__annotation (sym);struct disasm_line *dl;char *line =NULL , *parsed_line, *tmp, *tmp2;
@@ -1259,7 +1259,7 @@ static int symbol__parse_objdump_line(struct symbol *sym, struct map *map, parsed_line = tmp2 +1 ; } - dl =disasm_line__new (args, offset, parsed_line, *line_nr, map); + dl =disasm_line__new (args, offset, parsed_line, *line_nr);free (line); (*line_nr)++;
@@ -1420,9 +1420,9 @@ static const char *annotate__norm_arch(const char *arch_name)return normalize_arch ((char *)arch_name); } -static int symbol__disassemble (struct symbol *sym,struct map *map, -struct annotate_args *args) +static int symbol__disassemble (struct symbol *sym,struct annotate_args *args) { +struct map *map = args->map;struct dso *dso = map->dso;char command[PATH_MAX *2 ];FILE *file;
@@ -1521,8 +1521,7 @@ static int symbol__disassemble(struct symbol *sym, struct map *map,* can associate it with the instructions till the next one. * See disasm_line__new() and struct disasm_line::line_nr. */ -if (symbol__parse_objdump_line (sym, map, file, args, - &lineno) <0 ) +if (symbol__parse_objdump_line (sym, file, args, &lineno) <0 )break ; nline++; }
@@ -1561,6 +1560,7 @@ int symbol__annotate(struct symbol *sym, struct map *map, {struct annotate_args args = { .privsize = privsize, + .map = map, };struct arch *arch;int err;
@@ -1584,7 +1584,7 @@ int symbol__annotate(struct symbol *sym, struct map *map, } } -return symbol__disassemble (sym, map, &args); +return symbol__disassemble (sym, &args); }static void insert_source_line (struct rb_root *root,struct source_line *src_line)
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Add map into struct annotate_args
perf annotate: Add map into struct annotate_args
Commit-ID: 1a04db70dcbf621f9919e95456c372281779c053 Gitweb: https://git.kernel.org/tip/1a04db70dcbf621f9919e95456c372281779c053 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:31 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 13 Nov 2017 09:39:58 -0300
perf annotate: Add map into struct annotate_args
Add map into struct annotate_args to reduce the number of arguments that need to travel all the way to line allocation.
--- tools/perf/util/annotate.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)
tools/perf/util/annotate.c +11 -11
@@ -881,12 +881,12 @@ out_free_name:struct annotate_args {size_t privsize;struct arch *arch; +struct map *map; };static struct disasm_line *disasm_line__new (struct annotate_args *args,s64 offset,char *line, -int line_nr, -struct map *map) +int line_nr) {struct disasm_line *dl =zalloc (sizeof (*dl) + args->privsize);
@@ -902,7 +902,7 @@ static struct disasm_line *disasm_line__new(struct annotate_args *args,if (disasm_line__parse (dl->al.line, &dl->ins.name, &dl->ops.raw) <0 ) goto out_free_line; -disasm_line__init_ins (dl, args->arch, map); +disasm_line__init_ins (dl, args->arch, args->map); } }
@@ -1221,11 +1221,11 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 st* means that it's not a disassembly line so should be treated differently. * The ops.raw part will be parsed further according to type of the instruction. */ -static int symbol__parse_objdump_line (struct symbol *sym,struct map *map, -FILE *file, +static int symbol__parse_objdump_line (struct symbol *sym,FILE *file,struct annotate_args *args,int *line_nr) { +struct map *map = args->map;struct annotation *notes =symbol__annotation (sym);struct disasm_line *dl;char *line =NULL , *parsed_line, *tmp, *tmp2;
@@ -1269,7 +1269,7 @@ static int symbol__parse_objdump_line(struct symbol *sym, struct map *map, parsed_line = tmp2 +1 ; } - dl =disasm_line__new (args, offset, parsed_line, *line_nr, map); + dl =disasm_line__new (args, offset, parsed_line, *line_nr);free (line); (*line_nr)++;
@@ -1430,9 +1430,9 @@ static const char *annotate__norm_arch(const char *arch_name)return normalize_arch ((char *)arch_name); } -static int symbol__disassemble (struct symbol *sym,struct map *map, -struct annotate_args *args) +static int symbol__disassemble (struct symbol *sym,struct annotate_args *args) { +struct map *map = args->map;struct dso *dso = map->dso;char command[PATH_MAX *2 ];FILE *file;
@@ -1531,8 +1531,7 @@ static int symbol__disassemble(struct symbol *sym, struct map *map,* can associate it with the instructions till the next one. * See disasm_line__new() and struct disasm_line::line_nr. */ -if (symbol__parse_objdump_line (sym, map, file, args, - &lineno) <0 ) +if (symbol__parse_objdump_line (sym, file, args, &lineno) <0 )break ; nline++; }
@@ -1571,6 +1570,7 @@ int symbol__annotate(struct symbol *sym, struct map *map, {struct annotate_args args = { .privsize = privsize, + .map = map, };struct arch *arch;int err;
@@ -1594,7 +1594,7 @@ int symbol__annotate(struct symbol *sym, struct map *map, } } -return symbol__disassemble (sym, map, &args); +return symbol__disassemble (sym, &args); }static void insert_source_line (struct rb_root *root,struct source_line *src_line)
Jiri Olsa
reviewerPATCH 9/35 perf annotate: Add offset/line/line_nr into struct annotate_args
In reply to Jiri OlsaAdding offset/line/line_nr into struct annotate_args to reduce the number of arguments that need to travel all the way to line allocation.
--- tools/perf/util/annotate.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-)
tools/perf/util/annotate.c +13 -8
@@ -872,23 +872,24 @@ struct annotate_args {size_t privsize;struct arch *arch;struct map *map; +s64 offset; +char *line; +int line_nr; }; -static struct disasm_line *disasm_line__new (struct annotate_args *args, -s64 offset,char *line, -int line_nr) +static struct disasm_line *disasm_line__new (struct annotate_args *args) {struct disasm_line *dl =zalloc (sizeof (*dl) + args->privsize);if (dl !=NULL ) { - dl->al.offset = offset; - dl->al.line =strdup (line); - dl->al.line_nr = line_nr; + dl->al.offset = args->offset; + dl->al.line =strdup (args->line); + dl->al.line_nr = args->line_nr;if (dl->al.line ==NULL ) goto out_delete; -if (offset !=-1 ) { +if (args->offset !=-1 ) {if (disasm_line__parse (dl->al.line, &dl->ins.name, &dl->ops.raw) <0 ) goto out_free_line;
@@ -1259,7 +1260,11 @@ static int symbol__parse_objdump_line(struct symbol *sym, FILE *file, parsed_line = tmp2 +1 ; } - dl =disasm_line__new (args, offset, parsed_line, *line_nr); + args->offset = offset; + args->line = parsed_line; + args->line_nr = *line_nr; + + dl =disasm_line__new (args);free (line); (*line_nr)++;
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Add offset/line/line_nr into struct annotate_args
perf annotate: Add offset/line/line_nr into struct annotate_args
Commit-ID: 4748834f96903f843719b02190f98e36b2c55192 Gitweb: https://git.kernel.org/tip/4748834f96903f843719b02190f98e36b2c55192 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:32 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 13 Nov 2017 09:39:58 -0300
perf annotate: Add offset/line/line_nr into struct annotate_args
Add offset/line/line_nr into struct annotate_args to reduce the number of arguments that need to travel all the way to line allocation.
--- tools/perf/util/annotate.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-)
tools/perf/util/annotate.c +13 -8
@@ -882,23 +882,24 @@ struct annotate_args {size_t privsize;struct arch *arch;struct map *map; +s64 offset; +char *line; +int line_nr; }; -static struct disasm_line *disasm_line__new (struct annotate_args *args, -s64 offset,char *line, -int line_nr) +static struct disasm_line *disasm_line__new (struct annotate_args *args) {struct disasm_line *dl =zalloc (sizeof (*dl) + args->privsize);if (dl !=NULL ) { - dl->al.offset = offset; - dl->al.line =strdup (line); - dl->al.line_nr = line_nr; + dl->al.offset = args->offset; + dl->al.line =strdup (args->line); + dl->al.line_nr = args->line_nr;if (dl->al.line ==NULL ) goto out_delete; -if (offset !=-1 ) { +if (args->offset !=-1 ) {if (disasm_line__parse (dl->al.line, &dl->ins.name, &dl->ops.raw) <0 ) goto out_free_line;
@@ -1269,7 +1270,11 @@ static int symbol__parse_objdump_line(struct symbol *sym, FILE *file, parsed_line = tmp2 +1 ; } - dl =disasm_line__new (args, offset, parsed_line, *line_nr); + args->offset = offset; + args->line = parsed_line; + args->line_nr = *line_nr; + + dl =disasm_line__new (args);free (line); (*line_nr)++;
Jiri Olsa
reviewerPATCH 10/35 perf annotate: Add evsel into struct annotation_line_args
In reply to Jiri OlsaAdding evsel into struct annotate_args to reduce the number of arguments that need to travel all the way to line allocation.
This change also allow us to move the arch name initialization under symbol__annotate function.
--- tools/perf/ui/browsers/annotate.c | 2 +- tools/perf/ui/gtk/annotate.c | 3 +-- tools/perf/util/annotate.c | 11 ++++++++--- tools/perf/util/annotate.h | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-)
tools/perf/ui/browsers/annotate.c +1 -1
@@ -1119,7 +1119,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, (nr_pcnt -1 ); } - err =symbol__annotate (sym, map,perf_evsel__env_arch (evsel), + err =symbol__annotate (sym, map, evsel, sizeof_bdl, &browser.arch,perf_evsel__env_cpuid (evsel));if (err) {
tools/perf/ui/gtk/annotate.c +1 -2
@@ -168,8 +168,7 @@ static int symbol__gtk_annotate(struct symbol *sym, struct map *map,if (map->dso->annotate_warned)return -1 ; - err =symbol__annotate (sym, map,perf_evsel__env_arch (evsel), -0 ,NULL ,NULL ); + err =symbol__annotate (sym, map, evsel,0 ,NULL ,NULL );if (err) {char msg[BUFSIZ ];symbol__strerror_disassemble (sym, map, err, msg,sizeof (msg));
tools/perf/util/annotate.c +8 -3
@@ -872,6 +872,7 @@ struct annotate_args {size_t privsize;struct arch *arch;struct map *map; +struct perf_evsel *evsel;s64 offset;char *line;int line_nr;
@@ -1560,16 +1561,21 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args) }int symbol__annotate (struct symbol *sym,struct map *map, -const char *arch_name,size_t privsize, +struct perf_evsel *evsel,size_t privsize,struct arch **parch,char *cpuid) {struct annotate_args args = { .privsize = privsize, .map = map, + .evsel = evsel, }; +const char *arch_name =NULL ;struct arch *arch;int err; +if (evsel) + arch_name =perf_evsel__env_arch (evsel); + arch_name =annotate__norm_arch (arch_name);if (!arch_name)return -1 ;
@@ -1965,8 +1971,7 @@ int symbol__tty_annotate(struct symbol *sym, struct map *map,struct rb_root source_line =RB_ROOT ;u64 len; -if (symbol__annotate (sym, map,perf_evsel__env_arch (evsel), -0 ,NULL ,NULL ) <0 ) +if (symbol__annotate (sym, map, evsel,0 ,NULL ,NULL ) <0 )return -1 ; len =symbol__size (sym);
tools/perf/util/annotate.h +1 -1
@@ -173,7 +173,7 @@ int symbol__alloc_hist(struct symbol *sym);void symbol__annotate_zero_histograms (struct symbol *sym);int symbol__annotate (struct symbol *sym,struct map *map, -const char *arch_name,size_t privsize, +struct perf_evsel *evsel,size_t privsize,struct arch **parch,char *cpuid);enum symbol_disassemble_errno {
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Add evsel into struct annotation_line_args
perf annotate: Add evsel into struct annotation_line_args
Commit-ID: d03a686ea6e77b25edacc3eed386cef870e8d248 Gitweb: https://git.kernel.org/tip/d03a686ea6e77b25edacc3eed386cef870e8d248 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:33 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 13 Nov 2017 09:39:59 -0300
perf annotate: Add evsel into struct annotation_line_args
Add evsel into struct annotate_args to reduce the number of arguments that need to travel all the way to line allocation.
This change also allow us to move the arch name initialization under symbol__annotate function.
--- tools/perf/ui/browsers/annotate.c | 2 +- tools/perf/ui/gtk/annotate.c | 3 +-- tools/perf/util/annotate.c | 11 ++++++++--- tools/perf/util/annotate.h | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-)
tools/perf/ui/browsers/annotate.c +1 -1
@@ -1120,7 +1120,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, (nr_pcnt -1 ); } - err =symbol__annotate (sym, map,perf_evsel__env_arch (evsel), + err =symbol__annotate (sym, map, evsel, sizeof_bdl, &browser.arch,perf_evsel__env_cpuid (evsel));if (err) {
tools/perf/ui/gtk/annotate.c +1 -2
@@ -169,8 +169,7 @@ static int symbol__gtk_annotate(struct symbol *sym, struct map *map,if (map->dso->annotate_warned)return -1 ; - err =symbol__annotate (sym, map,perf_evsel__env_arch (evsel), -0 ,NULL ,NULL ); + err =symbol__annotate (sym, map, evsel,0 ,NULL ,NULL );if (err) {char msg[BUFSIZ ];symbol__strerror_disassemble (sym, map, err, msg,sizeof (msg));
tools/perf/util/annotate.c +8 -3
@@ -882,6 +882,7 @@ struct annotate_args {size_t privsize;struct arch *arch;struct map *map; +struct perf_evsel *evsel;s64 offset;char *line;int line_nr;
@@ -1570,16 +1571,21 @@ out_close_stdout: }int symbol__annotate (struct symbol *sym,struct map *map, -const char *arch_name,size_t privsize, +struct perf_evsel *evsel,size_t privsize,struct arch **parch,char *cpuid) {struct annotate_args args = { .privsize = privsize, .map = map, + .evsel = evsel, }; +const char *arch_name =NULL ;struct arch *arch;int err; +if (evsel) + arch_name =perf_evsel__env_arch (evsel); + arch_name =annotate__norm_arch (arch_name);if (!arch_name)return -1 ;
@@ -1975,8 +1981,7 @@ int symbol__tty_annotate(struct symbol *sym, struct map *map,struct rb_root source_line =RB_ROOT ;u64 len; -if (symbol__annotate (sym, map,perf_evsel__env_arch (evsel), -0 ,NULL ,NULL ) <0 ) +if (symbol__annotate (sym, map, evsel,0 ,NULL ,NULL ) <0 )return -1 ; len =symbol__size (sym);
tools/perf/util/annotate.h +1 -1
@@ -174,7 +174,7 @@ int symbol__alloc_hist(struct symbol *sym);void symbol__annotate_zero_histograms (struct symbol *sym);int symbol__annotate (struct symbol *sym,struct map *map, -const char *arch_name,size_t privsize, +struct perf_evsel *evsel,size_t privsize,struct arch **parch,char *cpuid);enum symbol_disassemble_errno {
Jiri Olsa
reviewerPATCH 11/35 perf annotate: Add annotation_line__next function
In reply to Jiri OlsaMoving disasm__get_next_ip_line into annotation_line__next to make it work over generic struct annotation_line.
--- tools/perf/ui/browsers/annotate.c | 7 ++++--- tools/perf/util/annotate.c | 13 +++++++------ tools/perf/util/annotate.h | 3 ++- 3 files changed, 13 insertions(+), 10 deletions(-)
tools/perf/ui/browsers/annotate.c +4 -3
@@ -439,7 +439,8 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,struct map_symbol *ms = browser->b.priv;struct symbol *sym = ms->sym;struct annotation *notes =symbol__annotation (sym); -struct disasm_line *pos, *next; +struct annotation_line *next; +struct disasm_line *pos;s64 len =symbol__size (sym); browser->entries =RB_ROOT ;
@@ -457,7 +458,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,continue ; } - next =disasm__get_next_ip_line (¬es->src->source, pos); + next =annotation_line__next (&pos->al, ¬es->src->source);for (i =0 ; i < browser->nr_events; i++) {struct sym_hist_entry sample;
@@ -465,7 +466,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser, bpos->samples[i].percent =disasm__calc_percent (notes, evsel->idx + i, pos->al.offset, - next ? next->al.offset : len, + next ? next->offset : len, &path, &sample); bpos->samples[i].he = sample;
tools/perf/util/annotate.c +7 -6
@@ -932,10 +932,11 @@ static void disasm__add(struct list_head *head, struct disasm_line *line)list_add_tail (&line->al.node, head); } -struct disasm_line *disasm__get_next_ip_line (struct list_head *head,struct disasm_line *pos) +struct annotation_line * +annotation_line__next (struct annotation_line *pos,struct list_head *head) { -list_for_each_entry_continue (pos, head, al.node) -if (pos->al.offset >=0 ) +list_for_each_entry_continue (pos, head, node) +if (pos->offset >=0 )return pos;return NULL ;
@@ -1086,10 +1087,10 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 ststruct annotation *notes =symbol__annotation (sym);s64 offset = dl->al.offset;const u64 addr = start + offset; -struct disasm_line *next; +struct annotation_line *next;struct block_range *br; - next =disasm__get_next_ip_line (¬es->src->source, dl); + next =annotation_line__next (&dl->al, ¬es->src->source);if (perf_evsel__is_group_event (evsel)) { nr_percent = evsel->nr_members;
@@ -1104,7 +1105,7 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 st percent =disasm__calc_percent (notes, notes->src->lines ? i : evsel->idx + i, offset, - next ? next->al.offset : (s64 ) len, + next ? next->offset : (s64 ) len, &path, &sample); ppercents[i] = percent;
tools/perf/util/annotate.h +2 -1
@@ -84,7 +84,8 @@ struct sym_hist_entry { };void disasm_line__free (struct disasm_line *dl); -struct disasm_line *disasm__get_next_ip_line (struct list_head *head,struct disasm_line *pos); +struct annotation_line * +annotation_line__next (struct annotation_line *pos,struct list_head *head);int disasm_line__scnprintf (struct disasm_line *dl,char *bf,size_t size,bool raw);size_t disasm__fprintf (struct list_head *head,FILE *fp); double disasm__calc_percent(struct annotation *notes, int evidx, s64 offset,
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Add annotation_line__next function
perf annotate: Add annotation_line__next function
Commit-ID: c4c724364d398a9746410d5ff482e8c4c7228249 Gitweb: https://git.kernel.org/tip/c4c724364d398a9746410d5ff482e8c4c7228249 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:34 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 13 Nov 2017 09:39:59 -0300
perf annotate: Add annotation_line__next function
Rename disasm__get_next_ip_line() to annotation_line__next() to make it work over a generic struct annotation_line.
--- tools/perf/ui/browsers/annotate.c | 7 ++++--- tools/perf/util/annotate.c | 13 +++++++------ tools/perf/util/annotate.h | 3 ++- 3 files changed, 13 insertions(+), 10 deletions(-)
tools/perf/ui/browsers/annotate.c +4 -3
@@ -440,7 +440,8 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,struct map_symbol *ms = browser->b.priv;struct symbol *sym = ms->sym;struct annotation *notes =symbol__annotation (sym); -struct disasm_line *pos, *next; +struct annotation_line *next; +struct disasm_line *pos;s64 len =symbol__size (sym); browser->entries =RB_ROOT ;
@@ -458,7 +459,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,continue ; } - next =disasm__get_next_ip_line (¬es->src->source, pos); + next =annotation_line__next (&pos->al, ¬es->src->source);for (i =0 ; i < browser->nr_events; i++) {struct sym_hist_entry sample;
@@ -466,7 +467,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser, bpos->samples[i].percent =disasm__calc_percent (notes, evsel->idx + i, pos->al.offset, - next ? next->al.offset : len, + next ? next->offset : len, &path, &sample); bpos->samples[i].he = sample;
tools/perf/util/annotate.c +7 -6
@@ -942,10 +942,11 @@ static void disasm__add(struct list_head *head, struct disasm_line *line)list_add_tail (&line->al.node, head); } -struct disasm_line *disasm__get_next_ip_line (struct list_head *head,struct disasm_line *pos) +struct annotation_line * +annotation_line__next (struct annotation_line *pos,struct list_head *head) { -list_for_each_entry_continue (pos, head, al.node) -if (pos->al.offset >=0 ) +list_for_each_entry_continue (pos, head, node) +if (pos->offset >=0 )return pos;return NULL ;
@@ -1096,10 +1097,10 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 ststruct annotation *notes =symbol__annotation (sym);s64 offset = dl->al.offset;const u64 addr = start + offset; -struct disasm_line *next; +struct annotation_line *next;struct block_range *br; - next =disasm__get_next_ip_line (¬es->src->source, dl); + next =annotation_line__next (&dl->al, ¬es->src->source);if (perf_evsel__is_group_event (evsel)) { nr_percent = evsel->nr_members;
@@ -1114,7 +1115,7 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 st percent =disasm__calc_percent (notes, notes->src->lines ? i : evsel->idx + i, offset, - next ? next->al.offset : (s64 ) len, + next ? next->offset : (s64 ) len, &path, &sample); ppercents[i] = percent;
tools/perf/util/annotate.h +2 -1
@@ -85,7 +85,8 @@ struct sym_hist_entry { };void disasm_line__free (struct disasm_line *dl); -struct disasm_line *disasm__get_next_ip_line (struct list_head *head,struct disasm_line *pos); +struct annotation_line * +annotation_line__next (struct annotation_line *pos,struct list_head *head);int disasm_line__scnprintf (struct disasm_line *dl,char *bf,size_t size,bool raw);size_t disasm__fprintf (struct list_head *head,FILE *fp); double disasm__calc_percent(struct annotation *notes, int evidx, s64 offset,
Jiri Olsa
reviewerPATCH 12/35 perf annotate: Add annotation_line__add function
In reply to Jiri OlsaMoving disasm__add into annotation_line__add to
make it work over generic struct annotation_line.
--- tools/perf/util/annotate.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
tools/perf/util/annotate.c +3 -3
@@ -927,9 +927,9 @@ int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool rreturn ins__scnprintf (&dl->ins, bf, size, &dl->ops); } -static void disasm__add (struct list_head *head,struct disasm_line *line) +static void annotation_line__add (struct annotation_line *al,struct list_head *head) { -list_add_tail (&line->al.node, head); +list_add_tail (&al->node, head); } struct annotation_line*
@@ -1291,7 +1291,7 @@ static int symbol__parse_objdump_line(struct symbol *sym, FILE *file, dl->ops.target.name =strdup (target.sym->name); } -disasm__add (¬es->src->source, dl); +annotation_line__add (&dl->al, ¬es->src->source);return 0 ; }
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Add annotation_line__add function
perf annotate: Add annotation_line__add function
Commit-ID: 82b9d7ff096b7e7ae3efaeb341ee673bb494bb61 Gitweb: https://git.kernel.org/tip/82b9d7ff096b7e7ae3efaeb341ee673bb494bb61 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:35 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 13 Nov 2017 09:39:59 -0300
perf annotate: Add annotation_line__add function
Rename disasm__add() into annotation_line__add() to make it work over a generic struct annotation_line.
--- tools/perf/util/annotate.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
tools/perf/util/annotate.c +3 -3
@@ -937,9 +937,9 @@ int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool rreturn ins__scnprintf (&dl->ins, bf, size, &dl->ops); } -static void disasm__add (struct list_head *head,struct disasm_line *line) +static void annotation_line__add (struct annotation_line *al,struct list_head *head) { -list_add_tail (&line->al.node, head); +list_add_tail (&al->node, head); } struct annotation_line *
@@ -1301,7 +1301,7 @@ static int symbol__parse_objdump_line(struct symbol *sym, FILE *file, dl->ops.target.name =strdup (target.sym->name); } -disasm__add (¬es->src->source, dl); +annotation_line__add (&dl->al, ¬es->src->source);return 0 ; }
Jiri Olsa
reviewerPATCH 13/35 perf annotate: Move rb_node into struct annotation_line
In reply to Jiri OlsaMoving rb_node into struct annotation_line to make struct annotation_line the rb tree node for sorted lines used in both stdio and tui code.
This way we can unite the sorted lines lines codes for both TUI and stdio in following patches.
--- tools/perf/ui/browsers/annotate.c | 30 ++++++++++++++++-------------- tools/perf/util/annotate.h | 1 + 2 files changed, 17 insertions(+), 14 deletions(-)
tools/perf/ui/browsers/annotate.c +16 -14
@@ -25,7 +25,6 @@ struct disasm_line_samples {#define CYCLES_WIDTH 6struct browser_disasm_line { -struct rb_node rb_node;u32 idx;int idx_asm;int jump_sources;
@@ -361,9 +360,11 @@ static unsigned int annotate_browser__refresh(struct ui_browser *browser)return ret; } -static int disasm__cmp (struct browser_disasm_line *a, -struct browser_disasm_line *b,int nr_pcnt) +static int disasm__cmp (struct disasm_line *da, +struct disasm_line *db,int nr_pcnt) { +struct browser_disasm_line *a =disasm_line__browser (da); +struct browser_disasm_line *b =disasm_line__browser (db);int i;for (i =0 ; i < nr_pcnt; i++) {
@@ -374,24 +375,24 @@ static int disasm__cmp(struct browser_disasm_line *a,return 0 ; } -static void disasm_rb_tree__insert (struct rb_root *root,struct browser_disasm_line *bdl, +static void disasm_rb_tree__insert (struct rb_root *root,struct disasm_line *dl,int nr_events) {struct rb_node **p = &root->rb_node;struct rb_node *parent =NULL ; -struct browser_disasm_line *l; +struct disasm_line *l;while (*p !=NULL ) { parent = *p; - l = rb_entry(parent, struct browser_disasm_line, rb_node); + l = rb_entry(parent, struct disasm_line, al.rb_node); -if (disasm__cmp (bdl, l, nr_events)) +if (disasm__cmp (dl, l, nr_events)) p = &(*p)->rb_left;else p = &(*p)->rb_right; } -rb_link_node (&bdl->rb_node, parent, p); -rb_insert_color (&bdl->rb_node, root); +rb_link_node (&dl->al.rb_node, parent, p); +rb_insert_color (&dl->al.rb_node, root); } static void annotate_browser__set_top(struct annotate_browser *browser,
@@ -424,8 +425,9 @@ static void annotate_browser__set_rb_top(struct annotate_browser *browser,struct disasm_line *pos;u32 idx; - bpos = rb_entry(nd, struct browser_disasm_line, rb_node); - pos = ((struct disasm_line *)bpos) -1 ; + pos = rb_entry(nd, struct disasm_line, al.rb_node); + bpos =disasm_line__browser (pos); + idx = bpos->idx;if (annotate_browser__opts.hide_src_code) idx = bpos->idx_asm;
@@ -454,7 +456,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,int i;if (pos->al.offset ==-1 ) { -RB_CLEAR_NODE (&bpos->rb_node); +RB_CLEAR_NODE (&pos->al.rb_node);continue ; }
@@ -475,10 +477,10 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser, }if (max_percent <0.01 && pos->al.ipc ==0 ) { -RB_CLEAR_NODE (&bpos->rb_node); +RB_CLEAR_NODE (&pos->al.rb_node);continue ; } -disasm_rb_tree__insert (&browser->entries, bpos, +disasm_rb_tree__insert (&browser->entries, pos, browser->nr_events); }pthread_mutex_unlock (¬es->lock);
tools/perf/util/annotate.h +1 -0
@@ -60,6 +60,7 @@ struct annotation;struct annotation_line {struct list_head node; +struct rb_node rb_node;s64 offset;char *line;int line_nr;
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Move rb_node to struct annotation_line
perf annotate: Move rb_node to struct annotation_line
Commit-ID: 5b12adc849be011fd6d99a16e39d83afee43c0a0 Gitweb: https://git.kernel.org/tip/5b12adc849be011fd6d99a16e39d83afee43c0a0 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:36 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 13 Nov 2017 09:39:59 -0300
perf annotate: Move rb_node to struct annotation_line
Move rb_node to struct annotation_line to make struct annotation_line the rb tree node for sorted lines used in both stdio and TUI code.
This way we can unite the sorted lines lines codes for both TUI and stdio in the following patches.
--- tools/perf/ui/browsers/annotate.c | 30 ++++++++++++++++-------------- tools/perf/util/annotate.h | 1 + 2 files changed, 17 insertions(+), 14 deletions(-)
tools/perf/ui/browsers/annotate.c +16 -14
@@ -26,7 +26,6 @@ struct disasm_line_samples {#define CYCLES_WIDTH 6struct browser_disasm_line { -struct rb_node rb_node;u32 idx;int idx_asm;int jump_sources;
@@ -362,9 +361,11 @@ static unsigned int annotate_browser__refresh(struct ui_browser *browser)return ret; } -static int disasm__cmp (struct browser_disasm_line *a, -struct browser_disasm_line *b,int nr_pcnt) +static int disasm__cmp (struct disasm_line *da, +struct disasm_line *db,int nr_pcnt) { +struct browser_disasm_line *a =disasm_line__browser (da); +struct browser_disasm_line *b =disasm_line__browser (db);int i;for (i =0 ; i < nr_pcnt; i++) {
@@ -375,24 +376,24 @@ static int disasm__cmp(struct browser_disasm_line *a,return 0 ; } -static void disasm_rb_tree__insert (struct rb_root *root,struct browser_disasm_line *bdl, +static void disasm_rb_tree__insert (struct rb_root *root,struct disasm_line *dl,int nr_events) {struct rb_node **p = &root->rb_node;struct rb_node *parent =NULL ; -struct browser_disasm_line *l; +struct disasm_line *l;while (*p !=NULL ) { parent = *p; - l = rb_entry(parent, struct browser_disasm_line, rb_node); + l = rb_entry(parent, struct disasm_line, al.rb_node); -if (disasm__cmp (bdl, l, nr_events)) +if (disasm__cmp (dl, l, nr_events)) p = &(*p)->rb_left;else p = &(*p)->rb_right; } -rb_link_node (&bdl->rb_node, parent, p); -rb_insert_color (&bdl->rb_node, root); +rb_link_node (&dl->al.rb_node, parent, p); +rb_insert_color (&dl->al.rb_node, root); } static void annotate_browser__set_top(struct annotate_browser *browser,
@@ -425,8 +426,9 @@ static void annotate_browser__set_rb_top(struct annotate_browser *browser,struct disasm_line *pos;u32 idx; - bpos = rb_entry(nd, struct browser_disasm_line, rb_node); - pos = ((struct disasm_line *)bpos) -1 ; + pos = rb_entry(nd, struct disasm_line, al.rb_node); + bpos =disasm_line__browser (pos); + idx = bpos->idx;if (annotate_browser__opts.hide_src_code) idx = bpos->idx_asm;
@@ -455,7 +457,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,int i;if (pos->al.offset ==-1 ) { -RB_CLEAR_NODE (&bpos->rb_node); +RB_CLEAR_NODE (&pos->al.rb_node);continue ; }
@@ -476,10 +478,10 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser, }if (max_percent <0.01 && pos->al.ipc ==0 ) { -RB_CLEAR_NODE (&bpos->rb_node); +RB_CLEAR_NODE (&pos->al.rb_node);continue ; } -disasm_rb_tree__insert (&browser->entries, bpos, +disasm_rb_tree__insert (&browser->entries, pos, browser->nr_events); }pthread_mutex_unlock (¬es->lock);
tools/perf/util/annotate.h +1 -0
@@ -61,6 +61,7 @@ struct annotation;struct annotation_line {struct list_head node; +struct rb_node rb_node;s64 offset;char *line;int line_nr;
Jiri Olsa
reviewerPATCH 14/35 perf annotate: Add annotation_line__(new|free) functions
In reply to Jiri OlsaChanging the way the annotation lines are allocated and adding annotation_line__(new|free) functions to deal with this.
Before the allocation schema was as follows:
-----------------------------------------------------------
struct disasm_line | struct annotation_line | private space
-----------------------------------------------------------
Where the private space is used in TUI code to store computed annotation data for events. The stdio code computes the data on the fly.
The goal is to compute and store annotation line's data directly in the struct annotation_line itself, so this patch changes the line allocation schema as follows:
------------------------------------------------------------
privsize space | struct disasm_line | struct annotation_line
------------------------------------------------------------
Moving struct annotation_line to the end, because in following changes we will move here the non-fixed length event's data.
--- tools/perf/ui/browsers/annotate.c | 4 ++- tools/perf/util/annotate.c | 63 ++++++++++++++++++++++++++++++++++----- tools/perf/util/annotate.h | 10 ++++++- 3 files changed, 68 insertions(+), 9 deletions(-)
tools/perf/ui/browsers/annotate.c +3 -1
@@ -75,7 +75,9 @@ struct annotate_browser {static inline struct browser_disasm_line *disasm_line__browser (struct disasm_line *dl) { -return (struct browser_disasm_line *)(dl +1 ); +struct annotation_line *al = &dl->al; + +return (void *) al - al->privsize; } static bool disasm_line__filter(struct ui_browser *browser __maybe_unused,
tools/perf/util/annotate.c +56 -7
84 lines not on this page · raw message
tools/perf/util/annotate.h +9 -1
@@ -66,14 +66,22 @@ struct annotation_line {int line_nr;float ipc;u64 cycles; +size_t privsize; };struct disasm_line { -struct annotation_line al;struct ins ins;struct ins_operands ops; + +/* This needs to be at the end. */ +struct annotation_line al; }; +static inline struct disasm_line *disasm_line (struct annotation_line *al) +{ + return al ? container_of(al, struct disasm_line, al) : NULL; +} +static inline bool disasm_line__has_offset (const struct disasm_line *dl) {return dl->ops.target.offset_avail;
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Add annotation_line__(new|delete) functions
perf annotate: Add annotation_line__(new|delete) functions
Commit-ID: c835e1914c4bcfdd41f43d270cafc6d8119d7782 Gitweb: https://git.kernel.org/tip/c835e1914c4bcfdd41f43d270cafc6d8119d7782 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:37 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 13 Nov 2017 09:39:59 -0300
perf annotate: Add annotation_line__(new|delete) functions
Changing the way the annotation lines are allocated and adding annotation_line__(new|delete) functions to deal with this.
Before the allocation schema was as follows:
-----------------------------------------------------------
struct disasm_line | struct annotation_line | private space
-----------------------------------------------------------
Where the private space is used in TUI code to store computed annotation data for events. The stdio code computes the data on the fly.
The goal is to compute and store annotation line's data directly in the struct annotation_line itself, so this patch changes the line allocation schema as follows:
------------------------------------------------------------
privsize space | struct disasm_line | struct annotation_line
------------------------------------------------------------
Moving struct annotation_line to the end, because in following changes we will move here the non-fixed length event's data.
--- tools/perf/ui/browsers/annotate.c | 4 ++- tools/perf/util/annotate.c | 63 ++++++++++++++++++++++++++++++++++----- tools/perf/util/annotate.h | 10 ++++++- 3 files changed, 68 insertions(+), 9 deletions(-)
tools/perf/ui/browsers/annotate.c +3 -1
@@ -76,7 +76,9 @@ struct annotate_browser {static inline struct browser_disasm_line *disasm_line__browser (struct disasm_line *dl) { -return (struct browser_disasm_line *)(dl +1 ); +struct annotation_line *al = &dl->al; + +return (void *) al - al->privsize; } static bool disasm_line__filter(struct ui_browser *browser __maybe_unused,
tools/perf/util/annotate.c +56 -7
84 lines not on this page · raw message
tools/perf/util/annotate.h +9 -1
@@ -67,14 +67,22 @@ struct annotation_line {int line_nr;float ipc;u64 cycles; +size_t privsize; };struct disasm_line { -struct annotation_line al;struct ins ins;struct ins_operands ops; + +/* This needs to be at the end. */ +struct annotation_line al; }; +static inline struct disasm_line *disasm_line (struct annotation_line *al) +{ + return al ? container_of(al, struct disasm_line, al) : NULL; +} +static inline bool disasm_line__has_offset (const struct disasm_line *dl) {return dl->ops.target.offset_avail;
Jiri Olsa
reviewerPATCH 15/35 perf annotate: Add annotated_source__purge function
In reply to Jiri OlsaMoving disasm__purge into annotated_source__purge to make it work over generic struct annotation_line.
--- tools/perf/ui/browsers/annotate.c | 8 +++----- tools/perf/util/annotate.c | 12 ++++++------ tools/perf/util/annotate.h | 2 +- 3 files changed, 10 insertions(+), 12 deletions(-)
tools/perf/ui/browsers/annotate.c +3 -5
@@ -1083,7 +1083,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,struct perf_evsel *evsel, struct hist_browser_timer *hbt) { - struct disasm_line *pos, *n; + struct disasm_line *pos;struct annotation *notes;size_t size; struct map_symbol ms = {
@@ -1179,10 +1179,8 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,annotate_browser__update_addr_width (&browser); ret =annotate_browser__run (&browser, evsel, hbt); -list_for_each_entry_safe (pos, n, ¬es->src->source, al.node) { -list_del (&pos->al.node); -disasm_line__free (pos); - } + +annotated_source__purge (notes->src); out_free_offsets:free (browser.offsets);
tools/perf/util/annotate.c +6 -6
@@ -1975,13 +1975,13 @@ void symbol__annotate_decay_histogram(struct symbol *sym, int evidx) } } -void disasm__purge (struct list_head *head) +void annotated_source__purge (struct annotated_source *as) { -struct disasm_line *pos, *n; +struct annotation_line *al, *n; -list_for_each_entry_safe (pos, n, head, al.node) { -list_del (&pos->al.node); -disasm_line__free (pos); +list_for_each_entry_safe (al, n, &as->source, node) { +list_del (&al->node); +disasm_line__free (disasm_line (al)); } }
@@ -2037,7 +2037,7 @@ int symbol__tty_annotate(struct symbol *sym, struct map *map,if (print_lines)symbol__free_source_line (sym, len); -disasm__purge (&symbol__annotation (sym)->src->source); +annotated_source__purge (symbol__annotation (sym)->src);return 0 ; }
tools/perf/util/annotate.h +1 -1
@@ -211,7 +211,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map, int min_pcnt, int max_lines, int context);void symbol__annotate_zero_histogram (struct symbol *sym,int evidx);void symbol__annotate_decay_histogram (struct symbol *sym,int evidx); -void disasm__purge (struct list_head *head); +void annotated_source__purge (struct annotated_source *as);bool ui__has_annotation (void );
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Add annotated_source__purge function
perf annotate: Add annotated_source__purge function
Commit-ID: f8eb37bd7c33babc01d9c2e3074ce001eec6cfbb Gitweb: https://git.kernel.org/tip/f8eb37bd7c33babc01d9c2e3074ce001eec6cfbb Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:38 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 13 Nov 2017 09:40:00 -0300
perf annotate: Add annotated_source__purge function
Mov disasm__purge() to annotated_source__purge() to make it work over a generic struct annotation_line.
--- tools/perf/ui/browsers/annotate.c | 8 +++----- tools/perf/util/annotate.c | 12 ++++++------ tools/perf/util/annotate.h | 2 +- 3 files changed, 10 insertions(+), 12 deletions(-)
tools/perf/ui/browsers/annotate.c +3 -5
@@ -1084,7 +1084,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,struct perf_evsel *evsel, struct hist_browser_timer *hbt) { - struct disasm_line *pos, *n; + struct disasm_line *pos;struct annotation *notes;size_t size; struct map_symbol ms = {
@@ -1180,10 +1180,8 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,annotate_browser__update_addr_width (&browser); ret =annotate_browser__run (&browser, evsel, hbt); -list_for_each_entry_safe (pos, n, ¬es->src->source, al.node) { -list_del (&pos->al.node); -disasm_line__free (pos); - } + +annotated_source__purge (notes->src); out_free_offsets:free (browser.offsets);
tools/perf/util/annotate.c +6 -6
@@ -1985,13 +1985,13 @@ void symbol__annotate_decay_histogram(struct symbol *sym, int evidx) } } -void disasm__purge (struct list_head *head) +void annotated_source__purge (struct annotated_source *as) { -struct disasm_line *pos, *n; +struct annotation_line *al, *n; -list_for_each_entry_safe (pos, n, head, al.node) { -list_del (&pos->al.node); -disasm_line__free (pos); +list_for_each_entry_safe (al, n, &as->source, node) { +list_del (&al->node); +disasm_line__free (disasm_line (al)); } }
@@ -2047,7 +2047,7 @@ int symbol__tty_annotate(struct symbol *sym, struct map *map,if (print_lines)symbol__free_source_line (sym, len); -disasm__purge (&symbol__annotation (sym)->src->source); +annotated_source__purge (symbol__annotation (sym)->src);return 0 ; }
tools/perf/util/annotate.h +1 -1
@@ -212,7 +212,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map, int min_pcnt, int max_lines, int context);void symbol__annotate_zero_histogram (struct symbol *sym,int evidx);void symbol__annotate_decay_histogram (struct symbol *sym,int evidx); -void disasm__purge (struct list_head *head); +void annotated_source__purge (struct annotated_source *as);bool ui__has_annotation (void );
Jiri Olsa
reviewerPATCH 16/35 perf annotate: Add samples into struct annotation_line
In reply to Jiri OlsaAdding samples array into struct annotation_line to hold the annotation data. The data are populated in the following patches.
--- tools/perf/util/annotate.c | 8 ++++++++ tools/perf/util/annotate.h | 17 ++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-)
tools/perf/util/annotate.c +8 -0
@@ -901,7 +901,14 @@ static struct annotation_line* annotation_line__new(struct annotate_args *args, size_t privsize) {struct annotation_line *al; +struct perf_evsel *evsel = args->evsel;size_t size = privsize +sizeof (*al); +int nr =1 ; + +if (perf_evsel__is_group_event (evsel)) + nr = evsel->nr_members; + + size +=sizeof (al->samples[0 ]) * nr; al =zalloc (size);if (al) {
@@ -910,6 +917,7 @@ annotation_line__new(struct annotate_args *args, size_t privsize) al->offset = args->offset; al->line =strdup (args->line); al->line_nr = args->line_nr; + al->samples_nr = nr; }return al;
tools/perf/util/annotate.h +12 -5
@@ -58,6 +58,16 @@ bool ins__is_fused(struct arch *arch, const char *ins1, const char *ins2);struct annotation ; +struct sym_hist_entry { +u64 nr_samples; +u64 period; +}; + +struct annotation_data { +double percent; +struct sym_hist_entry he; +}; +struct annotation_line {struct list_head node;struct rb_node rb_node;
@@ -67,6 +77,8 @@ struct annotation_line {float ipc;u64 cycles;size_t privsize; +int samples_nr; +struct annotation_data samples[0 ]; };struct disasm_line {
@@ -87,11 +99,6 @@ static inline bool disasm_line__has_offset(const struct disasm_line *dl)return dl->ops.target.offset_avail; } -struct sym_hist_entry { -u64 nr_samples; -u64 period; -}; -void disasm_line__free (struct disasm_line *dl);struct annotation_line *annotation_line__next (struct annotation_line *pos,struct list_head *head);
Signature · 1 line
2.13.6
Re: [PATCH 16/35] perf annotate: Add samples into struct annotation_line
Hi Jiri,
This patch seems to be causing segfault with "perf top --stdio".
Steps to reproduce:
1. start "perf top --stdio" in one terminal
2. run some simple workload in another terminal, let it get finished.
3. annotate function from previous workload in perf top (press 'a' followed by 's')
Perf will crash with:
perf: Segmentation fault
Obtained 8 stack frames. ./perf(sighandler_dump_stack+0x3e) [0x4f1b6e] /lib64/libc.so.6(+0x36a7f) [0x7ff3aa7e4a7f] ./perf() [0x4a27fd] ./perf(symbol__annotate+0x199) [0x4a4439] ./perf() [0x44e32d]
./perf() [0x44f098] /lib64/libpthread.so.0(+0x736c) [0x7ff3acee836c] /lib64/libc.so.6(clone+0x3e) [0x7ff3aa8bee1e]
Can you please check.
Thanks,
Ravi
Quoted 80 lines · Jiri Olsa
Adding samples array into struct
annotation_lineto hold the annotation data. The data are populated in the following patches.Signed-off-by Jiri Olsa <[email protected]>--- tools/perf/util/annotate.c | 8 ++++++++ tools/perf/util/annotate.h | 17 ++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-)tools/perf/util/annotate.c +8
-0@@ -901,7 +901,14 @@ static struct annotation_line* annotation_line__new(struct annotate_args *args, size_t privsize) {struct annotation_line *al; +struct perf_evsel *evsel = args->evsel;size_t size = privsize +sizeof (*al); +int nr =1 ; + +if (perf_evsel__is_group_event (evsel)) + nr = evsel->nr_members; + + size +=sizeof (al->samples[0 ]) * nr; al =zalloc (size);if (al) {@@ -910,6 +917,7 @@ annotation_line__new(struct annotate_args *args, size_t privsize) al->offset = args->offset; al->line =strdup (args->line); al->line_nr = args->line_nr; + al->samples_nr = nr; }return al;tools/perf/util/annotate.h +12
-5@@ -58,6 +58,16 @@ bool ins__is_fused(struct arch *arch, const char *ins1, const char *ins2);struct annotation ; +struct sym_hist_entry { +u64 nr_samples; +u64 period; +}; + +struct annotation_data { +double percent; +struct sym_hist_entry he; +}; +struct annotation_line {struct list_head node;struct rb_node rb_node;@@ -67,6 +77,8 @@ struct annotation_line {float ipc;u64 cycles;size_t privsize; +int samples_nr; +struct annotation_data samples[0 ]; };struct disasm_line {@@ -87,11 +99,6 @@ static inline bool disasm_line__has_offset(const struct disasm_line *dl)return dl->ops.target.offset_avail; } -struct sym_hist_entry { -u64 nr_samples; -u64 period; -}; -void disasm_line__free (struct disasm_line *dl);struct annotation_line *annotation_line__next (struct annotation_line *pos,struct list_head *head);
Re: [PATCH 16/35] perf annotate: Add samples into struct annotation_line
Quoted 23 lines · Ravi Bangoria
Hi Jiri,
This patch seems to be causing segfault with "perf top --stdio".
Steps to reproduce:
1. start "perf top --stdio" in one terminal
2. run some simple workload in another terminal, let it get finished.
3. annotate function from previous workload in perf top (press 'a' followed by 's')Perf will crash with:
perf: Segmentation fault
Obtained 8 stack frames. ./perf(sighandler_dump_stack+0x3e) [0x4f1b6e] /lib64/libc.so.6(+0x36a7f) [0x7ff3aa7e4a7f] ./perf() [0x4a27fd] ./perf(symbol__annotate+0x199) [0x4a4439] ./perf() [0x44e32d]
./perf() [0x44f098] /lib64/libpthread.so.0(+0x736c) [0x7ff3acee836c] /lib64/libc.so.6(clone+0x3e) [0x7ff3aa8bee1e]
Quoted 1 line
Can you please check.
hum, I'm getting following crash after resizing the terminal window:
perf: Floating point exception
Obtained 8 stack frames. ./perf(dump_stack+0x2e) [0x510c89] ./perf(sighandler_dump_stack+0x2e) [0x510d69] /lib64/libc.so.6(+0x36a80) [0x7f9419588a80] ./perf(perf_top__header_snprintf+0x208) [0x4f42c1] ./perf() [0x453c09]
./perf() [0x454ddb] /lib64/libpthread.so.0(+0x736d) [0x7f941bc8c36d] /lib64/libc.so.6(clone+0x3f) [0x7f9419662e1f] Floating point exception (core dumped)
working on fix
jirka
Re: [PATCH 16/35] perf annotate: Add samples into struct annotation_line
Quoted 40 lines · Jiri Olsa
Quoted 23 lines · Ravi Bangoria
Hi Jiri,
This patch seems to be causing segfault with "perf top --stdio".
Steps to reproduce:
1. start "perf top --stdio" in one terminal
2. run some simple workload in another terminal, let it get finished.
3. annotate function from previous workload in perf top (press 'a' followed by 's')Perf will crash with:
perf: Segmentation fault
Obtained 8 stack frames. ./perf(sighandler_dump_stack+0x3e) [0x4f1b6e] /lib64/libc.so.6(+0x36a7f) [0x7ff3aa7e4a7f] ./perf() [0x4a27fd] ./perf(symbol__annotate+0x199) [0x4a4439] ./perf() [0x44e32d]
./perf() [0x44f098] /lib64/libpthread.so.0(+0x736c) [0x7ff3acee836c] /lib64/libc.so.6(clone+0x3e) [0x7ff3aa8bee1e]Quoted 1 line
Can you please check.
hum, I'm getting following crash after resizing the terminal window:
perf: Floating point exception
Obtained 8 stack frames. ./perf(dump_stack+0x2e) [0x510c89] ./perf(sighandler_dump_stack+0x2e) [0x510d69] /lib64/libc.so.6(+0x36a80) [0x7f9419588a80] ./perf(perf_top__header_snprintf+0x208) [0x4f42c1] ./perf() [0x453c09]
./perf() [0x454ddb] /lib64/libpthread.so.0(+0x736d) [0x7f941bc8c36d] /lib64/libc.so.6(clone+0x3f) [0x7f9419662e1f] Floating point exception (core dumped)
Quoted 1 line
working on fix
so my crash is caused by bogus resize code, I have it working with fix for memory corruption happening in SIGWINCH signal handler (attached) could you please check if that fixes the code for you?
I'll check if that does not break the TUI
jirka
--- tools/perf/builtin-top.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-)
tools/perf/builtin-top.c +13 -6
@@ -77,6 +77,7 @@#include "sane_ctype.h" static volatile int done; +static volatile int resize;#define HEADER_LINE_NR 5
@@ -86,10 +87,13 @@ static void perf_top__update_print_entries(struct perf_top *top) }static void perf_top__sig_winch (int sig__maybe_unused , -siginfo_t *info__maybe_unused ,void *arg) +siginfo_t *info__maybe_unused ,void *arg__maybe_unused ) { -struct perf_top *top = arg; + resize =1 ; +} +static void perf_top__resize (struct perf_top *top) +{get_term_dimensions (&top->winsize);perf_top__update_print_entries (top); }
@@ -475,9 +479,8 @@ static bool perf_top__handle_keypress(struct perf_top *top, int c)if (top->print_entries ==0 ) {struct sigaction act = { .sa_sigaction = perf_top__sig_winch, - .sa_flags =SA_SIGINFO , }; -perf_top__sig_winch (SIGWINCH ,NULL , top); +perf_top__resize (top);sigaction (SIGWINCH , &act,NULL ); }else {signal (SIGWINCH ,SIG_DFL );
@@ -1030,6 +1033,11 @@ static int __cmd_top(struct perf_top *top)if (hits == top->samples) ret =perf_evlist__poll (top->evlist,100 ); + +if (resize) { +perf_top__resize (top); + resize =0 ; + } } ret =0 ;
@@ -1354,9 +1362,8 @@ int cmd_top(int argc, const char **argv)if (top.print_entries ==0 ) {struct sigaction act = { .sa_sigaction = perf_top__sig_winch, - .sa_flags =SA_SIGINFO , }; -perf_top__update_print_entries (&top); +perf_top__resize (&top);sigaction (SIGWINCH , &act,NULL ); }
Signature · 1 line
2.9.5
Re: [PATCH 16/35] perf annotate: Add samples into struct annotation_line
Hi Jiri,
Quoted 40 lines · Jiri Olsa
Quoted 39 lines · Jiri Olsa
Quoted 23 lines · Ravi Bangoria
Hi Jiri,
This patch seems to be causing segfault with "perf top --stdio".
Steps to reproduce:
1. start "perf top --stdio" in one terminal
2. run some simple workload in another terminal, let it get finished.
3. annotate function from previous workload in perf top (press 'a' followed by 's')Perf will crash with:
perf: Segmentation fault
Obtained 8 stack frames. ./perf(sighandler_dump_stack+0x3e) [0x4f1b6e] /lib64/libc.so.6(+0x36a7f) [0x7ff3aa7e4a7f] ./perf() [0x4a27fd] ./perf(symbol__annotate+0x199) [0x4a4439] ./perf() [0x44e32d]
./perf() [0x44f098] /lib64/libpthread.so.0(+0x736c) [0x7ff3acee836c] /lib64/libc.so.6(clone+0x3e) [0x7ff3aa8bee1e]Quoted 1 line
Can you please check.
hum, I'm getting following crash after resizing the terminal window:
perf: Floating point exception
Obtained 8 stack frames. ./perf(dump_stack+0x2e) [0x510c89] ./perf(sighandler_dump_stack+0x2e) [0x510d69] /lib64/libc.so.6(+0x36a80) [0x7f9419588a80] ./perf(perf_top__header_snprintf+0x208) [0x4f42c1] ./perf() [0x453c09]
./perf() [0x454ddb] /lib64/libpthread.so.0(+0x736d) [0x7f941bc8c36d] /lib64/libc.so.6(clone+0x3f) [0x7f9419662e1f] Floating point exception (core dumped)
Quoted 4 lines
Quoted 1 line
working on fix
so my crash is caused by bogus resize code, I have it working with fix for memory corruption happening in SIGWINCH signal handler (attached) could you please check if that fixes the code for you?
Yes, this fixes the crash caused by resize.
But original crash I reported is still there. Issue seems to be with evsel being NULL and we are trying to de-reference it somewhere inside annotation_line__new().
Will try to spend more time on it.
-Ravi
Re: [PATCH 16/35] perf annotate: Add samples into struct annotation_line
Quoted 48 lines · Ravi Bangoria
Hi Jiri,
Quoted 40 lines · Jiri Olsa
Quoted 39 lines · Jiri Olsa
Quoted 23 lines · Ravi Bangoria
Hi Jiri,
This patch seems to be causing segfault with "perf top --stdio".
Steps to reproduce:
1. start "perf top --stdio" in one terminal
2. run some simple workload in another terminal, let it get finished.
3. annotate function from previous workload in perf top (press 'a' followed by 's')Perf will crash with:
perf: Segmentation fault
Obtained 8 stack frames. ./perf(sighandler_dump_stack+0x3e) [0x4f1b6e] /lib64/libc.so.6(+0x36a7f) [0x7ff3aa7e4a7f] ./perf() [0x4a27fd] ./perf(symbol__annotate+0x199) [0x4a4439] ./perf() [0x44e32d]
./perf() [0x44f098] /lib64/libpthread.so.0(+0x736c) [0x7ff3acee836c] /lib64/libc.so.6(clone+0x3e) [0x7ff3aa8bee1e]Quoted 1 line
Can you please check.
hum, I'm getting following crash after resizing the terminal window:
perf: Floating point exception
Obtained 8 stack frames. ./perf(dump_stack+0x2e) [0x510c89] ./perf(sighandler_dump_stack+0x2e) [0x510d69] /lib64/libc.so.6(+0x36a80) [0x7f9419588a80] ./perf(perf_top__header_snprintf+0x208) [0x4f42c1] ./perf() [0x453c09]
./perf() [0x454ddb] /lib64/libpthread.so.0(+0x736d) [0x7f941bc8c36d] /lib64/libc.so.6(clone+0x3f) [0x7f9419662e1f] Floating point exception (core dumped)Quoted 4 lines
Quoted 1 line
working on fix
so my crash is caused by bogus resize code, I have it working with fix for memory corruption happening in SIGWINCH signal handler (attached) could you please check if that fixes the code for you?
Quoted 7 lines
Yes, this fixes the crash caused by resize.
But original crash I reported is still there. Issue seems to be with evsel being NULL and we are trying to de-reference it somewhere inside
annotation_line__new().Will try to spend more time on it.
right, I can see it now.. we are passing NULL as evsel in the top but does not check on that.. attached patch prevents the crash for me, but I'll need to double check if that's correct fix
jirka
---
tools/perf/util/annotate.c +1 -1
@@ -916,7 +916,7 @@ annotation_line__new(struct annotate_args *args, size_t privsize)size_t size = privsize +sizeof (*al);int nr =1 ; -if (perf_evsel__is_group_event (evsel)) +if (evsel &&perf_evsel__is_group_event (evsel)) nr = evsel->nr_members; size +=sizeof (al->samples[0 ]) * nr;
Re: [PATCH 16/35] perf annotate: Add samples into struct annotation_line
Quoted 55 lines · Jiri Olsa
Quoted 54 lines · Ravi Bangoria
Hi Jiri,
Quoted 40 lines · Jiri Olsa
Quoted 39 lines · Jiri Olsa
Quoted 23 lines · Ravi Bangoria
Hi Jiri,
This patch seems to be causing segfault with "perf top --stdio".
Steps to reproduce:
1. start "perf top --stdio" in one terminal
2. run some simple workload in another terminal, let it get finished.
3. annotate function from previous workload in perf top (press 'a' followed by 's')Perf will crash with:
perf: Segmentation fault
Obtained 8 stack frames. ./perf(sighandler_dump_stack+0x3e) [0x4f1b6e] /lib64/libc.so.6(+0x36a7f) [0x7ff3aa7e4a7f] ./perf() [0x4a27fd] ./perf(symbol__annotate+0x199) [0x4a4439] ./perf() [0x44e32d]
./perf() [0x44f098] /lib64/libpthread.so.0(+0x736c) [0x7ff3acee836c] /lib64/libc.so.6(clone+0x3e) [0x7ff3aa8bee1e]Quoted 1 line
Can you please check.
hum, I'm getting following crash after resizing the terminal window:
perf: Floating point exception
Obtained 8 stack frames. ./perf(dump_stack+0x2e) [0x510c89] ./perf(sighandler_dump_stack+0x2e) [0x510d69] /lib64/libc.so.6(+0x36a80) [0x7f9419588a80] ./perf(perf_top__header_snprintf+0x208) [0x4f42c1] ./perf() [0x453c09]
./perf() [0x454ddb] /lib64/libpthread.so.0(+0x736d) [0x7f941bc8c36d] /lib64/libc.so.6(clone+0x3f) [0x7f9419662e1f] Floating point exception (core dumped)Quoted 4 lines
Quoted 1 line
working on fix
so my crash is caused by bogus resize code, I have it working with fix for memory corruption happening in SIGWINCH signal handler (attached) could you please check if that fixes the code for you?
Yes, this fixes the crash caused by resize.
But original crash I reported is still there. Issue seems to be with evsel being NULL and we are trying to de-reference it somewhere inside
annotation_line__new().
Quoted 6 lines
Quoted 1 line
Will try to spend more time on it.
right, I can see it now.. we are passing NULL as evsel in the top but does not check on that.. attached patch prevents the crash for me, but I'll need to double check if that's correct fix
I ended up with few other annotation fixes, could you please check following branch if it's working for you?
https://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
perf/fixes
thanks,
jirka
Re: [PATCH 16/35] perf annotate: Add samples into struct annotation_line
Hi Jiri,
Quoted 60 lines · Jiri Olsa
Quoted 54 lines · Jiri Olsa
Quoted 53 lines · Ravi Bangoria
Hi Jiri,
Quoted 40 lines · Jiri Olsa
Quoted 39 lines · Jiri Olsa
Quoted 23 lines · Ravi Bangoria
Hi Jiri,
This patch seems to be causing segfault with "perf top --stdio".
Steps to reproduce:
1. start "perf top --stdio" in one terminal
2. run some simple workload in another terminal, let it get finished.
3. annotate function from previous workload in perf top (press 'a' followed by 's')Perf will crash with:
perf: Segmentation fault
Obtained 8 stack frames. ./perf(sighandler_dump_stack+0x3e) [0x4f1b6e] /lib64/libc.so.6(+0x36a7f) [0x7ff3aa7e4a7f] ./perf() [0x4a27fd] ./perf(symbol__annotate+0x199) [0x4a4439] ./perf() [0x44e32d]
./perf() [0x44f098] /lib64/libpthread.so.0(+0x736c) [0x7ff3acee836c] /lib64/libc.so.6(clone+0x3e) [0x7ff3aa8bee1e]Quoted 1 line
Can you please check.
hum, I'm getting following crash after resizing the terminal window:
perf: Floating point exception
Obtained 8 stack frames. ./perf(dump_stack+0x2e) [0x510c89] ./perf(sighandler_dump_stack+0x2e) [0x510d69] /lib64/libc.so.6(+0x36a80) [0x7f9419588a80] ./perf(perf_top__header_snprintf+0x208) [0x4f42c1] ./perf() [0x453c09]
./perf() [0x454ddb] /lib64/libpthread.so.0(+0x736d) [0x7f941bc8c36d] /lib64/libc.so.6(clone+0x3f) [0x7f9419662e1f] Floating point exception (core dumped)Quoted 4 lines
Quoted 1 line
working on fix
so my crash is caused by bogus resize code, I have it working with fix for memory corruption happening in SIGWINCH signal handler (attached) could you please check if that fixes the code for you?
Yes, this fixes the crash caused by resize.
But original crash I reported is still there. Issue seems to be with evsel being NULL and we are trying to de-reference it somewhere inside
annotation_line__new().Quoted 5 lines
Quoted 1 line
Will try to spend more time on it.
right, I can see it now.. we are passing NULL as evsel in the top but does not check on that.. attached patch prevents the crash for me, but I'll need to double check if that's correct fix
Quoted 5 lines
I ended up with few other annotation fixes, could you please check following branch if it's working for you?
https://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
perf/fixes
Changes looks good to me.
Thanks,
Ravi
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Add samples into struct annotation_line
In reply to Jiri Olsaperf annotate: Add samples into struct annotation_line
Commit-ID: 7e304557ead5b309d59807b2f05ed47f2c0076c6 Gitweb: https://git.kernel.org/tip/7e304557ead5b309d59807b2f05ed47f2c0076c6 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:39 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 13 Nov 2017 09:40:00 -0300
perf annotate: Add samples into struct annotation_line
Add samples array into struct annotation_line to hold the annotation data. The data is populated in the following patches.
--- tools/perf/util/annotate.c | 8 ++++++++ tools/perf/util/annotate.h | 17 ++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-)
tools/perf/util/annotate.c +8 -0
@@ -911,7 +911,14 @@ static struct annotation_line * annotation_line__new(struct annotate_args *args, size_t privsize) {struct annotation_line *al; +struct perf_evsel *evsel = args->evsel;size_t size = privsize +sizeof (*al); +int nr =1 ; + +if (perf_evsel__is_group_event (evsel)) + nr = evsel->nr_members; + + size +=sizeof (al->samples[0 ]) * nr; al =zalloc (size);if (al) {
@@ -920,6 +927,7 @@ annotation_line__new(struct annotate_args *args, size_t privsize) al->offset = args->offset; al->line =strdup (args->line); al->line_nr = args->line_nr; + al->samples_nr = nr; }return al;
tools/perf/util/annotate.h +12 -5
@@ -59,6 +59,16 @@ bool ins__is_fused(struct arch *arch, const char *ins1, const char *ins2);struct annotation ; +struct sym_hist_entry { +u64 nr_samples; +u64 period; +}; + +struct annotation_data { +double percent; +struct sym_hist_entry he; +}; +struct annotation_line {struct list_head node;struct rb_node rb_node;
@@ -68,6 +78,8 @@ struct annotation_line {float ipc;u64 cycles;size_t privsize; +int samples_nr; +struct annotation_data samples[0 ]; };struct disasm_line {
@@ -88,11 +100,6 @@ static inline bool disasm_line__has_offset(const struct disasm_line *dl)return dl->ops.target.offset_avail; } -struct sym_hist_entry { -u64 nr_samples; -u64 period; -}; -void disasm_line__free (struct disasm_line *dl);struct annotation_line *annotation_line__next (struct annotation_line *pos,struct list_head *head);
Jiri Olsa
reviewerPATCH 17/35 perf annotate: Add symbol__calc_percent function
In reply to Jiri OlsaAdding symbol__calc_percent function, that calculates annotation data for symbol and put the data in the struct annotation_line::samples array.
--- tools/perf/util/annotate.c | 65 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-)
tools/perf/util/annotate.c +64 -1
@@ -1618,6 +1618,65 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args) goto out_remove_tmp; } +static void calc_percent (struct sym_hist *hist, +struct annotation_data *sample, +s64 offset,s64 end) +{ +unsigned int hits =0 ; +u64 period =0 ; + +while (offset < end) { + hits += hist->addr[offset].nr_samples; + period += hist->addr[offset].period; + ++offset; + } + +if (hist->nr_samples) { + sample->he.period = period; + sample->he.nr_samples = hits; + sample->percent =100.0 * hits / hist->nr_samples; + } +} + +static int annotation__calc_percent (struct annotation *notes, +struct perf_evsel *evsel,s64 len) +{ +struct annotation_line *al, *next; + +pthread_mutex_lock (¬es->lock); + +list_for_each_entry (al, ¬es->src->source, node) { +s64 end; +int i; + +if (al->offset ==-1 ) +continue ; + + next =annotation_line__next (al, ¬es->src->source); + end = next ? next->offset : len; + +for (i =0 ; i < al->samples_nr; i++) { +struct annotation_data *sample; +struct sym_hist *hist; + + hist =annotation__histogram (notes, evsel->idx + i); + sample = &al->samples[i]; + +calc_percent (hist, sample, al->offset, end); + } + } + +pthread_mutex_unlock (¬es->lock); +return 0 ; +} + +static int symbol__calc_percent (struct symbol *sym,struct perf_evsel *evsel) +{ +struct annotation *notes =symbol__annotation (sym); + +return annotation__calc_percent (notes, evsel,symbol__size (sym)); +} +int symbol__annotate (struct symbol *sym,struct map *map,struct perf_evsel *evsel,size_t privsize,struct arch **parch,char *cpuid)
@@ -1653,7 +1712,11 @@ int symbol__annotate(struct symbol *sym, struct map *map, } } -return symbol__disassemble (sym, &args); + err =symbol__disassemble (sym, &args); +if (err) +return err; + +return symbol__calc_percent (sym, evsel); }static void insert_source_line (struct rb_root *root,struct source_line *src_line)
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Add symbol__calc_percent function
perf annotate: Add symbol__calc_percent function
Commit-ID: 073ae601edc211383b62618effaaedaa8b1d22db Gitweb: https://git.kernel.org/tip/073ae601edc211383b62618effaaedaa8b1d22db Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:40 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Nov 2017 14:37:49 -0300
perf annotate: Add symbol__calc_percent function
Add symbol__calc_percent function, that calculates annotation data for symbol and put the data in the struct annotation_line::samples array.
Committer notes:
Made symbol__calc_percent non static to be used in the next two patches, which will get some fixups from jolsa, doing it this way to keep this bisectable.
--- tools/perf/util/annotate.c | 62 +++++++++++++++++++++++++++++++++++++++++++++- tools/perf/util/annotate.h | 1 + 2 files changed, 62 insertions(+), 1 deletion(-)
tools/perf/util/annotate.c +61 -1
@@ -1628,6 +1628,62 @@ out_close_stdout: goto out_remove_tmp; } +static void calc_percent (struct sym_hist *hist, +struct annotation_data *sample, +s64 offset,s64 end) +{ +unsigned int hits =0 ; +u64 period =0 ; + +while (offset < end) { + hits += hist->addr[offset].nr_samples; + period += hist->addr[offset].period; + ++offset; + } + +if (hist->nr_samples) { + sample->he.period = period; + sample->he.nr_samples = hits; + sample->percent =100.0 * hits / hist->nr_samples; + } +} + +static int annotation__calc_percent (struct annotation *notes, +struct perf_evsel *evsel,s64 len) +{ +struct annotation_line *al, *next; + +list_for_each_entry (al, ¬es->src->source, node) { +s64 end; +int i; + +if (al->offset ==-1 ) +continue ; + + next =annotation_line__next (al, ¬es->src->source); + end = next ? next->offset : len; + +for (i =0 ; i < al->samples_nr; i++) { +struct annotation_data *sample; +struct sym_hist *hist; + + hist =annotation__histogram (notes, evsel->idx + i); + sample = &al->samples[i]; + +calc_percent (hist, sample, al->offset, end); + } + } + +return 0 ; +} + +int symbol__calc_percent (struct symbol *sym,struct perf_evsel *evsel) +{ +struct annotation *notes =symbol__annotation (sym); + +return annotation__calc_percent (notes, evsel,symbol__size (sym)); +} +int symbol__annotate (struct symbol *sym,struct map *map,struct perf_evsel *evsel,size_t privsize,struct arch **parch,char *cpuid)
@@ -1663,7 +1719,11 @@ int symbol__annotate(struct symbol *sym, struct map *map, } } -return symbol__disassemble (sym, &args); + err =symbol__disassemble (sym, &args); +if (err) +return err; + +return symbol__calc_percent (sym, evsel); }static void insert_source_line (struct rb_root *root,struct source_line *src_line)
tools/perf/util/annotate.h +1 -0
@@ -107,6 +107,7 @@ int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool rsize_t disasm__fprintf (struct list_head *head,FILE *fp);double disasm__calc_percent (struct annotation *notes,int evidx,s64 offset,s64 end,const char **path,struct sym_hist_entry *sample); +int symbol__calc_percent (struct symbol *sym,struct perf_evsel *evsel);struct sym_hist {u64 nr_samples;
Jiri Olsa
reviewerPATCH 18/35 perf annotate: Add symbol__calc_lines function
In reply to Jiri OlsaReplace symbol__get_source_line with symbol__calc_lines, which calculates the source line tree over the struct annotation_line.
This will allow us to remove redundant struct source_line in following patches.
--- tools/perf/util/annotate.c | 186 ++++++++++++++++----------------------------- tools/perf/util/annotate.h | 2 + 2 files changed, 68 insertions(+), 120 deletions(-)
tools/perf/util/annotate.c +66 -120
@@ -882,6 +882,7 @@ static void annotation_line__free(struct annotation_line *al) {void *ptr = (void *) al - al->privsize; +free_srcline (al->path);zfree (&al->line);free (ptr); }
@@ -1719,21 +1720,21 @@ int symbol__annotate(struct symbol *sym, struct map *map,return symbol__calc_percent (sym, evsel); } -static void insert_source_line (struct rb_root *root,struct source_line *src_line) +static void insert_source_line (struct rb_root *root,struct annotation_line *al) { -struct source_line *iter; +struct annotation_line *iter;struct rb_node **p = &root->rb_node;struct rb_node *parent =NULL ;int i, ret;while (*p !=NULL ) { parent = *p; - iter = rb_entry(parent, struct source_line, node); + iter = rb_entry(parent, struct annotation_line, rb_node); - ret =strcmp (iter->path, src_line->path); + ret =strcmp (iter->path, al->path);if (ret ==0 ) { -for (i =0 ; i < src_line->nr_pcnt; i++) - iter->samples[i].percent_sum += src_line->samples[i].percent; +for (i =0 ; i < al->samples_nr; i++) + iter->samples[i].percent_sum += al->samples[i].percent;return ; }
@@ -1743,18 +1744,18 @@ static void insert_source_line(struct rb_root *root, struct source_line *src_lin p = &(*p)->rb_right; } -for (i =0 ; i < src_line->nr_pcnt; i++) - src_line->samples[i].percent_sum = src_line->samples[i].percent; +for (i =0 ; i < al->samples_nr; i++) + al->samples[i].percent_sum = al->samples[i].percent; -rb_link_node (&src_line->node, parent, p); -rb_insert_color (&src_line->node, root); +rb_link_node (&al->rb_node, parent, p); +rb_insert_color (&al->rb_node, root); } -static int cmp_source_line (struct source_line *a,struct source_line *b) +static int cmp_source_line (struct annotation_line *a,struct annotation_line *b) {int i; -for (i =0 ; i < a->nr_pcnt; i++) { +for (i =0 ; i < a->samples_nr; i++) {if (a->samples[i].percent_sum == b->samples[i].percent_sum)continue ;return a->samples[i].percent_sum > b->samples[i].percent_sum;
@@ -1763,135 +1764,47 @@ static int cmp_source_line(struct source_line *a, struct source_line *b)return 0 ; } -static void __resort_source_line (struct rb_root *root,struct source_line *src_line) +static void __resort_source_line (struct rb_root *root,struct annotation_line *al) { -struct source_line *iter; +struct annotation_line *iter;struct rb_node **p = &root->rb_node;struct rb_node *parent =NULL ;while (*p !=NULL ) { parent = *p; - iter = rb_entry(parent, struct source_line, node); + iter = rb_entry(parent, struct annotation_line, rb_node); -if (cmp_source_line (src_line, iter)) +if (cmp_source_line (al, iter)) p = &(*p)->rb_left;else p = &(*p)->rb_right; } -rb_link_node (&src_line->node, parent, p); -rb_insert_color (&src_line->node, root); +rb_link_node (&al->rb_node, parent, p); +rb_insert_color (&al->rb_node, root); }static void resort_source_line (struct rb_root *dest_root,struct rb_root *src_root) { -struct source_line *src_line; +struct annotation_line *al;struct rb_node *node; node =rb_first (src_root);while (node) {struct rb_node *next; - src_line = rb_entry(node, struct source_line, node); + al = rb_entry(node, struct annotation_line, rb_node); next =rb_next (node);rb_erase (node, src_root); -__resort_source_line (dest_root, src_line); +__resort_source_line (dest_root, al); node = next; } } -static void symbol__free_source_line (struct symbol *sym,int len) -{ -struct annotation *notes =symbol__annotation (sym); -struct source_line *src_line = notes->src->lines; -size_t sizeof_src_line; -int i; - - sizeof_src_line =sizeof (*src_line) + - (sizeof (src_line->samples) * (src_line->nr_pcnt -1 )); - -for (i =0 ; i < len; i++) { -free_srcline (src_line->path); - src_line = (void *)src_line + sizeof_src_line; - } - -zfree (¬es->src->lines); -} - -/* Get the filename:line for the colored entries */ -static int symbol__get_source_line (struct symbol *sym,struct map *map, -struct perf_evsel *evsel, -struct rb_root *root,int len) -{ -u64 start; -int i, k; -int evidx = evsel->idx; -struct source_line *src_line; -struct annotation *notes =symbol__annotation (sym); -struct sym_hist *h =annotation__histogram (notes, evidx); -struct rb_root tmp_root =RB_ROOT ; -int nr_pcnt =1 ; -u64 nr_samples = h->nr_samples; -size_t sizeof_src_line =sizeof (struct source_line ); - -if (perf_evsel__is_group_event (evsel)) { -for (i =1 ; i < evsel->nr_members; i++) { - h =annotation__histogram (notes, evidx + i); - nr_samples += h->nr_samples; - } - nr_pcnt = evsel->nr_members; - sizeof_src_line += (nr_pcnt -1 ) *sizeof (src_line->samples); - } - -if (!nr_samples) -return 0 ; - - src_line = notes->src->lines =calloc (len, sizeof_src_line); -if (!notes->src->lines) -return -1 ; - - start =map__rip_2objdump (map, sym->start); - -for (i =0 ; i < len; i++) { -u64 offset; -double percent_max =0.0 ; - - src_line->nr_pcnt = nr_pcnt; - -for (k =0 ; k < nr_pcnt; k++) { -double percent =0.0 ; - - h =annotation__histogram (notes, evidx + k); - nr_samples = h->addr[i].nr_samples; -if (h->nr_samples) - percent =100.0 * nr_samples / h->nr_samples; - -if (percent > percent_max) - percent_max = percent; - src_line->samples[k].percent = percent; - src_line->samples[k].nr = nr_samples; - } - -if (percent_max <=0.5 ) - goto next; - - offset = start + i; - src_line->path =get_srcline (map->dso, offset,NULL , - false, true); -insert_source_line (&tmp_root, src_line); - - next: - src_line = (void *)src_line + sizeof_src_line; - } - -resort_source_line (root, &tmp_root); -return 0 ; -} -static void print_summary (struct rb_root *root,const char *filename) { -struct source_line *src_line; +struct annotation_line *al;struct rb_node *node;printf ("\nSorted summary for file %s\n" , filename);
@@ -1909,9 +1822,9 @@ static void print_summary(struct rb_root *root, const char *filename)char *path;int i; - src_line = rb_entry(node, struct source_line, node); -for (i =0 ; i < src_line->nr_pcnt; i++) { - percent = src_line->samples[i].percent_sum; + al = rb_entry(node, struct annotation_line, rb_node); +for (i =0 ; i < al->samples_nr; i++) { + percent = al->samples[i].percent_sum; color =get_percent_color (percent);color_fprintf (stdout, color," %7.2f" , percent);
@@ -1919,7 +1832,7 @@ static void print_summary(struct rb_root *root, const char *filename) percent_max = percent; } - path = src_line->path; + path = al->path; color =get_percent_color (percent_max);color_fprintf (stdout, color," %s\n" , path);
@@ -2084,29 +1997,62 @@ size_t disasm__fprintf(struct list_head *head, FILE *fp)return printed; } +static void annotation__calc_lines (struct annotation *notes,struct map *map, +struct rb_root *root,u64 start) +{ +struct annotation_line *al; +struct rb_root tmp_root =RB_ROOT ; + +list_for_each_entry (al, ¬es->src->source, node) { +double percent_max =0.0 ; +int i; + +for (i =0 ; i < al->samples_nr; i++) { +struct annotation_data *sample; + + sample = &al->samples[i]; + +if (sample->percent > percent_max) + percent_max = sample->percent; + } + +if (percent_max <=0.5 ) +continue ; + + al->path =get_srcline (map->dso, start + al->offset,NULL , false, true); +insert_source_line (&tmp_root, al); + } + +resort_source_line (root, &tmp_root); +} + +static void symbol__calc_lines (struct symbol *sym,struct map *map, +struct rb_root *root) +{ +struct annotation *notes =symbol__annotation (sym); +u64 start =map__rip_2objdump (map, sym->start); + +annotation__calc_lines (notes, map, root, start); +} +int symbol__tty_annotate (struct symbol *sym,struct map *map,struct perf_evsel *evsel,bool print_lines,bool full_paths,int min_pcnt,int max_lines) {struct dso *dso = map->dso;struct rb_root source_line =RB_ROOT ; -u64 len;if (symbol__annotate (sym, map, evsel,0 ,NULL ,NULL ) <0 )return -1 ; - len =symbol__size (sym); -if (print_lines) { srcline_full_filename = full_paths; -symbol__get_source_line (sym, map, evsel, &source_line, len); +symbol__calc_lines (sym, map, &source_line);print_summary (&source_line, dso->long_name); }symbol__annotate_printf (sym, map, evsel, full_paths, min_pcnt, max_lines,0 ); -if (print_lines) -symbol__free_source_line (sym, len);annotated_source__purge (symbol__annotation (sym)->src);
tools/perf/util/annotate.h +2 -0
@@ -65,6 +65,7 @@ struct sym_hist_entry {struct annotation_data {double percent; +double percent_sum;struct sym_hist_entry he; };
@@ -77,6 +78,7 @@ struct annotation_line {float ipc;u64 cycles;size_t privsize; +char *path;int samples_nr;struct annotation_data samples[0 ]; };
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Add symbol__calc_lines function
perf annotate: Add symbol__calc_lines function
Commit-ID: 8b4c74dc5cd40a3bc77f8bc2b6b7b33dc125e302 Gitweb: https://git.kernel.org/tip/8b4c74dc5cd40a3bc77f8bc2b6b7b33dc125e302 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:41 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Nov 2017 14:37:49 -0300
perf annotate: Add symbol__calc_lines function
Replace symbol__get_source_line() with symbol__calc_lines(), which calculates the source line tree over the struct annotation_line.
This will allow us to remove redundant struct source_line in following patches.
--- tools/perf/util/annotate.c | 186 ++++++++++++++++----------------------------- tools/perf/util/annotate.h | 2 + 2 files changed, 68 insertions(+), 120 deletions(-)
tools/perf/util/annotate.c +66 -120
@@ -892,6 +892,7 @@ static void annotation_line__delete(struct annotation_line *al) {void *ptr = (void *) al - al->privsize; +free_srcline (al->path);zfree (&al->line);free (ptr); }
@@ -1726,21 +1727,21 @@ int symbol__annotate(struct symbol *sym, struct map *map,return symbol__calc_percent (sym, evsel); } -static void insert_source_line (struct rb_root *root,struct source_line *src_line) +static void insert_source_line (struct rb_root *root,struct annotation_line *al) { -struct source_line *iter; +struct annotation_line *iter;struct rb_node **p = &root->rb_node;struct rb_node *parent =NULL ;int i, ret;while (*p !=NULL ) { parent = *p; - iter = rb_entry(parent, struct source_line, node); + iter = rb_entry(parent, struct annotation_line, rb_node); - ret =strcmp (iter->path, src_line->path); + ret =strcmp (iter->path, al->path);if (ret ==0 ) { -for (i =0 ; i < src_line->nr_pcnt; i++) - iter->samples[i].percent_sum += src_line->samples[i].percent; +for (i =0 ; i < al->samples_nr; i++) + iter->samples[i].percent_sum += al->samples[i].percent;return ; }
@@ -1750,18 +1751,18 @@ static void insert_source_line(struct rb_root *root, struct source_line *src_lin p = &(*p)->rb_right; } -for (i =0 ; i < src_line->nr_pcnt; i++) - src_line->samples[i].percent_sum = src_line->samples[i].percent; +for (i =0 ; i < al->samples_nr; i++) + al->samples[i].percent_sum = al->samples[i].percent; -rb_link_node (&src_line->node, parent, p); -rb_insert_color (&src_line->node, root); +rb_link_node (&al->rb_node, parent, p); +rb_insert_color (&al->rb_node, root); } -static int cmp_source_line (struct source_line *a,struct source_line *b) +static int cmp_source_line (struct annotation_line *a,struct annotation_line *b) {int i; -for (i =0 ; i < a->nr_pcnt; i++) { +for (i =0 ; i < a->samples_nr; i++) {if (a->samples[i].percent_sum == b->samples[i].percent_sum)continue ;return a->samples[i].percent_sum > b->samples[i].percent_sum;
@@ -1770,135 +1771,47 @@ static int cmp_source_line(struct source_line *a, struct source_line *b)return 0 ; } -static void __resort_source_line (struct rb_root *root,struct source_line *src_line) +static void __resort_source_line (struct rb_root *root,struct annotation_line *al) { -struct source_line *iter; +struct annotation_line *iter;struct rb_node **p = &root->rb_node;struct rb_node *parent =NULL ;while (*p !=NULL ) { parent = *p; - iter = rb_entry(parent, struct source_line, node); + iter = rb_entry(parent, struct annotation_line, rb_node); -if (cmp_source_line (src_line, iter)) +if (cmp_source_line (al, iter)) p = &(*p)->rb_left;else p = &(*p)->rb_right; } -rb_link_node (&src_line->node, parent, p); -rb_insert_color (&src_line->node, root); +rb_link_node (&al->rb_node, parent, p); +rb_insert_color (&al->rb_node, root); }static void resort_source_line (struct rb_root *dest_root,struct rb_root *src_root) { -struct source_line *src_line; +struct annotation_line *al;struct rb_node *node; node =rb_first (src_root);while (node) {struct rb_node *next; - src_line = rb_entry(node, struct source_line, node); + al = rb_entry(node, struct annotation_line, rb_node); next =rb_next (node);rb_erase (node, src_root); -__resort_source_line (dest_root, src_line); +__resort_source_line (dest_root, al); node = next; } } -static void symbol__free_source_line (struct symbol *sym,int len) -{ -struct annotation *notes =symbol__annotation (sym); -struct source_line *src_line = notes->src->lines; -size_t sizeof_src_line; -int i; - - sizeof_src_line =sizeof (*src_line) + - (sizeof (src_line->samples) * (src_line->nr_pcnt -1 )); - -for (i =0 ; i < len; i++) { -free_srcline (src_line->path); - src_line = (void *)src_line + sizeof_src_line; - } - -zfree (¬es->src->lines); -} - -/* Get the filename:line for the colored entries */ -static int symbol__get_source_line (struct symbol *sym,struct map *map, -struct perf_evsel *evsel, -struct rb_root *root,int len) -{ -u64 start; -int i, k; -int evidx = evsel->idx; -struct source_line *src_line; -struct annotation *notes =symbol__annotation (sym); -struct sym_hist *h =annotation__histogram (notes, evidx); -struct rb_root tmp_root =RB_ROOT ; -int nr_pcnt =1 ; -u64 nr_samples = h->nr_samples; -size_t sizeof_src_line =sizeof (struct source_line ); - -if (perf_evsel__is_group_event (evsel)) { -for (i =1 ; i < evsel->nr_members; i++) { - h =annotation__histogram (notes, evidx + i); - nr_samples += h->nr_samples; - } - nr_pcnt = evsel->nr_members; - sizeof_src_line += (nr_pcnt -1 ) *sizeof (src_line->samples); - } - -if (!nr_samples) -return 0 ; - - src_line = notes->src->lines =calloc (len, sizeof_src_line); -if (!notes->src->lines) -return -1 ; - - start =map__rip_2objdump (map, sym->start); - -for (i =0 ; i < len; i++) { -u64 offset; -double percent_max =0.0 ; - - src_line->nr_pcnt = nr_pcnt; - -for (k =0 ; k < nr_pcnt; k++) { -double percent =0.0 ; - - h =annotation__histogram (notes, evidx + k); - nr_samples = h->addr[i].nr_samples; -if (h->nr_samples) - percent =100.0 * nr_samples / h->nr_samples; - -if (percent > percent_max) - percent_max = percent; - src_line->samples[k].percent = percent; - src_line->samples[k].nr = nr_samples; - } - -if (percent_max <=0.5 ) - goto next; - - offset = start + i; - src_line->path =get_srcline (map->dso, offset,NULL , - false, true); -insert_source_line (&tmp_root, src_line); - - next: - src_line = (void *)src_line + sizeof_src_line; - } - -resort_source_line (root, &tmp_root); -return 0 ; -} -static void print_summary (struct rb_root *root,const char *filename) { -struct source_line *src_line; +struct annotation_line *al;struct rb_node *node;printf ("\nSorted summary for file %s\n" , filename);
@@ -1916,9 +1829,9 @@ static void print_summary(struct rb_root *root, const char *filename)char *path;int i; - src_line = rb_entry(node, struct source_line, node); -for (i =0 ; i < src_line->nr_pcnt; i++) { - percent = src_line->samples[i].percent_sum; + al = rb_entry(node, struct annotation_line, rb_node); +for (i =0 ; i < al->samples_nr; i++) { + percent = al->samples[i].percent_sum; color =get_percent_color (percent);color_fprintf (stdout, color," %7.2f" , percent);
@@ -1926,7 +1839,7 @@ static void print_summary(struct rb_root *root, const char *filename) percent_max = percent; } - path = src_line->path; + path = al->path; color =get_percent_color (percent_max);color_fprintf (stdout, color," %s\n" , path);
@@ -2091,29 +2004,62 @@ size_t disasm__fprintf(struct list_head *head, FILE *fp)return printed; } +static void annotation__calc_lines (struct annotation *notes,struct map *map, +struct rb_root *root,u64 start) +{ +struct annotation_line *al; +struct rb_root tmp_root =RB_ROOT ; + +list_for_each_entry (al, ¬es->src->source, node) { +double percent_max =0.0 ; +int i; + +for (i =0 ; i < al->samples_nr; i++) { +struct annotation_data *sample; + + sample = &al->samples[i]; + +if (sample->percent > percent_max) + percent_max = sample->percent; + } + +if (percent_max <=0.5 ) +continue ; + + al->path =get_srcline (map->dso, start + al->offset,NULL , false, true); +insert_source_line (&tmp_root, al); + } + +resort_source_line (root, &tmp_root); +} + +static void symbol__calc_lines (struct symbol *sym,struct map *map, +struct rb_root *root) +{ +struct annotation *notes =symbol__annotation (sym); +u64 start =map__rip_2objdump (map, sym->start); + +annotation__calc_lines (notes, map, root, start); +} +int symbol__tty_annotate (struct symbol *sym,struct map *map,struct perf_evsel *evsel,bool print_lines,bool full_paths,int min_pcnt,int max_lines) {struct dso *dso = map->dso;struct rb_root source_line =RB_ROOT ; -u64 len;if (symbol__annotate (sym, map, evsel,0 ,NULL ,NULL ) <0 )return -1 ; - len =symbol__size (sym); -if (print_lines) { srcline_full_filename = full_paths; -symbol__get_source_line (sym, map, evsel, &source_line, len); +symbol__calc_lines (sym, map, &source_line);print_summary (&source_line, dso->long_name); }symbol__annotate_printf (sym, map, evsel, full_paths, min_pcnt, max_lines,0 ); -if (print_lines) -symbol__free_source_line (sym, len);annotated_source__purge (symbol__annotation (sym)->src);
tools/perf/util/annotate.h +2 -0
@@ -66,6 +66,7 @@ struct sym_hist_entry {struct annotation_data {double percent; +double percent_sum;struct sym_hist_entry he; };
@@ -78,6 +79,7 @@ struct annotation_line {float ipc;u64 cycles;size_t privsize; +char *path;int samples_nr;struct annotation_data samples[0 ]; };
Jiri Olsa
reviewerPATCH 19/35 perf annotate: Remove disasm__calc_percent from disasm_line__print
In reply to Jiri OlsaRemoving disasm__calc_percent from disasm_line__print, because we already have the data calculated in struct annotation_line.
--- tools/perf/util/annotate.c | 59 ++++++++++++---------------------------------- 1 file changed, 15 insertions(+), 44 deletions(-)
tools/perf/util/annotate.c +15 -44
@@ -1135,41 +1135,19 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 ststatic const char *prev_color;if (dl->al.offset !=-1 ) { -const char *path =NULL ; -double percent, max_percent =0.0 ; -double *ppercents = &percent; -struct sym_hist_entry sample; -struct sym_hist_entry *psamples = &sample; +double max_percent =0.0 ;int i, nr_percent =1 ;const char *color;struct annotation *notes =symbol__annotation (sym);s64 offset = dl->al.offset;const u64 addr = start + offset; -struct annotation_line *next;struct block_range *br; - next =annotation_line__next (&dl->al, ¬es->src->source); +for (i =0 ; i < dl->al.samples_nr; i++) { +struct annotation_data *sample = &dl->al.samples[i]; -if (perf_evsel__is_group_event (evsel)) { - nr_percent = evsel->nr_members; - ppercents =calloc (nr_percent,sizeof (double )); - psamples =calloc (nr_percent,sizeof (struct sym_hist_entry )); -if (ppercents ==NULL || psamples ==NULL ) { -return -1 ; - } - } - -for (i =0 ; i < nr_percent; i++) { - percent =disasm__calc_percent (notes, - notes->src->lines ? i : evsel->idx + i, - offset, - next ? next->offset : (s64 ) len, - &path, &sample); - - ppercents[i] = percent; - psamples[i] = sample; -if (percent > max_percent) - max_percent = percent; +if (sample->percent > max_percent) + max_percent = sample->percent; }if (max_percent < min_pcnt)
@@ -1194,28 +1172,28 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 st* the same color than the percentage. Don't print it * twice for close colored addr with the same filename:line */ -if (path) { -if (!prev_line ||strcmp (prev_line, path) +if (dl->al.path) { +if (!prev_line ||strcmp (prev_line, dl->al.path) || color != prev_color) { -color_fprintf (stdout, color," %s" , path); - prev_line = path; +color_fprintf (stdout, color," %s" , dl->al.path); + prev_line = dl->al.path; prev_color = color; } }for (i =0 ; i < nr_percent; i++) { - percent = ppercents[i]; - sample = psamples[i]; - color =get_percent_color (percent); +struct annotation_data *sample = &dl->al.samples[i]; + + color =get_percent_color (sample->percent);if (symbol_conf.show_total_period)color_fprintf (stdout, color," %11" PRIu64, - sample.period); + sample->he.period);else if (symbol_conf.show_nr_samples)color_fprintf (stdout, color," %7" PRIu64, - sample.nr_samples); + sample->he.nr_samples);else -color_fprintf (stdout, color," %7.2f" , percent); +color_fprintf (stdout, color," %7.2f" , sample->percent); }printf (" : " );
@@ -1225,13 +1203,6 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 stcolor_fprintf (stdout,annotate__asm_color (br),"%s" , dl->al.line);annotate__branch_printf (br, addr);printf ("\n" ); - -if (ppercents != &percent) -free (ppercents); - -if (psamples != &sample) -free (psamples); - }else if (max_lines && printed >= max_lines)return 1 ;else {
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Remove disasm__calc_percent() from disasm_line__print()
perf annotate: Remove disasm__calc_percent() from disasm_line__print()
Commit-ID: f681d593d1ce7d2fc665c4047b45f4316408b892 Gitweb: https://git.kernel.org/tip/f681d593d1ce7d2fc665c4047b45f4316408b892 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:42 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Nov 2017 14:41:04 -0300
perf annotate: Remove disasm__calc_percent() from disasm_line__print()
Remove disasm__calc_percent() from disasm_line__print(), because we already have the data calculated in struct annotation_line.
--- tools/perf/builtin-top.c | 3 +++ tools/perf/util/annotate.c | 59 ++++++++++++---------------------------------- 2 files changed, 18 insertions(+), 44 deletions(-)
tools/perf/builtin-top.c +3 -0
@@ -226,6 +226,7 @@ static void perf_top__record_precise_ip(struct perf_top *top,static void perf_top__show_details (struct perf_top *top) {struct hist_entry *he = top->sym_filter_entry; +struct perf_evsel *evsel =hists_to_evsel (he->hists);struct annotation *notes;struct symbol *symbol;int more;
@@ -238,6 +239,8 @@ static void perf_top__show_details(struct perf_top *top)pthread_mutex_lock (¬es->lock); +symbol__calc_percent (symbol, evsel); +if (notes->src ==NULL ) goto out_unlock;
tools/perf/util/annotate.c +15 -44
97 lines not on this page · raw message
Jiri Olsa
reviewerPATCH 20/35 perf annotate: Remove disasm__calc_percent from annotate_browser__calc_percent
In reply to Jiri OlsaRemoving disasm__calc_percent from annotate_browser__calc_percent, because we already have the data calculated in struct annotation_line.
--- tools/perf/ui/browsers/annotate.c | 22 ++++++---------------- tools/perf/util/annotate.c | 2 +- tools/perf/util/annotate.h | 1 + 3 files changed, 8 insertions(+), 17 deletions(-)
tools/perf/ui/browsers/annotate.c +6 -16
@@ -437,15 +437,12 @@ static void annotate_browser__set_rb_top(struct annotate_browser *browser, browser->curr_hot = nd; } -static void annotate_browser__calc_percent (struct annotate_browser *browser, -struct perf_evsel *evsel) +static void annotate_browser__calc_percent (struct annotate_browser *browser) {struct map_symbol *ms = browser->b.priv;struct symbol *sym = ms->sym;struct annotation *notes =symbol__annotation (sym); -struct annotation_line *next;struct disasm_line *pos; -s64 len =symbol__size (sym); browser->entries =RB_ROOT ;
@@ -453,7 +450,6 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,list_for_each_entry (pos, ¬es->src->source, al.node) {struct browser_disasm_line *bpos =disasm_line__browser (pos); -const char *path =NULL ;double max_percent =0.0 ;int i;
@@ -462,17 +458,11 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,continue ; } - next =annotation_line__next (&pos->al, ¬es->src->source); -for (i =0 ; i < browser->nr_events; i++) { -struct sym_hist_entry sample; +struct annotation_data *sample = &pos->al.samples[i]; - bpos->samples[i].percent =disasm__calc_percent (notes, - evsel->idx + i, - pos->al.offset, - next ? next->offset : len, - &path, &sample); - bpos->samples[i].he = sample; + bpos->samples[i].percent = sample->percent; + bpos->samples[i].he = sample->he;if (max_percent < bpos->samples[i].percent) max_percent = bpos->samples[i].percent;
@@ -780,7 +770,7 @@ static int annotate_browser__run(struct annotate_browser *browser,if (ui_browser__show (&browser->b, title, help) <0 )return -1 ; -annotate_browser__calc_percent (browser, evsel); +annotate_browser__calc_percent (browser);if (browser->curr_hot) {annotate_browser__set_rb_top (browser, browser->curr_hot);
@@ -793,7 +783,7 @@ static int annotate_browser__run(struct annotate_browser *browser, key =ui_browser__run (&browser->b, delay_secs);if (delay_secs !=0 ) { -annotate_browser__calc_percent (browser, evsel); +annotate_browser__calc_percent (browser);/* * Current line focus got out of the list of most active * lines, NULL it so that if TAB|UNTAB is pressed, we
tools/perf/util/annotate.c +1 -1
@@ -1642,7 +1642,7 @@ static int annotation__calc_percent(struct annotation *notes,return 0 ; } -static int symbol__calc_percent (struct symbol *sym,struct perf_evsel *evsel) +int symbol__calc_percent (struct symbol *sym,struct perf_evsel *evsel) {struct annotation *notes =symbol__annotation (sym);
tools/perf/util/annotate.h +1 -0
@@ -108,6 +108,7 @@ int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool rsize_t disasm__fprintf (struct list_head *head,FILE *fp);double disasm__calc_percent (struct annotation *notes,int evidx,s64 offset,s64 end,const char **path,struct sym_hist_entry *sample); +int symbol__calc_percent (struct symbol *sym,struct perf_evsel *evsel);struct sym_hist {u64 nr_samples;
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Remove disasm__calc_percent() from annotate_browser__calc_percent()
perf annotate: Remove disasm__calc_percent() from annotate_browser__calc_percent()
Commit-ID: e425da6caed1a2872e9543bba83488dbe4bbe3f3 Gitweb: https://git.kernel.org/tip/e425da6caed1a2872e9543bba83488dbe4bbe3f3 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:43 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Nov 2017 14:45:35 -0300
perf annotate: Remove disasm__calc_percent() from annotate_browser__calc_percent()
Remove disasm__calc_percent() from annotate_browser__calc_percent(), because we already have the data calculated in struct annotation_line.
--- tools/perf/ui/browsers/annotate.c | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-)
tools/perf/ui/browsers/annotate.c +6 -13
@@ -444,17 +444,16 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,struct map_symbol *ms = browser->b.priv;struct symbol *sym = ms->sym;struct annotation *notes =symbol__annotation (sym); -struct annotation_line *next;struct disasm_line *pos; -s64 len =symbol__size (sym); browser->entries =RB_ROOT ;pthread_mutex_lock (¬es->lock); +symbol__calc_percent (sym, evsel); +list_for_each_entry (pos, ¬es->src->source, al.node) {struct browser_disasm_line *bpos =disasm_line__browser (pos); -const char *path =NULL ;double max_percent =0.0 ;int i;
@@ -463,17 +462,11 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,continue ; } - next =annotation_line__next (&pos->al, ¬es->src->source); -for (i =0 ; i < browser->nr_events; i++) { -struct sym_hist_entry sample; - - bpos->samples[i].percent =disasm__calc_percent (notes, - evsel->idx + i, - pos->al.offset, - next ? next->offset : len, - &path, &sample); - bpos->samples[i].he = sample; +struct annotation_data *sample = &pos->al.samples[i]; + + bpos->samples[i].percent = sample->percent; + bpos->samples[i].he = sample->he;if (max_percent < bpos->samples[i].percent) max_percent = bpos->samples[i].percent;
Jiri Olsa
reviewerPATCH 21/35 perf annotate: Remove disasm__calc_percent function
In reply to Jiri OlsaRemoving disasm__calc_percent function,
because it's no longer needed.
--- tools/perf/util/annotate.c | 44 -------------------------------------------- tools/perf/util/annotate.h | 2 -- 2 files changed, 46 deletions(-)
tools/perf/util/annotate.c +0 -44
@@ -1000,50 +1000,6 @@ annotation_line__next(struct annotation_line *pos, struct list_head *head)return NULL ; } -double disasm__calc_percent (struct annotation *notes,int evidx,s64 offset, -s64 end,const char **path,struct sym_hist_entry *sample) -{ -struct source_line *src_line = notes->src->lines; -double percent =0.0 ; - - sample->nr_samples = sample->period =0 ; - -if (src_line) { -size_t sizeof_src_line =sizeof (*src_line) + -sizeof (src_line->samples) * (src_line->nr_pcnt -1 ); - -while (offset < end) { - src_line = (void *)notes->src->lines + - (sizeof_src_line * offset); - -if (*path ==NULL ) - *path = src_line->path; - - percent += src_line->samples[evidx].percent; - sample->nr_samples += src_line->samples[evidx].nr; - offset++; - } - }else { -struct sym_hist *h =annotation__histogram (notes, evidx); -unsigned int hits =0 ; -u64 period =0 ; - -while (offset < end) { - hits += h->addr[offset].nr_samples; - period += h->addr[offset].period; - ++offset; - } - -if (h->nr_samples) { - sample->period = period; - sample->nr_samples = hits; - percent =100.0 * hits / h->nr_samples; - } - } - -return percent; -} -static const char *annotate__address_color (struct block_range *br) {double cov =block_range__coverage (br);
tools/perf/util/annotate.h +0 -2
@@ -106,8 +106,6 @@ struct annotation_line* annotation_line__next(struct annotation_line *pos, struct list_head *head);int disasm_line__scnprintf (struct disasm_line *dl,char *bf,size_t size,bool raw);size_t disasm__fprintf (struct list_head *head,FILE *fp); -double disasm__calc_percent (struct annotation *notes,int evidx,s64 offset, -s64 end,const char **path,struct sym_hist_entry *sample);int symbol__calc_percent (struct symbol *sym,struct perf_evsel *evsel);struct sym_hist {
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Remove disasm__calc_percent function
perf annotate: Remove disasm__calc_percent function
Commit-ID: 81e436a0b3a7a2f3ac0311674ce407b7cdd23f0b Gitweb: https://git.kernel.org/tip/81e436a0b3a7a2f3ac0311674ce407b7cdd23f0b Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:44 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Nov 2017 14:46:14 -0300
perf annotate: Remove disasm__calc_percent function
Remove disasm__calc_percent() function, because it's no longer needed.
--- tools/perf/util/annotate.c | 44 -------------------------------------------- tools/perf/util/annotate.h | 2 -- 2 files changed, 46 deletions(-)
tools/perf/util/annotate.c +0 -44
@@ -1010,50 +1010,6 @@ annotation_line__next(struct annotation_line *pos, struct list_head *head)return NULL ; } -double disasm__calc_percent (struct annotation *notes,int evidx,s64 offset, -s64 end,const char **path,struct sym_hist_entry *sample) -{ -struct source_line *src_line = notes->src->lines; -double percent =0.0 ; - - sample->nr_samples = sample->period =0 ; - -if (src_line) { -size_t sizeof_src_line =sizeof (*src_line) + -sizeof (src_line->samples) * (src_line->nr_pcnt -1 ); - -while (offset < end) { - src_line = (void *)notes->src->lines + - (sizeof_src_line * offset); - -if (*path ==NULL ) - *path = src_line->path; - - percent += src_line->samples[evidx].percent; - sample->nr_samples += src_line->samples[evidx].nr; - offset++; - } - }else { -struct sym_hist *h =annotation__histogram (notes, evidx); -unsigned int hits =0 ; -u64 period =0 ; - -while (offset < end) { - hits += h->addr[offset].nr_samples; - period += h->addr[offset].period; - ++offset; - } - -if (h->nr_samples) { - sample->period = period; - sample->nr_samples = hits; - percent =100.0 * hits / h->nr_samples; - } - } - -return percent; -} -static const char *annotate__address_color (struct block_range *br) {double cov =block_range__coverage (br);
tools/perf/util/annotate.h +0 -2
@@ -107,8 +107,6 @@ struct annotation_line * annotation_line__next(struct annotation_line *pos, struct list_head *head);int disasm_line__scnprintf (struct disasm_line *dl,char *bf,size_t size,bool raw);size_t disasm__fprintf (struct list_head *head,FILE *fp); -double disasm__calc_percent (struct annotation *notes,int evidx,s64 offset, -s64 end,const char **path,struct sym_hist_entry *sample);int symbol__calc_percent (struct symbol *sym,struct perf_evsel *evsel);struct sym_hist {
Jiri Olsa
reviewerPATCH 22/35 perf annotate: Remove struct source_line
In reply to Jiri OlsaRemoving struct source_line*, because it's no longer needed.
--- tools/perf/util/annotate.h | 14 -------------- 1 file changed, 14 deletions(-)
tools/perf/util/annotate.h +0 -14
@@ -125,19 +125,6 @@ struct cyc_hist {u16 reset; }; -struct source_line_samples { -double percent; -double percent_sum; -u64 nr; -}; - -struct source_line { -struct rb_node node; -char *path; -int nr_pcnt; -struct source_line_samples samples[1 ]; -}; -/** struct annotated_source - symbols with hits have this attached as in sannotation * * @histogram: Array of addr hit histograms per event being monitored
@@ -153,7 +140,6 @@ struct source_line {*/ struct annotated_source {struct list_head source; -struct source_line *lines;int nr_histograms;size_t sizeof_sym_hist;struct cyc_hist *cycles_hist;
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Remove struct source_line
perf annotate: Remove struct source_line
Commit-ID: fa1924eb4abcd756febc031d819ba75c3849ca45 Gitweb: https://git.kernel.org/tip/fa1924eb4abcd756febc031d819ba75c3849ca45 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:45 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Nov 2017 14:49:44 -0300
perf annotate: Remove struct source_line
Remove struct source_line*, no longer needed.
--- tools/perf/util/annotate.h | 14 -------------- 1 file changed, 14 deletions(-)
tools/perf/util/annotate.h +0 -14
@@ -126,19 +126,6 @@ struct cyc_hist {u16 reset; }; -struct source_line_samples { -double percent; -double percent_sum; -u64 nr; -}; - -struct source_line { -struct rb_node node; -char *path; -int nr_pcnt; -struct source_line_samples samples[1 ]; -}; -/** struct annotated_source - symbols with hits have this attached as in sannotation * * @histogram: Array of addr hit histograms per event being monitored
@@ -154,7 +141,6 @@ struct source_line {*/ struct annotated_source {struct list_head source; -struct source_line *lines;int nr_histograms;size_t sizeof_sym_hist;struct cyc_hist *cycles_hist;
Jiri Olsa
reviewerPATCH 23/35 perf annotate: Add annotation_line__print function
In reply to Jiri OlsaSeparating struct annotation_line display function, it will hold the generic line display code.
--- tools/perf/util/annotate.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-)
tools/perf/util/annotate.c +22 -6
@@ -1179,6 +1179,18 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 streturn 0 ; } +static int +annotation_line__print (struct annotation_line *al,struct symbol *sym,u64 start, +struct perf_evsel *evsel,u64 len,int min_pcnt,int printed, +int max_lines,struct annotation_line *aq) +{ + struct disasm_line *dl = container_of(al, struct disasm_line, al); + struct disasm_line *queue = container_of(aq, struct disasm_line, al); + +return disasm_line__print (dl, sym, start, evsel, len, min_pcnt, printed, + max_lines, queue); +} +/* * symbol__parse_objdump_line() parses objdump output (with -d --no-show-raw) * which looks like following
@@ -1790,7 +1802,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,const char *evsel_name =perf_evsel__name (evsel);struct annotation *notes =symbol__annotation (sym);struct sym_hist *h =annotation__histogram (notes, evsel->idx); -struct disasm_line *pos, *queue =NULL ; +struct annotation_line *pos, *queue =NULL ;u64 start =map__rip_2objdump (map, sym->start);int printed =2 , queue_len =0 ;int more =0 ;
@@ -1823,15 +1835,19 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,if (verbose >0 )symbol__annotate_hits (sym, evsel); -list_for_each_entry (pos, ¬es->src->source, al.node) { +list_for_each_entry (pos, ¬es->src->source, node) { +int err; +if (context && queue ==NULL ) { queue = pos; queue_len =0 ; } -switch (disasm_line__print (pos, sym, start, evsel, len, - min_pcnt, printed, max_lines, - queue)) { + err =annotation_line__print (pos, sym, start, evsel, len, + min_pcnt, printed, max_lines, + queue); + +switch (err) {case 0 : ++printed;if (context) {
@@ -1853,7 +1869,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,if (!context)break ;if (queue_len == context) - queue =list_entry (queue->al.node.next,typeof (*queue), al.node); + queue =list_entry (queue->node.next,typeof (*queue), node);else ++queue_len;break ;
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Add annotation_line__print function
perf annotate: Add annotation_line__print function
Commit-ID: 8f25b8197d43885a4cc19bea581e37bf46ed9958 Gitweb: https://git.kernel.org/tip/8f25b8197d43885a4cc19bea581e37bf46ed9958 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:46 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Nov 2017 14:49:44 -0300
perf annotate: Add annotation_line__print function
Separating struct annotation_line display function, it will hold the generic line display code.
--- tools/perf/util/annotate.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-)
tools/perf/util/annotate.c +22 -6
@@ -1189,6 +1189,18 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 streturn 0 ; } +static int +annotation_line__print (struct annotation_line *al,struct symbol *sym,u64 start, +struct perf_evsel *evsel,u64 len,int min_pcnt,int printed, +int max_lines,struct annotation_line *aq) +{ + struct disasm_line *dl = container_of(al, struct disasm_line, al); + struct disasm_line *queue = container_of(aq, struct disasm_line, al); + +return disasm_line__print (dl, sym, start, evsel, len, min_pcnt, printed, + max_lines, queue); +} +/* * symbol__parse_objdump_line() parses objdump output (with -d --no-show-raw) * which looks like following
@@ -1797,7 +1809,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,const char *evsel_name =perf_evsel__name (evsel);struct annotation *notes =symbol__annotation (sym);struct sym_hist *h =annotation__histogram (notes, evsel->idx); -struct disasm_line *pos, *queue =NULL ; +struct annotation_line *pos, *queue =NULL ;u64 start =map__rip_2objdump (map, sym->start);int printed =2 , queue_len =0 ;int more =0 ;
@@ -1830,15 +1842,19 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,if (verbose >0 )symbol__annotate_hits (sym, evsel); -list_for_each_entry (pos, ¬es->src->source, al.node) { +list_for_each_entry (pos, ¬es->src->source, node) { +int err; +if (context && queue ==NULL ) { queue = pos; queue_len =0 ; } -switch (disasm_line__print (pos, sym, start, evsel, len, - min_pcnt, printed, max_lines, - queue)) { + err =annotation_line__print (pos, sym, start, evsel, len, + min_pcnt, printed, max_lines, + queue); + +switch (err) {case 0 : ++printed;if (context) {
@@ -1860,7 +1876,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,if (!context)break ;if (queue_len == context) - queue =list_entry (queue->al.node.next,typeof (*queue), al.node); + queue =list_entry (queue->node.next,typeof (*queue), node);else ++queue_len;break ;
Jiri Olsa
reviewerPATCH 24/35 perf annotate: Factor annotation_line__print from disasm_line__print
In reply to Jiri OlsaMove generic annotation line display code intoannotation_line__print function.
--- tools/perf/util/annotate.c | 69 ++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 36 deletions(-)
tools/perf/util/annotate.c +33 -36
@@ -1083,24 +1083,36 @@ static void annotate__branch_printf(struct block_range *br, u64 addr) } -static int disasm_line__print (struct disasm_line *dl,struct symbol *sym,u64 start, -struct perf_evsel *evsel,u64 len,int min_pcnt,int printed, -int max_lines,struct disasm_line *queue) +static int disasm_line__print (struct disasm_line *dl,u64 start) { +s64 offset = dl->al.offset; +const u64 addr = start + offset; +struct block_range *br; + + br =block_range__find (addr); +color_fprintf (stdout,annotate__address_color (br)," %" PRIx64":" , addr); +color_fprintf (stdout,annotate__asm_color (br),"%s" , dl->al.line); +annotate__branch_printf (br, addr); +return 0 ; +} + +static int +annotation_line__print (struct annotation_line *al,struct symbol *sym,u64 start, +struct perf_evsel *evsel,u64 len,int min_pcnt,int printed, +int max_lines,struct annotation_line *queue) +{ + struct disasm_line *dl = container_of(al, struct disasm_line, al);static const char *prev_line;static const char *prev_color; -if (dl->al.offset !=-1 ) { +if (al->offset !=-1 ) {double max_percent =0.0 ;int i, nr_percent =1 ;const char *color;struct annotation *notes =symbol__annotation (sym); -s64 offset = dl->al.offset; -const u64 addr = start + offset; -struct block_range *br; -for (i =0 ; i < dl->al.samples_nr; i++) { -struct annotation_data *sample = &dl->al.samples[i]; +for (i =0 ; i < al->samples_nr; i++) { +struct annotation_data *sample = &al->samples[i];if (sample->percent > max_percent) max_percent = sample->percent;
@@ -1113,11 +1125,11 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 streturn 1 ;if (queue !=NULL ) { -list_for_each_entry_from (queue, ¬es->src->source, al.node) { -if (queue == dl) +list_for_each_entry_from (queue, ¬es->src->source, node) { +if (queue == al)break ; -disasm_line__print (queue, sym, start, evsel, len, -0 ,0 ,1 ,NULL ); +annotation_line__print (queue, sym, start, evsel, len, +0 ,0 ,1 ,NULL ); } }
@@ -1128,17 +1140,17 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 st* the same color than the percentage. Don't print it * twice for close colored addr with the same filename:line */ -if (dl->al.path) { -if (!prev_line ||strcmp (prev_line, dl->al.path) +if (al->path) { +if (!prev_line ||strcmp (prev_line, al->path) || color != prev_color) { -color_fprintf (stdout, color," %s" , dl->al.path); - prev_line = dl->al.path; +color_fprintf (stdout, color," %s" , al->path); + prev_line = al->path; prev_color = color; } }for (i =0 ; i < nr_percent; i++) { -struct annotation_data *sample = &dl->al.samples[i]; +struct annotation_data *sample = &al->samples[i]; color =get_percent_color (sample->percent);
@@ -1154,10 +1166,7 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 stprintf (" : " ); - br =block_range__find (addr); -color_fprintf (stdout,annotate__address_color (br)," %" PRIx64":" , addr); -color_fprintf (stdout,annotate__asm_color (br),"%s" , dl->al.line); -annotate__branch_printf (br, addr); +disasm_line__print (dl, start);printf ("\n" ); }else if (max_lines && printed >= max_lines)return 1 ;
@@ -1170,27 +1179,15 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 stif (perf_evsel__is_group_event (evsel)) width *= evsel->nr_members; -if (!*dl->al.line) +if (!*al->line)printf (" %*s:\n" , width," " );else -printf (" %*s: %s\n" , width," " , dl->al.line); +printf (" %*s: %s\n" , width," " , al->line); }return 0 ; } -static int -annotation_line__print (struct annotation_line *al,struct symbol *sym,u64 start, -struct perf_evsel *evsel,u64 len,int min_pcnt,int printed, -int max_lines,struct annotation_line *aq) -{ - struct disasm_line *dl = container_of(al, struct disasm_line, al); - struct disasm_line *queue = container_of(aq, struct disasm_line, al); - -return disasm_line__print (dl, sym, start, evsel, len, min_pcnt, printed, - max_lines, queue); -} -/* * symbol__parse_objdump_line() parses objdump output (with -d --no-show-raw) * which looks like following
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Factor annotation_line__print from disasm_line__print
perf annotate: Factor annotation_line__print from disasm_line__print
Commit-ID: 29971f9a82a5d005b37d65fbb73edaf9073279b0 Gitweb: https://git.kernel.org/tip/29971f9a82a5d005b37d65fbb73edaf9073279b0 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:47 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Nov 2017 14:49:44 -0300
perf annotate: Factor annotation_line__print from disasm_line__print
Move generic annotation line display code into annotation_line__print function.
--- tools/perf/util/annotate.c | 69 ++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 36 deletions(-)
tools/perf/util/annotate.c +33 -36
@@ -1093,24 +1093,36 @@ static void annotate__branch_printf(struct block_range *br, u64 addr) } -static int disasm_line__print (struct disasm_line *dl,struct symbol *sym,u64 start, -struct perf_evsel *evsel,u64 len,int min_pcnt,int printed, -int max_lines,struct disasm_line *queue) +static int disasm_line__print (struct disasm_line *dl,u64 start) { +s64 offset = dl->al.offset; +const u64 addr = start + offset; +struct block_range *br; + + br =block_range__find (addr); +color_fprintf (stdout,annotate__address_color (br)," %" PRIx64":" , addr); +color_fprintf (stdout,annotate__asm_color (br),"%s" , dl->al.line); +annotate__branch_printf (br, addr); +return 0 ; +} + +static int +annotation_line__print (struct annotation_line *al,struct symbol *sym,u64 start, +struct perf_evsel *evsel,u64 len,int min_pcnt,int printed, +int max_lines,struct annotation_line *queue) +{ + struct disasm_line *dl = container_of(al, struct disasm_line, al);static const char *prev_line;static const char *prev_color; -if (dl->al.offset !=-1 ) { +if (al->offset !=-1 ) {double max_percent =0.0 ;int i, nr_percent =1 ;const char *color;struct annotation *notes =symbol__annotation (sym); -s64 offset = dl->al.offset; -const u64 addr = start + offset; -struct block_range *br; -for (i =0 ; i < dl->al.samples_nr; i++) { -struct annotation_data *sample = &dl->al.samples[i]; +for (i =0 ; i < al->samples_nr; i++) { +struct annotation_data *sample = &al->samples[i];if (sample->percent > max_percent) max_percent = sample->percent;
@@ -1123,11 +1135,11 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 streturn 1 ;if (queue !=NULL ) { -list_for_each_entry_from (queue, ¬es->src->source, al.node) { -if (queue == dl) +list_for_each_entry_from (queue, ¬es->src->source, node) { +if (queue == al)break ; -disasm_line__print (queue, sym, start, evsel, len, -0 ,0 ,1 ,NULL ); +annotation_line__print (queue, sym, start, evsel, len, +0 ,0 ,1 ,NULL ); } }
@@ -1138,17 +1150,17 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 st* the same color than the percentage. Don't print it * twice for close colored addr with the same filename:line */ -if (dl->al.path) { -if (!prev_line ||strcmp (prev_line, dl->al.path) +if (al->path) { +if (!prev_line ||strcmp (prev_line, al->path) || color != prev_color) { -color_fprintf (stdout, color," %s" , dl->al.path); - prev_line = dl->al.path; +color_fprintf (stdout, color," %s" , al->path); + prev_line = al->path; prev_color = color; } }for (i =0 ; i < nr_percent; i++) { -struct annotation_data *sample = &dl->al.samples[i]; +struct annotation_data *sample = &al->samples[i]; color =get_percent_color (sample->percent);
@@ -1164,10 +1176,7 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 stprintf (" : " ); - br =block_range__find (addr); -color_fprintf (stdout,annotate__address_color (br)," %" PRIx64":" , addr); -color_fprintf (stdout,annotate__asm_color (br),"%s" , dl->al.line); -annotate__branch_printf (br, addr); +disasm_line__print (dl, start);printf ("\n" ); }else if (max_lines && printed >= max_lines)return 1 ;
@@ -1180,27 +1189,15 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 stif (perf_evsel__is_group_event (evsel)) width *= evsel->nr_members; -if (!*dl->al.line) +if (!*al->line)printf (" %*s:\n" , width," " );else -printf (" %*s: %s\n" , width," " , dl->al.line); +printf (" %*s: %s\n" , width," " , al->line); }return 0 ; } -static int -annotation_line__print (struct annotation_line *al,struct symbol *sym,u64 start, -struct perf_evsel *evsel,u64 len,int min_pcnt,int printed, -int max_lines,struct annotation_line *aq) -{ - struct disasm_line *dl = container_of(al, struct disasm_line, al); - struct disasm_line *queue = container_of(aq, struct disasm_line, al); - -return disasm_line__print (dl, sym, start, evsel, len, min_pcnt, printed, - max_lines, queue); -} -/* * symbol__parse_objdump_line() parses objdump output (with -d --no-show-raw) * which looks like following
Jiri Olsa
reviewerPATCH 25/35 perf annotate browser: Use samples data from struct annotation_line
In reply to Jiri OlsaWe now carry the data in 'struct annotation_line', so using it instead of samples from 'struct browser_disasm_line' and removing it and its setup.
--- tools/perf/ui/browsers/annotate.c | 57 ++++++++++++++------------------------- 1 file changed, 20 insertions(+), 37 deletions(-)
tools/perf/ui/browsers/annotate.c +20 -37
@@ -28,11 +28,6 @@ struct browser_disasm_line {u32 idx;int idx_asm;int jump_sources; -/* -* actual length of this array is saved on the nr_events field -* of the struct annotate_browser -*/ -struct disasm_line_samples samples[1 ]; }; static struct annotate_browser_opt {
@@ -75,9 +70,7 @@ struct annotate_browser {static inline struct browser_disasm_line *disasm_line__browser (struct disasm_line *dl) { -struct annotation_line *al = &dl->al; - -return (void *) al - al->privsize; +return (void *) dl -sizeof (struct browser_disasm_line ); } static bool disasm_line__filter(struct ui_browser *browser __maybe_unused,
@@ -138,8 +131,8 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intbool show_title = false;for (i =0 ; i < ab->nr_events; i++) { -if (bdl->samples[i].percent > percent_max) - percent_max = bdl->samples[i].percent; +if (dl->al.samples[i].percent > percent_max) + percent_max = dl->al.samples[i].percent; }if ((row ==0 ) && (dl->al.offset ==-1 || percent_max ==0.0 )) {
@@ -153,17 +146,17 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intif (dl->al.offset !=-1 && percent_max !=0.0 ) {for (i =0 ; i < ab->nr_events; i++) {ui_browser__set_percent_color (browser, - bdl->samples[i].percent, + dl->al.samples[i].percent, current_entry);if (annotate_browser__opts.show_total_period) {ui_browser__printf (browser,"%11" PRIu64" " , - bdl->samples[i].he.period); + dl->al.samples[i].he.period); }else if (annotate_browser__opts.show_nr_samples) {ui_browser__printf (browser,"%6" PRIu64" " , - bdl->samples[i].he.nr_samples); + dl->al.samples[i].he.nr_samples); }else {ui_browser__printf (browser,"%6.2f " , - bdl->samples[i].percent); + dl->al.samples[i].percent); } } }else {
@@ -362,11 +355,9 @@ static unsigned int annotate_browser__refresh(struct ui_browser *browser)return ret; } -static int disasm__cmp (struct disasm_line *da, -struct disasm_line *db,int nr_pcnt) +static int disasm__cmp (struct annotation_line *a, +struct annotation_line *b,int nr_pcnt) { -struct browser_disasm_line *a =disasm_line__browser (da); -struct browser_disasm_line *b =disasm_line__browser (db);int i;for (i =0 ; i < nr_pcnt; i++) {
@@ -377,24 +368,24 @@ static int disasm__cmp(struct disasm_line *da,return 0 ; } -static void disasm_rb_tree__insert (struct rb_root *root,struct disasm_line *dl, +static void disasm_rb_tree__insert (struct rb_root *root,struct annotation_line *al,int nr_events) {struct rb_node **p = &root->rb_node;struct rb_node *parent =NULL ; -struct disasm_line *l; +struct annotation_line *l;while (*p !=NULL ) { parent = *p; - l = rb_entry(parent, struct disasm_line, al.rb_node); + l = rb_entry(parent, struct annotation_line, rb_node); -if (disasm__cmp (dl, l, nr_events)) +if (disasm__cmp (al, l, nr_events)) p = &(*p)->rb_left;else p = &(*p)->rb_right; } -rb_link_node (&dl->al.rb_node, parent, p); -rb_insert_color (&dl->al.rb_node, root); +rb_link_node (&al->rb_node, parent, p); +rb_insert_color (&al->rb_node, root); } static void annotate_browser__set_top(struct annotate_browser *browser,
@@ -449,7 +440,6 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser)pthread_mutex_lock (¬es->lock);list_for_each_entry (pos, ¬es->src->source, al.node) { -struct browser_disasm_line *bpos =disasm_line__browser (pos);double max_percent =0.0 ;int i;
@@ -461,18 +451,15 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser)for (i =0 ; i < browser->nr_events; i++) {struct annotation_data *sample = &pos->al.samples[i]; - bpos->samples[i].percent = sample->percent; - bpos->samples[i].he = sample->he; - -if (max_percent < bpos->samples[i].percent) - max_percent = bpos->samples[i].percent; +if (max_percent < sample->percent) + max_percent = sample->percent; }if (max_percent <0.01 && pos->al.ipc ==0 ) {RB_CLEAR_NODE (&pos->al.rb_node);continue ; } -disasm_rb_tree__insert (&browser->entries, pos, +disasm_rb_tree__insert (&browser->entries, &pos->al, browser->nr_events); }pthread_mutex_unlock (¬es->lock);
@@ -1092,7 +1079,6 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, };int ret =-1 , err;int nr_pcnt =1 ; -size_t sizeof_bdl =sizeof (struct browser_disasm_line );if (sym ==NULL )return -1 ;
@@ -1108,14 +1094,11 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,return -1 ; } -if (perf_evsel__is_group_event (evsel)) { +if (perf_evsel__is_group_event (evsel)) nr_pcnt = evsel->nr_members; - sizeof_bdl +=sizeof (struct disasm_line_samples ) * - (nr_pcnt -1 ); - } err =symbol__annotate (sym, map, evsel, - sizeof_bdl, &browser.arch, +sizeof (struct browser_disasm_line ), &browser.arch,perf_evsel__env_cpuid (evsel));if (err) {char msg[BUFSIZ ];
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate browser: Use samples data from struct annotation_line
perf annotate browser: Use samples data from struct annotation_line
Commit-ID: 3ab6db8d0f3b19b93a8de25e3b7ab5fdaac47679 Gitweb: https://git.kernel.org/tip/3ab6db8d0f3b19b93a8de25e3b7ab5fdaac47679 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:48 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Nov 2017 14:49:45 -0300
perf annotate browser: Use samples data from struct annotation_line
We now carry the data in 'struct annotation_line', so using it instead of samples from 'struct browser_disasm_line' and removing it and its setup.
--- tools/perf/ui/browsers/annotate.c | 57 ++++++++++++++------------------------- 1 file changed, 20 insertions(+), 37 deletions(-)
tools/perf/ui/browsers/annotate.c +20 -37
@@ -29,11 +29,6 @@ struct browser_disasm_line {u32 idx;int idx_asm;int jump_sources; -/* -* actual length of this array is saved on the nr_events field -* of the struct annotate_browser -*/ -struct disasm_line_samples samples[1 ]; }; static struct annotate_browser_opt {
@@ -76,9 +71,7 @@ struct annotate_browser {static inline struct browser_disasm_line *disasm_line__browser (struct disasm_line *dl) { -struct annotation_line *al = &dl->al; - -return (void *) al - al->privsize; +return (void *) dl -sizeof (struct browser_disasm_line ); } static bool disasm_line__filter(struct ui_browser *browser __maybe_unused,
@@ -139,8 +132,8 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intbool show_title = false;for (i =0 ; i < ab->nr_events; i++) { -if (bdl->samples[i].percent > percent_max) - percent_max = bdl->samples[i].percent; +if (dl->al.samples[i].percent > percent_max) + percent_max = dl->al.samples[i].percent; }if ((row ==0 ) && (dl->al.offset ==-1 || percent_max ==0.0 )) {
@@ -154,17 +147,17 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intif (dl->al.offset !=-1 && percent_max !=0.0 ) {for (i =0 ; i < ab->nr_events; i++) {ui_browser__set_percent_color (browser, - bdl->samples[i].percent, + dl->al.samples[i].percent, current_entry);if (annotate_browser__opts.show_total_period) {ui_browser__printf (browser,"%11" PRIu64" " , - bdl->samples[i].he.period); + dl->al.samples[i].he.period); }else if (annotate_browser__opts.show_nr_samples) {ui_browser__printf (browser,"%6" PRIu64" " , - bdl->samples[i].he.nr_samples); + dl->al.samples[i].he.nr_samples); }else {ui_browser__printf (browser,"%6.2f " , - bdl->samples[i].percent); + dl->al.samples[i].percent); } } }else {
@@ -363,11 +356,9 @@ static unsigned int annotate_browser__refresh(struct ui_browser *browser)return ret; } -static int disasm__cmp (struct disasm_line *da, -struct disasm_line *db,int nr_pcnt) +static int disasm__cmp (struct annotation_line *a, +struct annotation_line *b,int nr_pcnt) { -struct browser_disasm_line *a =disasm_line__browser (da); -struct browser_disasm_line *b =disasm_line__browser (db);int i;for (i =0 ; i < nr_pcnt; i++) {
@@ -378,24 +369,24 @@ static int disasm__cmp(struct disasm_line *da,return 0 ; } -static void disasm_rb_tree__insert (struct rb_root *root,struct disasm_line *dl, +static void disasm_rb_tree__insert (struct rb_root *root,struct annotation_line *al,int nr_events) {struct rb_node **p = &root->rb_node;struct rb_node *parent =NULL ; -struct disasm_line *l; +struct annotation_line *l;while (*p !=NULL ) { parent = *p; - l = rb_entry(parent, struct disasm_line, al.rb_node); + l = rb_entry(parent, struct annotation_line, rb_node); -if (disasm__cmp (dl, l, nr_events)) +if (disasm__cmp (al, l, nr_events)) p = &(*p)->rb_left;else p = &(*p)->rb_right; } -rb_link_node (&dl->al.rb_node, parent, p); -rb_insert_color (&dl->al.rb_node, root); +rb_link_node (&al->rb_node, parent, p); +rb_insert_color (&al->rb_node, root); } static void annotate_browser__set_top(struct annotate_browser *browser,
@@ -453,7 +444,6 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,symbol__calc_percent (sym, evsel);list_for_each_entry (pos, ¬es->src->source, al.node) { -struct browser_disasm_line *bpos =disasm_line__browser (pos);double max_percent =0.0 ;int i;
@@ -465,18 +455,15 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,for (i =0 ; i < browser->nr_events; i++) {struct annotation_data *sample = &pos->al.samples[i]; - bpos->samples[i].percent = sample->percent; - bpos->samples[i].he = sample->he; - -if (max_percent < bpos->samples[i].percent) - max_percent = bpos->samples[i].percent; +if (max_percent < sample->percent) + max_percent = sample->percent; }if (max_percent <0.01 && pos->al.ipc ==0 ) {RB_CLEAR_NODE (&pos->al.rb_node);continue ; } -disasm_rb_tree__insert (&browser->entries, pos, +disasm_rb_tree__insert (&browser->entries, &pos->al, browser->nr_events); }pthread_mutex_unlock (¬es->lock);
@@ -1096,7 +1083,6 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, };int ret =-1 , err;int nr_pcnt =1 ; -size_t sizeof_bdl =sizeof (struct browser_disasm_line );if (sym ==NULL )return -1 ;
@@ -1112,14 +1098,11 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,return -1 ; } -if (perf_evsel__is_group_event (evsel)) { +if (perf_evsel__is_group_event (evsel)) nr_pcnt = evsel->nr_members; - sizeof_bdl +=sizeof (struct disasm_line_samples ) * - (nr_pcnt -1 ); - } err =symbol__annotate (sym, map, evsel, - sizeof_bdl, &browser.arch, +sizeof (struct browser_disasm_line ), &browser.arch,perf_evsel__env_cpuid (evsel));if (err) {char msg[BUFSIZ ];
Jiri Olsa
reviewerPATCH 26/35 perf annotate browser: Do not pass nr_events in disasm_rb_tree__insert
In reply to Jiri OlsaWe keep samples_nr in struct annotation_line, so there's no need to pass nr_events to disasm_rb_tree__insert function.
--- tools/perf/ui/browsers/annotate.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-)
tools/perf/ui/browsers/annotate.c +6 -9
@@ -355,12 +355,11 @@ static unsigned int annotate_browser__refresh(struct ui_browser *browser)return ret; } -static int disasm__cmp (struct annotation_line *a, -struct annotation_line *b,int nr_pcnt) +static int disasm__cmp (struct annotation_line *a,struct annotation_line *b) {int i; -for (i =0 ; i < nr_pcnt; i++) { +for (i =0 ; i < a->samples_nr; i++) {if (a->samples[i].percent == b->samples[i].percent)continue ;return a->samples[i].percent < b->samples[i].percent;
@@ -368,8 +367,7 @@ static int disasm__cmp(struct annotation_line *a,return 0 ; } -static void disasm_rb_tree__insert (struct rb_root *root,struct annotation_line *al, -int nr_events) +static void disasm_rb_tree__insert (struct rb_root *root,struct annotation_line *al) {struct rb_node **p = &root->rb_node;struct rb_node *parent =NULL ;
@@ -379,7 +377,7 @@ static void disasm_rb_tree__insert(struct rb_root *root, struct annotation_line parent = *p; l = rb_entry(parent, struct annotation_line, rb_node); -if (disasm__cmp (al, l, nr_events)) +if (disasm__cmp (al, l)) p = &(*p)->rb_left;else p = &(*p)->rb_right;
@@ -448,7 +446,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser)continue ; } -for (i =0 ; i < browser->nr_events; i++) { +for (i =0 ; i < pos->al.samples_nr; i++) {struct annotation_data *sample = &pos->al.samples[i];if (max_percent < sample->percent)
@@ -459,8 +457,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser)RB_CLEAR_NODE (&pos->al.rb_node);continue ; } -disasm_rb_tree__insert (&browser->entries, &pos->al, - browser->nr_events); +disasm_rb_tree__insert (&browser->entries, &pos->al); }pthread_mutex_unlock (¬es->lock);
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate browser: Do not pass nr_events in disasm_rb_tree__insert
perf annotate browser: Do not pass nr_events in disasm_rb_tree__insert
Commit-ID: b15636c62f3a32a8560ea6a32245ec49edd60c6b Gitweb: https://git.kernel.org/tip/b15636c62f3a32a8560ea6a32245ec49edd60c6b Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:49 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Nov 2017 14:49:45 -0300
perf annotate browser: Do not pass nr_events in disasm_rb_tree__insert
We now keep samples_nr in struct annotation_line, so there's no need to pass nr_events to disasm_rb_tree__insert function.
--- tools/perf/ui/browsers/annotate.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-)
tools/perf/ui/browsers/annotate.c +6 -9
@@ -356,12 +356,11 @@ static unsigned int annotate_browser__refresh(struct ui_browser *browser)return ret; } -static int disasm__cmp (struct annotation_line *a, -struct annotation_line *b,int nr_pcnt) +static int disasm__cmp (struct annotation_line *a,struct annotation_line *b) {int i; -for (i =0 ; i < nr_pcnt; i++) { +for (i =0 ; i < a->samples_nr; i++) {if (a->samples[i].percent == b->samples[i].percent)continue ;return a->samples[i].percent < b->samples[i].percent;
@@ -369,8 +368,7 @@ static int disasm__cmp(struct annotation_line *a,return 0 ; } -static void disasm_rb_tree__insert (struct rb_root *root,struct annotation_line *al, -int nr_events) +static void disasm_rb_tree__insert (struct rb_root *root,struct annotation_line *al) {struct rb_node **p = &root->rb_node;struct rb_node *parent =NULL ;
@@ -380,7 +378,7 @@ static void disasm_rb_tree__insert(struct rb_root *root, struct annotation_line parent = *p; l = rb_entry(parent, struct annotation_line, rb_node); -if (disasm__cmp (al, l, nr_events)) +if (disasm__cmp (al, l)) p = &(*p)->rb_left;else p = &(*p)->rb_right;
@@ -452,7 +450,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,continue ; } -for (i =0 ; i < browser->nr_events; i++) { +for (i =0 ; i < pos->al.samples_nr; i++) {struct annotation_data *sample = &pos->al.samples[i];if (max_percent < sample->percent)
@@ -463,8 +461,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,RB_CLEAR_NODE (&pos->al.rb_node);continue ; } -disasm_rb_tree__insert (&browser->entries, &pos->al, - browser->nr_events); +disasm_rb_tree__insert (&browser->entries, &pos->al); }pthread_mutex_unlock (¬es->lock);
Jiri Olsa
reviewerPATCH 27/35 perf annotate browser: Rename struct browser_disasm_line to browser_line
In reply to Jiri OlsaRenaming struct browser_disasm_line to browser_line.
--- tools/perf/ui/browsers/annotate.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-)
tools/perf/ui/browsers/annotate.c +13 -13
@@ -24,10 +24,10 @@ struct disasm_line_samples {#define IPC_WIDTH 6#define CYCLES_WIDTH 6 -struct browser_disasm_line { -u32 idx; -int idx_asm; -int jump_sources; +struct browser_line { +u32 idx; +int idx_asm; +int jump_sources; }; static struct annotate_browser_opt {
@@ -68,9 +68,9 @@ struct annotate_browser {char search_bf[128 ]; }; -static inline struct browser_disasm_line *disasm_line__browser (struct disasm_line *dl) +static inline struct browser_line *disasm_line__browser (struct disasm_line *dl) { -return (void *) dl -sizeof (struct browser_disasm_line ); +return (void *) dl -sizeof (struct browser_line ); } static bool disasm_line__filter(struct ui_browser *browser __maybe_unused,
@@ -118,7 +118,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); struct disasm_line *dl = list_entry(entry, struct disasm_line, al.node); -struct browser_disasm_line *bdl =disasm_line__browser (dl); +struct browser_line *bdl =disasm_line__browser (dl);bool current_entry =ui_browser__is_current_entry (browser, row); bool change_color = (!annotate_browser__opts.hide_src_code && (!current_entry || (browser->use_navkeypressed &&
@@ -301,7 +301,7 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser) { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);struct disasm_line *cursor = ab->selection, *target; -struct browser_disasm_line *btarget, *bcursor; +struct browser_line *btarget, *bcursor;unsigned int from, to;struct map_symbol *ms = ab->b.priv;struct symbol *sym = ms->sym;
@@ -412,7 +412,7 @@ static void annotate_browser__set_top(struct annotate_browser *browser,static void annotate_browser__set_rb_top (struct annotate_browser *browser,struct rb_node *nd) { -struct browser_disasm_line *bpos; +struct browser_line *bpos;struct disasm_line *pos;u32 idx;
@@ -467,7 +467,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser)static bool annotate_browser__toggle_source (struct annotate_browser *browser) {struct disasm_line *dl; -struct browser_disasm_line *bdl; +struct browser_line *bdl;off_t offset = browser->b.index - browser->b.top_idx; browser->b.seek (&browser->b, offset,SEEK_CUR );
@@ -1023,7 +1023,7 @@ static void annotate_browser__mark_jump_targets(struct annotate_browser *browserfor (offset =0 ; offset < size; ++offset) {struct disasm_line *dl = browser->offsets[offset], *dlt; -struct browser_disasm_line *bdlt; +struct browser_line *bdlt;if (!disasm_line__is_valid_jump (dl, sym))continue ;
@@ -1095,7 +1095,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, nr_pcnt = evsel->nr_members; err =symbol__annotate (sym, map, evsel, -sizeof (struct browser_disasm_line ), &browser.arch, +sizeof (struct browser_line ), &browser.arch,perf_evsel__env_cpuid (evsel));if (err) {char msg[BUFSIZ ];
@@ -1110,7 +1110,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, browser.start =map__rip_2objdump (map, sym->start);list_for_each_entry (pos, ¬es->src->source, al.node) { -struct browser_disasm_line *bpos; +struct browser_line *bpos;size_t line_len =strlen (pos->al.line);if (browser.b.width < line_len)
Signature · 1 line
2.13.6
PATCH v2 27/35 perf annotate browser: Rename struct browser_disasm_line to browser_line
Quoted 1 line · Jiri Olsa
Renaming struct
browser_disasm_linetobrowser_line.
v2 with update changelog attached
jirka
---
Renaming struct browser_disasm_line to browser_line, because the browser operates now on generic lines and no longer on disasm lines.
--- tools/perf/ui/browsers/annotate.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-)
tools/perf/ui/browsers/annotate.c +13 -13
@@ -24,10 +24,10 @@ struct disasm_line_samples {#define IPC_WIDTH 6#define CYCLES_WIDTH 6 -struct browser_disasm_line { -u32 idx; -int idx_asm; -int jump_sources; +struct browser_line { +u32 idx; +int idx_asm; +int jump_sources; }; static struct annotate_browser_opt {
@@ -68,9 +68,9 @@ struct annotate_browser {char search_bf[128 ]; }; -static inline struct browser_disasm_line *disasm_line__browser (struct disasm_line *dl) +static inline struct browser_line *disasm_line__browser (struct disasm_line *dl) { -return (void *) dl -sizeof (struct browser_disasm_line ); +return (void *) dl -sizeof (struct browser_line ); } static bool disasm_line__filter(struct ui_browser *browser __maybe_unused,
@@ -118,7 +118,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); struct disasm_line *dl = list_entry(entry, struct disasm_line, al.node); -struct browser_disasm_line *bdl =disasm_line__browser (dl); +struct browser_line *bdl =disasm_line__browser (dl);bool current_entry =ui_browser__is_current_entry (browser, row); bool change_color = (!annotate_browser__opts.hide_src_code && (!current_entry || (browser->use_navkeypressed &&
@@ -301,7 +301,7 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser) { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);struct disasm_line *cursor = ab->selection, *target; -struct browser_disasm_line *btarget, *bcursor; +struct browser_line *btarget, *bcursor;unsigned int from, to;struct map_symbol *ms = ab->b.priv;struct symbol *sym = ms->sym;
@@ -412,7 +412,7 @@ static void annotate_browser__set_top(struct annotate_browser *browser,static void annotate_browser__set_rb_top (struct annotate_browser *browser,struct rb_node *nd) { -struct browser_disasm_line *bpos; +struct browser_line *bpos;struct disasm_line *pos;u32 idx;
@@ -467,7 +467,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser)static bool annotate_browser__toggle_source (struct annotate_browser *browser) {struct disasm_line *dl; -struct browser_disasm_line *bdl; +struct browser_line *bdl;off_t offset = browser->b.index - browser->b.top_idx; browser->b.seek (&browser->b, offset,SEEK_CUR );
@@ -1023,7 +1023,7 @@ static void annotate_browser__mark_jump_targets(struct annotate_browser *browserfor (offset =0 ; offset < size; ++offset) {struct disasm_line *dl = browser->offsets[offset], *dlt; -struct browser_disasm_line *bdlt; +struct browser_line *bdlt;if (!disasm_line__is_valid_jump (dl, sym))continue ;
@@ -1095,7 +1095,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, nr_pcnt = evsel->nr_members; err =symbol__annotate (sym, map, evsel, -sizeof (struct browser_disasm_line ), &browser.arch, +sizeof (struct browser_line ), &browser.arch,perf_evsel__env_cpuid (evsel));if (err) {char msg[BUFSIZ ];
@@ -1110,7 +1110,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, browser.start =map__rip_2objdump (map, sym->start);list_for_each_entry (pos, ¬es->src->source, al.node) { -struct browser_disasm_line *bpos; +struct browser_line *bpos;size_t line_len =strlen (pos->al.line);if (browser.b.width < line_len)
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate browser: Rename struct browser_disasm_line to browser_line
perf annotate browser: Rename struct browser_disasm_line to browser_line
Commit-ID: 0d9579701fee0a482185ab4e8ee7f5ae86f8ae19 Gitweb: https://git.kernel.org/tip/0d9579701fee0a482185ab4e8ee7f5ae86f8ae19 Author: Jiri Olsa <[email protected]> AuthorDate: Mon, 6 Nov 2017 11:55:36 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Nov 2017 14:49:46 -0300
perf annotate browser: Rename struct browser_disasm_line to browser_line
Rename struct browser_disasm_line to browser_line, because the browser operates now on generic lines and no longer on disasm lines.
--- tools/perf/ui/browsers/annotate.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-)
tools/perf/ui/browsers/annotate.c +13 -13
@@ -25,10 +25,10 @@ struct disasm_line_samples {#define IPC_WIDTH 6#define CYCLES_WIDTH 6 -struct browser_disasm_line { -u32 idx; -int idx_asm; -int jump_sources; +struct browser_line { +u32 idx; +int idx_asm; +int jump_sources; }; static struct annotate_browser_opt {
@@ -69,9 +69,9 @@ struct annotate_browser {char search_bf[128 ]; }; -static inline struct browser_disasm_line *disasm_line__browser (struct disasm_line *dl) +static inline struct browser_line *disasm_line__browser (struct disasm_line *dl) { -return (void *) dl -sizeof (struct browser_disasm_line ); +return (void *) dl -sizeof (struct browser_line ); } static bool disasm_line__filter(struct ui_browser *browser __maybe_unused,
@@ -119,7 +119,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); struct disasm_line *dl = list_entry(entry, struct disasm_line, al.node); -struct browser_disasm_line *bdl =disasm_line__browser (dl); +struct browser_line *bdl =disasm_line__browser (dl);bool current_entry =ui_browser__is_current_entry (browser, row); bool change_color = (!annotate_browser__opts.hide_src_code && (!current_entry || (browser->use_navkeypressed &&
@@ -302,7 +302,7 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser) { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);struct disasm_line *cursor = ab->selection, *target; -struct browser_disasm_line *btarget, *bcursor; +struct browser_line *btarget, *bcursor;unsigned int from, to;struct map_symbol *ms = ab->b.priv;struct symbol *sym = ms->sym;
@@ -413,7 +413,7 @@ static void annotate_browser__set_top(struct annotate_browser *browser,static void annotate_browser__set_rb_top (struct annotate_browser *browser,struct rb_node *nd) { -struct browser_disasm_line *bpos; +struct browser_line *bpos;struct disasm_line *pos;u32 idx;
@@ -471,7 +471,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,static bool annotate_browser__toggle_source (struct annotate_browser *browser) {struct disasm_line *dl; -struct browser_disasm_line *bdl; +struct browser_line *bdl;off_t offset = browser->b.index - browser->b.top_idx; browser->b.seek (&browser->b, offset,SEEK_CUR );
@@ -1027,7 +1027,7 @@ static void annotate_browser__mark_jump_targets(struct annotate_browser *browserfor (offset =0 ; offset < size; ++offset) {struct disasm_line *dl = browser->offsets[offset], *dlt; -struct browser_disasm_line *bdlt; +struct browser_line *bdlt;if (!disasm_line__is_valid_jump (dl, sym))continue ;
@@ -1099,7 +1099,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, nr_pcnt = evsel->nr_members; err =symbol__annotate (sym, map, evsel, -sizeof (struct browser_disasm_line ), &browser.arch, +sizeof (struct browser_line ), &browser.arch,perf_evsel__env_cpuid (evsel));if (err) {char msg[BUFSIZ ];
@@ -1114,7 +1114,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, browser.start =map__rip_2objdump (map, sym->start);list_for_each_entry (pos, ¬es->src->source, al.node) { -struct browser_disasm_line *bpos; +struct browser_line *bpos;size_t line_len =strlen (pos->al.line);if (browser.b.width < line_len)
Jiri Olsa
reviewerPATCH 28/35 perf annotate browser: Rename disasm_line__browser to browser_line
In reply to Jiri OlsaRenaming disasm_line__browser function to browser_line.
--- tools/perf/ui/browsers/annotate.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
tools/perf/ui/browsers/annotate.c +8 -8
@@ -68,7 +68,7 @@ struct annotate_browser {char search_bf[128 ]; }; -static inline struct browser_line *disasm_line__browser (struct disasm_line *dl) +static inline struct browser_line *browser_line (struct disasm_line *dl) {return (void *) dl -sizeof (struct browser_line ); }
@@ -118,7 +118,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); struct disasm_line *dl = list_entry(entry, struct disasm_line, al.node); -struct browser_line *bdl =disasm_line__browser (dl); +struct browser_line *bdl =browser_line (dl);bool current_entry =ui_browser__is_current_entry (browser, row); bool change_color = (!annotate_browser__opts.hide_src_code && (!current_entry || (browser->use_navkeypressed &&
@@ -318,8 +318,8 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)if (!target)return ; - bcursor =disasm_line__browser (cursor); - btarget =disasm_line__browser (target); + bcursor =browser_line (cursor); + btarget =browser_line (target);if (annotate_browser__opts.hide_src_code) { from = bcursor->idx_asm;
@@ -417,7 +417,7 @@ static void annotate_browser__set_rb_top(struct annotate_browser *browser,u32 idx; pos = rb_entry(nd, struct disasm_line, al.rb_node); - bpos =disasm_line__browser (pos); + bpos =browser_line (pos); idx = bpos->idx;if (annotate_browser__opts.hide_src_code)
@@ -472,7 +472,7 @@ static bool annotate_browser__toggle_source(struct annotate_browser *browser) browser->b.seek (&browser->b, offset,SEEK_CUR ); dl = list_entry(browser->b.top, struct disasm_line, al.node); - bdl =disasm_line__browser (dl); + bdl =browser_line (dl);if (annotate_browser__opts.hide_src_code) {if (bdl->idx_asm < offset)
@@ -1036,7 +1036,7 @@ static void annotate_browser__mark_jump_targets(struct annotate_browser *browserif (dlt ==NULL )continue ; - bdlt =disasm_line__browser (dlt); + bdlt =browser_line (dlt);if (++bdlt->jump_sources > browser->max_jump_sources) browser->max_jump_sources = bdlt->jump_sources;
@@ -1115,7 +1115,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,if (browser.b.width < line_len) browser.b.width = line_len; - bpos =disasm_line__browser (pos); + bpos =browser_line (pos); bpos->idx = browser.nr_entries++;if (pos->al.offset !=-1 ) { bpos->idx_asm = browser.nr_asm_entries++;
Signature · 1 line
2.13.6
PATCH v2 28/35 perf annotate browser: Rename disasm_line__browser to browser_line
Quoted 1 line · Jiri Olsa
Renaming
disasm_line__browserfunction tobrowser_line.
v2 with updated changelog attached
jirka
---
Renaming disasm_line__browser function to browser_line, because the browser got generic and is no longer disasm specific.
--- tools/perf/ui/browsers/annotate.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
tools/perf/ui/browsers/annotate.c +8 -8
@@ -68,7 +68,7 @@ struct annotate_browser {char search_bf[128 ]; }; -static inline struct browser_line *disasm_line__browser (struct disasm_line *dl) +static inline struct browser_line *browser_line (struct disasm_line *dl) {return (void *) dl -sizeof (struct browser_line ); }
@@ -118,7 +118,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); struct disasm_line *dl = list_entry(entry, struct disasm_line, al.node); -struct browser_line *bdl =disasm_line__browser (dl); +struct browser_line *bdl =browser_line (dl);bool current_entry =ui_browser__is_current_entry (browser, row); bool change_color = (!annotate_browser__opts.hide_src_code && (!current_entry || (browser->use_navkeypressed &&
@@ -318,8 +318,8 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)if (!target)return ; - bcursor =disasm_line__browser (cursor); - btarget =disasm_line__browser (target); + bcursor =browser_line (cursor); + btarget =browser_line (target);if (annotate_browser__opts.hide_src_code) { from = bcursor->idx_asm;
@@ -417,7 +417,7 @@ static void annotate_browser__set_rb_top(struct annotate_browser *browser,u32 idx; pos = rb_entry(nd, struct disasm_line, al.rb_node); - bpos =disasm_line__browser (pos); + bpos =browser_line (pos); idx = bpos->idx;if (annotate_browser__opts.hide_src_code)
@@ -472,7 +472,7 @@ static bool annotate_browser__toggle_source(struct annotate_browser *browser) browser->b.seek (&browser->b, offset,SEEK_CUR ); dl = list_entry(browser->b.top, struct disasm_line, al.node); - bdl =disasm_line__browser (dl); + bdl =browser_line (dl);if (annotate_browser__opts.hide_src_code) {if (bdl->idx_asm < offset)
@@ -1036,7 +1036,7 @@ static void annotate_browser__mark_jump_targets(struct annotate_browser *browserif (dlt ==NULL )continue ; - bdlt =disasm_line__browser (dlt); + bdlt =browser_line (dlt);if (++bdlt->jump_sources > browser->max_jump_sources) browser->max_jump_sources = bdlt->jump_sources;
@@ -1115,7 +1115,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,if (browser.b.width < line_len) browser.b.width = line_len; - bpos =disasm_line__browser (pos); + bpos =browser_line (pos); bpos->idx = browser.nr_entries++;if (pos->al.offset !=-1 ) { bpos->idx_asm = browser.nr_asm_entries++;
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate browser: Rename disasm_line__browser to browser_line
perf annotate browser: Rename disasm_line__browser to browser_line
Commit-ID: daf25d4303cbf1795535b6c0b7172ba6f12aa2bd Gitweb: https://git.kernel.org/tip/daf25d4303cbf1795535b6c0b7172ba6f12aa2bd Author: Jiri Olsa <[email protected]> AuthorDate: Mon, 6 Nov 2017 11:55:52 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Nov 2017 14:49:46 -0300
perf annotate browser: Rename disasm_line__browser to browser_line
Rename disasm_line__browser function to browser_line, because the browser got generic and is no longer disasm specific.
--- tools/perf/ui/browsers/annotate.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
tools/perf/ui/browsers/annotate.c +8 -8
@@ -69,7 +69,7 @@ struct annotate_browser {char search_bf[128 ]; }; -static inline struct browser_line *disasm_line__browser (struct disasm_line *dl) +static inline struct browser_line *browser_line (struct disasm_line *dl) {return (void *) dl -sizeof (struct browser_line ); }
@@ -119,7 +119,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); struct disasm_line *dl = list_entry(entry, struct disasm_line, al.node); -struct browser_line *bdl =disasm_line__browser (dl); +struct browser_line *bdl =browser_line (dl);bool current_entry =ui_browser__is_current_entry (browser, row); bool change_color = (!annotate_browser__opts.hide_src_code && (!current_entry || (browser->use_navkeypressed &&
@@ -319,8 +319,8 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)if (!target)return ; - bcursor =disasm_line__browser (cursor); - btarget =disasm_line__browser (target); + bcursor =browser_line (cursor); + btarget =browser_line (target);if (annotate_browser__opts.hide_src_code) { from = bcursor->idx_asm;
@@ -418,7 +418,7 @@ static void annotate_browser__set_rb_top(struct annotate_browser *browser,u32 idx; pos = rb_entry(nd, struct disasm_line, al.rb_node); - bpos =disasm_line__browser (pos); + bpos =browser_line (pos); idx = bpos->idx;if (annotate_browser__opts.hide_src_code)
@@ -476,7 +476,7 @@ static bool annotate_browser__toggle_source(struct annotate_browser *browser) browser->b.seek (&browser->b, offset,SEEK_CUR ); dl = list_entry(browser->b.top, struct disasm_line, al.node); - bdl =disasm_line__browser (dl); + bdl =browser_line (dl);if (annotate_browser__opts.hide_src_code) {if (bdl->idx_asm < offset)
@@ -1040,7 +1040,7 @@ static void annotate_browser__mark_jump_targets(struct annotate_browser *browserif (dlt ==NULL )continue ; - bdlt =disasm_line__browser (dlt); + bdlt =browser_line (dlt);if (++bdlt->jump_sources > browser->max_jump_sources) browser->max_jump_sources = bdlt->jump_sources;
@@ -1119,7 +1119,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,if (browser.b.width < line_len) browser.b.width = line_len; - bpos =disasm_line__browser (pos); + bpos =browser_line (pos); bpos->idx = browser.nr_entries++;if (pos->al.offset !=-1 ) { bpos->idx_asm = browser.nr_asm_entries++;
Jiri Olsa
reviewerPATCH 29/35 perf annotate browser: Change selection to struct annotation_line
In reply to Jiri OlsaUse struct annotation_line as a browser::selection.
--- tools/perf/ui/browsers/annotate.c | 63 +++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 29 deletions(-)
tools/perf/ui/browsers/annotate.c +34 -29
@@ -46,26 +46,26 @@ static struct annotate_browser_opt {struct arch ;struct annotate_browser { -struct ui_browser b; -struct rb_root entries; -struct rb_node *curr_hot; -struct disasm_line *selection; -struct disasm_line **offsets; -struct arch *arch; -int nr_events; -u64 start; -int nr_asm_entries; -int nr_entries; -int max_jump_sources; -int nr_jumps; -bool searching_backwards; -bool have_cycles; -u8 addr_width; -u8 jumps_width; -u8 target_width; -u8 min_addr_width; -u8 max_addr_width; -char search_bf[128 ]; +struct ui_browser b; +struct rb_root entries; +struct rb_node *curr_hot; +struct annotation_line *selection; +struct disasm_line **offsets; +struct arch *arch; +int nr_events; +u64 start; +int nr_asm_entries; +int nr_entries; +int max_jump_sources; +int nr_jumps; +bool searching_backwards; +bool have_cycles; +u8 addr_width; +u8 jumps_width; +u8 target_width; +u8 min_addr_width; +u8 max_addr_width; +char search_bf[128 ]; };static inline struct browser_line *browser_line (struct disasm_line *dl)
@@ -264,7 +264,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int }if (current_entry) - ab->selection = dl; + ab->selection = &dl->al; }static bool disasm_line__is_valid_jump (struct disasm_line *dl,struct symbol *sym)
@@ -300,7 +300,8 @@ static bool is_fused(struct annotate_browser *ab, struct disasm_line *cursor)static void annotate_browser__draw_current_jump (struct ui_browser *browser) { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); -struct disasm_line *cursor = ab->selection, *target; +struct disasm_line *cursor =disasm_line (ab->selection); +struct disasm_line *target;struct browser_line *btarget, *bcursor;unsigned int from, to;struct map_symbol *ms = ab->b.priv;
@@ -522,7 +523,7 @@ static bool annotate_browser__callq(struct annotate_browser *browser, struct hist_browser_timer *hbt) {struct map_symbol *ms = browser->b.priv; -struct disasm_line *dl = browser->selection; +struct disasm_line *dl =disasm_line (browser->selection);struct annotation *notes;struct addr_map_symbol target = { .map = ms->map,
@@ -580,7 +581,7 @@ struct disasm_line *annotate_browser__find_offset(struct annotate_browser *browsstatic bool annotate_browser__jump (struct annotate_browser *browser) { -struct disasm_line *dl = browser->selection; +struct disasm_line *dl =disasm_line (browser->selection);u64 offset;s64 idx;
@@ -606,7 +607,7 @@ struct disasm_line *annotate_browser__find_string(struct annotate_browser *browsstruct map_symbol *ms = browser->b.priv;struct symbol *sym = ms->sym;struct annotation *notes =symbol__annotation (sym); -struct disasm_line *pos = browser->selection; +struct disasm_line *pos =disasm_line (browser->selection); *idx = browser->b.index;list_for_each_entry_continue (pos, ¬es->src->source, al.node) {
@@ -645,7 +646,7 @@ struct disasm_line *annotate_browser__find_string_reverse(struct annotate_browsestruct map_symbol *ms = browser->b.priv;struct symbol *sym = ms->sym;struct annotation *notes =symbol__annotation (sym); -struct disasm_line *pos = browser->selection; +struct disasm_line *pos =disasm_line (browser->selection); *idx = browser->b.index;list_for_each_entry_continue_reverse (pos, ¬es->src->source, al.node) {
@@ -878,13 +879,16 @@ static int annotate_browser__run(struct annotate_browser *browser,continue ;case K_ENTER :case K_RIGHT : + { +struct disasm_line *dl =disasm_line (browser->selection); +if (browser->selection ==NULL )ui_helpline__puts ("Huh? No selection. Report to [email protected]" ); -else if (browser->selection->al.offset ==-1 ) +else if (browser->selection->offset ==-1 )ui_helpline__puts ("Actions are only available for assembly lines." ); -else if (!browser->selection->ins.ops) +else if (!dl->ins.ops) goto show_sup_ins; -else if (ins__is_ret (&browser->selection->ins)) +else if (ins__is_ret (&dl->ins)) goto out;else if (!(annotate_browser__jump (browser) ||annotate_browser__callq (browser, evsel, hbt))) {
@@ -892,6 +896,7 @@ static int annotate_browser__run(struct annotate_browser *browser,ui_helpline__puts ("Actions are only available for function call/return & jump/branch instructions." ); }continue ; + }case 't' :if (annotate_browser__opts.show_total_period) { annotate_browser__opts.show_total_period = false;
Signature · 1 line
2.13.6
PATCH v2 29/35 perf annotate browser: Change selection to struct annotation_line
Quoted 2 lines · Jiri Olsa
Use struct
annotation_lineas abrowser::selection.
v2 with updated changelog attached
jirka
---
Use struct annotation_line as a browser::selection.
We want to be able to use the annotate_browser for all sorts of source data, so it needs to be able to work over the generic struct annotation_line.
--- tools/perf/ui/browsers/annotate.c | 63 +++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 29 deletions(-)
tools/perf/ui/browsers/annotate.c +34 -29
@@ -46,26 +46,26 @@ static struct annotate_browser_opt {struct arch ;struct annotate_browser { -struct ui_browser b; -struct rb_root entries; -struct rb_node *curr_hot; -struct disasm_line *selection; -struct disasm_line **offsets; -struct arch *arch; -int nr_events; -u64 start; -int nr_asm_entries; -int nr_entries; -int max_jump_sources; -int nr_jumps; -bool searching_backwards; -bool have_cycles; -u8 addr_width; -u8 jumps_width; -u8 target_width; -u8 min_addr_width; -u8 max_addr_width; -char search_bf[128 ]; +struct ui_browser b; +struct rb_root entries; +struct rb_node *curr_hot; +struct annotation_line *selection; +struct disasm_line **offsets; +struct arch *arch; +int nr_events; +u64 start; +int nr_asm_entries; +int nr_entries; +int max_jump_sources; +int nr_jumps; +bool searching_backwards; +bool have_cycles; +u8 addr_width; +u8 jumps_width; +u8 target_width; +u8 min_addr_width; +u8 max_addr_width; +char search_bf[128 ]; };static inline struct browser_line *browser_line (struct disasm_line *dl)
@@ -264,7 +264,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int }if (current_entry) - ab->selection = dl; + ab->selection = &dl->al; }static bool disasm_line__is_valid_jump (struct disasm_line *dl,struct symbol *sym)
@@ -300,7 +300,8 @@ static bool is_fused(struct annotate_browser *ab, struct disasm_line *cursor)static void annotate_browser__draw_current_jump (struct ui_browser *browser) { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); -struct disasm_line *cursor = ab->selection, *target; +struct disasm_line *cursor =disasm_line (ab->selection); +struct disasm_line *target;struct browser_line *btarget, *bcursor;unsigned int from, to;struct map_symbol *ms = ab->b.priv;
@@ -522,7 +523,7 @@ static bool annotate_browser__callq(struct annotate_browser *browser, struct hist_browser_timer *hbt) {struct map_symbol *ms = browser->b.priv; -struct disasm_line *dl = browser->selection; +struct disasm_line *dl =disasm_line (browser->selection);struct annotation *notes;struct addr_map_symbol target = { .map = ms->map,
@@ -580,7 +581,7 @@ struct disasm_line *annotate_browser__find_offset(struct annotate_browser *browsstatic bool annotate_browser__jump (struct annotate_browser *browser) { -struct disasm_line *dl = browser->selection; +struct disasm_line *dl =disasm_line (browser->selection);u64 offset;s64 idx;
@@ -606,7 +607,7 @@ struct disasm_line *annotate_browser__find_string(struct annotate_browser *browsstruct map_symbol *ms = browser->b.priv;struct symbol *sym = ms->sym;struct annotation *notes =symbol__annotation (sym); -struct disasm_line *pos = browser->selection; +struct disasm_line *pos =disasm_line (browser->selection); *idx = browser->b.index;list_for_each_entry_continue (pos, ¬es->src->source, al.node) {
@@ -645,7 +646,7 @@ struct disasm_line *annotate_browser__find_string_reverse(struct annotate_browsestruct map_symbol *ms = browser->b.priv;struct symbol *sym = ms->sym;struct annotation *notes =symbol__annotation (sym); -struct disasm_line *pos = browser->selection; +struct disasm_line *pos =disasm_line (browser->selection); *idx = browser->b.index;list_for_each_entry_continue_reverse (pos, ¬es->src->source, al.node) {
@@ -878,13 +879,16 @@ static int annotate_browser__run(struct annotate_browser *browser,continue ;case K_ENTER :case K_RIGHT : + { +struct disasm_line *dl =disasm_line (browser->selection); +if (browser->selection ==NULL )ui_helpline__puts ("Huh? No selection. Report to [email protected]" ); -else if (browser->selection->al.offset ==-1 ) +else if (browser->selection->offset ==-1 )ui_helpline__puts ("Actions are only available for assembly lines." ); -else if (!browser->selection->ins.ops) +else if (!dl->ins.ops) goto show_sup_ins; -else if (ins__is_ret (&browser->selection->ins)) +else if (ins__is_ret (&dl->ins)) goto out;else if (!(annotate_browser__jump (browser) ||annotate_browser__callq (browser, evsel, hbt))) {
@@ -892,6 +896,7 @@ static int annotate_browser__run(struct annotate_browser *browser,ui_helpline__puts ("Actions are only available for function call/return & jump/branch instructions." ); }continue ; + }case 't' :if (annotate_browser__opts.show_total_period) { annotate_browser__opts.show_total_period = false;
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate browser: Change selection to struct annotation_line
perf annotate browser: Change selection to struct annotation_line
Commit-ID: 7bcbcd589b15eae849d45540832ba4f9530c778e Gitweb: https://git.kernel.org/tip/7bcbcd589b15eae849d45540832ba4f9530c778e Author: Jiri Olsa <[email protected]> AuthorDate: Mon, 6 Nov 2017 11:56:17 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Nov 2017 14:49:47 -0300
perf annotate browser: Change selection to struct annotation_line
Use struct annotation_line as a browser::selection.
We want to be able to use the annotate_browser for all sorts of source data, so it needs to be able to work over the generic struct annotation_line.
--- tools/perf/ui/browsers/annotate.c | 63 +++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 29 deletions(-)
tools/perf/ui/browsers/annotate.c +34 -29
@@ -47,26 +47,26 @@ static struct annotate_browser_opt {struct arch ;struct annotate_browser { -struct ui_browser b; -struct rb_root entries; -struct rb_node *curr_hot; -struct disasm_line *selection; -struct disasm_line **offsets; -struct arch *arch; -int nr_events; -u64 start; -int nr_asm_entries; -int nr_entries; -int max_jump_sources; -int nr_jumps; -bool searching_backwards; -bool have_cycles; -u8 addr_width; -u8 jumps_width; -u8 target_width; -u8 min_addr_width; -u8 max_addr_width; -char search_bf[128 ]; +struct ui_browser b; +struct rb_root entries; +struct rb_node *curr_hot; +struct annotation_line *selection; +struct disasm_line **offsets; +struct arch *arch; +int nr_events; +u64 start; +int nr_asm_entries; +int nr_entries; +int max_jump_sources; +int nr_jumps; +bool searching_backwards; +bool have_cycles; +u8 addr_width; +u8 jumps_width; +u8 target_width; +u8 min_addr_width; +u8 max_addr_width; +char search_bf[128 ]; };static inline struct browser_line *browser_line (struct disasm_line *dl)
@@ -265,7 +265,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int }if (current_entry) - ab->selection = dl; + ab->selection = &dl->al; }static bool disasm_line__is_valid_jump (struct disasm_line *dl,struct symbol *sym)
@@ -301,7 +301,8 @@ static bool is_fused(struct annotate_browser *ab, struct disasm_line *cursor)static void annotate_browser__draw_current_jump (struct ui_browser *browser) { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); -struct disasm_line *cursor = ab->selection, *target; +struct disasm_line *cursor =disasm_line (ab->selection); +struct disasm_line *target;struct browser_line *btarget, *bcursor;unsigned int from, to;struct map_symbol *ms = ab->b.priv;
@@ -526,7 +527,7 @@ static bool annotate_browser__callq(struct annotate_browser *browser, struct hist_browser_timer *hbt) {struct map_symbol *ms = browser->b.priv; -struct disasm_line *dl = browser->selection; +struct disasm_line *dl =disasm_line (browser->selection);struct annotation *notes;struct addr_map_symbol target = { .map = ms->map,
@@ -584,7 +585,7 @@ struct disasm_line *annotate_browser__find_offset(struct annotate_browser *browsstatic bool annotate_browser__jump (struct annotate_browser *browser) { -struct disasm_line *dl = browser->selection; +struct disasm_line *dl =disasm_line (browser->selection);u64 offset;s64 idx;
@@ -610,7 +611,7 @@ struct disasm_line *annotate_browser__find_string(struct annotate_browser *browsstruct map_symbol *ms = browser->b.priv;struct symbol *sym = ms->sym;struct annotation *notes =symbol__annotation (sym); -struct disasm_line *pos = browser->selection; +struct disasm_line *pos =disasm_line (browser->selection); *idx = browser->b.index;list_for_each_entry_continue (pos, ¬es->src->source, al.node) {
@@ -649,7 +650,7 @@ struct disasm_line *annotate_browser__find_string_reverse(struct annotate_browsestruct map_symbol *ms = browser->b.priv;struct symbol *sym = ms->sym;struct annotation *notes =symbol__annotation (sym); -struct disasm_line *pos = browser->selection; +struct disasm_line *pos =disasm_line (browser->selection); *idx = browser->b.index;list_for_each_entry_continue_reverse (pos, ¬es->src->source, al.node) {
@@ -882,13 +883,16 @@ show_help:continue ;case K_ENTER :case K_RIGHT : + { +struct disasm_line *dl =disasm_line (browser->selection); +if (browser->selection ==NULL )ui_helpline__puts ("Huh? No selection. Report to [email protected]" ); -else if (browser->selection->al.offset ==-1 ) +else if (browser->selection->offset ==-1 )ui_helpline__puts ("Actions are only available for assembly lines." ); -else if (!browser->selection->ins.ops) +else if (!dl->ins.ops) goto show_sup_ins; -else if (ins__is_ret (&browser->selection->ins)) +else if (ins__is_ret (&dl->ins)) goto out;else if (!(annotate_browser__jump (browser) ||annotate_browser__callq (browser, evsel, hbt))) {
@@ -896,6 +900,7 @@ show_sup_ins:ui_helpline__puts ("Actions are only available for function call/return & jump/branch instructions." ); }continue ; + }case 't' :if (annotate_browser__opts.show_total_period) { annotate_browser__opts.show_total_period = false;
Jiri Olsa
reviewerPATCH 30/35 perf annotate browser: Change offsets to struct annotation_line
In reply to Jiri OlsaUse struct annotation_line as a browser::offsets array entry.
--- tools/perf/ui/browsers/annotate.c | 49 +++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 20 deletions(-)
tools/perf/ui/browsers/annotate.c +29 -20
@@ -50,7 +50,7 @@ struct annotate_browser {struct rb_root entries;struct rb_node *curr_hot;struct annotation_line *selection; -struct disasm_line **offsets; +struct annotation_line **offsets;struct arch *arch;int nr_events;u64 start;
@@ -302,6 +302,7 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser) struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);struct disasm_line *cursor =disasm_line (ab->selection);struct disasm_line *target; +struct annotation_line *al;struct browser_line *btarget, *bcursor;unsigned int from, to;struct map_symbol *ms = ab->b.priv;
@@ -315,10 +316,12 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)if (!disasm_line__is_valid_jump (cursor, sym))return ; - target = ab->offsets[cursor->ops.target.offset]; -if (!target) + al = ab->offsets[cursor->ops.target.offset]; +if (!al)return ; + target =disasm_line (al); + bcursor =browser_line (cursor); btarget =browser_line (target);
@@ -974,10 +977,10 @@ static void count_and_fill(struct annotate_browser *browser, u64 start, u64 end,return ;for (offset = start; offset <= end; offset++) { -struct disasm_line *dl = browser->offsets[offset]; +struct annotation_line *al = browser->offsets[offset]; -if (dl) - dl->al.ipc = ipc; +if (al) + al->ipc = ipc; } } }
@@ -1002,13 +1005,13 @@ static void annotate__compute_ipc(struct annotate_browser *browser, size_t size, ch = ¬es->src->cycles_hist[offset];if (ch && ch->cycles) { -struct disasm_line *dl; +struct annotation_line *al;if (ch->have_start)count_and_fill (browser, ch->start, offset, ch); - dl = browser->offsets[offset]; -if (dl && ch->num_aggr) - dl->al.cycles = ch->cycles_aggr / ch->num_aggr; + al = browser->offsets[offset]; +if (al && ch->num_aggr) + al->cycles = ch->cycles_aggr / ch->num_aggr; browser->have_cycles = true; } }
@@ -1027,13 +1030,18 @@ static void annotate_browser__mark_jump_targets(struct annotate_browser *browserreturn ;for (offset =0 ; offset < size; ++offset) { -struct disasm_line *dl = browser->offsets[offset], *dlt; +struct annotation_line *al = browser->offsets[offset]; +struct disasm_line *dl, *dlt;struct browser_line *bdlt; + dl =disasm_line (al); +if (!disasm_line__is_valid_jump (dl, sym))continue ; - dlt = browser->offsets[dl->ops.target.offset]; + al = browser->offsets[dl->ops.target.offset]; + dlt =disasm_line (al); +/* * FIXME: Oops, no jump target? Buggy disassembler? Or do we * have to adjust to the previous offset?
@@ -1062,7 +1070,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,struct perf_evsel *evsel, struct hist_browser_timer *hbt) { - struct disasm_line *pos; + struct annotation_line *al;struct annotation *notes;size_t size; struct map_symbol ms = {
@@ -1090,7 +1098,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,if (map->dso->annotate_warned)return -1 ; - browser.offsets =zalloc (size *sizeof (struct disasm_line *)); + browser.offsets =zalloc (size *sizeof (struct annotation_line *));if (browser.offsets ==NULL ) {ui__error ("Not enough memory!" );return -1 ;
@@ -1114,15 +1122,16 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, notes =symbol__annotation (sym); browser.start =map__rip_2objdump (map, sym->start); -list_for_each_entry (pos, ¬es->src->source, al.node) { +list_for_each_entry (al, ¬es->src->source, node) { +struct disasm_line *dl =disasm_line (al);struct browser_line *bpos; -size_t line_len =strlen (pos->al.line); +size_t line_len =strlen (al->line);if (browser.b.width < line_len) browser.b.width = line_len; - bpos =browser_line (pos); + bpos =browser_line (dl); bpos->idx = browser.nr_entries++; -if (pos->al.offset !=-1 ) { +if (al->offset !=-1 ) { bpos->idx_asm = browser.nr_asm_entries++;/* * FIXME: short term bandaid to cope with assembly
@@ -1131,8 +1140,8 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,* * E.g. copy_user_generic_unrolled */ -if (pos->al.offset < (s64 )size) - browser.offsets[pos->al.offset] = pos; +if (al->offset < (s64 )size) + browser.offsets[al->offset] = al; }else bpos->idx_asm =-1 ; }
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate browser: Change offsets to struct annotation_line
perf annotate browser: Change offsets to struct annotation_line
Commit-ID: e1b60b5bd3c7a3f215e79fa911122aba59b3d984 Gitweb: https://git.kernel.org/tip/e1b60b5bd3c7a3f215e79fa911122aba59b3d984 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:53 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Nov 2017 14:49:47 -0300
perf annotate browser: Change offsets to struct annotation_line
Use struct annotation_line as a browser::offsets array entry.
--- tools/perf/ui/browsers/annotate.c | 49 +++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 20 deletions(-)
tools/perf/ui/browsers/annotate.c +29 -20
@@ -51,7 +51,7 @@ struct annotate_browser {struct rb_root entries;struct rb_node *curr_hot;struct annotation_line *selection; -struct disasm_line **offsets; +struct annotation_line **offsets;struct arch *arch;int nr_events;u64 start;
@@ -303,6 +303,7 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser) struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);struct disasm_line *cursor =disasm_line (ab->selection);struct disasm_line *target; +struct annotation_line *al;struct browser_line *btarget, *bcursor;unsigned int from, to;struct map_symbol *ms = ab->b.priv;
@@ -316,10 +317,12 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)if (!disasm_line__is_valid_jump (cursor, sym))return ; - target = ab->offsets[cursor->ops.target.offset]; -if (!target) + al = ab->offsets[cursor->ops.target.offset]; +if (!al)return ; + target =disasm_line (al); + bcursor =browser_line (cursor); btarget =browser_line (target);
@@ -978,10 +981,10 @@ static void count_and_fill(struct annotate_browser *browser, u64 start, u64 end,return ;for (offset = start; offset <= end; offset++) { -struct disasm_line *dl = browser->offsets[offset]; +struct annotation_line *al = browser->offsets[offset]; -if (dl) - dl->al.ipc = ipc; +if (al) + al->ipc = ipc; } } }
@@ -1006,13 +1009,13 @@ static void annotate__compute_ipc(struct annotate_browser *browser, size_t size, ch = ¬es->src->cycles_hist[offset];if (ch && ch->cycles) { -struct disasm_line *dl; +struct annotation_line *al;if (ch->have_start)count_and_fill (browser, ch->start, offset, ch); - dl = browser->offsets[offset]; -if (dl && ch->num_aggr) - dl->al.cycles = ch->cycles_aggr / ch->num_aggr; + al = browser->offsets[offset]; +if (al && ch->num_aggr) + al->cycles = ch->cycles_aggr / ch->num_aggr; browser->have_cycles = true; } }
@@ -1031,13 +1034,18 @@ static void annotate_browser__mark_jump_targets(struct annotate_browser *browserreturn ;for (offset =0 ; offset < size; ++offset) { -struct disasm_line *dl = browser->offsets[offset], *dlt; +struct annotation_line *al = browser->offsets[offset]; +struct disasm_line *dl, *dlt;struct browser_line *bdlt; + dl =disasm_line (al); +if (!disasm_line__is_valid_jump (dl, sym))continue ; - dlt = browser->offsets[dl->ops.target.offset]; + al = browser->offsets[dl->ops.target.offset]; + dlt =disasm_line (al); +/* * FIXME: Oops, no jump target? Buggy disassembler? Or do we * have to adjust to the previous offset?
@@ -1066,7 +1074,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,struct perf_evsel *evsel, struct hist_browser_timer *hbt) { - struct disasm_line *pos; + struct annotation_line *al;struct annotation *notes;size_t size; struct map_symbol ms = {
@@ -1094,7 +1102,7 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,if (map->dso->annotate_warned)return -1 ; - browser.offsets =zalloc (size *sizeof (struct disasm_line *)); + browser.offsets =zalloc (size *sizeof (struct annotation_line *));if (browser.offsets ==NULL ) {ui__error ("Not enough memory!" );return -1 ;
@@ -1118,15 +1126,16 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, notes =symbol__annotation (sym); browser.start =map__rip_2objdump (map, sym->start); -list_for_each_entry (pos, ¬es->src->source, al.node) { +list_for_each_entry (al, ¬es->src->source, node) { +struct disasm_line *dl =disasm_line (al);struct browser_line *bpos; -size_t line_len =strlen (pos->al.line); +size_t line_len =strlen (al->line);if (browser.b.width < line_len) browser.b.width = line_len; - bpos =browser_line (pos); + bpos =browser_line (dl); bpos->idx = browser.nr_entries++; -if (pos->al.offset !=-1 ) { +if (al->offset !=-1 ) { bpos->idx_asm = browser.nr_asm_entries++;/* * FIXME: short term bandaid to cope with assembly
@@ -1135,8 +1144,8 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map,* * E.g. copy_user_generic_unrolled */ -if (pos->al.offset < (s64 )size) - browser.offsets[pos->al.offset] = pos; +if (al->offset < (s64 )size) + browser.offsets[al->offset] = al; }else bpos->idx_asm =-1 ; }
Jiri Olsa
reviewerPATCH 31/35 perf annotate browser: Use struct annotation_line in browser_line
In reply to Jiri OlsaUsing struct annotation_line arg in browser_line
function to make it generic.
--- tools/perf/ui/browsers/annotate.c | 60 ++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 32 deletions(-)
tools/perf/ui/browsers/annotate.c +28 -32
@@ -68,9 +68,12 @@ struct annotate_browser {char search_bf[128 ]; }; -static inline struct browser_line *browser_line (struct disasm_line *dl) +static inline struct browser_line *browser_line (struct annotation_line *al) { -return (void *) dl -sizeof (struct browser_line ); +void *ptr = al; + + ptr = container_of(al, struct disasm_line, al); +return ptr -sizeof (struct browser_line ); } static bool disasm_line__filter(struct ui_browser *browser __maybe_unused,
@@ -118,7 +121,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); struct disasm_line *dl = list_entry(entry, struct disasm_line, al.node); -struct browser_line *bdl =browser_line (dl); +struct browser_line *bdl =browser_line (&dl->al);bool current_entry =ui_browser__is_current_entry (browser, row); bool change_color = (!annotate_browser__opts.hide_src_code && (!current_entry || (browser->use_navkeypressed &&
@@ -301,8 +304,7 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser) { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);struct disasm_line *cursor =disasm_line (ab->selection); -struct disasm_line *target; -struct annotation_line *al; +struct annotation_line *target;struct browser_line *btarget, *bcursor;unsigned int from, to;struct map_symbol *ms = ab->b.priv;
@@ -316,13 +318,9 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)if (!disasm_line__is_valid_jump (cursor, sym))return ; - al = ab->offsets[cursor->ops.target.offset]; -if (!al) -return ; - - target =disasm_line (al); + target = ab->offsets[cursor->ops.target.offset]; - bcursor =browser_line (cursor); + bcursor =browser_line (&cursor->al); btarget =browser_line (target);if (annotate_browser__opts.hide_src_code) {
@@ -421,7 +419,7 @@ static void annotate_browser__set_rb_top(struct annotate_browser *browser,u32 idx; pos = rb_entry(nd, struct disasm_line, al.rb_node); - bpos =browser_line (pos); + bpos =browser_line (&pos->al); idx = bpos->idx;if (annotate_browser__opts.hide_src_code)
@@ -471,37 +469,37 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser)static bool annotate_browser__toggle_source (struct annotate_browser *browser) {struct disasm_line *dl; -struct browser_line *bdl; +struct browser_line *bl;off_t offset = browser->b.index - browser->b.top_idx; browser->b.seek (&browser->b, offset,SEEK_CUR ); dl = list_entry(browser->b.top, struct disasm_line, al.node); - bdl =browser_line (dl); + bl =browser_line (&dl->al);if (annotate_browser__opts.hide_src_code) { -if (bdl->idx_asm < offset) - offset = bdl->idx; +if (bl->idx_asm < offset) + offset = bl->idx; browser->b.nr_entries = browser->nr_entries; annotate_browser__opts.hide_src_code = false; browser->b.seek (&browser->b, -offset,SEEK_CUR ); - browser->b.top_idx = bdl->idx - offset; - browser->b.index = bdl->idx; + browser->b.top_idx = bl->idx - offset; + browser->b.index = bl->idx; }else { -if (bdl->idx_asm <0 ) { +if (bl->idx_asm <0 ) {ui_helpline__puts ("Only available for assembly lines." ); browser->b.seek (&browser->b, -offset,SEEK_CUR );return false; } -if (bdl->idx_asm < offset) - offset = bdl->idx_asm; +if (bl->idx_asm < offset) + offset = bl->idx_asm; browser->b.nr_entries = browser->nr_asm_entries; annotate_browser__opts.hide_src_code = true; browser->b.seek (&browser->b, -offset,SEEK_CUR ); - browser->b.top_idx = bdl->idx_asm - offset; - browser->b.index = bdl->idx_asm; + browser->b.top_idx = bl->idx_asm - offset; + browser->b.index = bl->idx_asm; }return true;
@@ -1031,8 +1029,8 @@ static void annotate_browser__mark_jump_targets(struct annotate_browser *browserfor (offset =0 ; offset < size; ++offset) {struct annotation_line *al = browser->offsets[offset]; -struct disasm_line *dl, *dlt; -struct browser_line *bdlt; +struct disasm_line *dl; +struct browser_line *blt; dl =disasm_line (al);
@@ -1040,18 +1038,17 @@ static void annotate_browser__mark_jump_targets(struct annotate_browser *browsercontinue ; al = browser->offsets[dl->ops.target.offset]; - dlt =disasm_line (al);/* * FIXME: Oops, no jump target? Buggy disassembler? Or do we * have to adjust to the previous offset? */ -if (dlt ==NULL ) +if (al ==NULL )continue ; - bdlt =browser_line (dlt); -if (++bdlt->jump_sources > browser->max_jump_sources) - browser->max_jump_sources = bdlt->jump_sources; + blt =browser_line (al); +if (++blt->jump_sources > browser->max_jump_sources) + browser->max_jump_sources = blt->jump_sources; ++browser->nr_jumps; }
@@ -1123,13 +1120,12 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, browser.start =map__rip_2objdump (map, sym->start);list_for_each_entry (al, ¬es->src->source, node) { -struct disasm_line *dl =disasm_line (al);struct browser_line *bpos;size_t line_len =strlen (al->line);if (browser.b.width < line_len) browser.b.width = line_len; - bpos =browser_line (dl); + bpos =browser_line (al); bpos->idx = browser.nr_entries++;if (al->offset !=-1 ) { bpos->idx_asm = browser.nr_asm_entries++;
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate browser: Use struct annotation_line in browser_line
perf annotate browser: Use struct annotation_line in browser_line
Commit-ID: a5ef27020b4bc0785fabb2591eb670d3bc641257 Gitweb: https://git.kernel.org/tip/a5ef27020b4bc0785fabb2591eb670d3bc641257 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:54 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Nov 2017 14:49:48 -0300
perf annotate browser: Use struct annotation_line in browser_line
Using struct annotation_line arg in browser_line
function to make it generic.
--- tools/perf/ui/browsers/annotate.c | 60 ++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 32 deletions(-)
tools/perf/ui/browsers/annotate.c +28 -32
@@ -69,9 +69,12 @@ struct annotate_browser {char search_bf[128 ]; }; -static inline struct browser_line *browser_line (struct disasm_line *dl) +static inline struct browser_line *browser_line (struct annotation_line *al) { -return (void *) dl -sizeof (struct browser_line ); +void *ptr = al; + + ptr = container_of(al, struct disasm_line, al); +return ptr -sizeof (struct browser_line ); } static bool disasm_line__filter(struct ui_browser *browser __maybe_unused,
@@ -119,7 +122,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); struct disasm_line *dl = list_entry(entry, struct disasm_line, al.node); -struct browser_line *bdl =browser_line (dl); +struct browser_line *bdl =browser_line (&dl->al);bool current_entry =ui_browser__is_current_entry (browser, row); bool change_color = (!annotate_browser__opts.hide_src_code && (!current_entry || (browser->use_navkeypressed &&
@@ -302,8 +305,7 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser) { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);struct disasm_line *cursor =disasm_line (ab->selection); -struct disasm_line *target; -struct annotation_line *al; +struct annotation_line *target;struct browser_line *btarget, *bcursor;unsigned int from, to;struct map_symbol *ms = ab->b.priv;
@@ -317,13 +319,9 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)if (!disasm_line__is_valid_jump (cursor, sym))return ; - al = ab->offsets[cursor->ops.target.offset]; -if (!al) -return ; - - target =disasm_line (al); + target = ab->offsets[cursor->ops.target.offset]; - bcursor =browser_line (cursor); + bcursor =browser_line (&cursor->al); btarget =browser_line (target);if (annotate_browser__opts.hide_src_code) {
@@ -422,7 +420,7 @@ static void annotate_browser__set_rb_top(struct annotate_browser *browser,u32 idx; pos = rb_entry(nd, struct disasm_line, al.rb_node); - bpos =browser_line (pos); + bpos =browser_line (&pos->al); idx = bpos->idx;if (annotate_browser__opts.hide_src_code)
@@ -475,37 +473,37 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,static bool annotate_browser__toggle_source (struct annotate_browser *browser) {struct disasm_line *dl; -struct browser_line *bdl; +struct browser_line *bl;off_t offset = browser->b.index - browser->b.top_idx; browser->b.seek (&browser->b, offset,SEEK_CUR ); dl = list_entry(browser->b.top, struct disasm_line, al.node); - bdl =browser_line (dl); + bl =browser_line (&dl->al);if (annotate_browser__opts.hide_src_code) { -if (bdl->idx_asm < offset) - offset = bdl->idx; +if (bl->idx_asm < offset) + offset = bl->idx; browser->b.nr_entries = browser->nr_entries; annotate_browser__opts.hide_src_code = false; browser->b.seek (&browser->b, -offset,SEEK_CUR ); - browser->b.top_idx = bdl->idx - offset; - browser->b.index = bdl->idx; + browser->b.top_idx = bl->idx - offset; + browser->b.index = bl->idx; }else { -if (bdl->idx_asm <0 ) { +if (bl->idx_asm <0 ) {ui_helpline__puts ("Only available for assembly lines." ); browser->b.seek (&browser->b, -offset,SEEK_CUR );return false; } -if (bdl->idx_asm < offset) - offset = bdl->idx_asm; +if (bl->idx_asm < offset) + offset = bl->idx_asm; browser->b.nr_entries = browser->nr_asm_entries; annotate_browser__opts.hide_src_code = true; browser->b.seek (&browser->b, -offset,SEEK_CUR ); - browser->b.top_idx = bdl->idx_asm - offset; - browser->b.index = bdl->idx_asm; + browser->b.top_idx = bl->idx_asm - offset; + browser->b.index = bl->idx_asm; }return true;
@@ -1035,8 +1033,8 @@ static void annotate_browser__mark_jump_targets(struct annotate_browser *browserfor (offset =0 ; offset < size; ++offset) {struct annotation_line *al = browser->offsets[offset]; -struct disasm_line *dl, *dlt; -struct browser_line *bdlt; +struct disasm_line *dl; +struct browser_line *blt; dl =disasm_line (al);
@@ -1044,18 +1042,17 @@ static void annotate_browser__mark_jump_targets(struct annotate_browser *browsercontinue ; al = browser->offsets[dl->ops.target.offset]; - dlt =disasm_line (al);/* * FIXME: Oops, no jump target? Buggy disassembler? Or do we * have to adjust to the previous offset? */ -if (dlt ==NULL ) +if (al ==NULL )continue ; - bdlt =browser_line (dlt); -if (++bdlt->jump_sources > browser->max_jump_sources) - browser->max_jump_sources = bdlt->jump_sources; + blt =browser_line (al); +if (++blt->jump_sources > browser->max_jump_sources) + browser->max_jump_sources = blt->jump_sources; ++browser->nr_jumps; }
@@ -1127,13 +1124,12 @@ int symbol__tui_annotate(struct symbol *sym, struct map *map, browser.start =map__rip_2objdump (map, sym->start);list_for_each_entry (al, ¬es->src->source, node) { -struct disasm_line *dl =disasm_line (al);struct browser_line *bpos;size_t line_len =strlen (al->line);if (browser.b.width < line_len) browser.b.width = line_len; - bpos =browser_line (dl); + bpos =browser_line (al); bpos->idx = browser.nr_entries++;if (al->offset !=-1 ) { bpos->idx_asm = browser.nr_asm_entries++;
Jiri Olsa
reviewerPATCH 32/35 perf annotate browser: Use struct annotation_line in find functions
In reply to Jiri OlsaUsing struct annotation_line in find functions:
annotate_browser__find_string
annotate_browser__find_string_reverse
--- tools/perf/ui/browsers/annotate.c | 40 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-)
tools/perf/ui/browsers/annotate.c +20 -20
@@ -602,23 +602,23 @@ static bool annotate_browser__jump(struct annotate_browser *browser) }static -struct disasm_line *annotate_browser__find_string (struct annotate_browser *browser, +struct annotation_line *annotate_browser__find_string (struct annotate_browser *browser,char *s,s64 *idx) {struct map_symbol *ms = browser->b.priv;struct symbol *sym = ms->sym;struct annotation *notes =symbol__annotation (sym); -struct disasm_line *pos =disasm_line (browser->selection); +struct annotation_line *al = browser->selection; *idx = browser->b.index; -list_for_each_entry_continue (pos, ¬es->src->source, al.node) { -if (disasm_line__filter (&browser->b, &pos->al.node)) +list_for_each_entry_continue (al, ¬es->src->source, node) { +if (disasm_line__filter (&browser->b, &al->node))continue ; ++*idx; -if (pos->al.line &&strstr (pos->al.line, s) !=NULL ) -return pos; +if (al->line &&strstr (al->line, s) !=NULL ) +return al; }return NULL ;
@@ -626,38 +626,38 @@ struct disasm_line *annotate_browser__find_string(struct annotate_browser *browsstatic bool __annotate_browser__search (struct annotate_browser *browser) { -struct disasm_line *dl; +struct annotation_line *al;s64 idx; - dl =annotate_browser__find_string (browser, browser->search_bf, &idx); -if (dl ==NULL ) { + al =annotate_browser__find_string (browser, browser->search_bf, &idx); +if (al ==NULL ) {ui_helpline__puts ("String not found!" );return false; } -annotate_browser__set_top (browser, dl, idx); +annotate_browser__set_top (browser,disasm_line (al), idx); browser->searching_backwards = false;return true; }static -struct disasm_line *annotate_browser__find_string_reverse (struct annotate_browser *browser, +struct annotation_line *annotate_browser__find_string_reverse (struct annotate_browser *browser,char *s,s64 *idx) {struct map_symbol *ms = browser->b.priv;struct symbol *sym = ms->sym;struct annotation *notes =symbol__annotation (sym); -struct disasm_line *pos =disasm_line (browser->selection); +struct annotation_line *al = browser->selection; *idx = browser->b.index; -list_for_each_entry_continue_reverse (pos, ¬es->src->source, al.node) { -if (disasm_line__filter (&browser->b, &pos->al.node)) +list_for_each_entry_continue_reverse (al, ¬es->src->source, node) { +if (disasm_line__filter (&browser->b, &al->node))continue ; --*idx; -if (pos->al.line &&strstr (pos->al.line, s) !=NULL ) -return pos; +if (al->line &&strstr (al->line, s) !=NULL ) +return al; }return NULL ;
@@ -665,16 +665,16 @@ struct disasm_line *annotate_browser__find_string_reverse(struct annotate_browsestatic bool __annotate_browser__search_reverse (struct annotate_browser *browser) { -struct disasm_line *dl; +struct annotation_line *al;s64 idx; - dl =annotate_browser__find_string_reverse (browser, browser->search_bf, &idx); -if (dl ==NULL ) { + al =annotate_browser__find_string_reverse (browser, browser->search_bf, &idx); +if (al ==NULL ) {ui_helpline__puts ("String not found!" );return false; } -annotate_browser__set_top (browser, dl, idx); +annotate_browser__set_top (browser,disasm_line (al), idx); browser->searching_backwards = true;return true; }
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate browser: Use struct annotation_line in find functions
perf annotate browser: Use struct annotation_line in find functions
Commit-ID: 9213afbdf9562cd108e7ed03bd960d8acdfb49c1 Gitweb: https://git.kernel.org/tip/9213afbdf9562cd108e7ed03bd960d8acdfb49c1 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:55 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Nov 2017 14:49:48 -0300
perf annotate browser: Use struct annotation_line in find functions
Use struct annotation_line in find functions:
annotate_browser__find_string
annotate_browser__find_string_reverse
--- tools/perf/ui/browsers/annotate.c | 40 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-)
tools/perf/ui/browsers/annotate.c +20 -20
@@ -606,23 +606,23 @@ static bool annotate_browser__jump(struct annotate_browser *browser) }static -struct disasm_line *annotate_browser__find_string (struct annotate_browser *browser, +struct annotation_line *annotate_browser__find_string (struct annotate_browser *browser,char *s,s64 *idx) {struct map_symbol *ms = browser->b.priv;struct symbol *sym = ms->sym;struct annotation *notes =symbol__annotation (sym); -struct disasm_line *pos =disasm_line (browser->selection); +struct annotation_line *al = browser->selection; *idx = browser->b.index; -list_for_each_entry_continue (pos, ¬es->src->source, al.node) { -if (disasm_line__filter (&browser->b, &pos->al.node)) +list_for_each_entry_continue (al, ¬es->src->source, node) { +if (disasm_line__filter (&browser->b, &al->node))continue ; ++*idx; -if (pos->al.line &&strstr (pos->al.line, s) !=NULL ) -return pos; +if (al->line &&strstr (al->line, s) !=NULL ) +return al; }return NULL ;
@@ -630,38 +630,38 @@ struct disasm_line *annotate_browser__find_string(struct annotate_browser *browsstatic bool __annotate_browser__search (struct annotate_browser *browser) { -struct disasm_line *dl; +struct annotation_line *al;s64 idx; - dl =annotate_browser__find_string (browser, browser->search_bf, &idx); -if (dl ==NULL ) { + al =annotate_browser__find_string (browser, browser->search_bf, &idx); +if (al ==NULL ) {ui_helpline__puts ("String not found!" );return false; } -annotate_browser__set_top (browser, dl, idx); +annotate_browser__set_top (browser,disasm_line (al), idx); browser->searching_backwards = false;return true; }static -struct disasm_line *annotate_browser__find_string_reverse (struct annotate_browser *browser, +struct annotation_line *annotate_browser__find_string_reverse (struct annotate_browser *browser,char *s,s64 *idx) {struct map_symbol *ms = browser->b.priv;struct symbol *sym = ms->sym;struct annotation *notes =symbol__annotation (sym); -struct disasm_line *pos =disasm_line (browser->selection); +struct annotation_line *al = browser->selection; *idx = browser->b.index; -list_for_each_entry_continue_reverse (pos, ¬es->src->source, al.node) { -if (disasm_line__filter (&browser->b, &pos->al.node)) +list_for_each_entry_continue_reverse (al, ¬es->src->source, node) { +if (disasm_line__filter (&browser->b, &al->node))continue ; --*idx; -if (pos->al.line &&strstr (pos->al.line, s) !=NULL ) -return pos; +if (al->line &&strstr (al->line, s) !=NULL ) +return al; }return NULL ;
@@ -669,16 +669,16 @@ struct disasm_line *annotate_browser__find_string_reverse(struct annotate_browsestatic bool __annotate_browser__search_reverse (struct annotate_browser *browser) { -struct disasm_line *dl; +struct annotation_line *al;s64 idx; - dl =annotate_browser__find_string_reverse (browser, browser->search_bf, &idx); -if (dl ==NULL ) { + al =annotate_browser__find_string_reverse (browser, browser->search_bf, &idx); +if (al ==NULL ) {ui_helpline__puts ("String not found!" );return false; } -annotate_browser__set_top (browser, dl, idx); +annotate_browser__set_top (browser,disasm_line (al), idx); browser->searching_backwards = true;return true; }
Jiri Olsa
reviewerPATCH 33/35 perf annotate browser: Use struct annotation_line in browser top
In reply to Jiri OlsaUsing struct annotation_line in browser::b::top.
--- tools/perf/ui/browsers/annotate.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-)
tools/perf/ui/browsers/annotate.c +13 -13
@@ -389,7 +389,7 @@ static void disasm_rb_tree__insert(struct rb_root *root, struct annotation_line }static void annotate_browser__set_top (struct annotate_browser *browser, -struct disasm_line *pos,u32 idx) +struct annotation_line *pos,u32 idx) {unsigned back;
@@ -398,16 +398,16 @@ static void annotate_browser__set_top(struct annotate_browser *browser, browser->b.top_idx = browser->b.index = idx;while (browser->b.top_idx !=0 && back !=0 ) { - pos = list_entry(pos->al.node.prev, struct disasm_line, al.node); + pos = list_entry(pos->node.prev, struct annotation_line, node); -if (disasm_line__filter (&browser->b, &pos->al.node)) +if (disasm_line__filter (&browser->b, &pos->node))continue ; --browser->b.top_idx; --back; } - browser->b.top = &pos->al; + browser->b.top = pos; browser->b.navkeypressed = true; }
@@ -415,11 +415,11 @@ static void annotate_browser__set_rb_top(struct annotate_browser *browser, struct rb_node *nd) {struct browser_line *bpos; -struct disasm_line *pos; +struct annotation_line *pos;u32 idx; - pos = rb_entry(nd, struct disasm_line, al.rb_node); - bpos =browser_line (&pos->al); + pos = rb_entry(nd, struct annotation_line, rb_node); + bpos =browser_line (pos); idx = bpos->idx;if (annotate_browser__opts.hide_src_code)
@@ -468,13 +468,13 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser)static bool annotate_browser__toggle_source (struct annotate_browser *browser) { -struct disasm_line *dl; +struct annotation_line *al;struct browser_line *bl;off_t offset = browser->b.index - browser->b.top_idx; browser->b.seek (&browser->b, offset,SEEK_CUR ); - dl = list_entry(browser->b.top, struct disasm_line, al.node); - bl =browser_line (&dl->al); + al = list_entry(browser->b.top, struct annotation_line, node); + bl =browser_line (al);if (annotate_browser__opts.hide_src_code) {if (bl->idx_asm < offset)
@@ -596,7 +596,7 @@ static bool annotate_browser__jump(struct annotate_browser *browser)return true; } -annotate_browser__set_top (browser, dl, idx); +annotate_browser__set_top (browser, &dl->al, idx);return true; }
@@ -635,7 +635,7 @@ static bool __annotate_browser__search(struct annotate_browser *browser)return false; } -annotate_browser__set_top (browser,disasm_line (al), idx); +annotate_browser__set_top (browser, al, idx); browser->searching_backwards = false;return true; }
@@ -674,7 +674,7 @@ static bool __annotate_browser__search_reverse(struct annotate_browser *browser)return false; } -annotate_browser__set_top (browser,disasm_line (al), idx); +annotate_browser__set_top (browser, al, idx); browser->searching_backwards = true;return true; }
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate browser: Use struct annotation_line in browser top
perf annotate browser: Use struct annotation_line in browser top
Commit-ID: ec03a77d7d28a2c2de246f67322c5d916852dd9d Gitweb: https://git.kernel.org/tip/ec03a77d7d28a2c2de246f67322c5d916852dd9d Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:56 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Nov 2017 14:49:49 -0300
perf annotate browser: Use struct annotation_line in browser top
Use struct annotation_line in browser::b::top.
--- tools/perf/ui/browsers/annotate.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-)
tools/perf/ui/browsers/annotate.c +13 -13
@@ -390,7 +390,7 @@ static void disasm_rb_tree__insert(struct rb_root *root, struct annotation_line }static void annotate_browser__set_top (struct annotate_browser *browser, -struct disasm_line *pos,u32 idx) +struct annotation_line *pos,u32 idx) {unsigned back;
@@ -399,16 +399,16 @@ static void annotate_browser__set_top(struct annotate_browser *browser, browser->b.top_idx = browser->b.index = idx;while (browser->b.top_idx !=0 && back !=0 ) { - pos = list_entry(pos->al.node.prev, struct disasm_line, al.node); + pos = list_entry(pos->node.prev, struct annotation_line, node); -if (disasm_line__filter (&browser->b, &pos->al.node)) +if (disasm_line__filter (&browser->b, &pos->node))continue ; --browser->b.top_idx; --back; } - browser->b.top = &pos->al; + browser->b.top = pos; browser->b.navkeypressed = true; }
@@ -416,11 +416,11 @@ static void annotate_browser__set_rb_top(struct annotate_browser *browser, struct rb_node *nd) {struct browser_line *bpos; -struct disasm_line *pos; +struct annotation_line *pos;u32 idx; - pos = rb_entry(nd, struct disasm_line, al.rb_node); - bpos =browser_line (&pos->al); + pos = rb_entry(nd, struct annotation_line, rb_node); + bpos =browser_line (pos); idx = bpos->idx;if (annotate_browser__opts.hide_src_code)
@@ -472,13 +472,13 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,static bool annotate_browser__toggle_source (struct annotate_browser *browser) { -struct disasm_line *dl; +struct annotation_line *al;struct browser_line *bl;off_t offset = browser->b.index - browser->b.top_idx; browser->b.seek (&browser->b, offset,SEEK_CUR ); - dl = list_entry(browser->b.top, struct disasm_line, al.node); - bl =browser_line (&dl->al); + al = list_entry(browser->b.top, struct annotation_line, node); + bl =browser_line (al);if (annotate_browser__opts.hide_src_code) {if (bl->idx_asm < offset)
@@ -600,7 +600,7 @@ static bool annotate_browser__jump(struct annotate_browser *browser)return true; } -annotate_browser__set_top (browser, dl, idx); +annotate_browser__set_top (browser, &dl->al, idx);return true; }
@@ -639,7 +639,7 @@ static bool __annotate_browser__search(struct annotate_browser *browser)return false; } -annotate_browser__set_top (browser,disasm_line (al), idx); +annotate_browser__set_top (browser, al, idx); browser->searching_backwards = false;return true; }
@@ -678,7 +678,7 @@ static bool __annotate_browser__search_reverse(struct annotate_browser *browser)return false; } -annotate_browser__set_top (browser,disasm_line (al), idx); +annotate_browser__set_top (browser, al, idx); browser->searching_backwards = true;return true; }
Jiri Olsa
reviewerPATCH 34/35 perf annotate browser: Add disasm_line__write function
In reply to Jiri OlsaFactor disasm_line__write function from annotate_browser__write, which now keeps only generic display code.
--- tools/perf/ui/browsers/annotate.c | 98 +++++++++++++++++++++------------------ 1 file changed, 53 insertions(+), 45 deletions(-)
tools/perf/ui/browsers/annotate.c +53 -45
@@ -117,11 +117,37 @@ static int annotate_browser__cycles_width(struct annotate_browser *ab)return ab->have_cycles ?IPC_WIDTH +CYCLES_WIDTH :0 ; } +static void disasm_line__write (struct disasm_line *dl,struct ui_browser *browser, +char *bf,size_t size) +{ +if (dl->ins.ops && dl->ins.ops->scnprintf) { +if (ins__is_jump (&dl->ins)) { +bool fwd = dl->ops.target.offset > dl->al.offset; + +ui_browser__write_graph (browser, fwd ?SLSMG_DARROW_CHAR : +SLSMG_UARROW_CHAR ); +SLsmg_write_char (' ' ); + }else if (ins__is_call (&dl->ins)) { +ui_browser__write_graph (browser,SLSMG_RARROW_CHAR ); +SLsmg_write_char (' ' ); + }else if (ins__is_ret (&dl->ins)) { +ui_browser__write_graph (browser,SLSMG_LARROW_CHAR ); +SLsmg_write_char (' ' ); + }else { +ui_browser__write_nstring (browser," " ,2 ); + } + }else { +ui_browser__write_nstring (browser," " ,2 ); + } + +disasm_line__scnprintf (dl, bf, size, !annotate_browser__opts.use_offset); +} +static void annotate_browser__write (struct ui_browser *browser,void *entry,int row) { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); - struct disasm_line *dl = list_entry(entry, struct disasm_line, al.node); -struct browser_line *bdl =browser_line (&dl->al); + struct annotation_line *al = list_entry(entry, struct annotation_line, node); +struct browser_line *bl =browser_line (al);bool current_entry =ui_browser__is_current_entry (browser, row); bool change_color = (!annotate_browser__opts.hide_src_code && (!current_entry || (browser->use_navkeypressed &&
@@ -134,32 +160,32 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intbool show_title = false;for (i =0 ; i < ab->nr_events; i++) { -if (dl->al.samples[i].percent > percent_max) - percent_max = dl->al.samples[i].percent; +if (al->samples[i].percent > percent_max) + percent_max = al->samples[i].percent; } -if ((row ==0 ) && (dl->al.offset ==-1 || percent_max ==0.0 )) { +if ((row ==0 ) && (al->offset ==-1 || percent_max ==0.0 )) {if (ab->have_cycles) { -if (dl->al.ipc ==0.0 && dl->al.cycles ==0 ) +if (al->ipc ==0.0 && al->cycles ==0 ) show_title = true; }else show_title = true; } -if (dl->al.offset !=-1 && percent_max !=0.0 ) { +if (al->offset !=-1 && percent_max !=0.0 ) {for (i =0 ; i < ab->nr_events; i++) {ui_browser__set_percent_color (browser, - dl->al.samples[i].percent, + al->samples[i].percent, current_entry);if (annotate_browser__opts.show_total_period) {ui_browser__printf (browser,"%11" PRIu64" " , - dl->al.samples[i].he.period); + al->samples[i].he.period); }else if (annotate_browser__opts.show_nr_samples) {ui_browser__printf (browser,"%6" PRIu64" " , - dl->al.samples[i].he.nr_samples); + al->samples[i].he.nr_samples); }else {ui_browser__printf (browser,"%6.2f " , - dl->al.samples[i].percent); + al->samples[i].percent); } } }else {
@@ -174,16 +200,16 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int } }if (ab->have_cycles) { -if (dl->al.ipc) -ui_browser__printf (browser,"%*.2f " ,IPC_WIDTH -1 , dl->al.ipc); +if (al->ipc) +ui_browser__printf (browser,"%*.2f " ,IPC_WIDTH -1 , al->ipc);else if (!show_title)ui_browser__write_nstring (browser," " ,IPC_WIDTH );else ui_browser__printf (browser,"%*s " ,IPC_WIDTH -1 ,"IPC" ); -if (dl->al.cycles) +if (al->cycles)ui_browser__printf (browser,"%*" PRIu64" " , -CYCLES_WIDTH -1 , dl->al.cycles); +CYCLES_WIDTH -1 , al->cycles);else if (!show_title)ui_browser__write_nstring (browser," " ,CYCLES_WIDTH );else
@@ -196,19 +222,19 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intif (!browser->navkeypressed) width +=1 ; -if (!*dl->al.line) +if (!*al->line)ui_browser__write_nstring (browser," " , width - pcnt_width - cycles_width); -else if (dl->al.offset ==-1 ) { -if (dl->al.line_nr && annotate_browser__opts.show_linenr) +else if (al->offset ==-1 ) { +if (al->line_nr && annotate_browser__opts.show_linenr) printed =scnprintf (bf,sizeof (bf),"%-*d " , - ab->addr_width +1 , dl->al.line_nr); + ab->addr_width +1 , al->line_nr);else printed =scnprintf (bf,sizeof (bf),"%*s " , ab->addr_width," " );ui_browser__write_nstring (browser, bf, printed); -ui_browser__write_nstring (browser, dl->al.line, width - printed - pcnt_width - cycles_width +1 ); +ui_browser__write_nstring (browser, al->line, width - printed - pcnt_width - cycles_width +1 ); }else { -u64 addr = dl->al.offset; +u64 addr = al->offset;int color =-1 ;if (!annotate_browser__opts.use_offset)
@@ -217,13 +243,13 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intif (!annotate_browser__opts.use_offset) { printed =scnprintf (bf,sizeof (bf),"%" PRIx64": " , addr); }else { -if (bdl->jump_sources) { +if (bl->jump_sources) {if (annotate_browser__opts.show_nr_jumps) {int prev; printed =scnprintf (bf,sizeof (bf),"%*d " , ab->jumps_width, - bdl->jump_sources); - prev =annotate_browser__set_jumps_percent_color (ab, bdl->jump_sources, + bl->jump_sources); + prev =annotate_browser__set_jumps_percent_color (ab, bl->jump_sources, current_entry);ui_browser__write_nstring (browser, bf, printed);ui_browser__set_color (browser, prev);
@@ -242,32 +268,14 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intui_browser__write_nstring (browser, bf, printed);if (change_color)ui_browser__set_color (browser, color); -if (dl->ins.ops && dl->ins.ops->scnprintf) { -if (ins__is_jump (&dl->ins)) { -bool fwd = dl->ops.target.offset > dl->al.offset; - -ui_browser__write_graph (browser, fwd ?SLSMG_DARROW_CHAR : -SLSMG_UARROW_CHAR ); -SLsmg_write_char (' ' ); - }else if (ins__is_call (&dl->ins)) { -ui_browser__write_graph (browser,SLSMG_RARROW_CHAR ); -SLsmg_write_char (' ' ); - }else if (ins__is_ret (&dl->ins)) { -ui_browser__write_graph (browser,SLSMG_LARROW_CHAR ); -SLsmg_write_char (' ' ); - }else { -ui_browser__write_nstring (browser," " ,2 ); - } - }else { -ui_browser__write_nstring (browser," " ,2 ); - } -disasm_line__scnprintf (dl, bf,sizeof (bf), !annotate_browser__opts.use_offset); +disasm_line__write (disasm_line (al), browser, bf,sizeof (bf)); +ui_browser__write_nstring (browser, bf, width - pcnt_width - cycles_width -3 - printed); }if (current_entry) - ab->selection = &dl->al; + ab->selection = al; }static bool disasm_line__is_valid_jump (struct disasm_line *dl,struct symbol *sym)
Signature · 1 line
2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate browser: Add disasm_line__write function
perf annotate browser: Add disasm_line__write function
Commit-ID: a5433b3ec937765a1d7521bc6bb87f6e76497640 Gitweb: https://git.kernel.org/tip/a5433b3ec937765a1d7521bc6bb87f6e76497640 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:57 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Nov 2017 14:49:49 -0300
perf annotate browser: Add disasm_line__write function
Factor disasm_line__write function from annotate_browser__write, which now keeps only generic display code.
--- tools/perf/ui/browsers/annotate.c | 98 +++++++++++++++++++++------------------ 1 file changed, 53 insertions(+), 45 deletions(-)
tools/perf/ui/browsers/annotate.c +53 -45
@@ -118,11 +118,37 @@ static int annotate_browser__cycles_width(struct annotate_browser *ab)return ab->have_cycles ?IPC_WIDTH +CYCLES_WIDTH :0 ; } +static void disasm_line__write (struct disasm_line *dl,struct ui_browser *browser, +char *bf,size_t size) +{ +if (dl->ins.ops && dl->ins.ops->scnprintf) { +if (ins__is_jump (&dl->ins)) { +bool fwd = dl->ops.target.offset > dl->al.offset; + +ui_browser__write_graph (browser, fwd ?SLSMG_DARROW_CHAR : +SLSMG_UARROW_CHAR ); +SLsmg_write_char (' ' ); + }else if (ins__is_call (&dl->ins)) { +ui_browser__write_graph (browser,SLSMG_RARROW_CHAR ); +SLsmg_write_char (' ' ); + }else if (ins__is_ret (&dl->ins)) { +ui_browser__write_graph (browser,SLSMG_LARROW_CHAR ); +SLsmg_write_char (' ' ); + }else { +ui_browser__write_nstring (browser," " ,2 ); + } + }else { +ui_browser__write_nstring (browser," " ,2 ); + } + +disasm_line__scnprintf (dl, bf, size, !annotate_browser__opts.use_offset); +} +static void annotate_browser__write (struct ui_browser *browser,void *entry,int row) { struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); - struct disasm_line *dl = list_entry(entry, struct disasm_line, al.node); -struct browser_line *bdl =browser_line (&dl->al); + struct annotation_line *al = list_entry(entry, struct annotation_line, node); +struct browser_line *bl =browser_line (al);bool current_entry =ui_browser__is_current_entry (browser, row); bool change_color = (!annotate_browser__opts.hide_src_code && (!current_entry || (browser->use_navkeypressed &&
@@ -135,32 +161,32 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intbool show_title = false;for (i =0 ; i < ab->nr_events; i++) { -if (dl->al.samples[i].percent > percent_max) - percent_max = dl->al.samples[i].percent; +if (al->samples[i].percent > percent_max) + percent_max = al->samples[i].percent; } -if ((row ==0 ) && (dl->al.offset ==-1 || percent_max ==0.0 )) { +if ((row ==0 ) && (al->offset ==-1 || percent_max ==0.0 )) {if (ab->have_cycles) { -if (dl->al.ipc ==0.0 && dl->al.cycles ==0 ) +if (al->ipc ==0.0 && al->cycles ==0 ) show_title = true; }else show_title = true; } -if (dl->al.offset !=-1 && percent_max !=0.0 ) { +if (al->offset !=-1 && percent_max !=0.0 ) {for (i =0 ; i < ab->nr_events; i++) {ui_browser__set_percent_color (browser, - dl->al.samples[i].percent, + al->samples[i].percent, current_entry);if (annotate_browser__opts.show_total_period) {ui_browser__printf (browser,"%11" PRIu64" " , - dl->al.samples[i].he.period); + al->samples[i].he.period); }else if (annotate_browser__opts.show_nr_samples) {ui_browser__printf (browser,"%6" PRIu64" " , - dl->al.samples[i].he.nr_samples); + al->samples[i].he.nr_samples); }else {ui_browser__printf (browser,"%6.2f " , - dl->al.samples[i].percent); + al->samples[i].percent); } } }else {
@@ -175,16 +201,16 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int } }if (ab->have_cycles) { -if (dl->al.ipc) -ui_browser__printf (browser,"%*.2f " ,IPC_WIDTH -1 , dl->al.ipc); +if (al->ipc) +ui_browser__printf (browser,"%*.2f " ,IPC_WIDTH -1 , al->ipc);else if (!show_title)ui_browser__write_nstring (browser," " ,IPC_WIDTH );else ui_browser__printf (browser,"%*s " ,IPC_WIDTH -1 ,"IPC" ); -if (dl->al.cycles) +if (al->cycles)ui_browser__printf (browser,"%*" PRIu64" " , -CYCLES_WIDTH -1 , dl->al.cycles); +CYCLES_WIDTH -1 , al->cycles);else if (!show_title)ui_browser__write_nstring (browser," " ,CYCLES_WIDTH );else
@@ -197,19 +223,19 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intif (!browser->navkeypressed) width +=1 ; -if (!*dl->al.line) +if (!*al->line)ui_browser__write_nstring (browser," " , width - pcnt_width - cycles_width); -else if (dl->al.offset ==-1 ) { -if (dl->al.line_nr && annotate_browser__opts.show_linenr) +else if (al->offset ==-1 ) { +if (al->line_nr && annotate_browser__opts.show_linenr) printed =scnprintf (bf,sizeof (bf),"%-*d " , - ab->addr_width +1 , dl->al.line_nr); + ab->addr_width +1 , al->line_nr);else printed =scnprintf (bf,sizeof (bf),"%*s " , ab->addr_width," " );ui_browser__write_nstring (browser, bf, printed); -ui_browser__write_nstring (browser, dl->al.line, width - printed - pcnt_width - cycles_width +1 ); +ui_browser__write_nstring (browser, al->line, width - printed - pcnt_width - cycles_width +1 ); }else { -u64 addr = dl->al.offset; +u64 addr = al->offset;int color =-1 ;if (!annotate_browser__opts.use_offset)
@@ -218,13 +244,13 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intif (!annotate_browser__opts.use_offset) { printed =scnprintf (bf,sizeof (bf),"%" PRIx64": " , addr); }else { -if (bdl->jump_sources) { +if (bl->jump_sources) {if (annotate_browser__opts.show_nr_jumps) {int prev; printed =scnprintf (bf,sizeof (bf),"%*d " , ab->jumps_width, - bdl->jump_sources); - prev =annotate_browser__set_jumps_percent_color (ab, bdl->jump_sources, + bl->jump_sources); + prev =annotate_browser__set_jumps_percent_color (ab, bl->jump_sources, current_entry);ui_browser__write_nstring (browser, bf, printed);ui_browser__set_color (browser, prev);
@@ -243,32 +269,14 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intui_browser__write_nstring (browser, bf, printed);if (change_color)ui_browser__set_color (browser, color); -if (dl->ins.ops && dl->ins.ops->scnprintf) { -if (ins__is_jump (&dl->ins)) { -bool fwd = dl->ops.target.offset > dl->al.offset; - -ui_browser__write_graph (browser, fwd ?SLSMG_DARROW_CHAR : -SLSMG_UARROW_CHAR ); -SLsmg_write_char (' ' ); - }else if (ins__is_call (&dl->ins)) { -ui_browser__write_graph (browser,SLSMG_RARROW_CHAR ); -SLsmg_write_char (' ' ); - }else if (ins__is_ret (&dl->ins)) { -ui_browser__write_graph (browser,SLSMG_LARROW_CHAR ); -SLsmg_write_char (' ' ); - }else { -ui_browser__write_nstring (browser," " ,2 ); - } - }else { -ui_browser__write_nstring (browser," " ,2 ); - } -disasm_line__scnprintf (dl, bf,sizeof (bf), !annotate_browser__opts.use_offset); +disasm_line__write (disasm_line (al), browser, bf,sizeof (bf)); +ui_browser__write_nstring (browser, bf, width - pcnt_width - cycles_width -3 - printed); }if (current_entry) - ab->selection = &dl->al; + ab->selection = al; }static bool disasm_line__is_valid_jump (struct disasm_line *dl,struct symbol *sym)
Jiri Olsa
reviewerPATCH 35/35 perf annotate: Align source and offset lines
In reply to Jiri OlsaAligning source with offset lines, which are more advanced, because of the address column.
Before:
: static void *worker_thread(void *__tdata)
: {
0.00 : 48a971: push %rbp
0.00 : 48a972: mov %rsp,%rbp
0.00 : 48a975: sub $0x30,%rsp
0.00 : 48a979: mov %rdi,-0x28(%rbp)
0.00 : 48a97d: mov %fs:0x28,%rax
0.00 : 48a986: mov %rax,-0x8(%rbp)
0.00 : 48a98a: xor %eax,%eax
: struct thread_data *td = __tdata;
0.00 : 48a98c: mov -0x28(%rbp),%rax
0.00 : 48a990: mov %rax,-0x10(%rbp)
: int m = 0, i;
0.00 : 48a994: movl $0x0,-0x1c(%rbp)
: int ret;
:
: for (i = 0; i < loops; i++) {
0.00 : 48a99b: movl $0x0,-0x18(%rbp)
After:
: static void *worker_thread(void *__tdata)
: {
0.00 : 48a971: push %rbp
0.00 : 48a972: mov %rsp,%rbp
0.00 : 48a975: sub $0x30,%rsp
0.00 : 48a979: mov %rdi,-0x28(%rbp)
0.00 : 48a97d: mov %fs:0x28,%rax
0.00 : 48a986: mov %rax,-0x8(%rbp)
0.00 : 48a98a: xor %eax,%eax
: struct thread_data *td = __tdata;
0.00 : 48a98c: mov -0x28(%rbp),%rax
0.00 : 48a990: mov %rax,-0x10(%rbp)
: int m = 0, i;
0.00 : 48a994: movl $0x0,-0x1c(%rbp)
: int ret;
:
: for (i = 0; i < loops; i++) {
0.00 : 48a99b: movl $0x0,-0x18(%rbp)It makes bigger different when displaying script sources, where the comment lines looks oddly shifted from the lines which actually hold code. I'll send script support separately.
--- tools/perf/util/annotate.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
tools/perf/util/annotate.c +4 -3
@@ -1082,6 +1082,7 @@ static void annotate__branch_printf(struct block_range *br, u64 addr) } } +#define ADDR_LEN 10static int disasm_line__print (struct disasm_line *dl,u64 start) {
@@ -1090,7 +1091,7 @@ static int disasm_line__print(struct disasm_line *dl, u64 start)struct block_range *br; br =block_range__find (addr); -color_fprintf (stdout,annotate__address_color (br)," %" PRIx64":" , addr); +color_fprintf (stdout,annotate__address_color (br)," %*" PRIx64":" ,ADDR_LEN , addr);color_fprintf (stdout,annotate__asm_color (br),"%s" , dl->al.line);annotate__branch_printf (br, addr);return 0 ;
@@ -1164,7 +1165,7 @@ annotation_line__print(struct annotation_line *al, struct symbol *sym, u64 startcolor_fprintf (stdout, color," %7.2f" , sample->percent); } -printf (" : " ); +printf (" : " );disasm_line__print (dl, start);printf ("\n" );
@@ -1182,7 +1183,7 @@ annotation_line__print(struct annotation_line *al, struct symbol *sym, u64 startif (!*al->line)printf (" %*s:\n" , width," " );else -printf (" %*s: %s\n" , width," " , al->line); +printf (" %*s: %*s %s\n" , width," " ,ADDR_LEN ," " , al->line); }return 0 ;
Signature · 1 line
2.13.6
Arnaldo Carvalho de Melo
maintainerRe: [PATCH 35/35] perf annotate: Align source and offset lines
Em Wed, Oct 11, 2017 at 05:01:58PM +0200, Jiri Olsa escreveu:
Quoted 58 lines
Aligning source with offset lines, which are more advanced, because of the address column.
Before: : static void *worker_thread(void *__tdata) : { 0.00 : 48a971: push %rbp 0.00 : 48a972: mov %rsp,%rbp 0.00 : 48a975: sub $0x30,%rsp 0.00 : 48a979: mov %rdi,-0x28(%rbp) 0.00 : 48a97d: mov %fs:0x28,%rax 0.00 : 48a986: mov %rax,-0x8(%rbp) 0.00 : 48a98a: xor %eax,%eax : struct thread_data *td = __tdata; 0.00 : 48a98c: mov -0x28(%rbp),%rax 0.00 : 48a990: mov %rax,-0x10(%rbp) : int m = 0, i; 0.00 : 48a994: movl $0x0,-0x1c(%rbp) : int ret; : : for (i = 0; i < loops; i++) { 0.00 : 48a99b: movl $0x0,-0x18(%rbp) After: : static void *worker_thread(void *__tdata) : { 0.00 : 48a971: push %rbp 0.00 : 48a972: mov %rsp,%rbp 0.00 : 48a975: sub $0x30,%rsp 0.00 : 48a979: mov %rdi,-0x28(%rbp) 0.00 : 48a97d: mov %fs:0x28,%rax 0.00 : 48a986: mov %rax,-0x8(%rbp) 0.00 : 48a98a: xor %eax,%eax : struct thread_data *td = __tdata; 0.00 : 48a98c: mov -0x28(%rbp),%rax 0.00 : 48a990: mov %rax,-0x10(%rbp) : int m = 0, i; 0.00 : 48a994: movl $0x0,-0x1c(%rbp) : int ret; : : for (i = 0; i < loops; i++) { 0.00 : 48a99b: movl $0x0,-0x18(%rbp)It makes bigger different when displaying script sources, where the comment lines looks oddly shifted from the lines which actually hold code. I'll send script support separately.
Signed-off-by Jiri Olsa <[email protected]>--- tools/perf/util/annotate.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)tools/perf/util/annotate.c +0
-0
tools/perf/util/annotate.c static void annotate__branch_printf(struct block_range *br, u64 addr) · line 1085
Quoted 4 lines
tools/perf/util/annotate.c +1
-0@@ -1082,6 +1082,7 @@ static void annotate__branch_printf(struct block_range *br, u64 addr) } } +#define ADDR_LEN 10
This doesn't align kernel addresses well, as they will take more columns, so I'm trying the patch below, on top of yours, ok?
I will combine both to elliminate unnecessary churn, ok?
- Arnaldo
tools/perf/util/annotate.c +23 -10
@@ -1092,16 +1092,14 @@ static void annotate__branch_printf(struct block_range *br, u64 addr) } } -#define ADDR_LEN 10 - -static int disasm_line__print (struct disasm_line *dl,u64 start) +static int disasm_line__print (struct disasm_line *dl,u64 start,int addr_fmt_width) {s64 offset = dl->al.offset;const u64 addr = start + offset;struct block_range *br; br =block_range__find (addr); -color_fprintf (stdout,annotate__address_color (br)," %*" PRIx64":" ,ADDR_LEN , addr); +color_fprintf (stdout,annotate__address_color (br)," %*" PRIx64":" , addr_fmt_width, addr);color_fprintf (stdout,annotate__asm_color (br),"%s" , dl->al.line);annotate__branch_printf (br, addr);return 0 ;
@@ -1110,7 +1108,7 @@ static int disasm_line__print(struct disasm_line *dl, u64 start)static int annotation_line__print (struct annotation_line *al,struct symbol *sym,u64 start,struct perf_evsel *evsel,u64 len,int min_pcnt,int printed, -int max_lines,struct annotation_line *queue) +int max_lines,struct annotation_line *queue,int addr_fmt_width) { struct disasm_line *dl = container_of(al, struct disasm_line, al);static const char *prev_line;
@@ -1140,7 +1138,7 @@ annotation_line__print(struct annotation_line *al, struct symbol *sym, u64 startif (queue == al)break ;annotation_line__print (queue, sym, start, evsel, len, -0 ,0 ,1 ,NULL ); +0 ,0 ,1 ,NULL , addr_fmt_width); } }
@@ -1177,7 +1175,7 @@ annotation_line__print(struct annotation_line *al, struct symbol *sym, u64 startprintf (" : " ); -disasm_line__print (dl, start); +disasm_line__print (dl, start, addr_fmt_width);printf ("\n" ); }else if (max_lines && printed >= max_lines)return 1 ;
@@ -1193,7 +1191,7 @@ annotation_line__print(struct annotation_line *al, struct symbol *sym, u64 startif (!*al->line)printf (" %*s:\n" , width," " );else -printf (" %*s: %*s %s\n" , width," " ,ADDR_LEN ," " , al->line); +printf (" %*s: %*s %s\n" , width," " , addr_fmt_width," " , al->line); }return 0 ;
@@ -1800,6 +1798,19 @@ static void symbol__annotate_hits(struct symbol *sym, struct perf_evsel *evsel)printf ("%*s: %" PRIu64"\n" ,BITS_PER_LONG /2 ,"h->nr_samples" , h->nr_samples); } +static int annotated_source__addr_fmt_width (struct list_head *lines,u64 start) +{ +char bf[32 ]; +struct annotation_line *line; + +list_for_each_entry_reverse (line, lines, node) { +if (line->offset !=-1 ) +return scnprintf (bf,sizeof (bf),"%" PRIx64, start + line->offset); + } + +return 0 ; +} +int symbol__annotate_printf (struct symbol *sym,struct map *map,struct perf_evsel *evsel,bool full_paths,int min_pcnt,int max_lines,int context)
@@ -1812,7 +1823,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,struct sym_hist *h =annotation__histogram (notes, evsel->idx);struct annotation_line *pos, *queue =NULL ;u64 start =map__rip_2objdump (map, sym->start); -int printed =2 , queue_len =0 ; +int printed =2 , queue_len =0 , addr_fmt_width;int more =0 ;u64 len;int width = symbol_conf.show_total_period ?12 :8 ;
@@ -1843,6 +1854,8 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,if (verbose >0 )symbol__annotate_hits (sym, evsel); + addr_fmt_width =annotated_source__addr_fmt_width (¬es->src->source, start); +list_for_each_entry (pos, ¬es->src->source, node) {int err;
@@ -1853,7 +1866,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map, err =annotation_line__print (pos, sym, start, evsel, len, min_pcnt, printed, max_lines, - queue); + queue, addr_fmt_width);switch (err) {case 0 :
Re: [PATCH 35/35] perf annotate: Align source and offset lines
On Tue, Nov 07, 2017 at 11:10:47AM -0300, Arnaldo Carvalho de Melo wrote:
SNIP
Quoted 14 lines
Quoted 14 lines
Signed-off-by Jiri Olsa <[email protected]>--- tools/perf/util/annotate.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)tools/perf/util/annotate.c +0
-0@@ -1082,6 +1082,7 @@ static void annotate__branch_printf(struct block_range *br, u64 addr) } }
Quoted 6 lines
tools/perf/util/annotate.c static void annotate__branch_printf(struct block_range *br, u64 addr) · line 1085
Quoted 1 line
tools/perf/util/annotate.c +1
-0+#define ADDR_LEN 10This doesn't align kernel addresses well, as they will take more columns, so I'm trying the patch below, on top of yours, ok?
I will combine both to elliminate unnecessary churn, ok?
argh.. sounds good, thanks
jirka
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf annotate: Align source and offset lines
In reply to Jiri Olsaperf annotate: Align source and offset lines
Commit-ID: f48e7c407050e5f5f53a0fa9a266d83b001dd356 Gitweb: https://git.kernel.org/tip/f48e7c407050e5f5f53a0fa9a266d83b001dd356 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 11 Oct 2017 17:01:58 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Nov 2017 14:49:50 -0300
perf annotate: Align source and offset lines
Align source with offset lines, which are more advanced, because of the address column.
Before:
: static void *worker_thread(void *__tdata)
: {
0.00 : 48a971: push %rbp
0.00 : 48a972: mov %rsp,%rbp
0.00 : 48a975: sub $0x30,%rsp
0.00 : 48a979: mov %rdi,-0x28(%rbp)
0.00 : 48a97d: mov %fs:0x28,%rax
0.00 : 48a986: mov %rax,-0x8(%rbp)
0.00 : 48a98a: xor %eax,%eax
: struct thread_data *td = __tdata;
0.00 : 48a98c: mov -0x28(%rbp),%rax
0.00 : 48a990: mov %rax,-0x10(%rbp)
: int m = 0, i;
0.00 : 48a994: movl $0x0,-0x1c(%rbp)
: int ret;
:
: for (i = 0; i < loops; i++) {
0.00 : 48a99b: movl $0x0,-0x18(%rbp)
After:
: static void *worker_thread(void *__tdata)
: {
0.00 : 48a971: push %rbp
0.00 : 48a972: mov %rsp,%rbp
0.00 : 48a975: sub $0x30,%rsp
0.00 : 48a979: mov %rdi,-0x28(%rbp)
0.00 : 48a97d: mov %fs:0x28,%rax
0.00 : 48a986: mov %rax,-0x8(%rbp)
0.00 : 48a98a: xor %eax,%eax
: struct thread_data *td = __tdata;
0.00 : 48a98c: mov -0x28(%rbp),%rax
0.00 : 48a990: mov %rax,-0x10(%rbp)
: int m = 0, i;
0.00 : 48a994: movl $0x0,-0x1c(%rbp)
: int ret;
:
: for (i = 0; i < loops; i++) {
0.00 : 48a99b: movl $0x0,-0x18(%rbp)It makes bigger different when displaying script sources, where the comment lines looks oddly shifted from the lines which actually hold code. I'll send script support separately.
Committer note:
Do not use a fixed column width for the addresses, as kernel ones se more than 10 columns, look at the last offset and get the right width.
--- tools/perf/util/annotate.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-)
tools/perf/util/annotate.c +24 -10
@@ -1092,15 +1092,14 @@ static void annotate__branch_printf(struct block_range *br, u64 addr) } } - -static int disasm_line__print (struct disasm_line *dl,u64 start) +static int disasm_line__print (struct disasm_line *dl,u64 start,int addr_fmt_width) {s64 offset = dl->al.offset;const u64 addr = start + offset;struct block_range *br; br =block_range__find (addr); -color_fprintf (stdout,annotate__address_color (br)," %" PRIx64":" , addr); +color_fprintf (stdout,annotate__address_color (br)," %*" PRIx64":" , addr_fmt_width, addr);color_fprintf (stdout,annotate__asm_color (br),"%s" , dl->al.line);annotate__branch_printf (br, addr);return 0 ;
@@ -1109,7 +1108,7 @@ static int disasm_line__print(struct disasm_line *dl, u64 start)static int annotation_line__print (struct annotation_line *al,struct symbol *sym,u64 start,struct perf_evsel *evsel,u64 len,int min_pcnt,int printed, -int max_lines,struct annotation_line *queue) +int max_lines,struct annotation_line *queue,int addr_fmt_width) { struct disasm_line *dl = container_of(al, struct disasm_line, al);static const char *prev_line;
@@ -1139,7 +1138,7 @@ annotation_line__print(struct annotation_line *al, struct symbol *sym, u64 startif (queue == al)break ;annotation_line__print (queue, sym, start, evsel, len, -0 ,0 ,1 ,NULL ); +0 ,0 ,1 ,NULL , addr_fmt_width); } }
@@ -1174,9 +1173,9 @@ annotation_line__print(struct annotation_line *al, struct symbol *sym, u64 startcolor_fprintf (stdout, color," %7.2f" , sample->percent); } -printf (" : " ); +printf (" : " ); -disasm_line__print (dl, start); +disasm_line__print (dl, start, addr_fmt_width);printf ("\n" ); }else if (max_lines && printed >= max_lines)return 1 ;
@@ -1192,7 +1191,7 @@ annotation_line__print(struct annotation_line *al, struct symbol *sym, u64 startif (!*al->line)printf (" %*s:\n" , width," " );else -printf (" %*s: %s\n" , width," " , al->line); +printf (" %*s: %*s %s\n" , width," " , addr_fmt_width," " , al->line); }return 0 ;
@@ -1796,6 +1795,19 @@ static void symbol__annotate_hits(struct symbol *sym, struct perf_evsel *evsel)printf ("%*s: %" PRIu64"\n" ,BITS_PER_LONG /2 ,"h->nr_samples" , h->nr_samples); } +static int annotated_source__addr_fmt_width (struct list_head *lines,u64 start) +{ +char bf[32 ]; +struct annotation_line *line; + +list_for_each_entry_reverse (line, lines, node) { +if (line->offset !=-1 ) +return scnprintf (bf,sizeof (bf),"%" PRIx64, start + line->offset); + } + +return 0 ; +} +int symbol__annotate_printf (struct symbol *sym,struct map *map,struct perf_evsel *evsel,bool full_paths,int min_pcnt,int max_lines,int context)
@@ -1808,7 +1820,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,struct sym_hist *h =annotation__histogram (notes, evsel->idx);struct annotation_line *pos, *queue =NULL ;u64 start =map__rip_2objdump (map, sym->start); -int printed =2 , queue_len =0 ; +int printed =2 , queue_len =0 , addr_fmt_width;int more =0 ;u64 len;int width = symbol_conf.show_total_period ?12 :8 ;
@@ -1839,6 +1851,8 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,if (verbose >0 )symbol__annotate_hits (sym, evsel); + addr_fmt_width =annotated_source__addr_fmt_width (¬es->src->source, start); +list_for_each_entry (pos, ¬es->src->source, node) {int err;
@@ -1849,7 +1863,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map, err =annotation_line__print (pos, sym, start, evsel, len, min_pcnt, printed, max_lines, - queue); + queue, addr_fmt_width);switch (err) {case 0 :
Arnaldo Carvalho de Melo
maintainerEm Wed, Oct 11, 2017 at 05:01:23PM +0200, Jiri Olsa escreveu:
Quoted 2 lines
hi,
I'm working on script profiling support and came up
Can you describe what you mean by "script profiling" and "script annotation"?
- Arnaldo
Quoted 30 lines
with some generic annotation code changes, which IMO make the code simpler and more generic.
The main idea of this patchset is to have generic struct (
annotation_line), which holds the common profile data. Having this we can easily add new types, like script annotation support. Currently there'sdisasm_linesupport only.It's also available at:
git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.gitperf/annotateI'm getting same annotation results for this patchset as in the current perf, but I might have missed something.
thanks,
jirka--- tools/perf/arch/arm/annotate/instructions.c | 3 +- tools/perf/arch/arm64/annotate/instructions.c | 3 +- tools/perf/arch/powerpc/annotate/instructions.c | 4 +- tools/perf/arch/s390/annotate/instructions.c | 4 +- tools/perf/arch/x86/annotate/instructions.c | 14 +++ tools/perf/builtin-top.c | 2 +- tools/perf/ui/browsers/annotate.c | 404 +++++++++++++++++++++++++++++++++++------------------------------------- tools/perf/ui/gtk/annotate.c | 23 ++--- tools/perf/util/annotate.c | 635 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------ tools/perf/util/annotate.h | 76 ++++++++------ 10 files changed, 609 insertions(+), 559 deletions(-)
Quoted 6 lines · Arnaldo Carvalho de Melo
Em Wed, Oct 11, 2017 at 05:01:23PM +0200, Jiri Olsa escreveu:
Quoted 2 lines
hi,
I'm working on script profiling support and came upCan you describe what you mean by "script profiling" and "script annotation"?
I have some prototype code that allows to get the
internal script stack to the sample and display
it later on in report:
Samples: 20K of event 'cycles:ppp', Event count (approx.): 10598322780
Overhead Command Script File Symbol ▒ 42.29% python3 /usr/lib64/python3.6/site-packages/hawkey/__init__.py [.] union+0xe ◆ 17.17% python3 /usr/lib64/python3.6/site-packages/hawkey/__init__.py [.] run+0x0 ▒ 16.80% python3 /usr/lib/python3.6/site-packages/dnf/cli/output.py [.] _skipped_packages+0x1e ▒ 13.64% python3 N/A [.] 0x00007f9a96e655a2 ▒ 1.48% python3 N/A [.] 0x00005584196c4844 ▒ 0.71% python3 <frozen importlib._bootstrap> [.] _call_with_frames_removed+0x0 ▒ 0.56% python3 <frozen importlib._bootstrap_external> [.] _compile_bytecode+0x0 ▒ 0.55% python3 /usr/lib64/python3.6/site-packages/hawkey/__init__.py [.] run+0x0 ▒ 0.23% python3 /usr/lib64/python3.6/sre_parse.py [.] _parse+0x288 ▒ 0.20% python3 /usr/lib64/python3.6/collections/__init__.py [.] namedtuple+0x174 ▒ 0.16% python3 N/A [.] 0x00007f9a89e9bc12 ▒ 0.16% python3 <frozen importlib._bootstrap_external> [.] _path_stat+0x0 ▒
and annotate:
Percent│ # parse a simple pattern
│ 471: subpattern = SubPattern(state) ◆
│
│ # precompute constants into local variables
2.00 │ 474: subpatternappend = subpattern.append ▒
│ 475: sourceget = source.get ▒
2.00 │ 476: sourcematch = source.match ▒
│ 477: _len = len ▒
│ 478: _ord = ord ▒
│
│ 480: while True: ▒
│
6.00 │ 482: this = source.next ▒
4.00 │ 483: if this is None: ▒
│ 484: break # end of pattern ▒
2.00 │ 485: if this in "|)": ▒
│ 486: break # end of subpattern ▒
10.00 │ 487: sourceget() ▒
│
4.00 │ 489: if verbose: ▒
│ # skip whitespace and comments
4.00 │ 491: if this in WHITESPACE: ▒
│ 492: continue ▒
│ 493: if this == "#": ▒
│ 494: while True: ▒
2.00 │ 495: this = sourceget() ▒
2.00 │ 64: 496: if this is None or this == "\n": ▒
│ 497: break ▒
│ 498: continue ▒
│
6.00 │ 500: if this[0] == "\\": ▒
2.00 │ 501: code = _escape(source, this, state) ▒it so far for python.. I plan to post it next week
jirka
Arnaldo Carvalho de Melo
maintainerEm Wed, Oct 11, 2017 at 09:10:57PM +0200, Jiri Olsa escreveu:
Quoted 10 lines · Arnaldo Carvalho de Melo
Quoted 6 lines
Em Wed, Oct 11, 2017 at 05:01:23PM +0200, Jiri Olsa escreveu:
Quoted 2 lines
hi,
I'm working on script profiling support and came upCan you describe what you mean by "script profiling" and "script annotation"?
I have some prototype code that allows to get the
internal script stack to the sample and display
What is an "internal script stack"? Ah, looking further below you mean "python scripts", I see!
Please try to state what you want to achieve in a detailed way as you go writing the patches, that eases reviewing, not requiring us to go looking at _all_ the patches in a series to then figure out and restart reviewing patch by patch...
Anyway, great stuff, with that in mind I think I'll restart reviewing :-)
The first one was obvious, thanks por putting it at the front of the series, already merged.
Thanks for working on this!
- Arnaldo
Quoted 57 lines
it later on in report:
Samples: 20K of event 'cycles:ppp', Event count (approx.): 10598322780
Overhead Command Script File Symbol ▒ 42.29% python3 /usr/lib64/python3.6/site-packages/hawkey/__init__.py [.] union+0xe ◆ 17.17% python3 /usr/lib64/python3.6/site-packages/hawkey/__init__.py [.] run+0x0 ▒ 16.80% python3 /usr/lib/python3.6/site-packages/dnf/cli/output.py [.] _skipped_packages+0x1e ▒ 13.64% python3 N/A [.] 0x00007f9a96e655a2 ▒ 1.48% python3 N/A [.] 0x00005584196c4844 ▒ 0.71% python3 <frozen importlib._bootstrap> [.] _call_with_frames_removed+0x0 ▒ 0.56% python3 <frozen importlib._bootstrap_external> [.] _compile_bytecode+0x0 ▒ 0.55% python3 /usr/lib64/python3.6/site-packages/hawkey/__init__.py [.] run+0x0 ▒ 0.23% python3 /usr/lib64/python3.6/sre_parse.py [.] _parse+0x288 ▒ 0.20% python3 /usr/lib64/python3.6/collections/__init__.py [.] namedtuple+0x174 ▒ 0.16% python3 N/A [.] 0x00007f9a89e9bc12 ▒ 0.16% python3 <frozen importlib._bootstrap_external> [.] _path_stat+0x0 ▒and annotate:
Percent│ # parse a simple pattern │ 471: subpattern = SubPattern(state) ◆ │ │ # precompute constants into local variables 2.00 │ 474: subpatternappend = subpattern.append ▒ │ 475: sourceget = source.get ▒ 2.00 │ 476: sourcematch = source.match ▒ │ 477: _len = len ▒ │ 478: _ord = ord ▒ │ │ 480: while True: ▒ │ 6.00 │ 482: this = source.next ▒ 4.00 │ 483: if this is None: ▒ │ 484: break # end of pattern ▒ 2.00 │ 485: if this in "|)": ▒ │ 486: break # end of subpattern ▒ 10.00 │ 487: sourceget() ▒ │ 4.00 │ 489: if verbose: ▒ │ # skip whitespace and comments 4.00 │ 491: if this in WHITESPACE: ▒ │ 492: continue ▒ │ 493: if this == "#": ▒ │ 494: while True: ▒ 2.00 │ 495: this = sourceget() ▒ 2.00 │ 64: 496: if this is None or this == "\n": ▒ │ 497: break ▒ │ 498: continue ▒ │ 6.00 │ 500: if this[0] == "\\": ▒ 2.00 │ 501: code = _escape(source, this, state) ▒it so far for python.. I plan to post it next week
jirka
Quoted 6 lines · Arnaldo Carvalho de Melo
Em Wed, Oct 11, 2017 at 09:10:57PM +0200, Jiri Olsa escreveu:
Quoted 5 lines · Arnaldo Carvalho de Melo
Quoted 4 lines
Em Wed, Oct 11, 2017 at 05:01:23PM +0200, Jiri Olsa escreveu:
Quoted 2 lines
hi,
I'm working on script profiling support and came up
Quoted 8 lines
Quoted 5 lines
Quoted 2 lines
Can you describe what you mean by "script profiling" and "script annotation"?
I have some prototype code that allows to get the
internal script stack to the sample and displayWhat is an "internal script stack"? Ah, looking further below you mean "python scripts", I see!
yep, the stack/callchain inside script ;-) only python so far
Quoted 5 lines
Please try to state what you want to achieve in a detailed way as you go writing the patches, that eases reviewing, not requiring us to go looking at _all_ the patches in a series to then figure out and restart reviewing patch by patch...
well I think the annotation patches i sent can stand on their own and also I did not want to send it all in 50+ patches bomb
jirka
Arnaldo Carvalho de Melo
maintainerEm Wed, Oct 11, 2017 at 09:30:05PM +0200, Jiri Olsa escreveu:
Quoted 17 lines · Arnaldo Carvalho de Melo
Quoted 5 lines
Em Wed, Oct 11, 2017 at 09:10:57PM +0200, Jiri Olsa escreveu:
Quoted 3 lines · Arnaldo Carvalho de Melo
Quoted 2 lines
Em Wed, Oct 11, 2017 at 05:01:23PM +0200, Jiri Olsa escreveu:
Quoted 1 line
I'm working on script profiling support and came up
Quoted 8 lines
Quoted 5 lines
Quoted 2 lines
Can you describe what you mean by "script profiling" and "script annotation"?
I have some prototype code that allows to get the
internal script stack to the sample and displayWhat is an "internal script stack"? Ah, looking further below you mean "python scripts", I see!
yep, the stack/callchain inside script ;-) only python so far
Quoted 7 lines
Quoted 4 lines
Please try to state what you want to achieve in a detailed way as you go writing the patches, that eases reviewing, not requiring us to go looking at _all_ the patches in a series to then figure out and restart reviewing patch by patch...
well I think the annotation patches i sent can stand on their own and also I did not want to send it all in 50+ patches bomb
Yeah, but understanding what you want to get to helps in reviewing, anyway, now I know :-)
- Arnaldo
Quoted 5 lines · Jiri Olsa
hi,
I'm working on script profiling support and came up with some generic annotation code changes, which IMO make the code simpler and more generic.
Quoted 8 lines
The main idea of this patchset is to have generic struct (
annotation_line), which holds the common profile data. Having this we can easily add new types, like script annotation support. Currently there'sdisasm_linesupport only.It's also available at:
git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.gitperf/annotate
updated with last perf/core and pushed out
jirka
Arnaldo Carvalho de Melo
maintainerEm Thu, Nov 02, 2017 at 01:16:32PM +0100, Jiri Olsa escreveu:
Quoted 12 lines · Jiri Olsa
Quoted 11 lines
hi,
I'm working on script profiling support and came up with some generic annotation code changes, which IMO make the code simpler and more generic.The main idea of this patchset is to have generic struct (
annotation_line), which holds the common profile data. Having this we can easily add new types, like script annotation support. Currently there'sdisasm_linesupport only.
Quoted 4 lines
Quoted 2 lines
It's also available at:
git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.gitperf/annotateupdated with last perf/core and pushed out
Can you please ellaborate, write _why_ you're doing these things instead of just saying _what_ is being done?
Author: Jiri Olsa <[email protected]> Date: Thu Sep 28 23:13:38 2017 +0200
perf annotate browser: Change selection to struct annotation_line
Use struct annotation_line as a browser::selection.
commit 902e9181b8f3807a4e51b587c3e5dcd32d61d3b2
Author: Jiri Olsa <[email protected]> Date: Tue Oct 3 15:51:43 2017 +0200
perf annotate browser: Rename disasm_line__browser to browser_line
Renaming disasm_line__browser function to browser_line.
commit f75c5dcbb250af16621cf0d4d42efa2ba08641cf
Author: Jiri Olsa <[email protected]> Date: Tue Oct 3 15:48:39 2017 +0200
perf annotate browser: Rename struct browser_disasm_line to browser_line
Renaming struct browser_disasm_line to browser_line.
Quoted 13 lines · Arnaldo Carvalho de Melo
Em Thu, Nov 02, 2017 at 01:16:32PM +0100, Jiri Olsa escreveu:
Quoted 12 lines · Jiri Olsa
Quoted 11 lines
hi,
I'm working on script profiling support and came up with some generic annotation code changes, which IMO make the code simpler and more generic.The main idea of this patchset is to have generic struct (
annotation_line), which holds the common profile data. Having this we can easily add new types, like script annotation support. Currently there'sdisasm_linesupport only.
Quoted 7 lines
Quoted 4 lines
Quoted 2 lines
It's also available at:
git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.gitperf/annotateupdated with last perf/core and pushed out
Can you please ellaborate, write _why_ you're doing these things instead of just saying _what_ is being done?
I will.. guess I worked too long and got too familiar with that, so it did not occur to me there's explanation needed ;-)
Quoted 10 lines
Author: Jiri Olsa <[email protected]> Date: Thu Sep 28 23:13:38 2017 +0200perf annotate browser: Change selection to struct
annotation_lineUse struct
annotation_lineas abrowser::selection.Signed-off-by Jiri Olsa <[email protected]>
the idea is to move to generic annotation_line struct in generic places so it can work over different sources
Quoted 16 lines
commit
902e9181b8f3807a4e51b587c3e5dcd32d61d3b2Author: Jiri Olsa <[email protected]> Date: Tue Oct 3 15:51:43 2017 +0200perf annotate browser: Rename
disasm_line__browsertobrowser_lineRenaming
disasm_line__browserfunction tobrowser_line.Signed-off-by Jiri Olsa <[email protected]>commit
f75c5dcbb250af16621cf0d4d42efa2ba08641cfAuthor: Jiri Olsa <[email protected]> Date: Tue Oct 3 15:48:39 2017 +0200
Quoted 6 lines
perf annotate browser: Rename struct
browser_disasm_linetobrowser_lineRenaming struct
browser_disasm_linetobrowser_line.Signed-off-by Jiri Olsa <[email protected]>
both browser_disasm_line and disasm_line__browser lost the 'disasm' by using the generic annotation_line struct.. so there's no need to keep it in its name
I'll update changelogs and resend/repush
thanks,
jirka
On Sat, Nov 04, 2017 at 11:29:08AM +0100, Jiri Olsa wrote:
SNIP
Quoted 6 lines
both
browser_disasm_lineanddisasm_line__browserlost the 'disasm' by using the genericannotation_linestruct.. so there's no need to keep it in its nameI'll update changelogs and resend/repush
branch updated/pushed
jirka