diff options
Diffstat (limited to 'gprof/symtab.c')
-rw-r--r-- | gprof/symtab.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/gprof/symtab.c b/gprof/symtab.c index b38ae6a..0b6a4af 100644 --- a/gprof/symtab.c +++ b/gprof/symtab.c @@ -85,8 +85,9 @@ DEFUN (symtab_finalize, (tab), Sym_Table * tab) if (src->addr == prev_addr) { /* - * If same address, favor global symbol over static one. - * If both symbols are either static or global, check + * If same address, favor global symbol over static one, + * then function over line number. If both symbols are + * either static or global and either function or line, check * whether one has name beginning with underscore while * the other doesn't. In such cases, keep sym without * underscore. This takes cares of compiler generated @@ -94,9 +95,12 @@ DEFUN (symtab_finalize, (tab), Sym_Table * tab) */ if ((!src->is_static && dst[-1].is_static) || ((src->is_static == dst[-1].is_static) - && ((src->name[0] != '_' && dst[-1].name[0] == '_') - || (src->name[0] - && src->name[1] != '_' && dst[-1].name[1] == '_')))) + && ((src->is_func && !dst[-1].is_func) + || ((src->is_func == dst[-1].is_func) + && ((src->name[0] != '_' && dst[-1].name[0] == '_') + || (src->name[0] + && src->name[1] != '_' + && dst[-1].name[1] == '_')))))) { DBG (AOUTDEBUG | IDDEBUG, printf ("[symtab_finalize] favor %s@%c%c over %s@%c%c", @@ -166,7 +170,7 @@ DEFUN (dbg_sym_lookup, (symtab, address), Sym_Table * symtab AND bfd_vma address long low, mid, high; Sym *sym; - fprintf (stderr, "[sym_lookup] address 0x%lx\n", address); + fprintf (stderr, "[dbg_sym_lookup] address 0x%lx\n", address); sym = symtab->base; for (low = 0, high = symtab->len - 1; low != high;) @@ -189,7 +193,7 @@ DEFUN (dbg_sym_lookup, (symtab, address), Sym_Table * symtab AND bfd_vma address low = mid + 1; } } - fprintf (stderr, "[sym_lookup] binary search fails???\n"); + fprintf (stderr, "[dbg_sym_lookup] binary search fails???\n"); return 0; } |