* 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:
parent
9c41109d36
commit
57d63ce2b9
2 changed files with 58 additions and 41 deletions
|
@ -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>
|
||||
|
||||
* remote.h (REMOTE_SYSROOT_PREFIX): New define.
|
||||
|
|
|
@ -750,8 +750,15 @@ struct dwo_unit
|
|||
};
|
||||
|
||||
/* 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
|
||||
{
|
||||
|
@ -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 struct dwo_unit *lookup_dwo_in_dwp
|
||||
(struct dwp_file *dwp_file, const struct dwp_hash_table *htab,
|
||||
const char *comp_dir, ULONGEST signature, int is_debug_types);
|
||||
static struct dwo_unit *lookup_dwo_unit_in_dwp
|
||||
(struct dwp_file *dwp_file, const char *comp_dir,
|
||||
ULONGEST signature, int is_debug_types);
|
||||
|
||||
static struct dwp_file *get_dwp_file (void);
|
||||
|
||||
|
@ -4238,7 +4245,6 @@ create_debug_types_hash_table (struct dwo_file *dwo_file,
|
|||
{
|
||||
bfd *abfd;
|
||||
const gdb_byte *info_ptr, *end_ptr;
|
||||
struct dwarf2_section_info *abbrev_section;
|
||||
|
||||
dwarf2_read_section (objfile, section);
|
||||
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. */
|
||||
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
|
||||
because we don't need to read any dies: the signature is in the
|
||||
header. */
|
||||
|
@ -4551,7 +4552,7 @@ lookup_dwp_signatured_type (struct dwarf2_cu *cu, ULONGEST sig)
|
|||
Try the DWP file and hope for the best. */
|
||||
if (dwp_file->tus == 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 */);
|
||||
if (dwo_entry == 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.
|
||||
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
|
||||
(fewer struct dwo_file objects to allocated). Remember that for really
|
||||
file, we can combine them back into a virtual DWO file to save space
|
||||
(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. */
|
||||
|
||||
virtual_dwo_name =
|
||||
|
@ -9255,12 +9256,13 @@ create_dwo_in_dwp (struct dwp_file *dwp_file,
|
|||
dwo_file->sections.str_offsets = sections.str_offsets;
|
||||
/* The "str" section is global to the entire DWP file. */
|
||||
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.
|
||||
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
|
||||
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;
|
||||
}
|
||||
else
|
||||
|
@ -9280,21 +9282,22 @@ create_dwo_in_dwp (struct dwp_file *dwp_file,
|
|||
dwo_unit->section = obstack_alloc (&objfile->objfile_obstack,
|
||||
sizeof (struct dwarf2_section_info));
|
||||
*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;
|
||||
}
|
||||
|
||||
/* 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 *
|
||||
lookup_dwo_in_dwp (struct dwp_file *dwp_file,
|
||||
const struct dwp_hash_table *htab,
|
||||
const char *comp_dir,
|
||||
lookup_dwo_unit_in_dwp (struct dwp_file *dwp_file, 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;
|
||||
uint32_t mask = htab->nr_slots - 1;
|
||||
uint32_t mask = dwp_htab->nr_slots - 1;
|
||||
uint32_t hash = signature & mask;
|
||||
uint32_t hash2 = ((signature >> 32) & mask) | 1;
|
||||
unsigned int i;
|
||||
|
@ -9309,18 +9312,19 @@ lookup_dwo_in_dwp (struct dwp_file *dwp_file,
|
|||
return *slot;
|
||||
|
||||
/* 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;
|
||||
|
||||
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)
|
||||
{
|
||||
uint32_t section_index =
|
||||
read_4_bytes (dbfd, htab->unit_table + hash * sizeof (uint32_t));
|
||||
uint32_t unit_index =
|
||||
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);
|
||||
return *slot;
|
||||
}
|
||||
|
@ -9756,7 +9760,7 @@ lookup_dwo_cutu (struct dwarf2_per_cu_data *this_unit,
|
|||
if (dwp_htab != NULL)
|
||||
{
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/* 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 *
|
||||
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;
|
||||
const gdb_byte *info_ptr;
|
||||
ULONGEST str_offset;
|
||||
static const char form_name[] = "DW_FORM_GNU_str_index";
|
||||
|
||||
dwarf2_read_section (objfile, §ions->str);
|
||||
dwarf2_read_section (objfile, §ions->str_offsets);
|
||||
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]"),
|
||||
(long) cu->header.offset.sect_off, dwo_name);
|
||||
form_name, (long) cu->header.offset.sect_off, dwo_name);
|
||||
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]"),
|
||||
(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)
|
||||
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]"),
|
||||
(long) cu->header.offset.sect_off, dwo_name);
|
||||
form_name, (long) cu->header.offset.sect_off, dwo_name);
|
||||
info_ptr = (sections->str_offsets.buffer
|
||||
+ str_index * cu->header.offset_size);
|
||||
if (cu->header.offset_size == 4)
|
||||
|
@ -15470,9 +15476,9 @@ read_str_index (const struct die_reader_specs *reader,
|
|||
else
|
||||
str_offset = bfd_get_64 (abfd, info_ptr);
|
||||
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]"),
|
||||
(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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue