Make probe_ops::get_probes fill an std::vector

This patch changes one usage of VEC to std::vector.  It is a relatively
straightforward 1:1 change.  The implementations of
sym_probe_fns::sym_get_probes return a borrowed reference to their probe
vectors, meaning that the caller should not free it.  In the new code, I
made them return a const reference to the vector.

This patch and the following one were tested by the buildbot.  I didn't
see any failures that looked related to this one.

gdb/ChangeLog:

	* probe.h (struct probe_ops) <get_probes>: Change parameter from
	vec to std::vector.
	* probe.c (parse_probes_in_pspace): Update.
	(find_probes_in_objfile): Update.
	(find_probe_by_pc): Update.
	(collect_probes): Update.
	(probe_any_get_probes): Update.
	* symfile.h (struct sym_probe_fns) <sym_get_probes> Change
	return type to reference to std::vector.
	* dtrace-probe.c (dtrace_process_dof_probe): Change parameter to
	std::vector and update.
	(dtrace_process_dof): Likewise.
	(dtrace_get_probes): Likewise.
	* elfread.c (elf_get_probes): Change return type to std::vector,
	store an std::vector in bfd_data.
	(probe_key_free): Update to std::vector.
	* stap-probe.c (handle_stap_probe): Change parameter to
	std::vector and update.
	(stap_get_probes): Likewise.
	* symfile-debug.c (debug_sym_get_probes): Change return type to
	std::vector and update.
This commit is contained in:
Simon Marchi 2017-09-12 13:37:00 +02:00
parent 331f81b22c
commit aaa63a3190
8 changed files with 65 additions and 60 deletions

View file

@ -1,3 +1,27 @@
2017-09-12 Simon Marchi <simon.marchi@ericsson.com>
* probe.h (struct probe_ops) <get_probes>: Change parameter from
vec to std::vector.
* probe.c (parse_probes_in_pspace): Update.
(find_probes_in_objfile): Update.
(find_probe_by_pc): Update.
(collect_probes): Update.
(probe_any_get_probes): Update.
* symfile.h (struct sym_probe_fns) <sym_get_probes> Change
return type to reference to std::vector.
* dtrace-probe.c (dtrace_process_dof_probe): Change parameter to
std::vector and update.
(dtrace_process_dof): Likewise.
(dtrace_get_probes): Likewise.
* elfread.c (elf_get_probes): Change return type to std::vector,
store an std::vector in bfd_data.
(probe_key_free): Update to std::vector.
* stap-probe.c (handle_stap_probe): Change parameter to
std::vector and update.
(stap_get_probes): Likewise.
* symfile-debug.c (debug_sym_get_probes): Change return type to
std::vector and update.
2017-09-11 Tom Tromey <tom@tromey.com> 2017-09-11 Tom Tromey <tom@tromey.com>
* breakpoint.c (program_breakpoint_here_p): Update. * breakpoint.c (program_breakpoint_here_p): Update.

View file

@ -313,7 +313,8 @@ struct dtrace_dof_probe
static void static void
dtrace_process_dof_probe (struct objfile *objfile, dtrace_process_dof_probe (struct objfile *objfile,
struct gdbarch *gdbarch, VEC (probe_p) **probesp, struct gdbarch *gdbarch,
std::vector<probe *> *probesp,
struct dtrace_dof_hdr *dof, struct dtrace_dof_hdr *dof,
struct dtrace_dof_probe *probe, struct dtrace_dof_probe *probe,
struct dtrace_dof_provider *provider, struct dtrace_dof_provider *provider,
@ -448,7 +449,7 @@ dtrace_process_dof_probe (struct objfile *objfile,
ret->enablers = VEC_copy (dtrace_probe_enabler_s, enablers); ret->enablers = VEC_copy (dtrace_probe_enabler_s, enablers);
/* Successfully created probe. */ /* Successfully created probe. */
VEC_safe_push (probe_p, *probesp, (struct probe *) ret); probesp->push_back ((struct probe *) ret);
} }
do_cleanups (cleanup); do_cleanups (cleanup);
@ -461,7 +462,7 @@ dtrace_process_dof_probe (struct objfile *objfile,
static void static void
dtrace_process_dof (asection *sect, struct objfile *objfile, dtrace_process_dof (asection *sect, struct objfile *objfile,
VEC (probe_p) **probesp, struct dtrace_dof_hdr *dof) std::vector<probe *> *probesp, struct dtrace_dof_hdr *dof)
{ {
struct gdbarch *gdbarch = get_objfile_arch (objfile); struct gdbarch *gdbarch = get_objfile_arch (objfile);
struct dtrace_dof_sect *section; struct dtrace_dof_sect *section;
@ -620,7 +621,7 @@ dtrace_get_arg (struct dtrace_probe *probe, unsigned n,
/* Implementation of the get_probes method. */ /* Implementation of the get_probes method. */
static void static void
dtrace_get_probes (VEC (probe_p) **probesp, struct objfile *objfile) dtrace_get_probes (std::vector<probe *> *probesp, struct objfile *objfile)
{ {
bfd *abfd = objfile->obfd; bfd *abfd = objfile->obfd;
asection *sect = NULL; asection *sect = NULL;

View file

@ -1309,35 +1309,30 @@ elf_symfile_init (struct objfile *objfile)
/* Implementation of `sym_get_probes', as documented in symfile.h. */ /* Implementation of `sym_get_probes', as documented in symfile.h. */
static VEC (probe_p) * static const std::vector<probe *> &
elf_get_probes (struct objfile *objfile) elf_get_probes (struct objfile *objfile)
{ {
VEC (probe_p) *probes_per_bfd; std::vector<probe *> *probes_per_bfd;
/* Have we parsed this objfile's probes already? */ /* Have we parsed this objfile's probes already? */
probes_per_bfd = (VEC (probe_p) *) bfd_data (objfile->obfd, probe_key); probes_per_bfd = (std::vector<probe *> *) bfd_data (objfile->obfd, probe_key);
if (!probes_per_bfd) if (probes_per_bfd == NULL)
{ {
int ix; int ix;
const struct probe_ops *probe_ops; const struct probe_ops *probe_ops;
probes_per_bfd = new std::vector<probe *>;
/* Here we try to gather information about all types of probes from the /* Here we try to gather information about all types of probes from the
objfile. */ objfile. */
for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, probe_ops); for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, probe_ops);
ix++) ix++)
probe_ops->get_probes (&probes_per_bfd, objfile); probe_ops->get_probes (probes_per_bfd, objfile);
if (probes_per_bfd == NULL)
{
VEC_reserve (probe_p, probes_per_bfd, 1);
gdb_assert (probes_per_bfd != NULL);
}
set_bfd_data (objfile->obfd, probe_key, probes_per_bfd); set_bfd_data (objfile->obfd, probe_key, probes_per_bfd);
} }
return probes_per_bfd; return *probes_per_bfd;
} }
/* Helper function used to free the space allocated for storing SystemTap /* Helper function used to free the space allocated for storing SystemTap
@ -1346,14 +1341,12 @@ elf_get_probes (struct objfile *objfile)
static void static void
probe_key_free (bfd *abfd, void *d) probe_key_free (bfd *abfd, void *d)
{ {
int ix; std::vector<probe *> *probes = (std::vector<probe *> *) d;
VEC (probe_p) *probes = (VEC (probe_p) *) d;
struct probe *probe;
for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++) for (struct probe *probe : *probes)
probe->pops->destroy (probe); probe->pops->destroy (probe);
VEC_free (probe_p, probes); delete probes;
} }

View file

@ -58,10 +58,6 @@ parse_probes_in_pspace (const struct probe_ops *probe_ops,
ALL_PSPACE_OBJFILES (search_pspace, objfile) ALL_PSPACE_OBJFILES (search_pspace, objfile)
{ {
VEC (probe_p) *probes;
struct probe *probe;
int ix;
if (!objfile->sf || !objfile->sf->sym_probe_fns) if (!objfile->sf || !objfile->sf->sym_probe_fns)
continue; continue;
@ -71,9 +67,10 @@ parse_probes_in_pspace (const struct probe_ops *probe_ops,
objfile_namestr) != 0) objfile_namestr) != 0)
continue; continue;
probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile); const std::vector<probe *> &probes
= objfile->sf->sym_probe_fns->sym_get_probes (objfile);
for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++) for (struct probe *probe : probes)
{ {
if (probe_ops != &probe_ops_any && probe->pops != probe_ops) if (probe_ops != &probe_ops_any && probe->pops != probe_ops)
continue; continue;
@ -211,15 +208,14 @@ VEC (probe_p) *
find_probes_in_objfile (struct objfile *objfile, const char *provider, find_probes_in_objfile (struct objfile *objfile, const char *provider,
const char *name) const char *name)
{ {
VEC (probe_p) *probes, *result = NULL; VEC (probe_p) *result = NULL;
int ix;
struct probe *probe;
if (!objfile->sf || !objfile->sf->sym_probe_fns) if (!objfile->sf || !objfile->sf->sym_probe_fns)
return NULL; return NULL;
probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile); const std::vector<probe *> &probes
for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++) = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
for (struct probe *probe : probes)
{ {
if (strcmp (probe->provider, provider) != 0) if (strcmp (probe->provider, provider) != 0)
continue; continue;
@ -246,17 +242,14 @@ find_probe_by_pc (CORE_ADDR pc)
ALL_OBJFILES (objfile) ALL_OBJFILES (objfile)
{ {
VEC (probe_p) *probes;
int ix;
struct probe *probe;
if (!objfile->sf || !objfile->sf->sym_probe_fns if (!objfile->sf || !objfile->sf->sym_probe_fns
|| objfile->sect_index_text == -1) || objfile->sect_index_text == -1)
continue; continue;
/* If this proves too inefficient, we can replace with a hash. */ /* If this proves too inefficient, we can replace with a hash. */
probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile); const std::vector<probe *> &probes
for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++) = objfile->sf->sym_probe_fns->sym_get_probes (objfile);
for (struct probe *probe : probes)
if (get_probe_address (probe, objfile) == pc) if (get_probe_address (probe, objfile) == pc)
{ {
result.objfile = objfile; result.objfile = objfile;
@ -297,10 +290,6 @@ collect_probes (const std::string &objname, const std::string &provider,
ALL_OBJFILES (objfile) ALL_OBJFILES (objfile)
{ {
VEC (probe_p) *probes;
struct probe *probe;
int ix;
if (! objfile->sf || ! objfile->sf->sym_probe_fns) if (! objfile->sf || ! objfile->sf->sym_probe_fns)
continue; continue;
@ -310,9 +299,10 @@ collect_probes (const std::string &objname, const std::string &provider,
continue; continue;
} }
probes = objfile->sf->sym_probe_fns->sym_get_probes (objfile); const std::vector<probe *> &probes
= objfile->sf->sym_probe_fns->sym_get_probes (objfile);
for (ix = 0; VEC_iterate (probe_p, probes, ix, probe); ix++) for (struct probe *probe : probes)
{ {
struct bound_probe bound; struct bound_probe bound;
@ -901,7 +891,7 @@ probe_any_is_linespec (const char **linespecp)
/* Dummy method used for `probe_ops_any'. */ /* Dummy method used for `probe_ops_any'. */
static void static void
probe_any_get_probes (VEC (probe_p) **probesp, struct objfile *objfile) probe_any_get_probes (std::vector<probe *> *probesp, struct objfile *objfile)
{ {
/* No probes can be provided by this dummy backend. */ /* No probes can be provided by this dummy backend. */
} }

View file

@ -64,7 +64,7 @@ struct probe_ops
/* Function that should fill PROBES with known probes from OBJFILE. */ /* Function that should fill PROBES with known probes from OBJFILE. */
void (*get_probes) (VEC (probe_p) **probes, struct objfile *objfile); void (*get_probes) (std::vector<probe *> *probes, struct objfile *objfile);
/* Compute the probe's relocated address. OBJFILE is the objfile /* Compute the probe's relocated address. OBJFILE is the objfile
in which the probe originated. */ in which the probe originated. */

View file

@ -1472,7 +1472,7 @@ stap_clear_semaphore (struct probe *probe_generic, struct objfile *objfile,
static void static void
handle_stap_probe (struct objfile *objfile, struct sdt_note *el, handle_stap_probe (struct objfile *objfile, struct sdt_note *el,
VEC (probe_p) **probesp, CORE_ADDR base) std::vector<probe *> *probesp, CORE_ADDR base)
{ {
bfd *abfd = objfile->obfd; bfd *abfd = objfile->obfd;
int size = bfd_get_arch_size (abfd) / 8; int size = bfd_get_arch_size (abfd) / 8;
@ -1543,7 +1543,7 @@ handle_stap_probe (struct objfile *objfile, struct sdt_note *el,
ret->args_u.text = probe_args; ret->args_u.text = probe_args;
/* Successfully created probe. */ /* Successfully created probe. */
VEC_safe_push (probe_p, *probesp, (struct probe *) ret); probesp->push_back ((struct probe *) ret);
} }
/* Helper function which tries to find the base address of the SystemTap /* Helper function which tries to find the base address of the SystemTap
@ -1588,7 +1588,7 @@ get_stap_base_address (bfd *obfd, bfd_vma *base)
SystemTap probes from OBJFILE. */ SystemTap probes from OBJFILE. */
static void static void
stap_get_probes (VEC (probe_p) **probesp, struct objfile *objfile) stap_get_probes (std::vector<probe *> *probesp, struct objfile *objfile)
{ {
/* If we are here, then this is the first time we are parsing the /* If we are here, then this is the first time we are parsing the
SystemTap probe's information. We basically have to count how many SystemTap probe's information. We basically have to count how many
@ -1597,7 +1597,7 @@ stap_get_probes (VEC (probe_p) **probesp, struct objfile *objfile)
bfd *obfd = objfile->obfd; bfd *obfd = objfile->obfd;
bfd_vma base; bfd_vma base;
struct sdt_note *iter; struct sdt_note *iter;
unsigned save_probesp_len = VEC_length (probe_p, *probesp); unsigned save_probesp_len = probesp->size ();
if (objfile->separate_debug_objfile_backlink != NULL) if (objfile->separate_debug_objfile_backlink != NULL)
{ {
@ -1628,7 +1628,7 @@ stap_get_probes (VEC (probe_p) **probesp, struct objfile *objfile)
handle_stap_probe (objfile, iter, probesp, base); handle_stap_probe (objfile, iter, probesp, base);
} }
if (save_probesp_len == VEC_length (probe_p, *probesp)) if (save_probesp_len == probesp->size ())
{ {
/* If we are here, it means we have failed to parse every known /* If we are here, it means we have failed to parse every known
probe. */ probe. */

View file

@ -384,20 +384,20 @@ static const struct quick_symbol_functions debug_sym_quick_functions =
/* Debugging version of struct sym_probe_fns. */ /* Debugging version of struct sym_probe_fns. */
static VEC (probe_p) * static const std::vector<probe *> &
debug_sym_get_probes (struct objfile *objfile) debug_sym_get_probes (struct objfile *objfile)
{ {
const struct debug_sym_fns_data *debug_data const struct debug_sym_fns_data *debug_data
= ((const struct debug_sym_fns_data *) = ((const struct debug_sym_fns_data *)
objfile_data (objfile, symfile_debug_objfile_data_key)); objfile_data (objfile, symfile_debug_objfile_data_key));
VEC (probe_p) *retval;
retval = debug_data->real_sf->sym_probe_fns->sym_get_probes (objfile); const std::vector<probe *> &retval
= debug_data->real_sf->sym_probe_fns->sym_get_probes (objfile);
fprintf_filtered (gdb_stdlog, fprintf_filtered (gdb_stdlog,
"probes->sym_get_probes (%s) = %s\n", "probes->sym_get_probes (%s) = %s\n",
objfile_debug_name (objfile), objfile_debug_name (objfile),
host_address_to_string (retval)); host_address_to_string (retval.data ()));
return retval; return retval;
} }

View file

@ -314,11 +314,8 @@ struct quick_symbol_functions
struct sym_probe_fns struct sym_probe_fns
{ {
/* If non-NULL, return an array of probe objects. /* If non-NULL, return a reference to vector of probe objects. */
const std::vector<probe *> &(*sym_get_probes) (struct objfile *);
The returned value does not have to be freed and it has lifetime of the
OBJFILE. */
VEC (probe_p) *(*sym_get_probes) (struct objfile *);
}; };
/* Structure to keep track of symbol reading functions for various /* Structure to keep track of symbol reading functions for various