gdb: allocate symfile_segment_data with new

- Allocate this structure with new instead of XNEW, use a unique pointer
  to manage its lifetime.
- Change a few functions to return a unique   pointer instead of a
  plain pointer.
- Change free_symfile_segment_data to be symfile_segment_data's
  destructor.

gdb/ChangeLog:

	* symfile.h (struct symfile_segment_data): Initialize fields.
	<~symfile_segment_data>: Add.
	(symfile_segment_data_up): New.
	(struct sym_fns) <sym_segments>: Return a
	symfile_segment_data_up.
	(default_symfile_segments): Return a symfile_segment_data_up.
	(free_symfile_segment_data): Remove.
	(get_symfile_segment_data): Return a symfile_segment_data_up.
	* symfile.c (default_symfile_segments): Likewise.
	(get_symfile_segment_data): Likewise.
	(free_symfile_segment_data): Remove.
	(symfile_find_segment_sections): Update.
	* elfread.c (elf_symfile_segments): Return a
	symfile_segment_data_up.
	* remote.c (remote_target::get_offsets): Update.
	* solib-target.c (solib_target_relocate_section_addresses):
	Update.
	* symfile-debug.c (debug_sym_segments): Return a
	symfile_segment_data_up.
This commit is contained in:
Simon Marchi 2020-05-19 12:18:04 -04:00
parent 8ac10c5bfc
commit 62982abdee
7 changed files with 55 additions and 45 deletions

View File

@ -1,3 +1,25 @@
2020-05-19 Simon Marchi <simon.marchi@efficios.com>
* symfile.h (struct symfile_segment_data): Initialize fields.
<~symfile_segment_data>: Add.
(symfile_segment_data_up): New.
(struct sym_fns) <sym_segments>: Return a
symfile_segment_data_up.
(default_symfile_segments): Return a symfile_segment_data_up.
(free_symfile_segment_data): Remove.
(get_symfile_segment_data): Return a symfile_segment_data_up.
* symfile.c (default_symfile_segments): Likewise.
(get_symfile_segment_data): Likewise.
(free_symfile_segment_data): Remove.
(symfile_find_segment_sections): Update.
* elfread.c (elf_symfile_segments): Return a
symfile_segment_data_up.
* remote.c (remote_target::get_offsets): Update.
* solib-target.c (solib_target_relocate_section_addresses):
Update.
* symfile-debug.c (debug_sym_segments): Return a
symfile_segment_data_up.
2020-05-18 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> 2020-05-18 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
PR build/25981 PR build/25981

View File

@ -85,14 +85,13 @@ static const struct bfd_key<elfread_data> probe_key;
/* Locate the segments in ABFD. */ /* Locate the segments in ABFD. */
static struct symfile_segment_data * static symfile_segment_data_up
elf_symfile_segments (bfd *abfd) elf_symfile_segments (bfd *abfd)
{ {
Elf_Internal_Phdr *phdrs, **segments; Elf_Internal_Phdr *phdrs, **segments;
long phdrs_size; long phdrs_size;
int num_phdrs, num_segments, num_sections, i; int num_phdrs, num_segments, num_sections, i;
asection *sect; asection *sect;
struct symfile_segment_data *data;
phdrs_size = bfd_get_elf_phdr_upper_bound (abfd); phdrs_size = bfd_get_elf_phdr_upper_bound (abfd);
if (phdrs_size == -1) if (phdrs_size == -1)
@ -112,7 +111,7 @@ elf_symfile_segments (bfd *abfd)
if (num_segments == 0) if (num_segments == 0)
return NULL; return NULL;
data = XCNEW (struct symfile_segment_data); symfile_segment_data_up data (new symfile_segment_data);
data->num_segments = num_segments; data->num_segments = num_segments;
data->segment_bases = XCNEWVEC (CORE_ADDR, num_segments); data->segment_bases = XCNEWVEC (CORE_ADDR, num_segments);
data->segment_sizes = XCNEWVEC (CORE_ADDR, num_segments); data->segment_sizes = XCNEWVEC (CORE_ADDR, num_segments);

View File

@ -4105,7 +4105,6 @@ remote_target::get_offsets ()
char *ptr; char *ptr;
int lose, num_segments = 0, do_sections, do_segments; int lose, num_segments = 0, do_sections, do_segments;
CORE_ADDR text_addr, data_addr, bss_addr, segments[2]; CORE_ADDR text_addr, data_addr, bss_addr, segments[2];
struct symfile_segment_data *data;
if (symfile_objfile == NULL) if (symfile_objfile == NULL)
return; return;
@ -4185,7 +4184,8 @@ remote_target::get_offsets ()
section_offsets offs = symfile_objfile->section_offsets; section_offsets offs = symfile_objfile->section_offsets;
data = get_symfile_segment_data (symfile_objfile->obfd); symfile_segment_data_up data
= get_symfile_segment_data (symfile_objfile->obfd);
do_segments = (data != NULL); do_segments = (data != NULL);
do_sections = num_segments == 0; do_sections = num_segments == 0;
@ -4220,8 +4220,9 @@ remote_target::get_offsets ()
if (do_segments) if (do_segments)
{ {
int ret = symfile_map_offsets_to_segments (symfile_objfile->obfd, data, int ret = symfile_map_offsets_to_segments (symfile_objfile->obfd,
offs, num_segments, segments); data.get (), offs,
num_segments, segments);
if (ret == 0 && !do_sections) if (ret == 0 && !do_sections)
error (_("Can not handle qOffsets TextSeg " error (_("Can not handle qOffsets TextSeg "
@ -4231,9 +4232,6 @@ remote_target::get_offsets ()
do_sections = 0; do_sections = 0;
} }
if (data)
free_symfile_segment_data (data);
if (do_sections) if (do_sections)
{ {
offs[SECT_OFF_TEXT (symfile_objfile)] = text_addr; offs[SECT_OFF_TEXT (symfile_objfile)] = text_addr;

View File

@ -364,9 +364,9 @@ Could not relocate shared library \"%s\": wrong number of ALLOC sections"),
} }
else if (!li->segment_bases.empty ()) else if (!li->segment_bases.empty ())
{ {
struct symfile_segment_data *data; symfile_segment_data_up data
= get_symfile_segment_data (so->abfd);
data = get_symfile_segment_data (so->abfd);
if (data == NULL) if (data == NULL)
warning (_("\ warning (_("\
Could not relocate shared library \"%s\": no segments"), so->so_name); Could not relocate shared library \"%s\": no segments"), so->so_name);
@ -375,7 +375,7 @@ Could not relocate shared library \"%s\": no segments"), so->so_name);
ULONGEST orig_delta; ULONGEST orig_delta;
int i; int i;
if (!symfile_map_offsets_to_segments (so->abfd, data, if (!symfile_map_offsets_to_segments (so->abfd, data.get (),
li->offsets, li->offsets,
li->segment_bases.size (), li->segment_bases.size (),
li->segment_bases.data ())) li->segment_bases.data ()))
@ -407,8 +407,6 @@ Could not relocate shared library \"%s\": bad offsets"), so->so_name);
+ data->segment_sizes[i - 1] + data->segment_sizes[i - 1]
+ orig_delta); + orig_delta);
gdb_assert (so->addr_low <= so->addr_high); gdb_assert (so->addr_low <= so->addr_high);
free_symfile_segment_data (data);
} }
} }
} }

View File

@ -475,7 +475,7 @@ debug_sym_offsets (struct objfile *objfile,
debug_data->real_sf->sym_offsets (objfile, info); debug_data->real_sf->sym_offsets (objfile, info);
} }
static struct symfile_segment_data * static symfile_segment_data_up
debug_sym_segments (bfd *abfd) debug_sym_segments (bfd *abfd)
{ {
/* This API function is annoying, it doesn't take a "this" pointer. /* This API function is annoying, it doesn't take a "this" pointer.

View File

@ -717,12 +717,11 @@ default_symfile_offsets (struct objfile *objfile,
It assumes that object files do not have segments, and fully linked It assumes that object files do not have segments, and fully linked
files have a single segment. */ files have a single segment. */
struct symfile_segment_data * symfile_segment_data_up
default_symfile_segments (bfd *abfd) default_symfile_segments (bfd *abfd)
{ {
int num_sections, i; int num_sections, i;
asection *sect; asection *sect;
struct symfile_segment_data *data;
CORE_ADDR low, high; CORE_ADDR low, high;
/* Relocatable files contain enough information to position each /* Relocatable files contain enough information to position each
@ -745,7 +744,7 @@ default_symfile_segments (bfd *abfd)
low = bfd_section_vma (sect); low = bfd_section_vma (sect);
high = low + bfd_section_size (sect); high = low + bfd_section_size (sect);
data = XCNEW (struct symfile_segment_data); symfile_segment_data_up data (new symfile_segment_data);
data->num_segments = 1; data->num_segments = 1;
data->segment_bases = XCNEW (CORE_ADDR); data->segment_bases = XCNEW (CORE_ADDR);
data->segment_sizes = XCNEW (CORE_ADDR); data->segment_sizes = XCNEW (CORE_ADDR);
@ -3621,7 +3620,7 @@ symfile_relocate_debug_section (struct objfile *objfile,
return (*objfile->sf->sym_relocate) (objfile, sectp, buf); return (*objfile->sf->sym_relocate) (objfile, sectp, buf);
} }
struct symfile_segment_data * symfile_segment_data_up
get_symfile_segment_data (bfd *abfd) get_symfile_segment_data (bfd *abfd)
{ {
const struct sym_fns *sf = find_sym_fns (abfd); const struct sym_fns *sf = find_sym_fns (abfd);
@ -3632,15 +3631,6 @@ get_symfile_segment_data (bfd *abfd)
return sf->sym_segments (abfd); return sf->sym_segments (abfd);
} }
void
free_symfile_segment_data (struct symfile_segment_data *data)
{
xfree (data->segment_bases);
xfree (data->segment_sizes);
xfree (data->segment_info);
xfree (data);
}
/* Given: /* Given:
- DATA, containing segment addresses from the object file ABFD, and - DATA, containing segment addresses from the object file ABFD, and
the mapping from ABFD's sections onto the segments that own them, the mapping from ABFD's sections onto the segments that own them,
@ -3703,17 +3693,14 @@ symfile_find_segment_sections (struct objfile *objfile)
bfd *abfd = objfile->obfd; bfd *abfd = objfile->obfd;
int i; int i;
asection *sect; asection *sect;
struct symfile_segment_data *data;
data = get_symfile_segment_data (objfile->obfd); symfile_segment_data_up data
= get_symfile_segment_data (objfile->obfd);
if (data == NULL) if (data == NULL)
return; return;
if (data->num_segments != 1 && data->num_segments != 2) if (data->num_segments != 1 && data->num_segments != 2)
{
free_symfile_segment_data (data);
return; return;
}
for (i = 0, sect = abfd->sections; sect != NULL; i++, sect = sect->next) for (i = 0, sect = abfd->sections; sect != NULL; i++, sect = sect->next)
{ {
@ -3736,8 +3723,6 @@ symfile_find_segment_sections (struct objfile *objfile)
objfile->sect_index_bss = sect->index; objfile->sect_index_bss = sect->index;
} }
} }
free_symfile_segment_data (data);
} }
/* Listen for free_objfile events. */ /* Listen for free_objfile events. */

View File

@ -80,26 +80,35 @@ typedef std::vector<other_sections> section_addr_info;
each BFD section belongs to. */ each BFD section belongs to. */
struct symfile_segment_data struct symfile_segment_data
{ {
~symfile_segment_data ()
{
xfree (this->segment_bases);
xfree (this->segment_sizes);
xfree (this->segment_info);
}
/* How many segments are present in this file. If there are /* How many segments are present in this file. If there are
two, the text segment is the first one and the data segment two, the text segment is the first one and the data segment
is the second one. */ is the second one. */
int num_segments; int num_segments = 0;
/* If NUM_SEGMENTS is greater than zero, the original base address /* If NUM_SEGMENTS is greater than zero, the original base address
of each segment. */ of each segment. */
CORE_ADDR *segment_bases; CORE_ADDR *segment_bases = nullptr;
/* If NUM_SEGMENTS is greater than zero, the memory size of each /* If NUM_SEGMENTS is greater than zero, the memory size of each
segment. */ segment. */
CORE_ADDR *segment_sizes; CORE_ADDR *segment_sizes = nullptr;
/* If NUM_SEGMENTS is greater than zero, this is an array of entries /* If NUM_SEGMENTS is greater than zero, this is an array of entries
recording which segment contains each BFD section. recording which segment contains each BFD section.
SEGMENT_INFO[I] is S+1 if the I'th BFD section belongs to segment SEGMENT_INFO[I] is S+1 if the I'th BFD section belongs to segment
S, or zero if it is not in any segment. */ S, or zero if it is not in any segment. */
int *segment_info; int *segment_info = nullptr;
}; };
using symfile_segment_data_up = std::unique_ptr<symfile_segment_data>;
/* Callback for quick_symbol_functions->map_symbol_filenames. */ /* Callback for quick_symbol_functions->map_symbol_filenames. */
typedef void (symbol_filename_ftype) (const char *filename, typedef void (symbol_filename_ftype) (const char *filename,
@ -360,7 +369,7 @@ struct sym_fns
the segments of ABFD. Each segment is a unit of the file the segments of ABFD. Each segment is a unit of the file
which may be relocated independently. */ which may be relocated independently. */
struct symfile_segment_data *(*sym_segments) (bfd *abfd); symfile_segment_data_up (*sym_segments) (bfd *abfd);
/* This function should read the linetable from the objfile when /* This function should read the linetable from the objfile when
the line table cannot be read while processing the debugging the line table cannot be read while processing the debugging
@ -401,7 +410,7 @@ extern void default_symfile_offsets (struct objfile *objfile,
/* The default version of sym_fns.sym_segments for readers that don't /* The default version of sym_fns.sym_segments for readers that don't
do anything special. */ do anything special. */
extern struct symfile_segment_data *default_symfile_segments (bfd *abfd); extern symfile_segment_data_up default_symfile_segments (bfd *abfd);
/* The default version of sym_fns.sym_relocate for readers that don't /* The default version of sym_fns.sym_relocate for readers that don't
do anything special. */ do anything special. */
@ -530,8 +539,7 @@ extern int symfile_map_offsets_to_segments (bfd *,
const struct symfile_segment_data *, const struct symfile_segment_data *,
section_offsets &, section_offsets &,
int, const CORE_ADDR *); int, const CORE_ADDR *);
struct symfile_segment_data *get_symfile_segment_data (bfd *abfd); symfile_segment_data_up get_symfile_segment_data (bfd *abfd);
void free_symfile_segment_data (struct symfile_segment_data *data);
extern scoped_restore_tmpl<int> increment_reading_symtab (void); extern scoped_restore_tmpl<int> increment_reading_symtab (void);