Re: [PATCH] move gdbarch object from objfile to per-BFD

Mark Kettenis
2013-08-05T18:11:34Z

> From: Tom Tromey <tromey@redhat.com>
> Date: Mon, 5 Aug 2013 11:56:25 -0600
>
> This moves the "gdbarch" field from the objfile into the BFD.
>
> This field's value is derived from the BFD and is immutable over the
> lifetime of the BFD. This makes it a reasonable candidate for pushing
> into the per-BFD object.
>
> This is part of the long-term objfile splitting project. In the long
> run I think this patch will make it simpler to moves types from the
> objfile to the per-BFD object; but the patch makes sense as a minor
> cleanup by itself.

The pointer chasing gets a bit ridiculous though. Perhaps it needs a
little helper function?

> Built and regtested on x86-64 Fedora 18.
>
> * cp-namespace.c (cp_lookup_symbol_imports_or_template): Update.
> * elfread.c (elf_rel_plt_read, elf_gnu_ifunc_record_cache)
> (elf_gnu_ifunc_resolve_by_got): Update.
> * jit.c (jit_object_close_impl): Update.
> * jv-lang.c (get_dynamics_objfile): Update.
> * linespec.c (add_minsym): Update.
> * objfiles.c (get_objfile_bfd_data): Initialize 'gdbarch' field.
> (allocate_objfile): Don't initialize 'gdbarch' field.
> (get_objfile_arch): Update.
> * objfiles.h (struct objfile_per_bfd_storage) <gdbarch>: New field,
> moved from...
> (struct objfile) <gdbarch>: ... here. Remove.
> * stap-probe.c (stap_can_evaluate_probe_arguments): Update.
> * symfile.c (init_entry_point_info): Update.
> ---
> gdb/cp-namespace.c | 3 ++-
> gdb/elfread.c | 6 +++---
> gdb/jit.c | 2 +-
> gdb/jv-lang.c | 2 +-
> gdb/linespec.c | 2 +-
> gdb/objfiles.c | 8 ++++----
> gdb/objfiles.h | 14 +++++++-------
> gdb/stap-probe.c | 2 +-
> gdb/symfile.c | 4 ++--
> 9 files changed, 22 insertions(+), 21 deletions(-)
>
> diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c
> index 755aeef..3c7ce15 100644
> --- a/gdb/cp-namespace.c
> +++ b/gdb/cp-namespace.c
> @@ -473,7 +473,8 @@ cp_lookup_symbol_imports_or_template (const char *scope,
> char *name_copy = xstrdup (SYMBOL_NATURAL_NAME (function));
> struct cleanup *cleanups = make_cleanup (xfree, name_copy);
> const struct language_defn *lang = language_def (language_cplus);
> - struct gdbarch *arch = SYMBOL_SYMTAB (function)->objfile->gdbarch;
> + struct gdbarch *arch
> + = SYMBOL_SYMTAB (function)->objfile->per_bfd->gdbarch;
> const struct block *parent = BLOCK_SUPERBLOCK (block);
>
> while (1)
> diff --git a/gdb/elfread.c b/gdb/elfread.c
> index 1aa10d1..975a0e4 100644
> --- a/gdb/elfread.c
> +++ b/gdb/elfread.c
> @@ -636,7 +636,7 @@ elf_rel_plt_read (struct objfile *objfile, asymbol **dyn_symbol_table)
> char *string_buffer = NULL;
> size_t string_buffer_size = 0;
> struct cleanup *back_to;
> - struct gdbarch *gdbarch = objfile->gdbarch;
> + struct gdbarch *gdbarch = objfile->per_bfd->gdbarch;
> struct type *ptr_type = builtin_type (gdbarch)->builtin_data_ptr;
> size_t ptr_size = TYPE_LENGTH (ptr_type);
>
> @@ -797,7 +797,7 @@ elf_gnu_ifunc_record_cache (const char *name, CORE_ADDR addr)
> if (*slot != NULL)
> {
> struct elf_gnu_ifunc_cache *entry_found_p = *slot;
> - struct gdbarch *gdbarch = objfile->gdbarch;
> + struct gdbarch *gdbarch = objfile->per_bfd->gdbarch;
>
> if (entry_found_p->addr != addr)
> {
> @@ -877,7 +877,7 @@ elf_gnu_ifunc_resolve_by_got (const char *name, CORE_ADDR *addr_p)
> ALL_PSPACE_OBJFILES (current_program_space, objfile)
> {
> bfd *obfd = objfile->obfd;
> - struct gdbarch *gdbarch = objfile->gdbarch;
> + struct gdbarch *gdbarch = objfile->per_bfd->gdbarch;
> struct type *ptr_type = builtin_type (gdbarch)->builtin_data_ptr;
> size_t ptr_size = TYPE_LENGTH (ptr_type);
> CORE_ADDR pointer_address, addr;
> diff --git a/gdb/jit.c b/gdb/jit.c
> index 6fc8524..c565b6b 100644
> --- a/gdb/jit.c
> +++ b/gdb/jit.c
> @@ -786,7 +786,7 @@ jit_object_close_impl (struct gdb_symbol_callbacks *cb,
> priv_data = cb->priv_data;
>
> objfile = allocate_objfile (NULL, 0);
> - objfile->gdbarch = target_gdbarch ();
> + objfile->per_bfd->gdbarch = target_gdbarch ();
>
> terminate_minimal_symbol_table (objfile);
>
> diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c
> index 1ef1296..bba94f2 100644
> --- a/gdb/jv-lang.c
> +++ b/gdb/jv-lang.c
> @@ -119,7 +119,7 @@ get_dynamics_objfile (struct gdbarch *gdbarch)
> /* Mark it as shared so that it is cleared when the inferior is
> re-run. */
> dynamics_objfile = allocate_objfile (NULL, OBJF_SHARED);
> - dynamics_objfile->gdbarch = gdbarch;
> + dynamics_objfile->per_bfd->gdbarch = gdbarch;
>
> data = XCNEW (struct jv_per_objfile_data);
> set_objfile_data (dynamics_objfile, jv_dynamics_objfile_data_key, data);
> diff --git a/gdb/linespec.c b/gdb/linespec.c
> index 2f2a1a3..d332206 100644
> --- a/gdb/linespec.c
> +++ b/gdb/linespec.c
> @@ -3492,7 +3492,7 @@ add_minsym (struct minimal_symbol *minsym, void *d)
> {
> /* Make sure this minsym is not a function descriptor
> before we decide to discard it. */
> - struct gdbarch *gdbarch = info->objfile->gdbarch;
> + struct gdbarch *gdbarch = info->objfile->per_bfd->gdbarch;
> CORE_ADDR addr = gdbarch_convert_from_func_ptr_addr
> (gdbarch, SYMBOL_VALUE_ADDRESS (minsym),
> &current_target);
> diff --git a/gdb/objfiles.c b/gdb/objfiles.c
> index 759159c..2b8cf4e 100644
> --- a/gdb/objfiles.c
> +++ b/gdb/objfiles.c
> @@ -143,6 +143,9 @@ get_objfile_bfd_data (struct objfile *objfile, struct bfd *abfd)
> {
> storage = bfd_zalloc (abfd, sizeof (struct objfile_per_bfd_storage));
> set_bfd_data (abfd, objfiles_bfd_data, storage);
> +
> + /* Look up the gdbarch associated with the BFD. */
> + storage->gdbarch = gdbarch_from_bfd (abfd);
> }
> else
> storage = OBSTACK_ZALLOC (&objfile->objfile_obstack,
> @@ -282,9 +285,6 @@ allocate_objfile (bfd *abfd, int flags)
> gdb_bfd_ref (abfd);
> if (abfd != NULL)
> {
> - /* Look up the gdbarch associated with the BFD. */
> - objfile->gdbarch = gdbarch_from_bfd (abfd);
> -
> objfile->name = bfd_get_filename (abfd);
> objfile->mtime = bfd_get_mtime (abfd);
>
> @@ -335,7 +335,7 @@ allocate_objfile (bfd *abfd, int flags)
> struct gdbarch *
> get_objfile_arch (struct objfile *objfile)
> {
> - return objfile->gdbarch;
> + return objfile->per_bfd->gdbarch;
> }
>
> /* If there is a valid and known entry point, function fills *ENTRY_P with it
> diff --git a/gdb/objfiles.h b/gdb/objfiles.h
> index 84167e0..5b762e4 100644
> --- a/gdb/objfiles.h
> +++ b/gdb/objfiles.h
> @@ -178,6 +178,13 @@ struct objfile_per_bfd_storage
>
> /* Byte cache for macros. */
> struct bcache *macro_cache;
> +
> + /* The gdbarch associated with the BFD. Note that this gdbarch is
> + determined solely from BFD information, without looking at target
> + information. The gdbarch determined from a running target may
> + differ from this e.g. with respect to register types and names. */
> +
> + struct gdbarch *gdbarch;
> };
>
> /* Master structure for keeping track of each file from which
> @@ -248,13 +255,6 @@ struct objfile
>
> struct objfile_per_bfd_storage *per_bfd;
>
> - /* The gdbarch associated with the BFD. Note that this gdbarch is
> - determined solely from BFD information, without looking at target
> - information. The gdbarch determined from a running target may
> - differ from this e.g. with respect to register types and names. */
> -
> - struct gdbarch *gdbarch;
> -
> /* The modification timestamp of the object file, as of the last time
> we read its symbols. */
>
> diff --git a/gdb/stap-probe.c b/gdb/stap-probe.c
> index cbbdf39..26c992c 100644
> --- a/gdb/stap-probe.c
> +++ b/gdb/stap-probe.c
> @@ -1086,7 +1086,7 @@ static int
> stap_can_evaluate_probe_arguments (struct probe *probe_generic)
> {
> struct stap_probe *stap_probe = (struct stap_probe *) probe_generic;
> - struct gdbarch *gdbarch = stap_probe->p.objfile->gdbarch;
> + struct gdbarch *gdbarch = stap_probe->p.objfile->per_bfd->gdbarch;
>
> /* For SystemTap probes, we have to guarantee that the method
> stap_is_single_operand is defined on gdbarch. If it is not, then it
> diff --git a/gdb/symfile.c b/gdb/symfile.c
> index 5129105..352c5ec 100644
> --- a/gdb/symfile.c
> +++ b/gdb/symfile.c
> @@ -884,14 +884,14 @@ init_entry_point_info (struct objfile *objfile)
> /* Make certain that the address points at real code, and not a
> function descriptor. */
> entry_point
> - = gdbarch_convert_from_func_ptr_addr (objfile->gdbarch,
> + = gdbarch_convert_from_func_ptr_addr (objfile->per_bfd->gdbarch,
> entry_point,
> &current_target);
>
> /* Remove any ISA markers, so that this matches entries in the
> symbol table. */
> objfile->ei.entry_point
> - = gdbarch_addr_bits_remove (objfile->gdbarch, entry_point);
> + = gdbarch_addr_bits_remove (objfile->per_bfd->gdbarch, entry_point);
> }
> }
>
> --
> 1.8.1.4
>
>