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

Commit b3c9ac08 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo Committed by Ingo Molnar
Browse files

perf callchains: Store the map together with the symbol



We need this to know where a symbol in a callchain came from,
for various reasons, among them precise annotation from a
TUI/GUI tool.

Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <1269459619-982-5-git-send-email-acme@infradead.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 59fd5306
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -81,7 +81,8 @@ static int perf_session__add_hist_entry(struct perf_session *self,
					struct addr_location *al,
					struct sample_data *data)
{
	struct symbol **syms = NULL, *parent = NULL;
	struct map_symbol *syms = NULL;
	struct symbol *parent = NULL;
	bool hit;
	int err;
	struct hist_entry *he;
+10 −11
Original line number Diff line number Diff line
@@ -186,7 +186,7 @@ create_child(struct callchain_node *parent, bool inherit_children)

struct resolved_ip {
	u64		  ip;
	struct symbol	*sym;
	struct map_symbol ms;
};

struct resolved_chain {
@@ -212,7 +212,7 @@ fill_node(struct callchain_node *node, struct resolved_chain *chain, int start)
			return;
		}
		call->ip = chain->ips[i].ip;
		call->sym = chain->ips[i].sym;
		call->ms = chain->ips[i].ms;
		list_add_tail(&call->list, &node->val);
	}
	node->val_nr = chain->nr - start;
@@ -318,10 +318,10 @@ __append_chain(struct callchain_node *root, struct resolved_chain *chain,
		if (i == chain->nr)
			break;

		sym = chain->ips[i].sym;
		sym = chain->ips[i].ms.sym;

		if (cnode->sym && sym) {
			if (cnode->sym->start != sym->start)
		if (cnode->ms.sym && sym) {
			if (cnode->ms.sym->start != sym->start)
				break;
		} else if (cnode->ip != chain->ips[i].ip)
			break;
@@ -353,9 +353,8 @@ __append_chain(struct callchain_node *root, struct resolved_chain *chain,
	return 0;
}

static void
filter_context(struct ip_callchain *old, struct resolved_chain *new,
	       struct symbol **syms)
static void filter_context(struct ip_callchain *old, struct resolved_chain *new,
			   struct map_symbol *syms)
{
	int i, j = 0;

@@ -364,7 +363,7 @@ filter_context(struct ip_callchain *old, struct resolved_chain *new,
			continue;

		new->ips[j].ip = old->ips[i];
		new->ips[j].sym = syms[i];
		new->ips[j].ms = syms[i];
		j++;
	}

@@ -373,7 +372,7 @@ filter_context(struct ip_callchain *old, struct resolved_chain *new,


int append_chain(struct callchain_node *root, struct ip_callchain *chain,
		  struct symbol **syms)
		 struct map_symbol *syms)
{
	struct resolved_chain *filtered;

+2 −2
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ struct callchain_param {

struct callchain_list {
	u64			ip;
	struct symbol		*sym;
	struct map_symbol	ms;
	struct list_head	list;
};

@@ -57,5 +57,5 @@ static inline u64 cumul_hits(struct callchain_node *node)

int register_callchain_param(struct callchain_param *param);
int append_chain(struct callchain_node *root, struct ip_callchain *chain,
		 struct symbol **syms);
		 struct map_symbol *syms);
#endif	/* __PERF_CALLCHAIN_H */
+7 −7
Original line number Diff line number Diff line
@@ -260,8 +260,8 @@ static size_t ipchain__fprintf_graph(FILE *fp, struct callchain_list *chain,
		} else
			ret += fprintf(fp, "%s", "          ");
	}
	if (chain->sym)
		ret += fprintf(fp, "%s\n", chain->sym->name);
	if (chain->ms.sym)
		ret += fprintf(fp, "%s\n", chain->ms.sym->name);
	else
		ret += fprintf(fp, "%p\n", (void *)(long)chain->ip);

@@ -280,7 +280,7 @@ static void init_rem_hits(void)
	}

	strcpy(rem_sq_bracket->name, "[...]");
	rem_hits.sym = rem_sq_bracket;
	rem_hits.ms.sym = rem_sq_bracket;
}

static size_t __callchain__fprintf_graph(FILE *fp, struct callchain_node *self,
@@ -382,8 +382,8 @@ static size_t callchain__fprintf_graph(FILE *fp, struct callchain_node *self,
		} else
			ret += callchain__fprintf_left_margin(fp, left_margin);

		if (chain->sym)
			ret += fprintf(fp, " %s\n", chain->sym->name);
		if (chain->ms.sym)
			ret += fprintf(fp, " %s\n", chain->ms.sym->name);
		else
			ret += fprintf(fp, " %p\n", (void *)(long)chain->ip);
	}
@@ -408,8 +408,8 @@ static size_t callchain__fprintf_flat(FILE *fp, struct callchain_node *self,
	list_for_each_entry(chain, &self->val, list) {
		if (chain->ip >= PERF_CONTEXT_MAX)
			continue;
		if (chain->sym)
			ret += fprintf(fp, "                %s\n", chain->sym->name);
		if (chain->ms.sym)
			ret += fprintf(fp, "                %s\n", chain->ms.sym->name);
		else
			ret += fprintf(fp, "                %p\n",
					(void *)(long)chain->ip);
+4 −4
Original line number Diff line number Diff line
@@ -104,8 +104,8 @@ static void newt_checkbox_tree__add(newtComponent tree, const char *str,
static char *callchain_list__sym_name(struct callchain_list *self,
				      char *bf, size_t bfsize)
{
	if (self->sym)
		return self->sym->name;
	if (self->ms.sym)
		return self->ms.sym->name;

	snprintf(bf, bfsize, "%#Lx", self->ip);
	return bf;
@@ -157,7 +157,7 @@ static void __callchain__append_graph_browser(struct callchain_node *self,
				indexes[depth + 2] = NEWT_ARG_LAST;
				++chain_idx;
			}
			newt_checkbox_tree__add(tree, str, chain->sym, indexes);
			newt_checkbox_tree__add(tree, str, chain->ms.sym, indexes);
			free(alloc_str);
			++printed;
		}
@@ -193,7 +193,7 @@ static void callchain__append_graph_browser(struct callchain_node *self,
			continue;

		str = callchain_list__sym_name(chain, ipstr, sizeof(ipstr));
		newt_checkbox_tree__add(tree, str, chain->sym, indexes);
		newt_checkbox_tree__add(tree, str, chain->ms.sym, indexes);
	}

	indexes[1] = parent_idx;
Loading