Mail Archives: djgpp-workers/2012/12/11/22:43:32
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 -