2011-04-16 06:40:49

by Anton Blanchard

[permalink] [raw]
Subject: [PATCH] perf annotate: Add config option for additional objdump arguments


We sometimes need to pass arguments to objdump, for example to
specify a particular machine type. In the case below I am profiling
on POWER7 and perf annotate is unable to decode a POWER7 specific
instruction:

c000000000008ff0: 7f 45 26 98 .long 0x7f452698

With the patch below and the following in ~/.perfconfig:

[objdump]
options = -Mpower7

perf annotate successfully decodes the instruction:

c000000000008ff0: 7f 45 26 98 lxvd2x vs26,r5,r4

Signed-off-by: Anton Blanchard <[email protected]>
---

What do people think of objdump.options? Would annotate.objdump_options be
better?

Also we only look at the first occurance of the option, do we want to
parse everything found and concatenate them together?

Index: linux.trees.git/tools/perf/util/annotate.c
===================================================================
--- linux.trees.git.orig/tools/perf/util/annotate.c 2011-04-16 16:00:31.000000000 +1000
+++ linux.trees.git/tools/perf/util/annotate.c 2011-04-16 16:26:46.000000000 +1000
@@ -16,10 +16,33 @@
#include "annotate.h"
#include <pthread.h>

+static char *objdump_options;
+
+static int perf_objdump_config(const char *var, const char *value, void *cb)
+{
+ if (objdump_options == NULL && !strcmp(var, "objdump.options")) {
+ size_t len = strlen(value);
+
+ objdump_options = zalloc(len + 1);
+ strncpy(objdump_options, value, len);
+
+ return 0;
+ }
+
+ return perf_default_config(var, value, cb);
+}
+
int symbol__annotate_init(struct map *map __used, struct symbol *sym)
{
struct annotation *notes = symbol__annotation(sym);
pthread_mutex_init(&notes->lock, NULL);
+
+ if (objdump_options == NULL) {
+ perf_config(perf_objdump_config, NULL);
+ if (objdump_options == NULL)
+ objdump_options = zalloc(1);
+ }
+
return 0;
}

@@ -324,9 +347,11 @@ fallback:

snprintf(command, sizeof(command),
"objdump --start-address=0x%016" PRIx64
- " --stop-address=0x%016" PRIx64 " -dS -C %s|grep -v %s|expand",
+ " --stop-address=0x%016" PRIx64 " %s -dS -C %s|"
+ "grep -v %s|expand",
map__rip_2objdump(map, sym->start),
map__rip_2objdump(map, sym->end),
+ objdump_options,
symfs_filename, filename);

pr_debug("Executing: %s\n", command);


2011-04-16 07:54:27

by Ingo Molnar

[permalink] [raw]
Subject: Re: [PATCH] perf annotate: Add config option for additional objdump arguments


* Anton Blanchard <[email protected]> wrote:

>
> We sometimes need to pass arguments to objdump, for example to
> specify a particular machine type. In the case below I am profiling
> on POWER7 and perf annotate is unable to decode a POWER7 specific
> instruction:
>
> c000000000008ff0: 7f 45 26 98 .long 0x7f452698
>
> With the patch below and the following in ~/.perfconfig:
>
> [objdump]
> options = -Mpower7

Hm, could we please detect the required flags automatically and pass them along
without forcing people into twiddling their ~/.perfconfig?

I don't mind the options patch either - but please first automate it, *then*
add this as a quick fix for similar future problems.

Thanks,

Ingo

2011-04-24 01:49:44

by Anton Blanchard

[permalink] [raw]
Subject: Re: [PATCH] perf annotate: Add config option for additional objdump arguments


Hi Ingo,

> Hm, could we please detect the required flags automatically and pass
> them along without forcing people into twiddling their ~/.perfconfig?
>
> I don't mind the options patch either - but please first automate it,
> *then* add this as a quick fix for similar future problems.

Good point. Unfortunately there are some overlapping opcodes between
the ppc embedded and server chips but we could get most of the way
there by specifying using objdump -Many.

Anton