Commit fcd14984 authored by Frederic Weisbecker's avatar Frederic Weisbecker Committed by Arnaldo Carvalho de Melo

perf tools: Fix accidentally preprocessed snprintf callback

struct sort_entry has a callback named snprintf that turns an
entry into a string result.
But there are glibc versions that implement snprintf through a
macro. The following expression is then going to get the snprintf
call preprocessed:

        ent->snprintf(...)

to finally end up in a build error:

        util/hist.c: Dans la fonction «hist_entry__snprintf» :
        util/hist.c:539: erreur: «struct sort_entry» has no member named «__builtin___snprintf_chk»

To fix this, prepend struct sort_entry callbacks with an "se_"
prefix.
Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Ingo Molnar <mingo@elte.hu>
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent df8290bf
...@@ -68,7 +68,7 @@ hist_entry__cmp(struct hist_entry *left, struct hist_entry *right) ...@@ -68,7 +68,7 @@ hist_entry__cmp(struct hist_entry *left, struct hist_entry *right)
int64_t cmp = 0; int64_t cmp = 0;
list_for_each_entry(se, &hist_entry__sort_list, list) { list_for_each_entry(se, &hist_entry__sort_list, list) {
cmp = se->cmp(left, right); cmp = se->se_cmp(left, right);
if (cmp) if (cmp)
break; break;
} }
...@@ -85,7 +85,7 @@ hist_entry__collapse(struct hist_entry *left, struct hist_entry *right) ...@@ -85,7 +85,7 @@ hist_entry__collapse(struct hist_entry *left, struct hist_entry *right)
list_for_each_entry(se, &hist_entry__sort_list, list) { list_for_each_entry(se, &hist_entry__sort_list, list) {
int64_t (*f)(struct hist_entry *, struct hist_entry *); int64_t (*f)(struct hist_entry *, struct hist_entry *);
f = se->collapse ?: se->cmp; f = se->se_collapse ?: se->se_cmp;
cmp = f(left, right); cmp = f(left, right);
if (cmp) if (cmp)
...@@ -536,8 +536,8 @@ int hist_entry__snprintf(struct hist_entry *self, ...@@ -536,8 +536,8 @@ int hist_entry__snprintf(struct hist_entry *self,
continue; continue;
ret += snprintf(s + ret, size - ret, "%s", sep ?: " "); ret += snprintf(s + ret, size - ret, "%s", sep ?: " ");
ret += se->snprintf(self, s + ret, size - ret, ret += se->se_snprintf(self, s + ret, size - ret,
se->width ? *se->width : 0); se->se_width ? *se->se_width : 0);
} }
return ret; return ret;
...@@ -564,7 +564,7 @@ static size_t hist_entry__fprintf_callchain(struct hist_entry *self, FILE *fp, ...@@ -564,7 +564,7 @@ static size_t hist_entry__fprintf_callchain(struct hist_entry *self, FILE *fp,
if (sort__first_dimension == SORT_COMM) { if (sort__first_dimension == SORT_COMM) {
struct sort_entry *se = list_first_entry(&hist_entry__sort_list, struct sort_entry *se = list_first_entry(&hist_entry__sort_list,
typeof(*se), list); typeof(*se), list);
left_margin = se->width ? *se->width : 0; left_margin = se->se_width ? *se->se_width : 0;
left_margin -= thread__comm_len(self->thread); left_margin -= thread__comm_len(self->thread);
} }
...@@ -615,22 +615,22 @@ size_t perf_session__fprintf_hists(struct rb_root *hists, ...@@ -615,22 +615,22 @@ size_t perf_session__fprintf_hists(struct rb_root *hists,
if (se->elide) if (se->elide)
continue; continue;
if (sep) { if (sep) {
fprintf(fp, "%c%s", *sep, se->header); fprintf(fp, "%c%s", *sep, se->se_header);
continue; continue;
} }
width = strlen(se->header); width = strlen(se->se_header);
if (se->width) { if (se->se_width) {
if (symbol_conf.col_width_list_str) { if (symbol_conf.col_width_list_str) {
if (col_width) { if (col_width) {
*se->width = atoi(col_width); *se->se_width = atoi(col_width);
col_width = strchr(col_width, ','); col_width = strchr(col_width, ',');
if (col_width) if (col_width)
++col_width; ++col_width;
} }
} }
width = *se->width = max(*se->width, width); width = *se->se_width = max(*se->se_width, width);
} }
fprintf(fp, " %*s", width, se->header); fprintf(fp, " %*s", width, se->se_header);
} }
fprintf(fp, "\n"); fprintf(fp, "\n");
...@@ -652,10 +652,10 @@ size_t perf_session__fprintf_hists(struct rb_root *hists, ...@@ -652,10 +652,10 @@ size_t perf_session__fprintf_hists(struct rb_root *hists,
continue; continue;
fprintf(fp, " "); fprintf(fp, " ");
if (se->width) if (se->se_width)
width = *se->width; width = *se->se_width;
else else
width = strlen(se->header); width = strlen(se->se_header);
for (i = 0; i < width; i++) for (i = 0; i < width; i++)
fprintf(fp, "."); fprintf(fp, ".");
} }
......
...@@ -30,38 +30,38 @@ static int hist_entry__parent_snprintf(struct hist_entry *self, char *bf, ...@@ -30,38 +30,38 @@ static int hist_entry__parent_snprintf(struct hist_entry *self, char *bf,
size_t size, unsigned int width); size_t size, unsigned int width);
struct sort_entry sort_thread = { struct sort_entry sort_thread = {
.header = "Command: Pid", .se_header = "Command: Pid",
.cmp = sort__thread_cmp, .se_cmp = sort__thread_cmp,
.snprintf = hist_entry__thread_snprintf, .se_snprintf = hist_entry__thread_snprintf,
.width = &threads__col_width, .se_width = &threads__col_width,
}; };
struct sort_entry sort_comm = { struct sort_entry sort_comm = {
.header = "Command", .se_header = "Command",
.cmp = sort__comm_cmp, .se_cmp = sort__comm_cmp,
.collapse = sort__comm_collapse, .se_collapse = sort__comm_collapse,
.snprintf = hist_entry__comm_snprintf, .se_snprintf = hist_entry__comm_snprintf,
.width = &comms__col_width, .se_width = &comms__col_width,
}; };
struct sort_entry sort_dso = { struct sort_entry sort_dso = {
.header = "Shared Object", .se_header = "Shared Object",
.cmp = sort__dso_cmp, .se_cmp = sort__dso_cmp,
.snprintf = hist_entry__dso_snprintf, .se_snprintf = hist_entry__dso_snprintf,
.width = &dsos__col_width, .se_width = &dsos__col_width,
}; };
struct sort_entry sort_sym = { struct sort_entry sort_sym = {
.header = "Symbol", .se_header = "Symbol",
.cmp = sort__sym_cmp, .se_cmp = sort__sym_cmp,
.snprintf = hist_entry__sym_snprintf, .se_snprintf = hist_entry__sym_snprintf,
}; };
struct sort_entry sort_parent = { struct sort_entry sort_parent = {
.header = "Parent symbol", .se_header = "Parent symbol",
.cmp = sort__parent_cmp, .se_cmp = sort__parent_cmp,
.snprintf = hist_entry__parent_snprintf, .se_snprintf = hist_entry__parent_snprintf,
.width = &parent_symbol__col_width, .se_width = &parent_symbol__col_width,
}; };
struct sort_dimension { struct sort_dimension {
...@@ -255,7 +255,7 @@ int sort_dimension__add(const char *tok) ...@@ -255,7 +255,7 @@ int sort_dimension__add(const char *tok)
if (strncasecmp(tok, sd->name, strlen(tok))) if (strncasecmp(tok, sd->name, strlen(tok)))
continue; continue;
if (sd->entry->collapse) if (sd->entry->se_collapse)
sort__need_collapse = 1; sort__need_collapse = 1;
if (sd->entry == &sort_parent) { if (sd->entry == &sort_parent) {
......
...@@ -78,13 +78,13 @@ enum sort_type { ...@@ -78,13 +78,13 @@ enum sort_type {
struct sort_entry { struct sort_entry {
struct list_head list; struct list_head list;
const char *header; const char *se_header;
int64_t (*cmp)(struct hist_entry *, struct hist_entry *); int64_t (*se_cmp)(struct hist_entry *, struct hist_entry *);
int64_t (*collapse)(struct hist_entry *, struct hist_entry *); int64_t (*se_collapse)(struct hist_entry *, struct hist_entry *);
int (*snprintf)(struct hist_entry *self, char *bf, size_t size, int (*se_snprintf)(struct hist_entry *self, char *bf, size_t size,
unsigned int width); unsigned int width);
unsigned int *width; unsigned int *se_width;
bool elide; bool elide;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment