A hack for DW_FORM_ref_addr

H. J. Lu
2003-07-31T16:16:23Z

On Wed, Jul 30, 2003 at 10:16:53PM -0700, H. J. Lu wrote:
> > >
> > > While waiting for your new DWARF reader, I will see how my hack
> > > goes :-(.
> >
> > Since the die table is hashed by offset (isn't it?), presumably very
> > badly.
>
> It is OK for different compilation units within the same .debug_info
> section.
>
>

FYI, this is the hack I am going to try.

H.J.
----
2003-07-31 H.J. Lu <hongjiu.lu@intel.com>

* dwarf2read.c (dwarf2_build_psymtabs_hard): Read in all
compilation units.
(read_comp_unit): Don't reset die reference table if abfd
is not changed.

--- gdb/dwarf2read.c.ref 2003-07-30 09:43:51.000000000 -0700
+++ gdb/dwarf2read.c 2003-07-31 08:11:23.000000000 -0700
@@ -1195,6 +1195,7 @@ dwarf2_build_psymtabs_hard (struct objfi
struct partial_symtab *pst;
struct cleanup *back_to;
CORE_ADDR lowpc, highpc;
+ struct die_info *dies;

info_ptr = dwarf_info_buffer;
abbrev_ptr = dwarf_abbrev_buffer;
@@ -1280,6 +1281,8 @@ dwarf2_build_psymtabs_hard (struct objfi
dwarf2_read_abbrevs (abfd, &cu_header);
make_cleanup (dwarf2_empty_abbrev_table, cu_header.dwarf2_abbrevs);

+ dies = read_comp_unit (info_ptr, abfd, &cu_header);
+
/* Read the compilation unit die */
info_ptr = read_partial_die (&comp_unit_die, abfd, info_ptr,
&cu_header);
@@ -3653,10 +3656,17 @@ read_comp_unit (char *info_ptr, bfd *abf
struct die_info *first_die, *last_die, *die;
char *cur_ptr;
int nesting_level;
+ static bfd *bfd_die_ref_table;
+
+ if (!bfd_die_ref_table)
+ bfd_die_ref_table = abfd;

- /* Reset die reference table; we are
- building new ones now. */
- dwarf2_empty_hash_tables ();
+ if (bfd_die_ref_table != abfd)
+ {
+ bfd_die_ref_table = abfd;
+ /* Reset die reference table; we are building new ones now. */
+ dwarf2_empty_hash_tables ();
+ }

cur_ptr = info_ptr;
nesting_level = 0;