From 5d9cf8a4d31f8c793ad7ba47fe79dac11894052c Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 3 Dec 2013 10:21:20 -0700 Subject: [PATCH] move probes to be per-bfd This patch moves the probe data from the objfile to the per-BFD object. This lets the probes be shared between different inferiors (and different objfiles when dlmopen is in use, should gdb ever handle that). 2014-03-03 Tom Tromey * elfread.c (probe_key): Change to bfd_data. (elf_get_probes, probe_key_free, _initialize_elfread): Probes are now per-BFD, not per-objfile. * stap-probe.c (stap_probe_destroy): Update comment. (handle_stap_probe): Allocate on the per-BFD obstack. --- gdb/ChangeLog | 8 ++++++++ gdb/elfread.c | 26 +++++++++++++------------- gdb/stap-probe.c | 4 ++-- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 963ca04ac60..2129d6ffcdf 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2014-03-03 Tom Tromey + + * elfread.c (probe_key): Change to bfd_data. + (elf_get_probes, probe_key_free, _initialize_elfread): Probes are + now per-BFD, not per-objfile. + * stap-probe.c (stap_probe_destroy): Update comment. + (handle_stap_probe): Allocate on the per-BFD obstack. + 2014-03-03 Tom Tromey * break-catch-throw.c (fetch_probe_arguments): Use bound probes. diff --git a/gdb/elfread.c b/gdb/elfread.c index 79936d0ae1d..085ff4729c2 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -63,9 +63,9 @@ struct elfinfo asection *mdebugsect; /* Section pointer for .mdebug section */ }; -/* Per-objfile data for probe info. */ +/* Per-BFD data for probe info. */ -static const struct objfile_data *probe_key = NULL; +static const struct bfd_data *probe_key = NULL; static void free_elfinfo (void *); @@ -1496,12 +1496,12 @@ elfstab_offset_sections (struct objfile *objfile, struct partial_symtab *pst) static VEC (probe_p) * elf_get_probes (struct objfile *objfile) { - VEC (probe_p) *probes_per_objfile; + VEC (probe_p) *probes_per_bfd; /* Have we parsed this objfile's probes already? */ - probes_per_objfile = objfile_data (objfile, probe_key); + probes_per_bfd = bfd_data (objfile->obfd, probe_key); - if (!probes_per_objfile) + if (!probes_per_bfd) { int ix; const struct probe_ops *probe_ops; @@ -1510,25 +1510,25 @@ elf_get_probes (struct objfile *objfile) objfile. */ for (ix = 0; VEC_iterate (probe_ops_cp, all_probe_ops, ix, probe_ops); ix++) - probe_ops->get_probes (&probes_per_objfile, objfile); + probe_ops->get_probes (&probes_per_bfd, objfile); - if (probes_per_objfile == NULL) + if (probes_per_bfd == NULL) { - VEC_reserve (probe_p, probes_per_objfile, 1); - gdb_assert (probes_per_objfile != NULL); + VEC_reserve (probe_p, probes_per_bfd, 1); + gdb_assert (probes_per_bfd != NULL); } - set_objfile_data (objfile, probe_key, probes_per_objfile); + set_bfd_data (objfile->obfd, probe_key, probes_per_bfd); } - return probes_per_objfile; + return probes_per_bfd; } /* Helper function used to free the space allocated for storing SystemTap probe information. */ static void -probe_key_free (struct objfile *objfile, void *d) +probe_key_free (bfd *abfd, void *d) { int ix; VEC (probe_p) *probes = d; @@ -1614,7 +1614,7 @@ static const struct gnu_ifunc_fns elf_gnu_ifunc_fns = void _initialize_elfread (void) { - probe_key = register_objfile_data_with_cleanup (NULL, probe_key_free); + probe_key = register_bfd_data_with_cleanup (NULL, probe_key_free); add_symtab_fns (bfd_target_elf_flavour, &elf_sym_fns); elf_objfile_gnu_ifunc_cache_data = register_objfile_data (); diff --git a/gdb/stap-probe.c b/gdb/stap-probe.c index 6bb73232d50..986debd58c9 100644 --- a/gdb/stap-probe.c +++ b/gdb/stap-probe.c @@ -1299,7 +1299,7 @@ stap_compile_to_ax (struct probe *probe_generic, struct agent_expr *expr, } /* Destroy (free) the data related to PROBE. PROBE memory itself is not feed - as it is allocated from OBJFILE_OBSTACK. */ + as it is allocated on an obstack. */ static void stap_probe_destroy (struct probe *probe_generic) @@ -1506,7 +1506,7 @@ handle_stap_probe (struct objfile *objfile, struct sdt_note *el, const char *probe_args = NULL; struct stap_probe *ret; - ret = obstack_alloc (&objfile->objfile_obstack, sizeof (*ret)); + ret = obstack_alloc (&objfile->per_bfd->storage_obstack, sizeof (*ret)); ret->p.pops = &stap_probe_ops; ret->p.arch = gdbarch;