delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp-workers/2012/12/11/22:43:32

X-Authentication-Warning: delorie.com: mail set sender to djgpp-workers-bounces using -f
X-Recipient: djgpp-workers AT delorie DOT com
Date: Wed, 12 Dec 2012 05:43:11 +0200
From: Eli Zaretskii <eliz AT gnu DOT org>
Subject: Re: RFC: remove deprecated_sym_private
In-reply-to: <87sj7c9u95.fsf@fleche.redhat.com>
X-012-Sender: halo1 AT inter DOT net DOT il
To: Juan Manuel Guerrero <juan DOT guerrero AT gmx DOT de>
Cc: djgpp-workers AT delorie DOT com
Message-id: <83r4mw7x68.fsf@gnu.org>
References: <87sj7c9u95 DOT fsf AT fleche DOT redhat DOT com>
Reply-To: djgpp-workers AT delorie DOT com
Errors-To: nobody AT delorie DOT com
X-Mailing-List: djgpp-workers AT delorie DOT com
X-Unsubscribes-To: listserv AT delorie DOT com

Could some of you please test this patch with DJGPP GDB and see if the
ability to debug binaries produced with -gcoff is harmed in any way?

Please report the results directly to gdb-patches AT sourceware DOT org.

Thanks in advance.

> From: Tom Tromey <tromey AT redhat DOT com>
> Date: Tue, 11 Dec 2012 14:03:18 -0700
> 
> Here's another deprecation removal, this time deprecated_sym_private.
> Like the previous patch, this changes all the users to use objfile_data
> instead.
> 
> This builds, and regtests on my x86-64 Fedora 16 machine -- but that
> means nothing as I think none of the code is exercised in this setup.
> 
> If you have access to the affected machines, I'd appreciate your testing
> it.  I can push a git branch if that would help.
> 
> Tom
> 
> 	* coffread.c (coff_objfile_data_key): New global.
> 	(coff_symfile_init): Use set_objfile_data.
> 	(coff_symfile_read): Use objfile_data.
> 	(coff_symfile_finish): Don't free deprecated_sym_private.
> 	(coff_free_info): New function.
> 	(_initialize_coffread): Initialize coff_objfile_data_key.
> 	* mdebugread.c (pending_list): Update comment.
> 	* objfiles.h (struct objfile) <deprecated_sym_private>: Remove.
> 	* symfile.c (reread_symbols): Don't mention
> 	deprecated_sym_private.
> 	* xcoffread.c (xcoff_objfile_data_key): New global.
> 	(XCOFF_DATA): New macro.
> 	(process_linenos, enter_line_range, xcoff_next_symbol_text)
> 	(read_xcoff_symtab, coff_getfilename, read_symbol_lineno): Use
> 	XCOFF_DATA.
> 	(xcoff_new_init) Use set_objfile_data.
> 	(xcoff_symfile_finish): Don't free deprecated_sym_private.
> 	(init_stringtab, swap_sym, scan_xcoff_symtab)
> 	(xcoff_get_toc_offset, xcoff_initial_scan): Use XCOFF_DATA.
> 	(xcoff_free_info): New function.
> 	(_initialize_xcoffread): Initialize xcoff_objfile_data_key.
> ---
>  gdb/coffread.c   |   30 +++++++++-----
>  gdb/mdebugread.c |   10 ++---
>  gdb/objfiles.h   |   13 ------
>  gdb/symfile.c    |    1 -
>  gdb/xcoffread.c  |  116 +++++++++++++++++++++++++-----------------------------
>  5 files changed, 77 insertions(+), 93 deletions(-)
> 
> diff --git a/gdb/coffread.c b/gdb/coffread.c
> index 94d0554..56ed5ae 100644
> --- a/gdb/coffread.c
> +++ b/gdb/coffread.c
> @@ -47,6 +47,10 @@
>  
>  extern void _initialize_coffread (void);
>  
> +/* Key for COFF-associated data.  */
> +
> +static const struct objfile_data *coff_objfile_data_key;
> +
>  /* The objfile we are currently reading.  */
>  
>  static struct objfile *coffread_objfile;
> @@ -451,17 +455,15 @@ static void
>  coff_symfile_init (struct objfile *objfile)
>  {
>    struct dbx_symfile_info *dbx;
> +  struct coff_symfile_info *coff;
>  
>    /* Allocate struct to keep track of stab reading.  */
>    dbx = XCNEW (struct dbx_symfile_info);
>    set_objfile_data (objfile, dbx_objfile_data_key, dbx);
>  
>    /* Allocate struct to keep track of the symfile.  */
> -  objfile->deprecated_sym_private
> -    = xmalloc (sizeof (struct coff_symfile_info));
> -
> -  memset (objfile->deprecated_sym_private, 0,
> -	  sizeof (struct coff_symfile_info));
> +  coff = XCNEW (struct coff_symfile_info);
> +  set_objfile_data (objfile, coff_objfile_data_key, coff);
>  
>    /* COFF objects may be reordered, so set OBJF_REORDERED.  If we
>       find this causes a significant slowdown in gdb then we could
> @@ -526,7 +528,7 @@ coff_symfile_read (struct objfile *objfile, int symfile_flags)
>    struct cleanup *back_to, *cleanup_minimal_symbols;
>    int stabstrsize;
>    
> -  info = (struct coff_symfile_info *) objfile->deprecated_sym_private;
> +  info = objfile_data (objfile, coff_objfile_data_key);
>    dbxinfo = DBX_SYMFILE_INFO (objfile);
>    symfile_bfd = abfd;		/* Kludge for swap routines.  */
>  
> @@ -680,11 +682,6 @@ coff_new_init (struct objfile *ignore)
>  static void
>  coff_symfile_finish (struct objfile *objfile)
>  {
> -  if (objfile->deprecated_sym_private != NULL)
> -    {
> -      xfree (objfile->deprecated_sym_private);
> -    }
> -
>    /* Let stabs reader clean up.  */
>    stabsread_clear_cache ();
>  
> @@ -2199,8 +2196,19 @@ static const struct sym_fns coff_sym_fns =
>    &psym_functions
>  };
>  
> +/* Free the per-objfile COFF data.  */
> +
> +static void
> +coff_free_info (struct objfile *objfile, void *arg)
> +{
> +  xfree (arg);
> +}
> +
>  void
>  _initialize_coffread (void)
>  {
>    add_symtab_fns (&coff_sym_fns);
> +
> +  coff_objfile_data_key = register_objfile_data_with_cleanup (NULL,
> +							      coff_free_info);
>  }
> diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c
> index d1b9177..37844b6 100644
> --- a/gdb/mdebugread.c
> +++ b/gdb/mdebugread.c
> @@ -479,12 +479,10 @@ struct mdebug_pending
>  };
>  
>  
> -/* The pending information is kept for an entire object file, and used
> -   to be in the deprecated_sym_private field.  I took it out when I
> -   split mdebugread from mipsread, because this might not be the only
> -   type of symbols read from an object file.  Instead, we allocate the
> -   pending information table when we create the partial symbols, and
> -   we store a pointer to the single table in each psymtab.  */
> +/* The pending information is kept for an entire object file We
> +   allocate the pending information table when we create the partial
> +   symbols, and we store a pointer to the single table in each
> +   psymtab.  */
>  
>  static struct mdebug_pending **pending_list;
>  
> diff --git a/gdb/objfiles.h b/gdb/objfiles.h
> index 65162a1..877c9e0 100644
> --- a/gdb/objfiles.h
> +++ b/gdb/objfiles.h
> @@ -322,20 +322,7 @@ struct objfile
>  
>      struct entry_info ei;
>  
> -    /* Hook for information for use by the symbol reader (currently used
> -       for information shared by sym_init and sym_read).  It is
> -       typically a pointer to malloc'd memory.  The symbol reader's finish
> -       function is responsible for freeing the memory thusly allocated.  */
> -    /* NOTE: cagney/2004-10-23: This has been replaced by per-objfile
> -       data points implemented using "data" and "num_data" below.  For
> -       an example of how to use this replacement, see "objfile_data"
> -       in "mips-tdep.c".  */
> -
> -    void *deprecated_sym_private;
> -
>      /* Per objfile data-pointers required by other GDB modules.  */
> -    /* FIXME: kettenis/20030711: This mechanism could replace
> -        deprecated_sym_private entirely.  */
>  
>      REGISTRY_FIELDS;
>  
> diff --git a/gdb/symfile.c b/gdb/symfile.c
> index 1d3278b..735f869 100644
> --- a/gdb/symfile.c
> +++ b/gdb/symfile.c
> @@ -2585,7 +2585,6 @@ reread_symbols (void)
>  	  objfile->free_psymtabs = NULL;
>  	  objfile->template_symbols = NULL;
>  	  objfile->msymbols = NULL;
> -	  objfile->deprecated_sym_private = NULL;
>  	  objfile->minimal_symbol_count = 0;
>  	  memset (&objfile->msymbol_hash, 0,
>  		  sizeof (objfile->msymbol_hash));
> diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
> index e4d0861..40fd97d 100644
> --- a/gdb/xcoffread.c
> +++ b/gdb/xcoffread.c
> @@ -56,6 +56,10 @@
>  #include "aout/stab_gnu.h"
>  
>  
> +/* Key for XCOFF-associated data.  */
> +
> +static const struct objfile_data *xcoff_objfile_data_key;
> +
>  /* We put a pointer to this structure in the read_symtab_private field
>     of the psymtab.  */
>  
> @@ -150,6 +154,12 @@ struct coff_symfile_info
>      CORE_ADDR toc_offset;
>    };
>  
> +/* Convenience macro to access the per-objfile XCOFF data.  */
> +
> +#define XCOFF_DATA(objfile)						\
> +  ((struct coff_symfile_info *) objfile_data ((objfile),		\
> +					      xcoff_objfile_data_key))
> +
>  /* XCOFF names for dwarf sections.  There is no compressed sections.  */
>  
>  static const struct dwarf2_debug_sections dwarf2_xcoff_names = {
> @@ -593,9 +603,8 @@ static void
>  process_linenos (CORE_ADDR start, CORE_ADDR end)
>  {
>    int offset, ii;
> -  file_ptr max_offset =
> -    ((struct coff_symfile_info *) this_symtab_psymtab->objfile
> -     ->deprecated_sym_private)->max_lineno_offset;
> +  file_ptr max_offset
> +    = XCOFF_DATA (this_symtab_psymtab->objfile)->max_lineno_offset;
>  
>    /* subfile structure for the main compilation unit.  */
>    struct subfile main_subfile;
> @@ -829,9 +838,7 @@ enter_line_range (struct subfile *subfile, unsigned beginoffset,
>    if (endoffset == 0 && startaddr == 0 && endaddr == 0)
>      return;
>    curoffset = beginoffset;
> -  limit_offset =
> -    ((struct coff_symfile_info *) objfile->deprecated_sym_private)
> -    ->max_lineno_offset;
> +  limit_offset = XCOFF_DATA (objfile)->max_lineno_offset;
>  
>    if (endoffset != 0)
>      {
> @@ -965,9 +972,7 @@ xcoff_next_symbol_text (struct objfile *objfile)
>      }
>    else if (symbol.n_sclass & 0x80)
>      {
> -      retval = ((struct coff_symfile_info *)
> -		objfile->deprecated_sym_private)->debugsec
> -	+ symbol.n_offset;
> +      retval = XCOFF_DATA (objfile)->debugsec + symbol.n_offset;
>        raw_symbol += coff_data (objfile->obfd)->local_symesz;
>        ++symnum;
>      }
> @@ -990,10 +995,9 @@ read_xcoff_symtab (struct partial_symtab *pst)
>    struct objfile *objfile = pst->objfile;
>    bfd *abfd = objfile->obfd;
>    char *raw_auxptr;		/* Pointer to first raw aux entry for sym.  */
> -  char *strtbl = 
> -    ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl;
> -  char *debugsec =
> -    ((struct coff_symfile_info *) objfile->deprecated_sym_private)->debugsec;
> +  struct coff_symfile_info *xcoff = XCOFF_DATA (objfile);
> +  char *strtbl = xcoff->strtbl;
> +  char *debugsec = xcoff->debugsec;
>    const char *debugfmt = bfd_xcoff_is_xcoff64 (abfd) ? "XCOFF64" : "XCOFF";
>  
>    struct internal_syment symbol[1];
> @@ -1035,9 +1039,7 @@ read_xcoff_symtab (struct partial_symtab *pst)
>      symnum + ((struct symloc *) pst->read_symtab_private)->numsyms;
>    first_object_file_end = 0;
>  
> -  raw_symbol =
> -    ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl
> -    + symnum * local_symesz;
> +  raw_symbol = xcoff->symtbl + symnum * local_symesz;
>  
>    while (symnum < max_symnum)
>      {
> @@ -1661,9 +1663,8 @@ coff_getfilename (union internal_auxent *aux_entry, struct objfile *objfile)
>    static char buffer[BUFSIZ];
>  
>    if (aux_entry->x_file.x_n.x_zeroes == 0)
> -    strcpy (buffer, ((struct coff_symfile_info *)
> -		     objfile->deprecated_sym_private)->strtbl
> -	    + aux_entry->x_file.x_n.x_offset);
> +    strcpy (buffer, (XCOFF_DATA (objfile)->strtbl
> +		     + aux_entry->x_file.x_n.x_offset));
>    else
>      {
>        strncpy (buffer, aux_entry->x_file.x_fname, FILNMLEN);
> @@ -1676,11 +1677,9 @@ coff_getfilename (union internal_auxent *aux_entry, struct objfile *objfile)
>  static void
>  read_symbol (struct internal_syment *symbol, int symno)
>  {
> -  int nsyms
> -    = ((struct coff_symfile_info *)
> -       this_symtab_psymtab->objfile->deprecated_sym_private)->symtbl_num_syms;
> -  char *stbl = ((struct coff_symfile_info *)
> -		this_symtab_psymtab->objfile->deprecated_sym_private)->symtbl;
> +  struct coff_symfile_info *xcoff = XCOFF_DATA (this_symtab_psymtab->objfile);
> +  int nsyms = xcoff->symtbl_num_syms;
> +  char *stbl = xcoff->symtbl;
>  
>    if (symno < 0 || symno >= nsyms)
>      {
> @@ -1715,8 +1714,7 @@ read_symbol_lineno (int symno)
>    struct objfile *objfile = this_symtab_psymtab->objfile;
>    int xcoff64 = bfd_xcoff_is_xcoff64 (objfile->obfd);
>  
> -  struct coff_symfile_info *info =
> -    (struct coff_symfile_info *)objfile->deprecated_sym_private;
> +  struct coff_symfile_info *info = XCOFF_DATA (objfile);
>    int nsyms = info->symtbl_num_syms;
>    char *stbl = info->symtbl;
>    char *strtbl = info->strtbl;
> @@ -1919,9 +1917,11 @@ xcoff_new_init (struct objfile *objfile)
>  static void
>  xcoff_symfile_init (struct objfile *objfile)
>  {
> +  struct coff_symfile_info *xcoff;
> +
>    /* Allocate struct to keep track of the symfile.  */
> -  objfile->deprecated_sym_private
> -    = xmalloc (sizeof (struct coff_symfile_info));
> +  xcoff = XNEW (struct coff_symfile_info);
> +  set_objfile_data (objfile, xcoff_objfile_data_key, xcoff);
>  
>    /* XCOFF objects may be reordered, so set OBJF_REORDERED.  If we
>       find this causes a significant slowdown in gdb then we could
> @@ -1939,11 +1939,6 @@ xcoff_symfile_init (struct objfile *objfile)
>  static void
>  xcoff_symfile_finish (struct objfile *objfile)
>  {
> -  if (objfile->deprecated_sym_private != NULL)
> -    {
> -      xfree (objfile->deprecated_sym_private);
> -    }
> -
>    /* Start with a fresh include table for the next objfile.  */
>    if (inclTable)
>      {
> @@ -1963,9 +1958,9 @@ init_stringtab (bfd *abfd, file_ptr offset, struct objfile *objfile)
>    int val;
>    unsigned char lengthbuf[4];
>    char *strtbl;
> +  struct coff_symfile_info *xcoff = XCOFF_DATA (objfile);
>  
> -  ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl
> -    = NULL;
> +  xcoff->strtbl = NULL;
>  
>    if (bfd_seek (abfd, offset, SEEK_SET) < 0)
>      error (_("cannot seek to string table in %s: %s"),
> @@ -1984,8 +1979,7 @@ init_stringtab (bfd *abfd, file_ptr offset, struct objfile *objfile)
>       as long as we have its symbol table around.  */
>  
>    strtbl = (char *) obstack_alloc (&objfile->objfile_obstack, length);
> -  ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl
> -    = strtbl;
> +  xcoff->strtbl = strtbl;
>  
>    /* Copy length buffer, the first byte is usually zero and is
>       used for stabs with a name length of zero.  */
> @@ -2165,13 +2159,11 @@ swap_sym (struct internal_syment *symbol, union internal_auxent *aux,
>      }
>    else if (symbol->n_sclass & 0x80)
>      {
> -      *name = ((struct coff_symfile_info *)
> -	       objfile->deprecated_sym_private)->debugsec + symbol->n_offset;
> +      *name = XCOFF_DATA (objfile)->debugsec + symbol->n_offset;
>      }
>    else
>      {
> -      *name = ((struct coff_symfile_info *)
> -	       objfile->deprecated_sym_private)->strtbl + symbol->n_offset;
> +      *name = XCOFF_DATA (objfile)->strtbl + symbol->n_offset;
>      }
>    ++*symnump;
>    *raw += coff_data (objfile->obfd)->local_symesz;
> @@ -2248,10 +2240,8 @@ scan_xcoff_symtab (struct objfile *objfile)
>    abfd = objfile->obfd;
>    next_symbol_text_func = xcoff_next_symbol_text;
>  
> -  sraw_symbol = ((struct coff_symfile_info *)
> -		 objfile->deprecated_sym_private)->symtbl;
> -  nsyms = ((struct coff_symfile_info *)
> -	   objfile->deprecated_sym_private)->symtbl_num_syms;
> +  sraw_symbol = XCOFF_DATA (objfile)->symtbl;
> +  nsyms = XCOFF_DATA (objfile)->symtbl_num_syms;
>    ssymnum = 0;
>    while (ssymnum < nsyms)
>      {
> @@ -2930,8 +2920,7 @@ scan_xcoff_symtab (struct objfile *objfile)
>       Another place to obtain this information would be file auxiliary
>       header.  */
>  
> -  ((struct coff_symfile_info *) objfile->deprecated_sym_private)->toc_offset
> -    = toc_offset;
> +  XCOFF_DATA (objfile)->toc_offset = toc_offset;
>  }
>  
>  /* Return the toc offset value for a given objfile.  */
> @@ -2940,8 +2929,7 @@ CORE_ADDR
>  xcoff_get_toc_offset (struct objfile *objfile)
>  {
>    if (objfile)
> -    return ((struct coff_symfile_info *)
> -	    objfile->deprecated_sym_private)->toc_offset;
> +    return XCOFF_DATA (objfile)->toc_offset;
>    return 0;
>  }
>  
> @@ -2967,7 +2955,7 @@ xcoff_initial_scan (struct objfile *objfile, int symfile_flags)
>    char *name;
>    unsigned int size;
>  
> -  info = (struct coff_symfile_info *) objfile->deprecated_sym_private;
> +  info = XCOFF_DATA (objfile);
>    symfile_bfd = abfd = objfile->obfd;
>    name = objfile->name;
>  
> @@ -3006,9 +2994,7 @@ xcoff_initial_scan (struct objfile *objfile, int symfile_flags)
>  		  }
>  	      }
>  	  }
> -	((struct coff_symfile_info *)
> -	 objfile->deprecated_sym_private)->debugsec
> -	  = debugsec;
> +	info->debugsec = debugsec;
>        }
>      }
>  
> @@ -3019,15 +3005,10 @@ xcoff_initial_scan (struct objfile *objfile, int symfile_flags)
>      error (_("Error reading symbols from %s: %s"),
>  	   name, bfd_errmsg (bfd_get_error ()));
>    size = coff_data (abfd)->local_symesz * num_symbols;
> -  ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl =
> -    obstack_alloc (&objfile->objfile_obstack, size);
> -  ((struct coff_symfile_info *)
> -   objfile->deprecated_sym_private)->symtbl_num_syms
> -    = num_symbols;
> -
> -  val = bfd_bread (((struct coff_symfile_info *)
> -		    objfile->deprecated_sym_private)->symtbl,
> -		   size, abfd);
> +  info->symtbl = obstack_alloc (&objfile->objfile_obstack, size);
> +  info->symtbl_num_syms = num_symbols;
> +
> +  val = bfd_bread (info->symtbl, size, abfd);
>    if (val != size)
>      perror_with_name (_("reading symbol table"));
>  
> @@ -3138,6 +3119,14 @@ static const struct sym_fns xcoff_sym_fns =
>    &psym_functions
>  };
>  
> +/* Free the per-objfile xcoff data.  */
> +
> +static void
> +xcoff_free_info (struct objfile *objfile, void *arg)
> +{
> +  xfree (arg);
> +}
> +
>  /* Provide a prototype to silence -Wmissing-prototypes.  */
>  extern initialize_file_ftype _initialize_xcoffread;
>  
> @@ -3145,4 +3134,7 @@ void
>  _initialize_xcoffread (void)
>  {
>    add_symtab_fns (&xcoff_sym_fns);
> +
> +  xcoff_objfile_data_key = register_objfile_data_with_cleanup (NULL,
> +							       xcoff_free_info);
>  }
> -- 
> 1.7.7.6
> 
> 

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019