(unless of course the caller is expected to) @@ -56,18 +57,24 @@ dwfl_module_getsrc (Dwfl_Module *mod, Dwarf_Addr addr) Dwarf_Addr bias; if (INTUSE(dwfl_module_getdwarf) (mod, &bias) == NULL) return NULL; + fprintf(stderr, "got dwarf 0x%lx\n", addr); struct dwfl_cu *cu; Dwfl_Error error = __libdwfl_addrcu (mod, addr, &cu); if (likely (error == DWFL_E_NOERROR)) error = __libdwfl_cu_getsrclines (cu); + fprintf(stderr, "got addrcu\n"); if (likely (error == DWFL_E_NOERROR)) { + addr = addr - bias; + fprintf(stderr, "searching unbiased 0x%lx\n", (long) addr); /* The lines are sorted by address, so we can use binary search. */ size_t l = 0, u = cu->die.cu->lines->nlines; while (l < u) { size_t idx = (l + u) / 2; + fprintf(stderr, "%d 0x%lx\n", (int)idx, + (long) cu->die.cu->lines->info[idx].addr); if (addr < cu->die.cu->lines->info[idx].addr) u = idx; else if (addr > cu->die.cu->lines->info[idx].addr) which gives the improved effect: got dwarf 0x2aaab057683c addrarange 2aaab057683c naranges 859 adjusted 6e83c by bias 2aaab0508000 found arange at 624 got addrcu searching unbiased 0x6e83c 73 0x6e950 36 0x57fba 55 0x6e87b 46 0x6e83c
upstream: https://bugzilla.redhat.com/show_bug.cgi?id=450229
Submitted upstream. 2008-06-07 Andrew Cagney <cagney@redhat.com> * dwfl_module_getsrc.c (dwfl_module_getsrc): Remove bias from address. Fix frysk/6600, redhat/450229.