When kcore is used for annotation, symbols do not
have correct sizes because they come from kallsyms.
That sometimes results in an extra nop being seen
after the end of a function.  Remove it.

Signed-off-by: Adrian Hunter <adrian.hun...@intel.com>
---
 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.7.11.7

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
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