* dwarf2read.c (struct dwo_file): Add/tweak comments.

(lookup_dwo_unit_in_dwp): Renamed from lookup_dwo_in_dwp.  Remove
	arg "htab".  All callers updated.
	(create_debug_types_hash_table): Remove redundant copy of
	abbrev_section.
	(create_dwo_in_dwp): Tweak comments.
	(read_str_index): Tweak comment.  Record dwarf form name in static
	local.
This commit is contained in:
Doug Evans 2013-09-27 18:48:41 +00:00
parent 9c41109d36
commit 57d63ce2b9
2 changed files with 58 additions and 41 deletions

View file

@ -1,3 +1,14 @@
2013-09-27 Doug Evans <dje@google.com>
* dwarf2read.c (struct dwo_file): Add/tweak comments.
(lookup_dwo_unit_in_dwp): Renamed from lookup_dwo_in_dwp. Remove
arg "htab". All callers updated.
(create_debug_types_hash_table): Remove redundant copy of
abbrev_section.
(create_dwo_in_dwp): Tweak comments.
(read_str_index): Tweak comment. Record dwarf form name in static
local.
2013-09-27 Pedro Alves <palves@redhat.com> 2013-09-27 Pedro Alves <palves@redhat.com>
* remote.h (REMOTE_SYSROOT_PREFIX): New define. * remote.h (REMOTE_SYSROOT_PREFIX): New define.

View file

@ -750,8 +750,15 @@ struct dwo_unit
}; };
/* Data for one DWO file. /* Data for one DWO file.
This includes virtual DWO files that have been packaged into a
DWP file. */ This includes virtual DWO files (a virtual DWO file is a DWO file as it
appears in a DWP file). DWP files don't really have DWO files per se -
comdat folding of types "loses" the DWO file they came from, and from
a high level view DWP files appear to contain a mass of random types.
However, to maintain consistency with the non-DWP case we pretend DWP
files contain virtual DWO files, and we assign each TU with one virtual
DWO file (generally based on the line and abbrev section offsets -
a heuristic that seems to work in practice). */
struct dwo_file struct dwo_file
{ {
@ -830,7 +837,7 @@ struct dwp_file
/* Section info for this file. */ /* Section info for this file. */
struct dwp_sections sections; struct dwp_sections sections;
/* Table of CUs in the file. */ /* Table of CUs in the file. */
const struct dwp_hash_table *cus; const struct dwp_hash_table *cus;
/* Table of TUs in the file. */ /* Table of TUs in the file. */
@ -1699,9 +1706,9 @@ static htab_t allocate_signatured_type_table (struct objfile *objfile);
static htab_t allocate_dwo_unit_table (struct objfile *objfile); static htab_t allocate_dwo_unit_table (struct objfile *objfile);
static struct dwo_unit *lookup_dwo_in_dwp static struct dwo_unit *lookup_dwo_unit_in_dwp
(struct dwp_file *dwp_file, const struct dwp_hash_table *htab, (struct dwp_file *dwp_file, const char *comp_dir,
const char *comp_dir, ULONGEST signature, int is_debug_types); ULONGEST signature, int is_debug_types);
static struct dwp_file *get_dwp_file (void); static struct dwp_file *get_dwp_file (void);
@ -4238,7 +4245,6 @@ create_debug_types_hash_table (struct dwo_file *dwo_file,
{ {
bfd *abfd; bfd *abfd;
const gdb_byte *info_ptr, *end_ptr; const gdb_byte *info_ptr, *end_ptr;
struct dwarf2_section_info *abbrev_section;
dwarf2_read_section (objfile, section); dwarf2_read_section (objfile, section);
info_ptr = section->buffer; info_ptr = section->buffer;
@ -4250,11 +4256,6 @@ create_debug_types_hash_table (struct dwo_file *dwo_file,
not present, in which case section->asection will be NULL. */ not present, in which case section->asection will be NULL. */
abfd = section->asection->owner; abfd = section->asection->owner;
if (dwo_file)
abbrev_section = &dwo_file->sections.abbrev;
else
abbrev_section = &dwarf2_per_objfile->abbrev;
/* We don't use init_cutu_and_read_dies_simple, or some such, here /* We don't use init_cutu_and_read_dies_simple, or some such, here
because we don't need to read any dies: the signature is in the because we don't need to read any dies: the signature is in the
header. */ header. */
@ -4551,8 +4552,8 @@ lookup_dwp_signatured_type (struct dwarf2_cu *cu, ULONGEST sig)
Try the DWP file and hope for the best. */ Try the DWP file and hope for the best. */
if (dwp_file->tus == NULL) if (dwp_file->tus == NULL)
return NULL; return NULL;
dwo_entry = lookup_dwo_in_dwp (dwp_file, dwp_file->tus, NULL, dwo_entry = lookup_dwo_unit_in_dwp (dwp_file, NULL,
sig, 1 /* is_debug_types */); sig, 1 /* is_debug_types */);
if (dwo_entry == NULL) if (dwo_entry == NULL)
return NULL; return NULL;
@ -9219,8 +9220,8 @@ create_dwo_in_dwp (struct dwp_file *dwp_file,
The DWP file can be made up of a random collection of CUs and TUs. The DWP file can be made up of a random collection of CUs and TUs.
However, for each CU + set of TUs that came from the same original DWO However, for each CU + set of TUs that came from the same original DWO
file, we want to combine them back into a virtual DWO file to save space file, we can combine them back into a virtual DWO file to save space
(fewer struct dwo_file objects to allocated). Remember that for really (fewer struct dwo_file objects to allocate). Remember that for really
large apps there can be on the order of 8K CUs and 200K TUs, or more. */ large apps there can be on the order of 8K CUs and 200K TUs, or more. */
virtual_dwo_name = virtual_dwo_name =
@ -9255,12 +9256,13 @@ create_dwo_in_dwp (struct dwp_file *dwp_file,
dwo_file->sections.str_offsets = sections.str_offsets; dwo_file->sections.str_offsets = sections.str_offsets;
/* The "str" section is global to the entire DWP file. */ /* The "str" section is global to the entire DWP file. */
dwo_file->sections.str = dwp_file->sections.str; dwo_file->sections.str = dwp_file->sections.str;
/* The info or types section is assigned later to dwo_unit, /* The info or types section is assigned below to dwo_unit,
there's no need to record it in dwo_file. there's no need to record it in dwo_file.
Also, we can't simply record type sections in dwo_file because Also, we can't simply record type sections in dwo_file because
we record a pointer into the vector in dwo_unit. As we collect more we record a pointer into the vector in dwo_unit. As we collect more
types we'll grow the vector and eventually have to reallocate space types we'll grow the vector and eventually have to reallocate space
for it, invalidating all the pointers into the current copy. */ for it, invalidating all copies of pointers into the previous
contents. */
*dwo_file_slot = dwo_file; *dwo_file_slot = dwo_file;
} }
else else
@ -9280,21 +9282,22 @@ create_dwo_in_dwp (struct dwp_file *dwp_file,
dwo_unit->section = obstack_alloc (&objfile->objfile_obstack, dwo_unit->section = obstack_alloc (&objfile->objfile_obstack,
sizeof (struct dwarf2_section_info)); sizeof (struct dwarf2_section_info));
*dwo_unit->section = sections.info_or_types; *dwo_unit->section = sections.info_or_types;
/* offset, length, type_offset_in_tu are set later. */ /* dwo_unit->{offset,length,type_offset_in_tu} are set later. */
return dwo_unit; return dwo_unit;
} }
/* Lookup the DWO with SIGNATURE in DWP_FILE. */ /* Lookup the DWO unit with SIGNATURE in DWP_FILE.
Returns NULL if the signature isn't found. */
static struct dwo_unit * static struct dwo_unit *
lookup_dwo_in_dwp (struct dwp_file *dwp_file, lookup_dwo_unit_in_dwp (struct dwp_file *dwp_file, const char *comp_dir,
const struct dwp_hash_table *htab, ULONGEST signature, int is_debug_types)
const char *comp_dir,
ULONGEST signature, int is_debug_types)
{ {
const struct dwp_hash_table *dwp_htab =
is_debug_types ? dwp_file->tus : dwp_file->cus;
bfd *dbfd = dwp_file->dbfd; bfd *dbfd = dwp_file->dbfd;
uint32_t mask = htab->nr_slots - 1; uint32_t mask = dwp_htab->nr_slots - 1;
uint32_t hash = signature & mask; uint32_t hash = signature & mask;
uint32_t hash2 = ((signature >> 32) & mask) | 1; uint32_t hash2 = ((signature >> 32) & mask) | 1;
unsigned int i; unsigned int i;
@ -9309,18 +9312,19 @@ lookup_dwo_in_dwp (struct dwp_file *dwp_file,
return *slot; return *slot;
/* Use a for loop so that we don't loop forever on bad debug info. */ /* Use a for loop so that we don't loop forever on bad debug info. */
for (i = 0; i < htab->nr_slots; ++i) for (i = 0; i < dwp_htab->nr_slots; ++i)
{ {
ULONGEST signature_in_table; ULONGEST signature_in_table;
signature_in_table = signature_in_table =
read_8_bytes (dbfd, htab->hash_table + hash * sizeof (uint64_t)); read_8_bytes (dbfd, dwp_htab->hash_table + hash * sizeof (uint64_t));
if (signature_in_table == signature) if (signature_in_table == signature)
{ {
uint32_t section_index = uint32_t unit_index =
read_4_bytes (dbfd, htab->unit_table + hash * sizeof (uint32_t)); read_4_bytes (dbfd,
dwp_htab->unit_table + hash * sizeof (uint32_t));
*slot = create_dwo_in_dwp (dwp_file, htab, section_index, *slot = create_dwo_in_dwp (dwp_file, dwp_htab, unit_index,
comp_dir, signature, is_debug_types); comp_dir, signature, is_debug_types);
return *slot; return *slot;
} }
@ -9756,8 +9760,8 @@ lookup_dwo_cutu (struct dwarf2_per_cu_data *this_unit,
if (dwp_htab != NULL) if (dwp_htab != NULL)
{ {
struct dwo_unit *dwo_cutu = struct dwo_unit *dwo_cutu =
lookup_dwo_in_dwp (dwp_file, dwp_htab, comp_dir, lookup_dwo_unit_in_dwp (dwp_file, comp_dir,
signature, is_debug_types); signature, is_debug_types);
if (dwo_cutu != NULL) if (dwo_cutu != NULL)
{ {
@ -15436,7 +15440,8 @@ dwarf2_read_addr_index (struct dwarf2_per_cu_data *per_cu,
return read_addr_index_1 (addr_index, addr_base, addr_size); return read_addr_index_1 (addr_index, addr_base, addr_size);
} }
/* Given a DW_AT_str_index, fetch the string. */ /* Given a DW_FORM_GNU_str_index, fetch the string.
This is only used by the Fission support. */
static const char * static const char *
read_str_index (const struct die_reader_specs *reader, read_str_index (const struct die_reader_specs *reader,
@ -15448,21 +15453,22 @@ read_str_index (const struct die_reader_specs *reader,
struct dwo_sections *sections = &reader->dwo_file->sections; struct dwo_sections *sections = &reader->dwo_file->sections;
const gdb_byte *info_ptr; const gdb_byte *info_ptr;
ULONGEST str_offset; ULONGEST str_offset;
static const char form_name[] = "DW_FORM_GNU_str_index";
dwarf2_read_section (objfile, &sections->str); dwarf2_read_section (objfile, &sections->str);
dwarf2_read_section (objfile, &sections->str_offsets); dwarf2_read_section (objfile, &sections->str_offsets);
if (sections->str.buffer == NULL) if (sections->str.buffer == NULL)
error (_("DW_FORM_str_index used without .debug_str.dwo section" error (_("%s used without .debug_str.dwo section"
" in CU at offset 0x%lx [in module %s]"), " in CU at offset 0x%lx [in module %s]"),
(long) cu->header.offset.sect_off, dwo_name); form_name, (long) cu->header.offset.sect_off, dwo_name);
if (sections->str_offsets.buffer == NULL) if (sections->str_offsets.buffer == NULL)
error (_("DW_FORM_str_index used without .debug_str_offsets.dwo section" error (_("%s used without .debug_str_offsets.dwo section"
" in CU at offset 0x%lx [in module %s]"), " in CU at offset 0x%lx [in module %s]"),
(long) cu->header.offset.sect_off, dwo_name); form_name, (long) cu->header.offset.sect_off, dwo_name);
if (str_index * cu->header.offset_size >= sections->str_offsets.size) if (str_index * cu->header.offset_size >= sections->str_offsets.size)
error (_("DW_FORM_str_index pointing outside of .debug_str_offsets.dwo" error (_("%s pointing outside of .debug_str_offsets.dwo"
" section in CU at offset 0x%lx [in module %s]"), " section in CU at offset 0x%lx [in module %s]"),
(long) cu->header.offset.sect_off, dwo_name); form_name, (long) cu->header.offset.sect_off, dwo_name);
info_ptr = (sections->str_offsets.buffer info_ptr = (sections->str_offsets.buffer
+ str_index * cu->header.offset_size); + str_index * cu->header.offset_size);
if (cu->header.offset_size == 4) if (cu->header.offset_size == 4)
@ -15470,9 +15476,9 @@ read_str_index (const struct die_reader_specs *reader,
else else
str_offset = bfd_get_64 (abfd, info_ptr); str_offset = bfd_get_64 (abfd, info_ptr);
if (str_offset >= sections->str.size) if (str_offset >= sections->str.size)
error (_("Offset from DW_FORM_str_index pointing outside of" error (_("Offset from %s pointing outside of"
" .debug_str.dwo section in CU at offset 0x%lx [in module %s]"), " .debug_str.dwo section in CU at offset 0x%lx [in module %s]"),
(long) cu->header.offset.sect_off, dwo_name); form_name, (long) cu->header.offset.sect_off, dwo_name);
return (const char *) (sections->str.buffer + str_offset); return (const char *) (sections->str.buffer + str_offset);
} }