]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - tools/perf/util/annotate.c
perf annotate: Remove nop at end of annotation
[karo-tx-linux.git] / tools / perf / util / annotate.c
index 4ab2f11ee6f4e7e02034a42f2460004aedad84ad..646e38dad01b848d5afedd910660f2c8ac2be5d8 100644 (file)
@@ -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)