gdb: move dwarf2_per_cu_data and signatured_type up

Move them up before dwarf2_per_bfd, this will allow adding and using
signatured_type_up in the next patch.

gdb/ChangeLog:

	* dwarf2/read.h (signatured_type, dwarf2_per_cu_data): Move up.

Change-Id: I85acad4476c8236930b6f9e53ddb8bbbad009e5e
This commit is contained in:
Simon Marchi 2021-05-31 12:33:31 -04:00
parent ef9d256562
commit 4631503b28
2 changed files with 221 additions and 215 deletions

View file

@ -1,3 +1,7 @@
2021-05-31 Simon Marchi <simon.marchi@polymtl.ca>
* dwarf2/read.h (signatured_type, dwarf2_per_cu_data): Move up.
2021-05-30 Tom Tromey <tom@tromey.com>
* dwarf2/read.c (dwarf2_per_bfd::allocate_signatured_type): Set

View file

@ -47,7 +47,9 @@ struct tu_stats
struct dwarf2_cu;
struct dwarf2_debug_sections;
struct dwarf2_per_bfd;
struct dwarf2_per_cu_data;
struct dwarf2_psymtab;
struct mapped_index;
struct mapped_debug_names;
struct signatured_type;
@ -88,6 +90,221 @@ struct dwarf2_per_cu_data_deleter
typedef std::unique_ptr<dwarf2_per_cu_data, dwarf2_per_cu_data_deleter>
dwarf2_per_cu_data_up;
/* Persistent data held for a compilation unit, even when not
processing it. We put a pointer to this structure in the
psymtab. */
struct dwarf2_per_cu_data
{
dwarf2_per_cu_data ()
: queued (false),
is_debug_types (false),
is_dwz (false),
reading_dwo_directly (false),
tu_read (false),
m_header_read_in (false),
unit_type {},
lang (language_unknown)
{
}
/* The start offset and length of this compilation unit.
NOTE: Unlike comp_unit_head.length, this length includes
initial_length_size.
If the DIE refers to a DWO file, this is always of the original die,
not the DWO file. */
sect_offset sect_off {};
unsigned int length = 0;
/* DWARF standard version this data has been read from (such as 4 or 5). */
unsigned char dwarf_version = 0;
/* Flag indicating this compilation unit will be read in before
any of the current compilation units are processed. */
unsigned int queued : 1;
/* Non-zero if this CU is from .debug_types.
Struct dwarf2_per_cu_data is contained in struct signatured_type iff
this is non-zero. */
unsigned int is_debug_types : 1;
/* Non-zero if this CU is from the .dwz file. */
unsigned int is_dwz : 1;
/* Non-zero if reading a TU directly from a DWO file, bypassing the stub.
This flag is only valid if is_debug_types is true.
We can't read a CU directly from a DWO file: There are required
attributes in the stub. */
unsigned int reading_dwo_directly : 1;
/* Non-zero if the TU has been read.
This is used to assist the "Stay in DWO Optimization" for Fission:
When reading a DWO, it's faster to read TUs from the DWO instead of
fetching them from random other DWOs (due to comdat folding).
If the TU has already been read, the optimization is unnecessary
(and unwise - we don't want to change where gdb thinks the TU lives
"midflight").
This flag is only valid if is_debug_types is true. */
unsigned int tu_read : 1;
/* True if HEADER has been read in.
Don't access this field directly. It should be private, but we can't make
it private at the moment. */
mutable bool m_header_read_in : 1;
/* The unit type of this CU. */
ENUM_BITFIELD (dwarf_unit_type) unit_type : 8;
/* The language of this CU. */
ENUM_BITFIELD (language) lang : LANGUAGE_BITS;
/* Our index in the unshared "symtabs" vector. */
unsigned index = 0;
/* The section this CU/TU lives in.
If the DIE refers to a DWO file, this is always the original die,
not the DWO file. */
struct dwarf2_section_info *section = nullptr;
/* Backlink to the owner of this. */
dwarf2_per_bfd *per_bfd = nullptr;
/* DWARF header of this CU. Note that dwarf2_cu reads its own version of the
header, which may differ from this one, since it may pass rcuh_kind::TYPE
to read_comp_unit_head, whereas for dwarf2_per_cu_data we always pass
rcuh_kind::COMPILE.
Don't access this field directly, use the get_header method instead. It
should be private, but we can't make it private at the moment. */
mutable comp_unit_head m_header {};
/* When dwarf2_per_bfd::using_index is true, the 'quick' field
is active. Otherwise, the 'psymtab' field is active. */
union
{
/* The partial symbol table associated with this compilation unit,
or NULL for unread partial units. */
dwarf2_psymtab *psymtab;
/* Data needed by the "quick" functions. */
struct dwarf2_per_cu_quick_data *quick;
} v {};
/* The CUs we import using DW_TAG_imported_unit. This is filled in
while reading psymtabs, used to compute the psymtab dependencies,
and then cleared. Then it is filled in again while reading full
symbols, and only deleted when the objfile is destroyed.
This is also used to work around a difference between the way gold
generates .gdb_index version <=7 and the way gdb does. Arguably this
is a gold bug. For symbols coming from TUs, gold records in the index
the CU that includes the TU instead of the TU itself. This breaks
dw2_lookup_symbol: It assumes that if the index says symbol X lives
in CU/TU Y, then one need only expand Y and a subsequent lookup in Y
will find X. Alas TUs live in their own symtab, so after expanding CU Y
we need to look in TU Z to find X. Fortunately, this is akin to
DW_TAG_imported_unit, so we just use the same mechanism: For
.gdb_index version <=7 this also records the TUs that the CU referred
to. Concurrently with this change gdb was modified to emit version 8
indices so we only pay a price for gold generated indices.
http://sourceware.org/bugzilla/show_bug.cgi?id=15021.
This currently needs to be a public member due to how
dwarf2_per_cu_data is allocated and used. Ideally in future things
could be refactored to make this private. Until then please try to
avoid direct access to this member, and instead use the helper
functions above. */
std::vector <dwarf2_per_cu_data *> *imported_symtabs = nullptr;
/* Return true of IMPORTED_SYMTABS is empty or not yet allocated. */
bool imported_symtabs_empty () const
{
return (imported_symtabs == nullptr || imported_symtabs->empty ());
}
/* Push P to the back of IMPORTED_SYMTABS, allocated IMPORTED_SYMTABS
first if required. */
void imported_symtabs_push (dwarf2_per_cu_data *p)
{
if (imported_symtabs == nullptr)
imported_symtabs = new std::vector <dwarf2_per_cu_data *>;
imported_symtabs->push_back (p);
}
/* Return the size of IMPORTED_SYMTABS if it is allocated, otherwise
return 0. */
size_t imported_symtabs_size () const
{
if (imported_symtabs == nullptr)
return 0;
return imported_symtabs->size ();
}
/* Delete IMPORTED_SYMTABS and set the pointer back to nullptr. */
void imported_symtabs_free ()
{
delete imported_symtabs;
imported_symtabs = nullptr;
}
/* Get the header of this per_cu, reading it if necessary. */
const comp_unit_head *get_header () const;
/* Return the address size given in the compilation unit header for
this CU. */
int addr_size () const;
/* Return the offset size given in the compilation unit header for
this CU. */
int offset_size () const;
/* Return the DW_FORM_ref_addr size given in the compilation unit
header for this CU. */
int ref_addr_size () const;
/* Return DWARF version number of this CU. */
short version () const
{
return dwarf_version;
}
/* A type unit group has a per_cu object that is recognized by
having no section. */
bool type_unit_group_p () const
{
return section == nullptr;
}
};
/* Entry in the signatured_types hash table. */
struct signatured_type : public dwarf2_per_cu_data
{
/* The type's signature. */
ULONGEST signature = 0;
/* Offset in the TU of the type's DIE, as read from the TU header.
If this TU is a DWO stub and the definition lives in a DWO file
(specified by DW_AT_GNU_dwo_name), this value is unusable. */
cu_offset type_offset_in_tu {};
/* Offset in the section of the type's DIE.
If the definition lives in a DWO file, this is the offset in the
.debug_types.dwo section.
The value is zero until the actual value is known.
Zero is otherwise not a valid section offset. */
sect_offset type_offset_in_section {};
/* Type units are grouped by their DW_AT_stmt_list entry so that they
can share them. This points to the containing symtab. */
struct type_unit_group *type_unit_group = nullptr;
/* Containing DWO unit.
This field is valid iff per_cu.reading_dwo_directly. */
struct dwo_unit *dwo_unit = nullptr;
};
/* Some DWARF data can be shared across objfiles who share the same BFD,
this data is stored in this object.
@ -402,221 +619,6 @@ struct dwarf2_psymtab : public partial_symtab
struct dwarf2_per_cu_data *per_cu_data;
};
/* Persistent data held for a compilation unit, even when not
processing it. We put a pointer to this structure in the
psymtab. */
struct dwarf2_per_cu_data
{
dwarf2_per_cu_data ()
: queued (false),
is_debug_types (false),
is_dwz (false),
reading_dwo_directly (false),
tu_read (false),
m_header_read_in (false),
unit_type {},
lang (language_unknown)
{
}
/* The start offset and length of this compilation unit.
NOTE: Unlike comp_unit_head.length, this length includes
initial_length_size.
If the DIE refers to a DWO file, this is always of the original die,
not the DWO file. */
sect_offset sect_off {};
unsigned int length = 0;
/* DWARF standard version this data has been read from (such as 4 or 5). */
unsigned char dwarf_version = 0;
/* Flag indicating this compilation unit will be read in before
any of the current compilation units are processed. */
unsigned int queued : 1;
/* Non-zero if this CU is from .debug_types.
Struct dwarf2_per_cu_data is contained in struct signatured_type iff
this is non-zero. */
unsigned int is_debug_types : 1;
/* Non-zero if this CU is from the .dwz file. */
unsigned int is_dwz : 1;
/* Non-zero if reading a TU directly from a DWO file, bypassing the stub.
This flag is only valid if is_debug_types is true.
We can't read a CU directly from a DWO file: There are required
attributes in the stub. */
unsigned int reading_dwo_directly : 1;
/* Non-zero if the TU has been read.
This is used to assist the "Stay in DWO Optimization" for Fission:
When reading a DWO, it's faster to read TUs from the DWO instead of
fetching them from random other DWOs (due to comdat folding).
If the TU has already been read, the optimization is unnecessary
(and unwise - we don't want to change where gdb thinks the TU lives
"midflight").
This flag is only valid if is_debug_types is true. */
unsigned int tu_read : 1;
/* True if HEADER has been read in.
Don't access this field directly. It should be private, but we can't make
it private at the moment. */
mutable bool m_header_read_in : 1;
/* The unit type of this CU. */
ENUM_BITFIELD (dwarf_unit_type) unit_type : 8;
/* The language of this CU. */
ENUM_BITFIELD (language) lang : LANGUAGE_BITS;
/* Our index in the unshared "symtabs" vector. */
unsigned index = 0;
/* The section this CU/TU lives in.
If the DIE refers to a DWO file, this is always the original die,
not the DWO file. */
struct dwarf2_section_info *section = nullptr;
/* Backlink to the owner of this. */
dwarf2_per_bfd *per_bfd = nullptr;
/* DWARF header of this CU. Note that dwarf2_cu reads its own version of the
header, which may differ from this one, since it may pass rcuh_kind::TYPE
to read_comp_unit_head, whereas for dwarf2_per_cu_data we always pass
rcuh_kind::COMPILE.
Don't access this field directly, use the get_header method instead. It
should be private, but we can't make it private at the moment. */
mutable comp_unit_head m_header {};
/* When dwarf2_per_bfd::using_index is true, the 'quick' field
is active. Otherwise, the 'psymtab' field is active. */
union
{
/* The partial symbol table associated with this compilation unit,
or NULL for unread partial units. */
dwarf2_psymtab *psymtab;
/* Data needed by the "quick" functions. */
struct dwarf2_per_cu_quick_data *quick;
} v {};
/* The CUs we import using DW_TAG_imported_unit. This is filled in
while reading psymtabs, used to compute the psymtab dependencies,
and then cleared. Then it is filled in again while reading full
symbols, and only deleted when the objfile is destroyed.
This is also used to work around a difference between the way gold
generates .gdb_index version <=7 and the way gdb does. Arguably this
is a gold bug. For symbols coming from TUs, gold records in the index
the CU that includes the TU instead of the TU itself. This breaks
dw2_lookup_symbol: It assumes that if the index says symbol X lives
in CU/TU Y, then one need only expand Y and a subsequent lookup in Y
will find X. Alas TUs live in their own symtab, so after expanding CU Y
we need to look in TU Z to find X. Fortunately, this is akin to
DW_TAG_imported_unit, so we just use the same mechanism: For
.gdb_index version <=7 this also records the TUs that the CU referred
to. Concurrently with this change gdb was modified to emit version 8
indices so we only pay a price for gold generated indices.
http://sourceware.org/bugzilla/show_bug.cgi?id=15021.
This currently needs to be a public member due to how
dwarf2_per_cu_data is allocated and used. Ideally in future things
could be refactored to make this private. Until then please try to
avoid direct access to this member, and instead use the helper
functions above. */
std::vector <dwarf2_per_cu_data *> *imported_symtabs = nullptr;
/* Return true of IMPORTED_SYMTABS is empty or not yet allocated. */
bool imported_symtabs_empty () const
{
return (imported_symtabs == nullptr || imported_symtabs->empty ());
}
/* Push P to the back of IMPORTED_SYMTABS, allocated IMPORTED_SYMTABS
first if required. */
void imported_symtabs_push (dwarf2_per_cu_data *p)
{
if (imported_symtabs == nullptr)
imported_symtabs = new std::vector <dwarf2_per_cu_data *>;
imported_symtabs->push_back (p);
}
/* Return the size of IMPORTED_SYMTABS if it is allocated, otherwise
return 0. */
size_t imported_symtabs_size () const
{
if (imported_symtabs == nullptr)
return 0;
return imported_symtabs->size ();
}
/* Delete IMPORTED_SYMTABS and set the pointer back to nullptr. */
void imported_symtabs_free ()
{
delete imported_symtabs;
imported_symtabs = nullptr;
}
/* Get the header of this per_cu, reading it if necessary. */
const comp_unit_head *get_header () const;
/* Return the address size given in the compilation unit header for
this CU. */
int addr_size () const;
/* Return the offset size given in the compilation unit header for
this CU. */
int offset_size () const;
/* Return the DW_FORM_ref_addr size given in the compilation unit
header for this CU. */
int ref_addr_size () const;
/* Return DWARF version number of this CU. */
short version () const
{
return dwarf_version;
}
/* A type unit group has a per_cu object that is recognized by
having no section. */
bool type_unit_group_p () const
{
return section == nullptr;
}
};
/* Entry in the signatured_types hash table. */
struct signatured_type : public dwarf2_per_cu_data
{
/* The type's signature. */
ULONGEST signature = 0;
/* Offset in the TU of the type's DIE, as read from the TU header.
If this TU is a DWO stub and the definition lives in a DWO file
(specified by DW_AT_GNU_dwo_name), this value is unusable. */
cu_offset type_offset_in_tu {};
/* Offset in the section of the type's DIE.
If the definition lives in a DWO file, this is the offset in the
.debug_types.dwo section.
The value is zero until the actual value is known.
Zero is otherwise not a valid section offset. */
sect_offset type_offset_in_section {};
/* Type units are grouped by their DW_AT_stmt_list entry so that they
can share them. This points to the containing symtab. */
struct type_unit_group *type_unit_group = nullptr;
/* Containing DWO unit.
This field is valid iff per_cu.reading_dwo_directly. */
struct dwo_unit *dwo_unit = nullptr;
};
/* Return the type of the DIE at DIE_OFFSET in the CU named by
PER_CU. */