Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+14 −14
Original line number Diff line number Diff line
@@ -68,7 +68,7 @@ hist_entry__cmp(struct hist_entry *left, struct hist_entry *right)
	int64_t cmp = 0;

	list_for_each_entry(se, &hist_entry__sort_list, list) {
		cmp = se->cmp(left, right);
		cmp = se->se_cmp(left, right);
		if (cmp)
			break;
	}
@@ -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) {
		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);
		if (cmp)
@@ -536,8 +536,8 @@ int hist_entry__snprintf(struct hist_entry *self,
			continue;

		ret += snprintf(s + ret, size - ret, "%s", sep ?: "  ");
		ret += se->snprintf(self, s + ret, size - ret,
				    se->width ? *se->width : 0);
		ret += se->se_snprintf(self, s + ret, size - ret,
				       se->se_width ? *se->se_width : 0);
	}

	return ret;
@@ -564,7 +564,7 @@ static size_t hist_entry__fprintf_callchain(struct hist_entry *self, FILE *fp,
	if (sort__first_dimension == SORT_COMM) {
		struct sort_entry *se = list_first_entry(&hist_entry__sort_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);
	}

@@ -615,22 +615,22 @@ size_t perf_session__fprintf_hists(struct rb_root *hists,
		if (se->elide)
			continue;
		if (sep) {
			fprintf(fp, "%c%s", *sep, se->header);
			fprintf(fp, "%c%s", *sep, se->se_header);
			continue;
		}
		width = strlen(se->header);
		if (se->width) {
		width = strlen(se->se_header);
		if (se->se_width) {
			if (symbol_conf.col_width_list_str) {
				if (col_width) {
					*se->width = atoi(col_width);
					*se->se_width = atoi(col_width);
					col_width = strchr(col_width, ',');
					if (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");

@@ -652,10 +652,10 @@ size_t perf_session__fprintf_hists(struct rb_root *hists,
			continue;

		fprintf(fp, "  ");
		if (se->width)
			width = *se->width;
		if (se->se_width)
			width = *se->se_width;
		else
			width = strlen(se->header);
			width = strlen(se->se_header);
		for (i = 0; i < width; i++)
			fprintf(fp, ".");
	}
+21 −21
Original line number Diff line number Diff line
@@ -30,38 +30,38 @@ static int hist_entry__parent_snprintf(struct hist_entry *self, char *bf,
				       size_t size, unsigned int width);

struct sort_entry sort_thread = {
	.header = "Command:  Pid",
	.cmp	= sort__thread_cmp,
	.snprintf = hist_entry__thread_snprintf,
	.width	= &threads__col_width,
	.se_header	= "Command:  Pid",
	.se_cmp		= sort__thread_cmp,
	.se_snprintf	= hist_entry__thread_snprintf,
	.se_width	= &threads__col_width,
};

struct sort_entry sort_comm = {
	.header		= "Command",
	.cmp		= sort__comm_cmp,
	.collapse	= sort__comm_collapse,
	.snprintf	= hist_entry__comm_snprintf,
	.width		= &comms__col_width,
	.se_header	= "Command",
	.se_cmp		= sort__comm_cmp,
	.se_collapse	= sort__comm_collapse,
	.se_snprintf	= hist_entry__comm_snprintf,
	.se_width	= &comms__col_width,
};

struct sort_entry sort_dso = {
	.header = "Shared Object",
	.cmp	= sort__dso_cmp,
	.snprintf = hist_entry__dso_snprintf,
	.width	= &dsos__col_width,
	.se_header	= "Shared Object",
	.se_cmp		= sort__dso_cmp,
	.se_snprintf	= hist_entry__dso_snprintf,
	.se_width	= &dsos__col_width,
};

struct sort_entry sort_sym = {
	.header = "Symbol",
	.cmp	= sort__sym_cmp,
	.snprintf = hist_entry__sym_snprintf,
	.se_header	= "Symbol",
	.se_cmp		= sort__sym_cmp,
	.se_snprintf	= hist_entry__sym_snprintf,
};

struct sort_entry sort_parent = {
	.header = "Parent symbol",
	.cmp	= sort__parent_cmp,
	.snprintf = hist_entry__parent_snprintf,
	.width	= &parent_symbol__col_width,
	.se_header	= "Parent symbol",
	.se_cmp		= sort__parent_cmp,
	.se_snprintf	= hist_entry__parent_snprintf,
	.se_width	= &parent_symbol__col_width,
};

struct sort_dimension {
@@ -255,7 +255,7 @@ int sort_dimension__add(const char *tok)
		if (strncasecmp(tok, sd->name, strlen(tok)))
			continue;

		if (sd->entry->collapse)
		if (sd->entry->se_collapse)
			sort__need_collapse = 1;

		if (sd->entry == &sort_parent) {
+6 −6
Original line number Diff line number Diff line
@@ -78,13 +78,13 @@ enum sort_type {
struct sort_entry {
	struct list_head list;

	const char *header;
	const char *se_header;

	int64_t (*cmp)(struct hist_entry *, struct hist_entry *);
	int64_t (*collapse)(struct hist_entry *, struct hist_entry *);
	int	(*snprintf)(struct hist_entry *self, char *bf, size_t size,
	int64_t (*se_cmp)(struct hist_entry *, struct hist_entry *);
	int64_t (*se_collapse)(struct hist_entry *, struct hist_entry *);
	int	(*se_snprintf)(struct hist_entry *self, char *bf, size_t size,
			       unsigned int width);
	unsigned int *width;
	unsigned int *se_width;
	bool	elide;
};