|
@@ -396,6 +396,7 @@ static struct symbol *symbols__find_by_name(struct rb_root *symbols,
|
|
|
const char *name)
|
|
|
{
|
|
|
struct rb_node *n;
|
|
|
+ struct symbol_name_rb_node *s;
|
|
|
|
|
|
if (symbols == NULL)
|
|
|
return NULL;
|
|
@@ -403,7 +404,6 @@ static struct symbol *symbols__find_by_name(struct rb_root *symbols,
|
|
|
n = symbols->rb_node;
|
|
|
|
|
|
while (n) {
|
|
|
- struct symbol_name_rb_node *s;
|
|
|
int cmp;
|
|
|
|
|
|
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)
|
|
|
n = n->rb_right;
|
|
|
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,
|