perf symbols: Adopt the strlists for dso, comm
authorArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 15 Dec 2009 22:04:40 +0000 (20:04 -0200)
committerIngo Molnar <mingo@elte.hu>
Wed, 16 Dec 2009 07:53:49 +0000 (08:53 +0100)
Will be used in perf diff too.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <1260914682-29652-2-git-send-email-acme@infradead.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
tools/perf/builtin-annotate.c
tools/perf/builtin-diff.c
tools/perf/builtin-kmem.c
tools/perf/builtin-record.c
tools/perf/builtin-report.c
tools/perf/builtin-timechart.c
tools/perf/builtin-trace.c
tools/perf/util/symbol.c
tools/perf/util/symbol.h

index e656e25f1c14678491d4056fec3fd531e7bd491a..645d58058431c2ec9a69f07aa1e0037930a3445c 100644 (file)
@@ -518,14 +518,14 @@ static const struct option options[] = {
 
 int cmd_annotate(int argc, const char **argv, const char *prefix __used)
 {
+       argc = parse_options(argc, argv, options, annotate_usage, 0);
+
        symbol_conf.priv_size = sizeof(struct sym_priv);
        symbol_conf.try_vmlinux_path = true;
 
        if (symbol__init() < 0)
                return -1;
 
-       argc = parse_options(argc, argv, options, annotate_usage, 0);
-
        setup_sorting(annotate_usage, options);
 
        if (argc) {
index 67328d1069942b0822c78946171129e2a77a6ca5..4fde606553417066378fb30ad9f6e9227096cc29 100644 (file)
@@ -265,11 +265,6 @@ static const struct option options[] = {
 
 int cmd_diff(int argc, const char **argv, const char *prefix __used)
 {
-       if (symbol__init() < 0)
-               return -1;
-
-       setup_sorting(diff_usage, options);
-
        argc = parse_options(argc, argv, options, diff_usage, 0);
        if (argc) {
                if (argc > 2)
@@ -281,6 +276,10 @@ int cmd_diff(int argc, const char **argv, const char *prefix __used)
                        input_new = argv[0];
        }
 
+       if (symbol__init() < 0)
+               return -1;
+
+       setup_sorting(diff_usage, options);
        setup_pager();
        return __cmd_diff();
 }
index e078797ab1f1425df1c8f1423fba7d01b938b449..fc21ad79dd83e25a7520f00e6d3611587650ee79 100644 (file)
@@ -766,13 +766,13 @@ static int __cmd_record(int argc, const char **argv)
 
 int cmd_kmem(int argc, const char **argv, const char *prefix __used)
 {
-       symbol__init();
-
        argc = parse_options(argc, argv, kmem_options, kmem_usage, 0);
 
        if (!argc)
                usage_with_options(kmem_usage, kmem_options);
 
+       symbol__init();
+
        if (!strncmp(argv[0], "rec", 3)) {
                return __cmd_record(argc, argv);
        } else if (!strcmp(argv[0], "stat")) {
index 1da48a8fe9cc936f53f48f67b9251156451ecc5e..65301c5ca1dedcffcc473c35767b01960cba19dd 100644 (file)
@@ -632,13 +632,13 @@ int cmd_record(int argc, const char **argv, const char *prefix __used)
 {
        int counter;
 
-       symbol__init();
-
        argc = parse_options(argc, argv, options, record_usage,
-               PARSE_OPT_STOP_AT_NON_OPTION);
+                           PARSE_OPT_STOP_AT_NON_OPTION);
        if (!argc && target_pid == -1 && !system_wide)
                usage_with_options(record_usage, options);
 
+       symbol__init();
+
        if (!nr_counters) {
                nr_counters     = 1;
                attrs[0].type   = PERF_TYPE_HARDWARE;
index c349bdbb94745961dca6ca3077735ed65832b357..03afac3b56ef692e77958d0bf7131fbc2f8ff462 100644 (file)
 
 static char            const *input_name = "perf.data";
 
-static char            *dso_list_str, *comm_list_str, *sym_list_str,
-                       *col_width_list_str;
-static struct strlist  *dso_list, *comm_list, *sym_list;
-
 static int             force;
 static bool            use_callchain;
 
@@ -365,8 +361,9 @@ static size_t hist_entry__fprintf(FILE *fp, struct hist_entry *self,
 
 static void dso__calc_col_width(struct dso *self)
 {
-       if (!col_width_list_str && !field_sep &&
-           (!dso_list || strlist__has_entry(dso_list, self->name))) {
+       if (!symbol_conf.col_width_list_str && !field_sep &&
+           (!symbol_conf.dso_list ||
+            strlist__has_entry(symbol_conf.dso_list, self->name))) {
                unsigned int slen = strlen(self->name);
                if (slen > dsos__col_width)
                        dsos__col_width = slen;
@@ -379,8 +376,9 @@ static void thread__comm_adjust(struct thread *self)
 {
        char *comm = self->comm;
 
-       if (!col_width_list_str && !field_sep &&
-           (!comm_list || strlist__has_entry(comm_list, comm))) {
+       if (!symbol_conf.col_width_list_str && !field_sep &&
+           (!symbol_conf.comm_list ||
+            strlist__has_entry(symbol_conf.comm_list, comm))) {
                unsigned int slen = strlen(comm);
 
                if (slen > comms__col_width) {
@@ -442,7 +440,7 @@ static size_t perf_session__fprintf_hist_entries(struct perf_session *self,
        struct rb_node *nd;
        size_t ret = 0;
        unsigned int width;
-       char *col_width = col_width_list_str;
+       char *col_width = symbol_conf.col_width_list_str;
        int raw_printing_style;
 
        raw_printing_style = !strcmp(pretty_printing_style, "raw");
@@ -468,7 +466,7 @@ static size_t perf_session__fprintf_hist_entries(struct perf_session *self,
                }
                width = strlen(se->header);
                if (se->width) {
-                       if (col_width_list_str) {
+                       if (symbol_conf.col_width_list_str) {
                                if (col_width) {
                                        *se->width = atoi(col_width);
                                        col_width = strchr(col_width, ',');
@@ -587,7 +585,8 @@ static int process_sample_event(event_t *event, struct perf_session *session)
 
        dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid);
 
-       if (comm_list && !strlist__has_entry(comm_list, thread->comm))
+       if (symbol_conf.comm_list &&
+           !strlist__has_entry(symbol_conf.comm_list, thread->comm))
                return 0;
 
        cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
@@ -601,14 +600,15 @@ static int process_sample_event(event_t *event, struct perf_session *session)
        if (al.map && !sort_dso.elide && !al.map->dso->slen_calculated)
                dso__calc_col_width(al.map->dso);
 
-       if (dso_list &&
+       if (symbol_conf.dso_list &&
            (!al.map || !al.map->dso ||
-            !(strlist__has_entry(dso_list, al.map->dso->short_name) ||
+            !(strlist__has_entry(symbol_conf.dso_list, al.map->dso->short_name) ||
               (al.map->dso->short_name != al.map->dso->long_name &&
-               strlist__has_entry(dso_list, al.map->dso->long_name)))))
+               strlist__has_entry(symbol_conf.dso_list, al.map->dso->long_name)))))
                return 0;
 
-       if (sym_list && al.sym && !strlist__has_entry(sym_list, al.sym->name))
+       if (symbol_conf.sym_list && al.sym &&
+           !strlist__has_entry(symbol_conf.sym_list, al.sym->name))
                return 0;
 
        if (perf_session__add_hist_entry(session, &al, data.callchain, data.period)) {
@@ -825,13 +825,13 @@ static const struct option options[] = {
        OPT_CALLBACK_DEFAULT('g', "call-graph", NULL, "output_type,min_percent",
                     "Display callchains using output_type and min percent threshold. "
                     "Default: fractal,0.5", &parse_callchain_opt, callchain_default_opt),
-       OPT_STRING('d', "dsos", &dso_list_str, "dso[,dso...]",
+       OPT_STRING('d', "dsos", &symbol_conf.dso_list_str, "dso[,dso...]",
                   "only consider symbols in these dsos"),
-       OPT_STRING('C', "comms", &comm_list_str, "comm[,comm...]",
+       OPT_STRING('C', "comms", &symbol_conf.comm_list_str, "comm[,comm...]",
                   "only consider symbols in these comms"),
-       OPT_STRING('S', "symbols", &sym_list_str, "symbol[,symbol...]",
+       OPT_STRING('S', "symbols", &symbol_conf.sym_list_str, "symbol[,symbol...]",
                   "only consider these symbols"),
-       OPT_STRING('w', "column-widths", &col_width_list_str,
+       OPT_STRING('w', "column-widths", &symbol_conf.col_width_list_str,
                   "width[,width...]",
                   "don't try to adjust column width, use these fixed values"),
        OPT_STRING('t', "field-separator", &field_sep, "separator",
@@ -840,32 +840,25 @@ static const struct option options[] = {
        OPT_END()
 };
 
-static void setup_list(struct strlist **list, const char *list_str,
-                      struct sort_entry *se, const char *list_name,
-                      FILE *fp)
+static void sort_entry__setup_elide(struct sort_entry *self,
+                                   struct strlist *list,
+                                   const char *list_name, FILE *fp)
 {
-       if (list_str) {
-               *list = strlist__new(true, list_str);
-               if (!*list) {
-                       fprintf(stderr, "problems parsing %s list\n",
-                               list_name);
-                       exit(129);
-               }
-               if (strlist__nr_entries(*list) == 1) {
-                       fprintf(fp, "# %s: %s\n", list_name,
-                               strlist__entry(*list, 0)->s);
-                       se->elide = true;
-               }
+       if (list && strlist__nr_entries(list) == 1) {
+               fprintf(fp, "# %s: %s\n", list_name, strlist__entry(list, 0)->s);
+               self->elide = true;
        }
 }
 
 int cmd_report(int argc, const char **argv, const char *prefix __used)
 {
+       argc = parse_options(argc, argv, options, report_usage, 0);
+
+       setup_pager();
+
        if (symbol__init() < 0)
                return -1;
 
-       argc = parse_options(argc, argv, options, report_usage, 0);
-
        setup_sorting(report_usage, options);
 
        if (parent_pattern != default_parent_pattern) {
@@ -880,11 +873,9 @@ int cmd_report(int argc, const char **argv, const char *prefix __used)
        if (argc)
                usage_with_options(report_usage, options);
 
-       setup_pager();
-
-       setup_list(&dso_list, dso_list_str, &sort_dso, "dso", stdout);
-       setup_list(&comm_list, comm_list_str, &sort_comm, "comm", stdout);
-       setup_list(&sym_list, sym_list_str, &sort_sym, "symbol", stdout);
+       sort_entry__setup_elide(&sort_dso, symbol_conf.dso_list, "dso", stdout);
+       sort_entry__setup_elide(&sort_comm, symbol_conf.comm_list, "comm", stdout);
+       sort_entry__setup_elide(&sort_sym, symbol_conf.sym_list, "symbol", stdout);
 
        if (field_sep && *field_sep == '.') {
                fputs("'.' is the only non valid --field-separator argument\n",
index 9c98b7a2b19a70ba109f7a9791a5859993368272..a589a43112d67f7b764ae02365a1b53e2e8119a7 100644 (file)
@@ -1137,11 +1137,11 @@ static const struct option options[] = {
 
 int cmd_timechart(int argc, const char **argv, const char *prefix __used)
 {
-       symbol__init();
-
        argc = parse_options(argc, argv, options, timechart_usage,
                        PARSE_OPT_STOP_AT_NON_OPTION);
 
+       symbol__init();
+
        if (argc && !strncmp(argv[0], "rec", 3))
                return __cmd_record(argc, argv);
        else if (argc)
index 07ad25ca654f6fac95cd0179dedad3e1ddd0a5c5..e2285e28720fe2cb076240edc53fdd90913ee748 100644 (file)
@@ -579,13 +579,13 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used)
                exit(-1);
        }
 
-       symbol__init();
-
        setup_scripting();
 
        argc = parse_options(argc, argv, options, annotate_usage,
                             PARSE_OPT_STOP_AT_NON_OPTION);
 
+       if (symbol__init() < 0)
+               return -1;
        setup_pager();
 
        session = perf_session__new(input_name, O_RDONLY, 0);
index 17ce01269a91faba57ea7fc159ea3eb1ab8aa53c..164286ace7dfead09efaca6a6b5286b1d05e0a5d 100644 (file)
@@ -1,6 +1,7 @@
 #include "util.h"
 #include "../perf.h"
 #include "session.h"
+#include "sort.h"
 #include "string.h"
 #include "symbol.h"
 #include "thread.h"
@@ -1739,6 +1740,20 @@ out_fail:
        return -1;
 }
 
+static int setup_list(struct strlist **list, const char *list_str,
+                     const char *list_name)
+{
+       if (list_str == NULL)
+               return 0;
+
+       *list = strlist__new(true, list_str);
+       if (!*list) {
+               pr_err("problems parsing %s list\n", list_name);
+               return -1;
+       }
+       return 0;
+}
+
 int symbol__init(void)
 {
        elf_version(EV_CURRENT);
@@ -1749,7 +1764,25 @@ int symbol__init(void)
        if (symbol_conf.try_vmlinux_path && vmlinux_path__init() < 0)
                return -1;
 
+       if (setup_list(&symbol_conf.dso_list,
+                      symbol_conf.dso_list_str, "dso") < 0)
+               return -1;
+
+       if (setup_list(&symbol_conf.comm_list,
+                      symbol_conf.comm_list_str, "comm") < 0)
+               goto out_free_dso_list;
+
+       if (setup_list(&symbol_conf.sym_list,
+                      symbol_conf.sym_list_str, "symbol") < 0)
+               goto out_free_comm_list;
+
        return 0;
+
+out_free_dso_list:
+       strlist__delete(symbol_conf.dso_list);
+out_free_comm_list:
+       strlist__delete(symbol_conf.comm_list);
+       return -1;
 }
 
 int perf_session__create_kernel_maps(struct perf_session *self)
index 766294735f9305f7656728302ad06ffda890e268..d61f350749976fce8cdcd6115bce6468d098be09 100644 (file)
@@ -49,12 +49,21 @@ struct symbol {
        char            name[0];
 };
 
+struct strlist;
+
 struct symbol_conf {
        unsigned short  priv_size;
        bool            try_vmlinux_path,
                        use_modules,
                        sort_by_name;
        const char      *vmlinux_name;
+       char            *dso_list_str,
+                       *comm_list_str,
+                       *sym_list_str,
+                       *col_width_list_str;
+       struct strlist  *dso_list,
+                       *comm_list,
+                       *sym_list;
 };
 
 extern struct symbol_conf symbol_conf;