mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-28 23:39:35 +08:00
dwarf2read: C++ify dwo_file
This patch changes dwo_file to be allocated/deallocated with new/delete, so that we can start using C++ features in it, and in struct dwo_sections. The free_dwo_file function becomes the destructor of struct dwo_file (and will disappear in upcoming patches, which will use gdb_bfd_ref_ptr for dbfd and an std::vector for sections.types). gdb/ChangeLog: * dwarf2read.h (struct dwarf2_per_objfile) <dwo_files>: Change type to htab_up. * dwarf2read.c (struct dwo_file): Initialize fields. <~dwo_file>: New. (free_dwo_file): Remove, move content to ~dwo_file. (struct dwo_file_deleter): Remove. (dwo_file_up>: Remove custom deleter. (free_dwo_files): Remove. (dwarf2_per_objfile::~dwarf2_per_objfile): Don't explicitly free dwo_files. (process_skeletonless_type_units): Call unique_ptr::get. (allocate_dwo_file_hash_table): Add deleter to created hash table. Change return type to htab_up. (lookup_dwo_file_slot): Don't memset dwo_file, call unique_ptr::get. (create_dwo_unit_in_dwp_v1): Allocate dwo_file with new. (create_dwo_unit_in_dwp_v2): Likewise. (open_and_init_dwo_file): Likewise. (free_dwo_file_from_slot): Remove.
This commit is contained in:

committed by
Simon Marchi

parent
dc4ccb6f7f
commit
51ac9db596
@ -1,3 +1,25 @@
|
||||
2019-06-21 Simon Marchi <simon.marchi@polymtl.ca>
|
||||
|
||||
* dwarf2read.h (struct dwarf2_per_objfile) <dwo_files>: Change
|
||||
type to htab_up.
|
||||
* dwarf2read.c (struct dwo_file): Initialize fields.
|
||||
<~dwo_file>: New.
|
||||
(free_dwo_file): Remove, move content to ~dwo_file.
|
||||
(struct dwo_file_deleter): Remove.
|
||||
(dwo_file_up>: Remove custom deleter.
|
||||
(free_dwo_files): Remove.
|
||||
(dwarf2_per_objfile::~dwarf2_per_objfile): Don't explicitly free
|
||||
dwo_files.
|
||||
(process_skeletonless_type_units): Call unique_ptr::get.
|
||||
(allocate_dwo_file_hash_table): Add deleter to created hash
|
||||
table. Change return type to htab_up.
|
||||
(lookup_dwo_file_slot): Don't memset dwo_file, call
|
||||
unique_ptr::get.
|
||||
(create_dwo_unit_in_dwp_v1): Allocate dwo_file with new.
|
||||
(create_dwo_unit_in_dwp_v2): Likewise.
|
||||
(open_and_init_dwo_file): Likewise.
|
||||
(free_dwo_file_from_slot): Remove.
|
||||
|
||||
2019-06-21 Simon Marchi <simon.marchi@polymtl.ca>
|
||||
|
||||
* dwarf2read.h (struct dwarf2_section_info) <readin,
|
||||
|
112
gdb/dwarf2read.c
112
gdb/dwarf2read.c
@ -703,33 +703,43 @@ enum dwp_v2_section_ids
|
||||
|
||||
struct dwo_file
|
||||
{
|
||||
dwo_file () = default;
|
||||
DISABLE_COPY_AND_ASSIGN (dwo_file);
|
||||
|
||||
~dwo_file ()
|
||||
{
|
||||
gdb_bfd_unref (dbfd);
|
||||
|
||||
VEC_free (dwarf2_section_info_def, sections.types);
|
||||
}
|
||||
|
||||
/* The DW_AT_GNU_dwo_name attribute.
|
||||
For virtual DWO files the name is constructed from the section offsets
|
||||
of abbrev,line,loc,str_offsets so that we combine virtual DWO files
|
||||
from related CU+TUs. */
|
||||
const char *dwo_name;
|
||||
const char *dwo_name = nullptr;
|
||||
|
||||
/* The DW_AT_comp_dir attribute. */
|
||||
const char *comp_dir;
|
||||
const char *comp_dir = nullptr;
|
||||
|
||||
/* The bfd, when the file is open. Otherwise this is NULL.
|
||||
This is unused(NULL) for virtual DWO files where we use dwp_file.dbfd. */
|
||||
bfd *dbfd;
|
||||
bfd *dbfd = nullptr;
|
||||
|
||||
/* The sections that make up this DWO file.
|
||||
Remember that for virtual DWO files in DWP V2, these are virtual
|
||||
sections (for lack of a better name). */
|
||||
struct dwo_sections sections;
|
||||
struct dwo_sections sections {};
|
||||
|
||||
/* The CUs in the file.
|
||||
Each element is a struct dwo_unit. Multiple CUs per DWO are supported as
|
||||
an extension to handle LLVM's Link Time Optimization output (where
|
||||
multiple source files may be compiled into a single object/dwo pair). */
|
||||
htab_t cus;
|
||||
htab_t cus {};
|
||||
|
||||
/* Table of TUs in the file.
|
||||
Each element is a struct dwo_unit. */
|
||||
htab_t tus;
|
||||
htab_t tus {};
|
||||
};
|
||||
|
||||
/* These sections are what may appear in a DWP file. */
|
||||
@ -1988,21 +1998,9 @@ static struct dwo_unit *lookup_dwo_type_unit
|
||||
|
||||
static void queue_and_load_all_dwo_tus (struct dwarf2_per_cu_data *);
|
||||
|
||||
static void free_dwo_file (struct dwo_file *);
|
||||
|
||||
/* A unique_ptr helper to free a dwo_file. */
|
||||
|
||||
struct dwo_file_deleter
|
||||
{
|
||||
void operator() (struct dwo_file *df) const
|
||||
{
|
||||
free_dwo_file (df);
|
||||
}
|
||||
};
|
||||
|
||||
/* A unique pointer to a dwo_file. */
|
||||
|
||||
typedef std::unique_ptr<struct dwo_file, dwo_file_deleter> dwo_file_up;
|
||||
typedef std::unique_ptr<struct dwo_file> dwo_file_up;
|
||||
|
||||
static void process_cu_includes (struct dwarf2_per_objfile *dwarf2_per_objfile);
|
||||
|
||||
@ -2147,8 +2145,6 @@ dwarf2_per_objfile::dwarf2_per_objfile (struct objfile *objfile_,
|
||||
locate_sections (obfd, sec, *names);
|
||||
}
|
||||
|
||||
static void free_dwo_files (htab_t dwo_files, struct objfile *objfile);
|
||||
|
||||
dwarf2_per_objfile::~dwarf2_per_objfile ()
|
||||
{
|
||||
/* Cached DIE trees use xmalloc and the comp_unit_obstack. */
|
||||
@ -2168,9 +2164,6 @@ dwarf2_per_objfile::~dwarf2_per_objfile ()
|
||||
|
||||
VEC_free (dwarf2_section_info_def, types);
|
||||
|
||||
if (dwo_files != NULL)
|
||||
free_dwo_files (dwo_files, objfile);
|
||||
|
||||
/* Everything else should be on the objfile obstack. */
|
||||
}
|
||||
|
||||
@ -8407,7 +8400,7 @@ process_skeletonless_type_units (struct dwarf2_per_objfile *dwarf2_per_objfile)
|
||||
if (get_dwp_file (dwarf2_per_objfile) == NULL
|
||||
&& dwarf2_per_objfile->dwo_files != NULL)
|
||||
{
|
||||
htab_traverse_noresize (dwarf2_per_objfile->dwo_files,
|
||||
htab_traverse_noresize (dwarf2_per_objfile->dwo_files.get (),
|
||||
process_dwo_file_for_skeletonless_type_units,
|
||||
dwarf2_per_objfile);
|
||||
}
|
||||
@ -11775,16 +11768,23 @@ eq_dwo_file (const void *item_lhs, const void *item_rhs)
|
||||
|
||||
/* Allocate a hash table for DWO files. */
|
||||
|
||||
static htab_t
|
||||
static htab_up
|
||||
allocate_dwo_file_hash_table (struct objfile *objfile)
|
||||
{
|
||||
return htab_create_alloc_ex (41,
|
||||
hash_dwo_file,
|
||||
eq_dwo_file,
|
||||
NULL,
|
||||
&objfile->objfile_obstack,
|
||||
hashtab_obstack_allocate,
|
||||
dummy_obstack_deallocate);
|
||||
auto delete_dwo_file = [] (void *item)
|
||||
{
|
||||
struct dwo_file *dwo_file = (struct dwo_file *) item;
|
||||
|
||||
delete dwo_file;
|
||||
};
|
||||
|
||||
return htab_up (htab_create_alloc_ex (41,
|
||||
hash_dwo_file,
|
||||
eq_dwo_file,
|
||||
delete_dwo_file,
|
||||
&objfile->objfile_obstack,
|
||||
hashtab_obstack_allocate,
|
||||
dummy_obstack_deallocate));
|
||||
}
|
||||
|
||||
/* Lookup DWO file DWO_NAME. */
|
||||
@ -11801,10 +11801,10 @@ lookup_dwo_file_slot (struct dwarf2_per_objfile *dwarf2_per_objfile,
|
||||
dwarf2_per_objfile->dwo_files
|
||||
= allocate_dwo_file_hash_table (dwarf2_per_objfile->objfile);
|
||||
|
||||
memset (&find_entry, 0, sizeof (find_entry));
|
||||
find_entry.dwo_name = dwo_name;
|
||||
find_entry.comp_dir = comp_dir;
|
||||
slot = htab_find_slot (dwarf2_per_objfile->dwo_files, &find_entry, INSERT);
|
||||
slot = htab_find_slot (dwarf2_per_objfile->dwo_files.get (), &find_entry,
|
||||
INSERT);
|
||||
|
||||
return slot;
|
||||
}
|
||||
@ -12451,7 +12451,7 @@ create_dwo_unit_in_dwp_v1 (struct dwarf2_per_objfile *dwarf2_per_objfile,
|
||||
fprintf_unfiltered (gdb_stdlog, "Creating virtual DWO: %s\n",
|
||||
virtual_dwo_name.c_str ());
|
||||
}
|
||||
dwo_file = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwo_file);
|
||||
dwo_file = new struct dwo_file;
|
||||
dwo_file->dwo_name
|
||||
= (const char *) obstack_copy0 (&objfile->objfile_obstack,
|
||||
virtual_dwo_name.c_str (),
|
||||
@ -12649,7 +12649,7 @@ create_dwo_unit_in_dwp_v2 (struct dwarf2_per_objfile *dwarf2_per_objfile,
|
||||
fprintf_unfiltered (gdb_stdlog, "Creating virtual DWO: %s\n",
|
||||
virtual_dwo_name.c_str ());
|
||||
}
|
||||
dwo_file = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwo_file);
|
||||
dwo_file = new struct dwo_file;
|
||||
dwo_file->dwo_name
|
||||
= (const char *) obstack_copy0 (&objfile->objfile_obstack,
|
||||
virtual_dwo_name.c_str (),
|
||||
@ -12959,7 +12959,6 @@ open_and_init_dwo_file (struct dwarf2_per_cu_data *per_cu,
|
||||
const char *dwo_name, const char *comp_dir)
|
||||
{
|
||||
struct dwarf2_per_objfile *dwarf2_per_objfile = per_cu->dwarf2_per_objfile;
|
||||
struct objfile *objfile = dwarf2_per_objfile->objfile;
|
||||
|
||||
gdb_bfd_ref_ptr dbfd (open_dwo_file (dwarf2_per_objfile, dwo_name, comp_dir));
|
||||
if (dbfd == NULL)
|
||||
@ -12969,10 +12968,7 @@ open_and_init_dwo_file (struct dwarf2_per_cu_data *per_cu,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* We use a unique pointer here, despite the obstack allocation,
|
||||
because a dwo_file needs some cleanup if it is abandoned. */
|
||||
dwo_file_up dwo_file (OBSTACK_ZALLOC (&objfile->objfile_obstack,
|
||||
struct dwo_file));
|
||||
dwo_file_up dwo_file (new struct dwo_file);
|
||||
dwo_file->dwo_name = dwo_name;
|
||||
dwo_file->comp_dir = comp_dir;
|
||||
dwo_file->dbfd = dbfd.release ();
|
||||
@ -13486,38 +13482,6 @@ queue_and_load_all_dwo_tus (struct dwarf2_per_cu_data *per_cu)
|
||||
htab_traverse_noresize (dwo_file->tus, queue_and_load_dwo_tu, per_cu);
|
||||
}
|
||||
|
||||
/* Free all resources associated with DWO_FILE.
|
||||
Close the DWO file and munmap the sections. */
|
||||
|
||||
static void
|
||||
free_dwo_file (struct dwo_file *dwo_file)
|
||||
{
|
||||
/* Note: dbfd is NULL for virtual DWO files. */
|
||||
gdb_bfd_unref (dwo_file->dbfd);
|
||||
|
||||
VEC_free (dwarf2_section_info_def, dwo_file->sections.types);
|
||||
}
|
||||
|
||||
/* Traversal function for free_dwo_files. */
|
||||
|
||||
static int
|
||||
free_dwo_file_from_slot (void **slot, void *info)
|
||||
{
|
||||
struct dwo_file *dwo_file = (struct dwo_file *) *slot;
|
||||
|
||||
free_dwo_file (dwo_file);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Free all resources associated with DWO_FILES. */
|
||||
|
||||
static void
|
||||
free_dwo_files (htab_t dwo_files, struct objfile *objfile)
|
||||
{
|
||||
htab_traverse_noresize (dwo_files, free_dwo_file_from_slot, objfile);
|
||||
}
|
||||
|
||||
/* Read in various DIEs. */
|
||||
|
||||
/* DW_AT_abstract_origin inherits whole DIEs (not just their attributes).
|
||||
|
@ -197,7 +197,7 @@ public:
|
||||
|
||||
/* A table mapping DW_AT_dwo_name values to struct dwo_file objects.
|
||||
This is NULL if the table hasn't been allocated yet. */
|
||||
htab_t dwo_files {};
|
||||
htab_up dwo_files;
|
||||
|
||||
/* True if we've checked for whether there is a DWP file. */
|
||||
bool dwp_checked = false;
|
||||
|
Reference in New Issue
Block a user