Re: non-contiguous files break dwarf2 init-file recognition

Elena Zannoni
2002-12-11T22:34:27Z

Alexandre Oliva writes:
> If an object file contains functions in CODE sections that are mapped
> to different segments, or just non-contiguous memory areas, and the
> entry point of the program happens to be in between such areas, we may
> end up picking the wrong comp_unit as init file. This patch fixes it
> (as long as the code of the init file itself is contiguous, this
> should be fine, otherwise the whole thing has to be redesigned). Ok
> to install?
>

How odd. I am just looking at an old patch that was dealing with
DW_AT_ranges, from rth:
http://sources.redhat.com/ml/gdb-patches/2001-12/msg00616.html I am
trying tointegrate that at the moment because the lexical blocks are
broken. (see gdb gnats pr 833). Would that patch help you here?
Probably not.

Elena

> Index: gdb/ChangeLog
> from Alexandre Oliva <aoliva@redhat.com>
>
> * dwarf2read.c (read_file_scope): Handle non-contiguous
> comp_units, testing entry_point for every subprogram.
>
> Index: gdb/dwarf2read.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/dwarf2read.c,v
> retrieving revision 1.78
> diff -u -p -r1.78 dwarf2read.c
> --- gdb/dwarf2read.c 11 Dec 2002 20:55:37 -0000 1.78
> +++ gdb/dwarf2read.c 11 Dec 2002 21:42:29 -0000
> @@ -1710,9 +1710,15 @@ read_file_scope (struct die_info *die, s
> struct die_info *child_die;
> bfd *abfd = objfile->obfd;
> struct line_header *line_header = 0;
> + CORE_ADDR entry_point = objfile->ei.entry_point - baseaddr;
> + int init_file = 0;
>
> if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, objfile))
> {
> + if (entry_point >= lowpc && entry_point < highpc
> + && lowpc != ((CORE_ADDR) -1))
> + init_file = 1;
> +
> if (die->has_children)
> {
> child_die = die->next;
> @@ -1724,6 +1730,17 @@ read_file_scope (struct die_info *die, s
>
> if (dwarf2_get_pc_bounds (child_die, &low, &high, objfile))
> {
> + /* We want to do this test per subprogram, so
> + that, if the comp_unit is not contiguous
> + (e.g., it has code in several sections that
> + are not mapped to a single segment, such that
> + there is code from other comp_units
> + interspersed with code from this one), we
> + don't get false positives. */
> + if (entry_point >= low && entry_point < high
> + && lowpc != ((CORE_ADDR) -1))
> + init_file = 1;
> +
> lowpc = min (lowpc, low);
> highpc = max (highpc, high);
> }
> @@ -1760,8 +1777,7 @@ read_file_scope (struct die_info *die, s
> }
> }
>
> - if (objfile->ei.entry_point >= lowpc &&
> - objfile->ei.entry_point < highpc)
> + if (init_file)
> {
> objfile->ei.entry_file_lowpc = lowpc;
> objfile->ei.entry_file_highpc = highpc;
>
> --
> Alexandre Oliva Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
> Red Hat GCC Developer aoliva@{redhat.com, gcc.gnu.org}
> CS PhD student at IC-Unicamp oliva@{lsd.ic.unicamp.br, gnu.org}
> Free Software Evangelist Professional serial bug killer