perf callchain: Add option to skip ignore symbol when printing callchains
[linux-2.6-block.git] / tools / perf / util / evsel_fprintf.c
index 662a0a6182e7a04ade198c01a3914701c333f543..5a6f52284452e2ea07be12f5eff85ea306356470 100644 (file)
@@ -108,7 +108,10 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment,
        int print_oneline = print_opts & EVSEL__PRINT_ONELINE;
        int print_srcline = print_opts & EVSEL__PRINT_SRCLINE;
        int print_unknown_as_addr = print_opts & EVSEL__PRINT_UNKNOWN_AS_ADDR;
+       int print_arrow = print_opts & EVSEL__PRINT_CALLCHAIN_ARROW;
+       int print_skip_ignored = print_opts & EVSEL__PRINT_SKIP_IGNORED;
        char s = print_oneline ? ' ' : '\t';
+       bool first = true;
 
        if (sample->callchain) {
                struct addr_location node_al;
@@ -122,8 +125,14 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment,
                        if (!node)
                                break;
 
+                       if (node->sym && node->sym->ignore && print_skip_ignored)
+                               goto next;
+
                        printed += fprintf(fp, "%-*.*s", left_alignment, left_alignment, " ");
 
+                       if (print_arrow && !first)
+                               printed += fprintf(fp, " <-");
+
                        if (print_ip)
                                printed += fprintf(fp, "%c%16" PRIx64, s, node->ip);
 
@@ -137,7 +146,8 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment,
 
                                if (print_symoffset) {
                                        printed += __symbol__fprintf_symname_offs(node->sym, &node_al,
-                                                                                 print_unknown_as_addr, fp);
+                                                                                 print_unknown_as_addr,
+                                                                                 true, fp);
                                } else {
                                        printed += __symbol__fprintf_symname(node->sym, &node_al,
                                                                             print_unknown_as_addr, fp);
@@ -156,6 +166,8 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment,
                        if (!print_oneline)
                                printed += fprintf(fp, "\n");
 
+                       first = false;
+next:
                        callchain_cursor_advance(cursor);
                }
        }
@@ -188,7 +200,8 @@ int sample__fprintf_sym(struct perf_sample *sample, struct addr_location *al,
                        printed += fprintf(fp, " ");
                        if (print_symoffset) {
                                printed += __symbol__fprintf_symname_offs(al->sym, al,
-                                                                         print_unknown_as_addr, fp);
+                                                                         print_unknown_as_addr,
+                                                                         true, fp);
                        } else {
                                printed += __symbol__fprintf_symname(al->sym, al,
                                                                     print_unknown_as_addr, fp);