From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32540 invoked by alias); 5 Aug 2013 18:11:34 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 32489 invoked by uid 89); 5 Aug 2013 18:11:34 -0000 X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,KHOP_THREADED,RDNS_NONE autolearn=no version=3.3.1 Received: from Unknown (HELO glazunov.sibelius.xs4all.nl) (83.163.83.176) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Mon, 05 Aug 2013 18:11:32 +0000 Received: from glazunov.sibelius.xs4all.nl (kettenis@localhost [127.0.0.1]) by glazunov.sibelius.xs4all.nl (8.14.5/8.14.3) with ESMTP id r75IBJZE001469; Mon, 5 Aug 2013 20:11:19 +0200 (CEST) Received: (from kettenis@localhost) by glazunov.sibelius.xs4all.nl (8.14.5/8.14.3/Submit) id r75IBJGq013284; Mon, 5 Aug 2013 20:11:19 +0200 (CEST) Date: Mon, 05 Aug 2013 18:11:00 -0000 Message-Id: <201308051811.r75IBJGq013284@glazunov.sibelius.xs4all.nl> From: Mark Kettenis To: tromey@redhat.com CC: gdb-patches@sourceware.org, tromey@redhat.com In-reply-to: <1375725385-11178-1-git-send-email-tromey@redhat.com> (message from Tom Tromey on Mon, 5 Aug 2013 11:56:25 -0600) Subject: Re: [PATCH] move gdbarch object from objfile to per-BFD References: <1375725385-11178-1-git-send-email-tromey@redhat.com> X-SW-Source: 2013-08/txt/msg00155.txt.bz2 > From: Tom Tromey > 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) : New field, > moved from... > (struct objfile) : ... 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), > ¤t_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, > ¤t_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 > >