Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Elena Zannoni <ezannoni@redhat.com>
To: Mark Kettenis <kettenis@chello.nl>
Cc: gdb-patches@sources.redhat.com
Subject: Re: [RFC/RFA] Per-objfile data mechanism
Date: Tue, 15 Jul 2003 20:00:00 -0000	[thread overview]
Message-ID: <16148.24324.886904.580087@localhost.redhat.com> (raw)
In-Reply-To: <200307131717.h6DHH425098569@elgar.kettenis.dyndns.org>

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  <kettenis@gnu.org>
 >  
 > 	* 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);
 > +\f
 >  
 >  /* 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 <sys/types.h>
 >  #include "gdb_stat.h"
 >  #include <fcntl.h>
 > @@ -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;
 >  }
 > +\f
 > +
 > +/* 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 ();
 >  }


      parent reply	other threads:[~2003-07-15 20:00 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-07-13 17:17 Mark Kettenis
2003-07-15 15:55 ` David Carlton
2003-07-15 16:17 ` Daniel Jacobowitz
2003-07-15 16:48   ` David Carlton
2003-07-15 17:27     ` Daniel Jacobowitz
2003-08-10 19:03     ` Mark Kettenis
2003-08-11 15:45       ` David Carlton
2003-08-12 20:08         ` Andrew Cagney
2003-08-12 20:51           ` David Carlton
2003-08-21 22:42             ` Mark Kettenis
2003-09-07  4:26               ` Daniel Jacobowitz
2003-08-13 20:54       ` Daniel Jacobowitz
2003-07-15 17:14   ` Andrew Cagney
2003-07-15 20:00 ` Elena Zannoni [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=16148.24324.886904.580087@localhost.redhat.com \
    --to=ezannoni@redhat.com \
    --cc=gdb-patches@sources.redhat.com \
    --cc=kettenis@chello.nl \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox