aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/annotate.c
diff options
context:
space:
mode:
authorAdrian Hunter <adrian.hunter@intel.com>2013-08-07 07:38:56 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2013-08-07 16:35:35 -0400
commit484a5e7476b7ce790ba37417a4976c7f86a87231 (patch)
tree400618e694cdac7b0de196a69c50f3293cfe160a /tools/perf/util/annotate.c
parent34f77abcb34e1da4ee3ca5c5a41b673664eee1fa (diff)
perf annotate: Remove nop at end of annotation
When kcore is used for annotation, symbols do not have correct sizes because they come from kallsyms, that has only its start address, with the end address being the next symbol's minus one. That sometimes results in an extra nop being seen after the end of a function. Remove it. Suggested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1375875537-4509-13-git-send-email-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/annotate.c')
-rw-r--r--tools/perf/util/annotate.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index 4ab2f11ee6f4..646e38dad01b 100644
--- a/tools/perf/util/annotate.c
+++ b/tools/perf/util/annotate.c
@@ -830,6 +830,30 @@ static int symbol__parse_objdump_line(struct symbol *sym, struct map *map,
830 return 0; 830 return 0;
831} 831}
832 832
833static void delete_last_nop(struct symbol *sym)
834{
835 struct annotation *notes = symbol__annotation(sym);
836 struct list_head *list = &notes->src->source;
837 struct disasm_line *dl;
838
839 while (!list_empty(list)) {
840 dl = list_entry(list->prev, struct disasm_line, node);
841
842 if (dl->ins && dl->ins->ops) {
843 if (dl->ins->ops != &nop_ops)
844 return;
845 } else {
846 if (!strstr(dl->line, " nop ") &&
847 !strstr(dl->line, " nopl ") &&
848 !strstr(dl->line, " nopw "))
849 return;
850 }
851
852 list_del(&dl->node);
853 disasm_line__free(dl);
854 }
855}
856
833int symbol__annotate(struct symbol *sym, struct map *map, size_t privsize) 857int symbol__annotate(struct symbol *sym, struct map *map, size_t privsize)
834{ 858{
835 struct dso *dso = map->dso; 859 struct dso *dso = map->dso;
@@ -923,6 +947,13 @@ fallback:
923 if (symbol__parse_objdump_line(sym, map, file, privsize) < 0) 947 if (symbol__parse_objdump_line(sym, map, file, privsize) < 0)
924 break; 948 break;
925 949
950 /*
951 * kallsyms does not have symbol sizes so there may a nop at the end.
952 * Remove it.
953 */
954 if (dso__is_kcore(dso))
955 delete_last_nop(sym);
956
926 pclose(file); 957 pclose(file);
927out_free_filename: 958out_free_filename:
928 if (free_filename) 959 if (free_filename)