X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gprof%2Fsymtab.c;h=e4fda46533f86e477c3958c2188a0415f8ba7478;hb=60bcf0fa8c115b4e71d7b1372aca3efccffc9607;hp=6fd48c3c8f5e8281545e69d62abceb3421a1c330;hpb=03c35bcb6ec00adf7bff3a0e51370718c03d5f90;p=binutils-gdb.git diff --git a/gprof/symtab.c b/gprof/symtab.c index 6fd48c3c8f5..e4fda46533f 100644 --- a/gprof/symtab.c +++ b/gprof/symtab.c @@ -1,6 +1,6 @@ #include "gprof.h" #include "cg_arcs.h" -#include "core.h" +#include "corefile.h" #include "symtab.h" Sym_Table symtab; @@ -85,18 +85,22 @@ 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 * symbols (such as __gnu_compiled, __c89_used, etc.). */ 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_static == dst[-1].is_static) + && ((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", @@ -104,7 +108,7 @@ DEFUN (symtab_finalize, (tab), Sym_Table * tab) src->is_func ? 'F' : 'f', dst[-1].name, dst[-1].is_static ? 't' : 'T', dst[-1].is_func ? 'F' : 'f'); - printf (" (addr=%lx)\n", src->addr)); + printf (" (addr=%lx)\n", (unsigned long) src->addr)); dst[-1] = *src; } else @@ -115,7 +119,7 @@ DEFUN (symtab_finalize, (tab), Sym_Table * tab) dst[-1].is_func ? 'F' : 'f', src->name, src->is_static ? 't' : 'T', src->is_func ? 'F' : 'f'); - printf (" (addr=%lx)\n", src->addr)); + printf (" (addr=%lx)\n", (unsigned long) src->addr)); } } else @@ -128,7 +132,8 @@ DEFUN (symtab_finalize, (tab), Sym_Table * tab) /* retain sym only if it has a non-empty address range: */ if (!src->end_addr || src->addr <= src->end_addr) { - *dst++ = *src; + *dst = *src; + dst++; prev_addr = src->addr; } } @@ -146,7 +151,7 @@ DEFUN (symtab_finalize, (tab), Sym_Table * tab) tab->len = tab->limit - tab->base; DBG (AOUTDEBUG | IDDEBUG, - int j; + unsigned int j; for (j = 0; j < tab->len; ++j) { @@ -166,7 +171,8 @@ 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", + (unsigned long) address); sym = symtab->base; for (low = 0, high = symtab->len - 1; low != high;) @@ -175,7 +181,8 @@ DEFUN (dbg_sym_lookup, (symtab, address), Sym_Table * symtab AND bfd_vma address fprintf (stderr, "[dbg_sym_lookup] low=0x%lx, mid=0x%lx, high=0x%lx\n", low, mid, high); fprintf (stderr, "[dbg_sym_lookup] sym[m]=0x%lx sym[m + 1]=0x%lx\n", - sym[mid].addr, sym[mid + 1].addr); + (unsigned long) sym[mid].addr, + (unsigned long) sym[mid + 1].addr); if (sym[mid].addr <= address && sym[mid + 1].addr > address) { return &sym[mid]; @@ -189,7 +196,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; } @@ -233,7 +240,7 @@ DEFUN (sym_lookup, (symtab, address), Sym_Table * symtab AND bfd_vma address) else { DBG (LOOKUPDEBUG, - printf ("[sym_lookup] %d probes (symtab->len=%d)\n", + printf ("[sym_lookup] %d probes (symtab->len=%u)\n", probes, symtab->len - 1)); return &sym[mid]; } @@ -256,7 +263,7 @@ DEFUN (sym_lookup, (symtab, address), Sym_Table * symtab AND bfd_vma address) } else { - DBG (LOOKUPDEBUG, printf ("[sym_lookup] %d (%d) probes, fall off\n", + DBG (LOOKUPDEBUG, printf ("[sym_lookup] %d (%u) probes, fall off\n", probes, symtab->len - 1)); return &sym[mid + 1]; }