From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18311 invoked by alias); 15 Jul 2003 20:00:30 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 18303 invoked from network); 15 Jul 2003 20:00:29 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sources.redhat.com with SMTP; 15 Jul 2003 20:00:29 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id h6FK0TH14672 for ; Tue, 15 Jul 2003 16:00:29 -0400 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [172.16.52.156]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id h6FK0TI27144 for ; Tue, 15 Jul 2003 16:00:29 -0400 Received: from localhost.redhat.com (romulus-int.sfbay.redhat.com [172.16.27.46]) by pobox.corp.redhat.com (8.11.6/8.11.6) with ESMTP id h6FK0SP13307 for ; Tue, 15 Jul 2003 16:00:28 -0400 Received: by localhost.redhat.com (Postfix, from userid 469) id 1A4A82CA3B; Tue, 15 Jul 2003 16:07:33 -0400 (EDT) From: Elena Zannoni MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16148.24324.886904.580087@localhost.redhat.com> Date: Tue, 15 Jul 2003 20:00:00 -0000 To: Mark Kettenis Cc: gdb-patches@sources.redhat.com Subject: Re: [RFC/RFA] Per-objfile data mechanism In-Reply-To: <200307131717.h6DHH425098569@elgar.kettenis.dyndns.org> References: <200307131717.h6DHH425098569@elgar.kettenis.dyndns.org> X-SW-Source: 2003-07/txt/msg00310.txt.bz2 Mark Kettenis writes: > This patch adds a per-objfile data mechanism to GDB, and uses that to > store DWARF2 frame info instead of abusing objfile->sym_private. The > latter could lead to problems on certain platforms according to > Daniel. yes, xcoffread and coffread heavily rely on the sym_private field. > > Comments? OK to check this in? Do we want this on the release branch > too? > Seems ok. I really like the idea of getting rid of the other *_private and stab only data stuff. elena > Mark > > > Index: ChangeLog > from Mark Kettenis > > * objfiles.h (struct objfile): Add memebers `data' and `num_data'. > (register_objfile_data, set_objfile_data, objfile_data): New > prototypes. > * objfiles.c (objfile_alloc_data, objfile_free_data): New > prototypes. > (allocate_objfile): Call objfile_alloc_data. > (free_objfile): Call objfile_free_data. > (struct objfile_data): New. > (struct objfile_data_registration): New. > (struct objfile_data_registry): New. > (objfile_data_registry): New variable. > (register_objfile_data): New function. > (objfile_alloc_data, objfile_free_data): New functions. > (set_objfile_data, objfile_data): New functions. > * dwarf2-frame.c (dwarf2_frame_data): New variable. > (dwarf2_frame_find_fde, add_fde): Use new per-objfile data mechanism. > (_initialize_dwarf2_frame): New function and prototype. > > > Index: objfiles.h > =================================================================== > RCS file: /cvs/src/src/gdb/objfiles.h,v > retrieving revision 1.22 > diff -u -p -r1.22 objfiles.h > --- objfiles.h 24 Mar 2003 03:54:48 -0000 1.22 > +++ objfiles.h 13 Jul 2003 17:16:04 -0000 > @@ -379,6 +379,13 @@ struct objfile > > void *obj_private; > > + /* Per objfile data-pointers required by other GDB modules. */ > + /* FIXME: kettenis/20030711: This mechanism could replace > + sym_stab_info, sym_private and obj_private entirely. */ > + > + void **data; > + unsigned num_data; > + > /* Set of relocation offsets to apply to each section. > Currently on the psymbol_obstack (which makes no sense, but I'm > not sure it's harming anything). > @@ -564,6 +571,16 @@ extern struct obj_section *find_pc_sect_ > extern int in_plt_section (CORE_ADDR, char *); > > extern int is_in_import_list (char *, struct objfile *); > + > +/* Keep a registry of per-objfile data-pointers required by other GDB > + modules. */ > + > +extern const struct objfile_data *register_objfile_data (void); > +extern void set_objfile_data (struct objfile *objfile, > + const struct objfile_data *data, void *value); > +extern void *objfile_data (struct objfile *objfile, > + const struct objfile_data *data); > + > > /* Traverse all object files. ALL_OBJFILES_SAFE works even if you delete > the objfile during the traversal. */ > Index: objfiles.c > =================================================================== > RCS file: /cvs/src/src/gdb/objfiles.c,v > retrieving revision 1.33 > diff -u -p -r1.33 objfiles.c > --- objfiles.c 11 Jun 2003 23:29:47 -0000 1.33 > +++ objfiles.c 13 Jul 2003 17:16:05 -0000 > @@ -34,6 +34,7 @@ > #include "target.h" > #include "bcache.h" > > +#include "gdb_assert.h" > #include > #include "gdb_stat.h" > #include > @@ -61,6 +62,9 @@ static void *map_to_file (int); > > static void add_to_objfile_sections (bfd *, sec_ptr, void *); > > +static void objfile_alloc_data (struct objfile *objfile); > +static void objfile_free_data (struct objfile *objfile); > + > /* Externally visible variables that are owned by this module. > See declarations in objfile.h for more info. */ > > @@ -302,6 +306,8 @@ allocate_objfile (bfd *abfd, int flags) > terminate_minimal_symbol_table (objfile); > } > > + objfile_alloc_data (objfile); > + > /* Update the per-objfile information that comes from the bfd, ensuring > that any data that is reference is saved in the per-objfile data > region. */ > @@ -561,6 +567,7 @@ free_objfile (struct objfile *objfile) > > if (objfile != NULL) > { > + objfile_free_data (objfile); > if (objfile->name != NULL) > { > xmfree (objfile->md, objfile->name); > @@ -1097,4 +1104,74 @@ is_in_import_list (char *name, struct ob > return 1; > return 0; > } > + > + > +/* Keep a registry of per-objfile data-pointers required by other GDB > + modules. */ > + > +struct objfile_data > +{ > + unsigned index; > +}; > + > +struct objfile_data_registration > +{ > + struct objfile_data *data; > + struct objfile_data_registration *next; > +}; > + > +struct objfile_data_registry > +{ > + struct objfile_data_registration *registrations; > + unsigned num_registrations; > +}; > + > +static struct objfile_data_registry objfile_data_registry = { NULL, 0 }; > + > +const struct objfile_data * > +register_objfile_data (void) > +{ > + struct objfile_data_registration **curr; > + > + /* Append new registration. */ > + for (curr = &objfile_data_registry.registrations; > + *curr != NULL; curr = &(*curr)->next); > > + *curr = XMALLOC (struct objfile_data_registration); > + (*curr)->next = NULL; > + (*curr)->data = XMALLOC (struct objfile_data); > + (*curr)->data->index = objfile_data_registry.num_registrations++; > + > + return (*curr)->data; > +} > + > +static void > +objfile_alloc_data (struct objfile *objfile) > +{ > + gdb_assert (objfile->data == NULL); > + objfile->num_data = objfile_data_registry.num_registrations; > + objfile->data = XCALLOC (objfile->num_data, void *); > +} > + > +static void > +objfile_free_data (struct objfile *objfile) > +{ > + gdb_assert (objfile->data != NULL); > + xfree (objfile->data); > + objfile->data = NULL; > +} > + > +void > +set_objfile_data (struct objfile *objfile, const struct objfile_data *data, > + void *value) > +{ > + gdb_assert (data->index < objfile->num_data); > + objfile->data[data->index] = value; > +} > + > +void * > +objfile_data (struct objfile *objfile, const struct objfile_data *data) > +{ > + gdb_assert (data->index < objfile->num_data); > + return objfile->data[data->index]; > +} > Index: dwarf2-frame.c > =================================================================== > RCS file: /cvs/src/src/gdb/dwarf2-frame.c,v > retrieving revision 1.8 > diff -u -p -r1.8 dwarf2-frame.c > --- dwarf2-frame.c 11 Jul 2003 16:22:17 -0000 1.8 > +++ dwarf2-frame.c 13 Jul 2003 17:16:21 -0000 > @@ -785,6 +785,8 @@ struct comp_unit > bfd_vma dbase; > }; > > +const struct objfile_data *dwarf2_frame_data; > + > static unsigned int > read_1_byte (bfd *bfd, char *buf) > { > @@ -1029,7 +1031,7 @@ dwarf2_frame_find_fde (CORE_ADDR *pc) > > offset = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); > > - fde = objfile->sym_private; > + fde = objfile_data (objfile, dwarf2_frame_data); > while (fde) > { > if (*pc >= fde->initial_location + offset > @@ -1049,8 +1051,8 @@ dwarf2_frame_find_fde (CORE_ADDR *pc) > static void > add_fde (struct comp_unit *unit, struct dwarf2_fde *fde) > { > - fde->next = unit->objfile->sym_private; > - unit->objfile->sym_private = fde; > + fde->next = objfile_data (unit->objfile, dwarf2_frame_data); > + set_objfile_data (unit->objfile, dwarf2_frame_data, fde); > } > > #ifdef CC_HAS_LONG_LONG > @@ -1445,4 +1447,13 @@ dwarf2_build_frame_info (struct objfile > while (frame_ptr < unit.dwarf_frame_buffer + unit.dwarf_frame_size) > frame_ptr = decode_frame_entry (&unit, frame_ptr, 0); > } > +} > + > +/* Provide a prototype to silence -Wmissing-prototypes. */ > +void _initialize_dwarf2_frame (void); > + > +void > +_initialize_dwarf2_frame (void) > +{ > + dwarf2_frame_data = register_objfile_data (); > }