perf symbols: Return the first entry with a given name in find_by_name method
When a dso contains multiple symbols which have same name, current dso__find_symbol_by_name() only finds an one of them and there's no way to get the all symbols without going through the rbtree. So make symbols__find_by_name() return the first entry with the given name and the next patch in this series will provide a way to iterate from there, by the name ordered rb_tree, till a suitable symbol is found. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Cc: David Ahern <dsahern@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Link: http://lkml.kernel.org/r/1421234288-22758-2-git-send-email-namhyung@kernel.org [ Yanked this independent hunk, without changes, from a larger patch ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Родитель
0fb9f2aab7
Коммит
de4809999d
|
@ -396,6 +396,7 @@ static struct symbol *symbols__find_by_name(struct rb_root *symbols,
|
||||||
const char *name)
|
const char *name)
|
||||||
{
|
{
|
||||||
struct rb_node *n;
|
struct rb_node *n;
|
||||||
|
struct symbol_name_rb_node *s;
|
||||||
|
|
||||||
if (symbols == NULL)
|
if (symbols == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -403,7 +404,6 @@ static struct symbol *symbols__find_by_name(struct rb_root *symbols,
|
||||||
n = symbols->rb_node;
|
n = symbols->rb_node;
|
||||||
|
|
||||||
while (n) {
|
while (n) {
|
||||||
struct symbol_name_rb_node *s;
|
|
||||||
int cmp;
|
int cmp;
|
||||||
|
|
||||||
s = rb_entry(n, struct symbol_name_rb_node, rb_node);
|
s = rb_entry(n, struct symbol_name_rb_node, rb_node);
|
||||||
|
@ -414,10 +414,24 @@ static struct symbol *symbols__find_by_name(struct rb_root *symbols,
|
||||||
else if (cmp > 0)
|
else if (cmp > 0)
|
||||||
n = n->rb_right;
|
n = n->rb_right;
|
||||||
else
|
else
|
||||||
return &s->sym;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
if (n == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* return first symbol that has same name (if any) */
|
||||||
|
for (n = rb_prev(n); n; n = rb_prev(n)) {
|
||||||
|
struct symbol_name_rb_node *tmp;
|
||||||
|
|
||||||
|
tmp = rb_entry(n, struct symbol_name_rb_node, rb_node);
|
||||||
|
if (strcmp(tmp->sym.name, s->sym.name))
|
||||||
|
break;
|
||||||
|
|
||||||
|
s = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &s->sym;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct symbol *dso__find_symbol(struct dso *dso,
|
struct symbol *dso__find_symbol(struct dso *dso,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче