[PATCH] libdw: Search for the last matching address with dwarf_getsrc_die.
mjw at redhat.com
Sat Dec 27 15:49:46 UTC 2014
On Fri, Dec 26, 2014 at 02:12:14PM -0700, Josh Stone wrote:
> > /* The lines are sorted by address, so we can use binary search. */
> > - size_t l = 0, u = nlines;
> > + size_t l = 0, u = nlines - 1;
> > while (l < u)
> What if nlines == 0?
I wanted to say that cannot happen. If nlines == 0 then cu->lines would
be NULL. But looking at the code there is a theoretical possibility
that isn't the case. It seems unlikely to happen in practice, but we
should guard against it indeed.
> > + size_t idx = u - (u -l) / 2;
> [nit] missing a space: "(u - l)"
> > + /* This is guaranteed for us by libdw read_srclines. */
> > if (nlines > 0)
> > assert (lines->info[nlines - 1].end_sequence);
> In case your answer above was that nlines is never 0, then this "if" is
I moved the if up before the while loop.
> > + /* The last line which is less than or equal to addr is what we want,
> > + except with an end_sequence which can only be strictly equal. */
> > + Dwarf_Line *line = &lines->info[l];
> > + if (line->addr == addr || (! line->end_sequence && line->addr < addr))
> > + return &lines->info[l];
> BTW, it seems like the end ought to be exclusive, i.e. [start,end). I
> only wrote my commit this way because some existing tests depended on
> end-inclusive behavior, and I forgot to argue it. :) Thoughts?
I think you are right and those tests, addrscopes and funcscopes, are
wrong. They use dwfl_module_getsrc to find the line associated with start
and end of the scope. But for the end they use the value of the high_pc
attribute. The high_pc attributes indicates the first address beyond
the current scope of the associated DIE. So the tests should use
highpc - 1 as end of scope.
I created a patch to change dwfl_module_getsrc to not match against
a line with end_sequence set, changed the tests to use highpc -1.
And adjusted this patch for dwarf_getsrc_die. to match the new
behavior. Do those changes look correct to you?
More information about the elfutils-devel