From: Adrian Hunter <[email protected]>

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 <[email protected]>
Signed-off-by: Adrian Hunter <[email protected]>
Cc: David Ahern <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Mike Galbraith <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Stephane Eranian <[email protected]>
Link: 
http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
 tools/perf/util/annotate.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
index 4ab2f11..646e38d 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,
        return 0;
 }
 
+static void delete_last_nop(struct symbol *sym)
+{
+       struct annotation *notes = symbol__annotation(sym);
+       struct list_head *list = &notes->src->source;
+       struct disasm_line *dl;
+
+       while (!list_empty(list)) {
+               dl = list_entry(list->prev, struct disasm_line, node);
+
+               if (dl->ins && dl->ins->ops) {
+                       if (dl->ins->ops != &nop_ops)
+                               return;
+               } else {
+                       if (!strstr(dl->line, " nop ") &&
+                           !strstr(dl->line, " nopl ") &&
+                           !strstr(dl->line, " nopw "))
+                               return;
+               }
+
+               list_del(&dl->node);
+               disasm_line__free(dl);
+       }
+}
+
 int symbol__annotate(struct symbol *sym, struct map *map, size_t privsize)
 {
        struct dso *dso = map->dso;
@@ -923,6 +947,13 @@ fallback:
                if (symbol__parse_objdump_line(sym, map, file, privsize) < 0)
                        break;
 
+       /*
+        * kallsyms does not have symbol sizes so there may a nop at the end.
+        * Remove it.
+        */
+       if (dso__is_kcore(dso))
+               delete_last_nop(sym);
+
        pclose(file);
 out_free_filename:
        if (free_filename)
-- 
1.8.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to