perf script: Allow --symbol to accept hexadecimal addresses
authorStephane Eranian <eranian@google.com>
Wed, 25 Mar 2020 22:08:02 +0000 (15:08 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 3 Apr 2020 12:37:56 +0000 (09:37 -0300)
This patch extends the perf script --symbols option to filter on
hexadecimal addresses in addition to symbol names. This makes it easier
to handle cases where symbols are aliased.

With this patch, it is possible to mix and match symbols and hexadecimal
addresses using the --symbols option.

  $ perf script --symbols=noploop,0x4007a0

Signed-off-by: Stephane Eranian <eranian@google.com>
Reviewed-by: Ian Rogers <irogers@google.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lore.kernel.org/lkml/20200325220802.15039-1-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/event.c

index 824c038e5c33d5df23291286e71cc90ec372363c..dc0e11214ae1a1678f1796a613d52193c042bce3 100644 (file)
@@ -617,10 +617,23 @@ int machine__resolve(struct machine *machine, struct addr_location *al,
                al->sym = map__find_symbol(al->map, al->addr);
        }
 
-       if (symbol_conf.sym_list &&
-               (!al->sym || !strlist__has_entry(symbol_conf.sym_list,
-                                               al->sym->name))) {
-               al->filtered |= (1 << HIST_FILTER__SYMBOL);
+       if (symbol_conf.sym_list) {
+               int ret = 0;
+               char al_addr_str[32];
+               size_t sz = sizeof(al_addr_str);
+
+               if (al->sym) {
+                       ret = strlist__has_entry(symbol_conf.sym_list,
+                                               al->sym->name);
+               }
+               if (!(ret && al->sym)) {
+                       snprintf(al_addr_str, sz, "0x%"PRIx64,
+                               al->map->unmap_ip(al->map, al->sym->start));
+                       ret = strlist__has_entry(symbol_conf.sym_list,
+                                               al_addr_str);
+               }
+               if (!ret)
+                       al->filtered |= (1 << HIST_FILTER__SYMBOL);
        }
 
        return 0;