* dwarf2read.c (dwo_section_names): Add macinfo_dwo, macro_dwo.

(dwo_sections): Add macinfo, macro.
	(dwarf2_locate_dwo_sections): Watch for macro sections.
	(dwarf_decode_macros): Remove args lh, abfd, section, section_name.
	All callers updated.  Handle DWO files.
This commit is contained in:
Doug Evans
2012-06-26 21:56:46 +00:00
parent 45cfd46896
commit 09262596f2
2 changed files with 60 additions and 17 deletions

View File

@ -1,5 +1,11 @@
2012-06-26 Doug Evans <dje@google.com> 2012-06-26 Doug Evans <dje@google.com>
* dwarf2read.c (dwo_section_names): Add macinfo_dwo, macro_dwo.
(dwo_sections): Add macinfo, macro.
(dwarf2_locate_dwo_sections): Watch for macro sections.
(dwarf_decode_macros): Remove args lh, abfd, section, section_name.
All callers updated. Handle DWO files.
* NEWS: Mention new options "set debug dwarf2-read" and * NEWS: Mention new options "set debug dwarf2-read" and
"set debug symtab-create". "set debug symtab-create".
* dwarf2read.c (dwarf2_read_debug): New static global. * dwarf2read.c (dwarf2_read_debug): New static global.

View File

@ -289,6 +289,8 @@ static const struct dwo_section_names
struct dwarf2_section_names info_dwo; struct dwarf2_section_names info_dwo;
struct dwarf2_section_names line_dwo; struct dwarf2_section_names line_dwo;
struct dwarf2_section_names loc_dwo; struct dwarf2_section_names loc_dwo;
struct dwarf2_section_names macinfo_dwo;
struct dwarf2_section_names macro_dwo;
struct dwarf2_section_names str_dwo; struct dwarf2_section_names str_dwo;
struct dwarf2_section_names str_offsets_dwo; struct dwarf2_section_names str_offsets_dwo;
struct dwarf2_section_names types_dwo; struct dwarf2_section_names types_dwo;
@ -299,6 +301,8 @@ dwo_section_names =
{ ".debug_info.dwo", ".zdebug_info.dwo" }, { ".debug_info.dwo", ".zdebug_info.dwo" },
{ ".debug_line.dwo", ".zdebug_line.dwo" }, { ".debug_line.dwo", ".zdebug_line.dwo" },
{ ".debug_loc.dwo", ".zdebug_loc.dwo" }, { ".debug_loc.dwo", ".zdebug_loc.dwo" },
{ ".debug_macinfo.dwo", ".zdebug_macinfo.dwo" },
{ ".debug_macro.dwo", ".zdebug_macro.dwo" },
{ ".debug_str.dwo", ".zdebug_str.dwo" }, { ".debug_str.dwo", ".zdebug_str.dwo" },
{ ".debug_str_offsets.dwo", ".zdebug_str_offsets.dwo" }, { ".debug_str_offsets.dwo", ".zdebug_str_offsets.dwo" },
{ ".debug_types.dwo", ".zdebug_types.dwo" }, { ".debug_types.dwo", ".zdebug_types.dwo" },
@ -569,6 +573,8 @@ struct dwo_sections
struct dwarf2_section_info info; struct dwarf2_section_info info;
struct dwarf2_section_info line; struct dwarf2_section_info line;
struct dwarf2_section_info loc; struct dwarf2_section_info loc;
struct dwarf2_section_info macinfo;
struct dwarf2_section_info macro;
struct dwarf2_section_info str; struct dwarf2_section_info str;
struct dwarf2_section_info str_offsets; struct dwarf2_section_info str_offsets;
VEC (dwarf2_section_info_def) *types; VEC (dwarf2_section_info_def) *types;
@ -1368,10 +1374,8 @@ static struct abbrev_info *dwarf_alloc_abbrev (struct dwarf2_cu *);
static struct die_info *dwarf_alloc_die (struct dwarf2_cu *, int); static struct die_info *dwarf_alloc_die (struct dwarf2_cu *, int);
static void dwarf_decode_macros (struct line_header *, unsigned int, static void dwarf_decode_macros (struct dwarf2_cu *, unsigned int,
char *, bfd *, struct dwarf2_cu *, char *, int);
struct dwarf2_section_info *,
int, const char *);
static int attr_form_is_block (struct attribute *); static int attr_form_is_block (struct attribute *);
@ -6772,10 +6776,7 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu)
complaint (&symfile_complaints, complaint (&symfile_complaints,
_("CU refers to both DW_AT_GNU_macros and DW_AT_macro_info")); _("CU refers to both DW_AT_GNU_macros and DW_AT_macro_info"));
dwarf_decode_macros (cu->line_header, DW_UNSND (attr), dwarf_decode_macros (cu, DW_UNSND (attr), comp_dir, 1);
comp_dir, abfd, cu,
&dwarf2_per_objfile->macro, 1,
".debug_macro");
} }
else else
{ {
@ -6784,10 +6785,7 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu)
{ {
unsigned int macro_offset = DW_UNSND (attr); unsigned int macro_offset = DW_UNSND (attr);
dwarf_decode_macros (cu->line_header, macro_offset, dwarf_decode_macros (cu, macro_offset, comp_dir, 0);
comp_dir, abfd, cu,
&dwarf2_per_objfile->macinfo, 0,
".debug_macinfo");
} }
} }
@ -6974,6 +6972,16 @@ dwarf2_locate_dwo_sections (bfd *abfd, asection *sectp, void *dwo_file_ptr)
dwo_file->sections.loc.asection = sectp; dwo_file->sections.loc.asection = sectp;
dwo_file->sections.loc.size = bfd_get_section_size (sectp); dwo_file->sections.loc.size = bfd_get_section_size (sectp);
} }
else if (section_is_p (sectp->name, &names->macinfo_dwo))
{
dwo_file->sections.macinfo.asection = sectp;
dwo_file->sections.macinfo.size = bfd_get_section_size (sectp);
}
else if (section_is_p (sectp->name, &names->macro_dwo))
{
dwo_file->sections.macro.asection = sectp;
dwo_file->sections.macro.size = bfd_get_section_size (sectp);
}
else if (section_is_p (sectp->name, &names->str_dwo)) else if (section_is_p (sectp->name, &names->str_dwo))
{ {
dwo_file->sections.str.asection = sectp; dwo_file->sections.str.asection = sectp;
@ -16423,13 +16431,12 @@ dwarf_decode_macro_bytes (bfd *abfd, gdb_byte *mac_ptr, gdb_byte *mac_end,
} }
static void static void
dwarf_decode_macros (struct line_header *lh, unsigned int offset, dwarf_decode_macros (struct dwarf2_cu *cu, unsigned int offset,
char *comp_dir, bfd *abfd, char *comp_dir, int section_is_gnu)
struct dwarf2_cu *cu,
struct dwarf2_section_info *section,
int section_is_gnu, const char *section_name)
{ {
struct objfile *objfile = dwarf2_per_objfile->objfile; struct objfile *objfile = dwarf2_per_objfile->objfile;
struct line_header *lh = cu->line_header;
bfd *abfd;
gdb_byte *mac_ptr, *mac_end; gdb_byte *mac_ptr, *mac_end;
struct macro_source_file *current_file = 0; struct macro_source_file *current_file = 0;
enum dwarf_macro_record_type macinfo_type; enum dwarf_macro_record_type macinfo_type;
@ -16438,6 +16445,35 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
struct cleanup *cleanup; struct cleanup *cleanup;
htab_t include_hash; htab_t include_hash;
void **slot; void **slot;
struct dwarf2_section_info *section;
const char *section_name;
if (cu->dwo_unit != NULL)
{
if (section_is_gnu)
{
section = &cu->dwo_unit->dwo_file->sections.macro;
section_name = ".debug_macro.dwo";
}
else
{
section = &cu->dwo_unit->dwo_file->sections.macinfo;
section_name = ".debug_macinfo.dwo";
}
}
else
{
if (section_is_gnu)
{
section = &dwarf2_per_objfile->macro;
section_name = ".debug_macro";
}
else
{
section = &dwarf2_per_objfile->macinfo;
section_name = ".debug_macinfo";
}
}
dwarf2_read_section (objfile, section); dwarf2_read_section (objfile, section);
if (section->buffer == NULL) if (section->buffer == NULL)
@ -16445,6 +16481,7 @@ dwarf_decode_macros (struct line_header *lh, unsigned int offset,
complaint (&symfile_complaints, _("missing %s section"), section_name); complaint (&symfile_complaints, _("missing %s section"), section_name);
return; return;
} }
abfd = section->asection->owner;
/* First pass: Find the name of the base filename. /* First pass: Find the name of the base filename.
This filename is needed in order to process all macros whose definition This filename is needed in order to process all macros whose definition