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:
Simon Marchi
2019-06-21 14:10:14 -04:00
committed by Simon Marchi
parent dc4ccb6f7f
commit 51ac9db596
3 changed files with 61 additions and 75 deletions

View File

@ -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> 2019-06-21 Simon Marchi <simon.marchi@polymtl.ca>
* dwarf2read.h (struct dwarf2_section_info) <readin, * dwarf2read.h (struct dwarf2_section_info) <readin,

View File

@ -703,33 +703,43 @@ enum dwp_v2_section_ids
struct dwo_file 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. /* The DW_AT_GNU_dwo_name attribute.
For virtual DWO files the name is constructed from the section offsets 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 of abbrev,line,loc,str_offsets so that we combine virtual DWO files
from related CU+TUs. */ from related CU+TUs. */
const char *dwo_name; const char *dwo_name = nullptr;
/* The DW_AT_comp_dir attribute. */ /* 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. /* 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. */ 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. /* The sections that make up this DWO file.
Remember that for virtual DWO files in DWP V2, these are virtual Remember that for virtual DWO files in DWP V2, these are virtual
sections (for lack of a better name). */ sections (for lack of a better name). */
struct dwo_sections sections; struct dwo_sections sections {};
/* The CUs in the file. /* The CUs in the file.
Each element is a struct dwo_unit. Multiple CUs per DWO are supported as 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 an extension to handle LLVM's Link Time Optimization output (where
multiple source files may be compiled into a single object/dwo pair). */ multiple source files may be compiled into a single object/dwo pair). */
htab_t cus; htab_t cus {};
/* Table of TUs in the file. /* Table of TUs in the file.
Each element is a struct dwo_unit. */ Each element is a struct dwo_unit. */
htab_t tus; htab_t tus {};
}; };
/* These sections are what may appear in a DWP file. */ /* 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 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. */ /* 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); 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); locate_sections (obfd, sec, *names);
} }
static void free_dwo_files (htab_t dwo_files, struct objfile *objfile);
dwarf2_per_objfile::~dwarf2_per_objfile () dwarf2_per_objfile::~dwarf2_per_objfile ()
{ {
/* Cached DIE trees use xmalloc and the comp_unit_obstack. */ /* 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); 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. */ /* 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 if (get_dwp_file (dwarf2_per_objfile) == NULL
&& dwarf2_per_objfile->dwo_files != 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, process_dwo_file_for_skeletonless_type_units,
dwarf2_per_objfile); 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. */ /* Allocate a hash table for DWO files. */
static htab_t static htab_up
allocate_dwo_file_hash_table (struct objfile *objfile) allocate_dwo_file_hash_table (struct objfile *objfile)
{ {
return htab_create_alloc_ex (41, 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, hash_dwo_file,
eq_dwo_file, eq_dwo_file,
NULL, delete_dwo_file,
&objfile->objfile_obstack, &objfile->objfile_obstack,
hashtab_obstack_allocate, hashtab_obstack_allocate,
dummy_obstack_deallocate); dummy_obstack_deallocate));
} }
/* Lookup DWO file DWO_NAME. */ /* 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 dwarf2_per_objfile->dwo_files
= allocate_dwo_file_hash_table (dwarf2_per_objfile->objfile); = allocate_dwo_file_hash_table (dwarf2_per_objfile->objfile);
memset (&find_entry, 0, sizeof (find_entry));
find_entry.dwo_name = dwo_name; find_entry.dwo_name = dwo_name;
find_entry.comp_dir = comp_dir; 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; 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", fprintf_unfiltered (gdb_stdlog, "Creating virtual DWO: %s\n",
virtual_dwo_name.c_str ()); 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 dwo_file->dwo_name
= (const char *) obstack_copy0 (&objfile->objfile_obstack, = (const char *) obstack_copy0 (&objfile->objfile_obstack,
virtual_dwo_name.c_str (), 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", fprintf_unfiltered (gdb_stdlog, "Creating virtual DWO: %s\n",
virtual_dwo_name.c_str ()); 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 dwo_file->dwo_name
= (const char *) obstack_copy0 (&objfile->objfile_obstack, = (const char *) obstack_copy0 (&objfile->objfile_obstack,
virtual_dwo_name.c_str (), 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) const char *dwo_name, const char *comp_dir)
{ {
struct dwarf2_per_objfile *dwarf2_per_objfile = per_cu->dwarf2_per_objfile; 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)); gdb_bfd_ref_ptr dbfd (open_dwo_file (dwarf2_per_objfile, dwo_name, comp_dir));
if (dbfd == NULL) if (dbfd == NULL)
@ -12969,10 +12968,7 @@ open_and_init_dwo_file (struct dwarf2_per_cu_data *per_cu,
return NULL; return NULL;
} }
/* We use a unique pointer here, despite the obstack allocation, dwo_file_up dwo_file (new struct dwo_file);
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->dwo_name = dwo_name; dwo_file->dwo_name = dwo_name;
dwo_file->comp_dir = comp_dir; dwo_file->comp_dir = comp_dir;
dwo_file->dbfd = dbfd.release (); 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); 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. */ /* Read in various DIEs. */
/* DW_AT_abstract_origin inherits whole DIEs (not just their attributes). /* DW_AT_abstract_origin inherits whole DIEs (not just their attributes).

View File

@ -197,7 +197,7 @@ public:
/* A table mapping DW_AT_dwo_name values to struct dwo_file objects. /* A table mapping DW_AT_dwo_name values to struct dwo_file objects.
This is NULL if the table hasn't been allocated yet. */ 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. */ /* True if we've checked for whether there is a DWP file. */
bool dwp_checked = false; bool dwp_checked = false;