Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH] move gdbarch object from objfile to per-BFD
@ 2013-08-05 17:56 Tom Tromey
  2013-08-05 18:11 ` Mark Kettenis
  0 siblings, 1 reply; 7+ messages in thread
From: Tom Tromey @ 2013-08-05 17:56 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

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.

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


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] move gdbarch object from objfile to per-BFD
  2013-08-05 17:56 [PATCH] move gdbarch object from objfile to per-BFD Tom Tromey
@ 2013-08-05 18:11 ` Mark Kettenis
  2013-08-05 19:13   ` Tom Tromey
  0 siblings, 1 reply; 7+ messages in thread
From: Mark Kettenis @ 2013-08-05 18:11 UTC (permalink / raw)
  To: tromey; +Cc: gdb-patches, tromey

> 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
> 
> 


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] move gdbarch object from objfile to per-BFD
  2013-08-05 18:11 ` Mark Kettenis
@ 2013-08-05 19:13   ` Tom Tromey
  2013-08-05 19:22     ` Mark Kettenis
  0 siblings, 1 reply; 7+ messages in thread
From: Tom Tromey @ 2013-08-05 19:13 UTC (permalink / raw)
  To: Mark Kettenis; +Cc: gdb-patches

>>>>> "Mark" == Mark Kettenis <mark.kettenis@xs4all.nl> writes:

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

I can add it.  The reason I did not is that, for whatever reason,
objfiles have not historically used accessors.  So, I preserved the
status quo in this respect.

Tom


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] move gdbarch object from objfile to per-BFD
  2013-08-05 19:13   ` Tom Tromey
@ 2013-08-05 19:22     ` Mark Kettenis
  2013-08-05 20:12       ` Tom Tromey
  0 siblings, 1 reply; 7+ messages in thread
From: Mark Kettenis @ 2013-08-05 19:22 UTC (permalink / raw)
  To: tromey; +Cc: gdb-patches

> From: Tom Tromey <tromey@redhat.com>
> Cc: gdb-patches@sourceware.org
> 
> >>>>> "Mark" == Mark Kettenis <mark.kettenis@xs4all.nl> writes:
> 
> Mark> The pointer chasing gets a bit ridiculous though.  Perhaps it needs a
> Mark> little helper function?
> 
> I can add it.  The reason I did not is that, for whatever reason,
> objfiles have not historically used accessors.  So, I preserved the
> status quo in this respect.

Merely a suggestion.  If you considered it and decided against it
that's fine with me.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] move gdbarch object from objfile to per-BFD
  2013-08-05 19:22     ` Mark Kettenis
@ 2013-08-05 20:12       ` Tom Tromey
  0 siblings, 0 replies; 7+ messages in thread
From: Tom Tromey @ 2013-08-05 20:12 UTC (permalink / raw)
  To: Mark Kettenis; +Cc: gdb-patches

>> I can add it.  The reason I did not is that, for whatever reason,
>> objfiles have not historically used accessors.  So, I preserved the
>> status quo in this respect.

Mark> Merely a suggestion.  If you considered it and decided against it
Mark> that's fine with me.

I'm not sure why, but even though the patch changed get_objfile_arch, I
failed to think of that as an accessor.  Weird; but I suppose since it
doesn't follow the usual gdb macro style.  Anyway, I'll shortly send an
updated patch that uses get_objfile_arch at all the spots that read the
field.  I left the writers alone, as there aren't many and we shouldn't
encourage more.

Tom


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] move gdbarch object from objfile to per-BFD
  2013-08-05 20:29 Tom Tromey
@ 2013-08-20 15:01 ` Tom Tromey
  0 siblings, 0 replies; 7+ messages in thread
From: Tom Tromey @ 2013-08-20 15:01 UTC (permalink / raw)
  To: gdb-patches

>>>>> "Tom" == Tom Tromey <tromey@redhat.com> writes:

Tom> This moves the "gdbarch" field from the objfile into the BFD.

I'm checking this in now.

Tom


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH] move gdbarch object from objfile to per-BFD
@ 2013-08-05 20:29 Tom Tromey
  2013-08-20 15:01 ` Tom Tromey
  0 siblings, 1 reply; 7+ messages in thread
From: Tom Tromey @ 2013-08-05 20:29 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

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.

Built and regtested on x86-64 Fedora 18.

	* cp-namespace.c (cp_lookup_symbol_imports_or_template): Use
	get_objfile_arch.
	* elfread.c (elf_rel_plt_read, elf_gnu_ifunc_record_cache)
	(elf_gnu_ifunc_resolve_by_got): Use get_objfile_arch.
	* jit.c (jit_object_close_impl): Update.
	* jv-lang.c (get_dynamics_objfile): Update.
	* linespec.c (add_minsym): Use get_dynamics_objfile.
	* 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): Use
	get_objfile_arch.
	* symfile.c (init_entry_point_info): Use get_objfile_arch.
---
 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..36134c0 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
+	    = get_objfile_arch (SYMBOL_SYMTAB (function)->objfile);
 	  const struct block *parent = BLOCK_SUPERBLOCK (block);
 
 	  while (1)
diff --git a/gdb/elfread.c b/gdb/elfread.c
index 1aa10d1..d16287a 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 = get_objfile_arch (objfile);
   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 = get_objfile_arch (objfile);
 
       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 = get_objfile_arch (objfile);
       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..f97f8e8 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 = get_objfile_arch (info->objfile);
 	    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..200111c 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 = get_objfile_arch (stap_probe->p.objfile);
 
   /* 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..8c55a62 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 (get_objfile_arch (objfile),
 					      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 (get_objfile_arch (objfile), entry_point);
     }
 }
 
-- 
1.8.1.4


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2013-08-20 15:01 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-08-05 17:56 [PATCH] move gdbarch object from objfile to per-BFD Tom Tromey
2013-08-05 18:11 ` Mark Kettenis
2013-08-05 19:13   ` Tom Tromey
2013-08-05 19:22     ` Mark Kettenis
2013-08-05 20:12       ` Tom Tromey
2013-08-05 20:29 Tom Tromey
2013-08-20 15:01 ` Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox