perf stat: Fix metrics with --no-merge
[linux-2.6-block.git] / tools / perf / util / stat-shadow.c
index 3f8fd127d31e0a8053462e54fa25073291603ee1..cb891e5c29696a240a0872f0f06039eccc04fe6d 100644 (file)
@@ -724,6 +724,7 @@ static void generic_metric(struct perf_stat_config *config,
        double ratio;
        int i;
        void *ctxp = out->ctx;
+       char *n, *pn;
 
        expr__ctx_init(&pctx);
        expr__add_id(&pctx, name, avg);
@@ -743,7 +744,19 @@ static void generic_metric(struct perf_stat_config *config,
                        stats = &v->stats;
                        scale = 1.0;
                }
-               expr__add_id(&pctx, metric_events[i]->name, avg_stats(stats)*scale);
+
+               n = strdup(metric_events[i]->name);
+               if (!n)
+                       return;
+               /*
+                * This display code with --no-merge adds [cpu] postfixes.
+                * These are not supported by the parser. Remove everything
+                * after the space.
+                */
+               pn = strchr(n, ' ');
+               if (pn)
+                       *pn = 0;
+               expr__add_id(&pctx, n, avg_stats(stats)*scale);
        }
        if (!metric_events[i]) {
                const char *p = metric_expr;
@@ -760,6 +773,9 @@ static void generic_metric(struct perf_stat_config *config,
                                     (metric_name ? metric_name : name) : "", 0);
        } else
                print_metric(config, ctxp, NULL, NULL, "", 0);
+
+       for (i = 1; i < pctx.num_ids; i++)
+               free((void *)pctx.ids[i].name);
 }
 
 void perf_stat__print_shadow_stats(struct perf_stat_config *config,