* 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>
|
2013-09-27 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
* remote.h (REMOTE_SYSROOT_PREFIX): New define.
|
* remote.h (REMOTE_SYSROOT_PREFIX): New define.
|
||||||
|
|
|
@ -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, §ions->str);
|
dwarf2_read_section (objfile, §ions->str);
|
||||||
dwarf2_read_section (objfile, §ions->str_offsets);
|
dwarf2_read_section (objfile, §ions->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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue