perf tools: Remove filter parameter of perf_event__preprocess_sample()
[deliverable/linux.git] / tools / perf / builtin-report.c
index ca98d34cd58b533491a255c8349795f581afce17..958a56a0e39e7f8a0ca14bbc52db3e5bdab4e0c4 100644 (file)
@@ -49,7 +49,6 @@ struct perf_report {
        bool                    mem_mode;
        struct perf_read_values show_threads_values;
        const char              *pretty_printing_style;
-       symbol_filter_t         annotate_init;
        const char              *cpu_list;
        const char              *symbol_filter_str;
        float                   min_percent;
@@ -89,7 +88,7 @@ static int perf_report__add_mem_hist_entry(struct perf_tool *tool,
        if ((sort__has_parent || symbol_conf.use_callchain) &&
            sample->callchain) {
                err = machine__resolve_callchain(machine, evsel, al->thread,
-                                                sample, &parent);
+                                                sample, &parent, al);
                if (err)
                        return err;
        }
@@ -180,7 +179,7 @@ static int perf_report__add_branch_hist_entry(struct perf_tool *tool,
        if ((sort__has_parent || symbol_conf.use_callchain)
            && sample->callchain) {
                err = machine__resolve_callchain(machine, evsel, al->thread,
-                                                sample, &parent);
+                                                sample, &parent, al);
                if (err)
                        return err;
        }
@@ -254,7 +253,7 @@ static int perf_evsel__add_hist_entry(struct perf_evsel *evsel,
 
        if ((sort__has_parent || symbol_conf.use_callchain) && sample->callchain) {
                err = machine__resolve_callchain(machine, evsel, al->thread,
-                                                sample, &parent);
+                                                sample, &parent, al);
                if (err)
                        return err;
        }
@@ -305,8 +304,7 @@ static int process_sample_event(struct perf_tool *tool,
        struct addr_location al;
        int ret;
 
-       if (perf_event__preprocess_sample(event, machine, &al, sample,
-                                         rep->annotate_init) < 0) {
+       if (perf_event__preprocess_sample(event, machine, &al, sample) < 0) {
                fprintf(stderr, "problem processing %d event, skipping it.\n",
                        event->header.type);
                return -1;
@@ -497,7 +495,7 @@ static int __cmd_report(struct perf_report *rep)
                ret = perf_session__cpu_bitmap(session, rep->cpu_list,
                                               rep->cpu_bitmap);
                if (ret)
-                       goto out_delete;
+                       return ret;
        }
 
        if (use_browser <= 0)
@@ -508,11 +506,11 @@ static int __cmd_report(struct perf_report *rep)
 
        ret = perf_report__setup_sample_type(rep);
        if (ret)
-               goto out_delete;
+               return ret;
 
        ret = perf_session__process_events(session, &rep->tool);
        if (ret)
-               goto out_delete;
+               return ret;
 
        kernel_map = session->machines.host.vmlinux_maps[MAP__FUNCTION];
        kernel_kmap = map__kmap(kernel_map);
@@ -547,7 +545,7 @@ static int __cmd_report(struct perf_report *rep)
 
        if (dump_trace) {
                perf_session__fprintf_nr_events(session, stdout);
-               goto out_delete;
+               return 0;
        }
 
        nr_samples = 0;
@@ -572,7 +570,7 @@ static int __cmd_report(struct perf_report *rep)
 
        if (nr_samples == 0) {
                ui__error("The %s file has no samples!\n", session->filename);
-               goto out_delete;
+               return 0;
        }
 
        list_for_each_entry(pos, &session->evlist->entries, node)
@@ -598,19 +596,6 @@ static int __cmd_report(struct perf_report *rep)
        } else
                perf_evlist__tty_browse_hists(session->evlist, rep, help);
 
-out_delete:
-       /*
-        * Speed up the exit process, for large files this can
-        * take quite a while.
-        *
-        * XXX Enable this when using valgrind or if we ever
-        * librarize this command.
-        *
-        * Also experiment with obstacks to see how much speed
-        * up we'll get here.
-        *
-        * perf_session__delete(session);
-        */
        return ret;
 }
 
@@ -680,12 +665,23 @@ parse_callchain_opt(const struct option *opt, const char *arg, int unset)
        }
 
        /* get the call chain order */
-       if (!strcmp(tok2, "caller"))
+       if (!strncmp(tok2, "caller", strlen("caller")))
                callchain_param.order = ORDER_CALLER;
-       else if (!strcmp(tok2, "callee"))
+       else if (!strncmp(tok2, "callee", strlen("callee")))
                callchain_param.order = ORDER_CALLEE;
        else
                return -1;
+
+       /* Get the sort key */
+       tok2 = strtok(NULL, ",");
+       if (!tok2)
+               goto setup;
+       if (!strncmp(tok2, "function", strlen("function")))
+               callchain_param.key = CCKEY_FUNCTION;
+       else if (!strncmp(tok2, "address", strlen("address")))
+               callchain_param.key = CCKEY_ADDRESS;
+       else
+               return -1;
 setup:
        if (callchain_register_param(&callchain_param) < 0) {
                fprintf(stderr, "Can't register callchain params\n");
@@ -694,6 +690,24 @@ setup:
        return 0;
 }
 
+int
+report_parse_ignore_callees_opt(const struct option *opt __maybe_unused,
+                               const char *arg, int unset __maybe_unused)
+{
+       if (arg) {
+               int err = regcomp(&ignore_callees_regex, arg, REG_EXTENDED);
+               if (err) {
+                       char buf[BUFSIZ];
+                       regerror(err, &ignore_callees_regex, buf, sizeof(buf));
+                       pr_err("Invalid --ignore-callees regex: %s\n%s", arg, buf);
+                       return -1;
+               }
+               have_ignore_callees = 1;
+       }
+
+       return 0;
+}
+
 static int
 parse_branch_mode(const struct option *opt __maybe_unused,
                  const char *str __maybe_unused, int unset)
@@ -736,7 +750,6 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
                        .lost            = perf_event__process_lost,
                        .read            = process_read_event,
                        .attr            = perf_event__process_attr,
-                       .event_type      = perf_event__process_event_type,
                        .tracing_data    = perf_event__process_tracing_data,
                        .build_id        = perf_event__process_build_id,
                        .ordered_samples = true,
@@ -780,10 +793,13 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
        OPT_BOOLEAN('x', "exclude-other", &symbol_conf.exclude_other,
                    "Only display entries with parent-match"),
        OPT_CALLBACK_DEFAULT('g', "call-graph", &report, "output_type,min_percent[,print_limit],call_order",
-                    "Display callchains using output_type (graph, flat, fractal, or none) , min percent threshold, optional print limit and callchain order. "
-                    "Default: fractal,0.5,callee", &parse_callchain_opt, callchain_default_opt),
+                    "Display callchains using output_type (graph, flat, fractal, or none) , min percent threshold, optional print limit, callchain order, key (function or address). "
+                    "Default: fractal,0.5,callee,function", &parse_callchain_opt, callchain_default_opt),
        OPT_BOOLEAN('G', "inverted", &report.inverted_callchain,
                    "alias for inverted call graph"),
+       OPT_CALLBACK(0, "ignore-callees", NULL, "regex",
+                  "ignore callees of these functions in call graphs",
+                  report_parse_ignore_callees_opt),
        OPT_STRING('d', "dsos", &symbol_conf.dso_list_str, "dso[,dso...]",
                   "only consider symbols in these dsos"),
        OPT_STRING('c', "comms", &symbol_conf.comm_list_str, "comm[,comm...]",
@@ -853,7 +869,6 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
                setup_browser(true);
        else {
                use_browser = 0;
-               perf_hpp__column_enable(PERF_HPP__OVERHEAD);
                perf_hpp__init();
        }
 
@@ -907,7 +922,8 @@ repeat:
         */
        if (use_browser == 1 && sort__has_sym) {
                symbol_conf.priv_size = sizeof(struct annotation);
-               report.annotate_init  = symbol__annotate_init;
+               machines__set_symbol_filter(&session->machines,
+                                           symbol__annotate_init);
                /*
                 * For searching by name on the "Browse map details".
                 * providing it only in verbose mode not to bloat too
@@ -931,16 +947,7 @@ repeat:
        if (parent_pattern != default_parent_pattern) {
                if (sort_dimension__add("parent") < 0)
                        goto error;
-
-               /*
-                * Only show the parent fields if we explicitly
-                * sort that way. If we only use parent machinery
-                * for filtering, we don't want it.
-                */
-               if (!strstr(sort_order, "parent"))
-                       sort_parent.elide = 1;
-       } else
-               symbol_conf.exclude_other = false;
+       }
 
        if (argc) {
                /*
This page took 0.033122 seconds and 5 git commands to generate.