move gdbarch object from objfile to per-BFD
authorTom Tromey <tromey@redhat.com>
Tue, 20 Aug 2013 15:04:51 +0000 (15:04 +0000)
committerTom Tromey <tromey@redhat.com>
Tue, 20 Aug 2013 15:04:51 +0000 (15:04 +0000)
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/ChangeLog
gdb/cp-namespace.c
gdb/elfread.c
gdb/jit.c
gdb/jv-lang.c
gdb/linespec.c
gdb/objfiles.c
gdb/objfiles.h
gdb/stap-probe.c
gdb/symfile.c

index f22a1b4ad4742afbb37e566e1f4f73188f26b8dd..d11e2263f5bd1f8cf76d922ee882c8170ac74b45 100644 (file)
@@ -1,3 +1,22 @@
+2013-08-20  Tom Tromey  <tromey@redhat.com>
+
+       * 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.
+
 2013-08-20  Alan Modra  <amodra@gmail.com>
 
        * doublest.c (convert_floatformat_to_doublest): Use fmt->split_half
index 755aeef89d9cf73c9c16e2f9e47f8ba529536869..36134c0b00b5a5550bf9b9ea26d9f33b5795d72f 100644 (file)
@@ -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)
index 1aa10d1e384b9dc9c13a38f6d87d31219dcab0e2..d16287aeb9f82430d2bd134cfb34190e4c91ef02 100644 (file)
@@ -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;
index 6fc8524f54fcc8ab905b2d297107a09969f45545..c565b6b7aa9b4f01715d29a3a67be6b40b0d72ed 100644 (file)
--- 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);
 
index 1ef12962918a075dc1510465a0407dc9dfe3ded1..bba94f287989164386f6106ac2ec11cbe5ff93a8 100644 (file)
@@ -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);
index 45d7817c978f206c970faa01e280a5ff4386e227..b1a80634dc7b8c432d0e989f8759280909994fdd 100644 (file)
@@ -3511,7 +3511,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);
index 759159c35af55c30ad0cd3e48316fb2d2d865882..2b8cf4e2962037a6eec8eaa30e7566939323b541 100644 (file)
@@ -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
index 84167e03f3a591a3ef414e6439012d72f16c7e63..5b762e466b98ce09069070eebd4baa97dba23c4b 100644 (file)
@@ -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.  */
 
index cbbdf391130b9d4e1754ab8d693d8fe9c1b0b466..200111c5ee6244fe8565ca8a3a05b5b08fe5a42a 100644 (file)
@@ -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
index 3dd550927f72e002e7980a619117f4b1486891c4..d1e024f1e718fab736d8049be471cbd1c72ac7f8 100644 (file)
@@ -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);
     }
 }