This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[RFC] Remove deprecated_sym_private
- From: Tristan Gingold <gingold at adacore dot com>
- To: gdb-patches at sourceware dot org
- Date: Wed, 3 Feb 2010 17:08:30 +0100
- Subject: [RFC] Remove deprecated_sym_private
Hi,
I wrote a patch that remove deprecated_sym_private, but I am not sure
that it is worth applying it: not sure this is a real improvment, and
I think that the private data_key could be shared among all symbol readers.
That's the reason why comments are welcome.
Simply tested on GNU/Linux x86. I can test it on AIX using the AdaCore
testsuite.
Tristan.
2010-01-14 Tristan Gingold <gingold@adacore.com>
Remove deprecated_sym_private.
* objfiles.h (struct objfile): Remove deprecated_sym_private.
* symfile.c (reread_symbols): Remove initialization of
deprecated_sym_private.
* coffread.c (coff_objfile_data_key): New variable.
(coff_symfile_init): Add info variable. Allocate coff_symfile_info
on objfile objstack.
(coff_symfile_read): Get info from objfile data.
(coff_symfile_finish): Remove xfree of coff_symfile_info data.
(_initialize_coffread): Set coff_objfile_data_key.
* xcoffread.c (xcoff_objfile_data_key): New variable.
(get_coff_symfile_info): New function.
(process_linenos): Use get_coff_symfile_info instead of
deprecated_sym_private.
(enter_line_range): Ditto.
(xcoff_next_symbol_text): Ditto.
(read_xcoff_symtab): Ditto.
(read_xcoff_symtab): Ditto.
(coff_getfilename): Ditto.
(read_symbol): Ditto.
(read_symbol_lineno): Ditto.
(init_stringtab): Ditto.
(swap_sym): Ditto.
(scan_xcoff_symtab): Ditto.
(xcoff_get_toc_offset): Ditto.
(xcoff_initial_scan): Ditto.
(xcoff_symfile_init): Allocate coff_symfile_info on objstack.
(xcoff_symfile_finish): Do not free coff_symfile_info.
(_initialize_xcoffread): Set xcoff_objfile_data_key.
---
gdb/coffread.c | 22 +++++++-----
gdb/objfiles.h | 11 ------
gdb/symfile.c | 1 -
gdb/xcoffread.c | 101 ++++++++++++++++++++++++++----------------------------
4 files changed, 62 insertions(+), 73 deletions(-)
diff --git a/gdb/coffread.c b/gdb/coffread.c
index ba413ad..d2a72fd 100644
--- a/gdb/coffread.c
+++ b/gdb/coffread.c
@@ -59,6 +59,10 @@ struct coff_symfile_info
char *stabstrdata;
};
+/* The data key for coff_symfile_info. */
+
+static const struct objfile_data *coff_objfile_data_key;
+
/* Translate an external name string into a user-visible name. */
#define EXTERNAL_NAME(string, abfd) \
(string[0] == bfd_get_symbol_leading_char(abfd)? string+1: string)
@@ -437,6 +441,8 @@ record_minimal_symbol (struct coff_symbol *cs, CORE_ADDR address,
static void
coff_symfile_init (struct objfile *objfile)
{
+ struct coff_symfile_info *info;
+
/* Allocate struct to keep track of stab reading. */
objfile->deprecated_sym_stab_info = (struct dbx_symfile_info *)
xmalloc (sizeof (struct dbx_symfile_info));
@@ -445,9 +451,9 @@ coff_symfile_init (struct objfile *objfile)
sizeof (struct dbx_symfile_info));
/* 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));
+ info = obstack_alloc (&objfile->objfile_obstack, sizeof (*info));
+ memset (info, 0, sizeof (*info));
+ set_objfile_data (objfile, coff_objfile_data_key, info);
/* COFF objects may be reordered, so set OBJF_REORDERED. If we
find this causes a significant slowdown in gdb then we could
@@ -514,7 +520,8 @@ coff_symfile_read (struct objfile *objfile, int symfile_flags)
int len;
char * target;
- info = (struct coff_symfile_info *) objfile->deprecated_sym_private;
+ info = (struct coff_symfile_info *) objfile_data
+ (objfile, coff_objfile_data_key);
dbxinfo = objfile->deprecated_sym_stab_info;
symfile_bfd = abfd; /* Kludge for swap routines */
@@ -665,11 +672,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 ();
@@ -2135,5 +2137,7 @@ static struct sym_fns coff_sym_fns =
void
_initialize_coffread (void)
{
+ coff_objfile_data_key = register_objfile_data ();
+
add_symtab_fns (&coff_sym_fns);
}
diff --git a/gdb/objfiles.h b/gdb/objfiles.h
index c689622..334f8d4 100644
--- a/gdb/objfiles.h
+++ b/gdb/objfiles.h
@@ -309,17 +309,6 @@ struct objfile
struct dbx_symfile_info *deprecated_sym_stab_info;
- /* 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_stab_info and deprecated_sym_private
diff --git a/gdb/symfile.c b/gdb/symfile.c
index d82f02b..01e7094 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -2324,7 +2324,6 @@ reread_symbols (void)
objfile->free_psymtabs = NULL;
objfile->cp_namespace_symtab = 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 acd7b50..2b7090f 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -150,6 +150,18 @@ struct coff_symfile_info
CORE_ADDR toc_offset;
};
+/* The data key for coff_symfile_info. */
+
+static const struct objfile_data *xcoff_objfile_data_key;
+
+/* Get coff_symfile_info from OBJFILE. */
+
+static struct coff_symfile_info *
+get_coff_symfile_info (struct objfile *objfile)
+{
+ return objfile_data (objfile, xcoff_objfile_data_key);
+}
+
static void
bf_notfound_complaint (void)
{
@@ -552,8 +564,7 @@ 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;
+ get_coff_symfile_info (this_symtab_psymtab->objfile)->max_lineno_offset;
/* subfile structure for the main compilation unit. */
struct subfile main_subfile;
@@ -778,9 +789,7 @@ enter_line_range (struct subfile *subfile, unsigned beginoffset, unsigned endoff
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 = get_coff_symfile_info (objfile)->max_lineno_offset;
if (endoffset != 0)
{
@@ -899,11 +908,8 @@ 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;
- raw_symbol +=
- coff_data (objfile->obfd)->local_symesz;
+ retval = get_coff_symfile_info (objfile)->debugsec + symbol.n_offset;
+ raw_symbol += coff_data (objfile->obfd)->local_symesz;
++symnum;
}
else
@@ -925,9 +931,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 *symfile_info = get_coff_symfile_info (objfile);
+ char *strtbl = symfile_info->strtbl;
+ char *debugsec = symfile_info->debugsec;
char *debugfmt = bfd_xcoff_is_xcoff64 (abfd) ? "XCOFF64" : "XCOFF";
struct internal_syment symbol[1];
@@ -968,13 +974,10 @@ read_xcoff_symtab (struct partial_symtab *pst)
start_symtab (filestring, (char *) NULL, file_start_addr);
record_debugformat (debugfmt);
symnum = ((struct symloc *) pst->read_symtab_private)->first_symnum;
- max_symnum =
- symnum + ((struct symloc *) pst->read_symtab_private)->numsyms;
+ max_symnum = 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 = get_coff_symfile_info (objfile)->symtbl + symnum * local_symesz;
while (symnum < max_symnum)
{
@@ -1595,8 +1598,7 @@ 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
+ strcpy (buffer, get_coff_symfile_info (objfile)->strtbl
+ aux_entry->x_file.x_n.x_offset);
else
{
@@ -1610,10 +1612,10 @@ 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 *symfile_info =
+ get_coff_symfile_info (this_symtab_psymtab->objfile);
+ int nsyms = symfile_info->symtbl_num_syms;
+ char *stbl = symfile_info->symtbl;
if (symno < 0 || symno >= nsyms)
{
complaint (&symfile_complaints, _("Invalid symbol offset"));
@@ -1647,8 +1649,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 = get_coff_symfile_info (objfile);
int nsyms = info->symtbl_num_syms;
char *stbl = info->symtbl;
char *strtbl = info->strtbl;
@@ -1850,8 +1851,12 @@ xcoff_new_init (struct objfile *objfile)
static void
xcoff_symfile_init (struct objfile *objfile)
{
+ struct coff_symfile_info *data;
+
/* Allocate struct to keep track of the symfile */
- objfile->deprecated_sym_private = xmalloc (sizeof (struct coff_symfile_info));
+ data = obstack_alloc (&objfile->objfile_obstack, sizeof (*data));
+ memset (data, 0, sizeof (*data));
+ set_objfile_data (objfile, xcoff_objfile_data_key, data);
/* XCOFF objects may be reordered, so set OBJF_REORDERED. If we
find this causes a significant slowdown in gdb then we could
@@ -1869,11 +1874,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)
{
@@ -1891,8 +1891,9 @@ init_stringtab (bfd *abfd, file_ptr offset, struct objfile *objfile)
int val;
unsigned char lengthbuf[4];
char *strtbl;
+ struct coff_symfile_info *info = get_coff_symfile_info (objfile);
- ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl = NULL;
+ info->strtbl = NULL;
if (bfd_seek (abfd, offset, SEEK_SET) < 0)
error (_("cannot seek to string table in %s: %s"),
@@ -1911,7 +1912,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;
+ info->strtbl = strtbl;
/* Copy length buffer, the first byte is usually zero and is
used for stabs with a name length of zero. */
@@ -2101,13 +2102,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 = get_coff_symfile_info (objfile)->debugsec + symbol->n_offset;
}
else
{
- *name = ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl
- + symbol->n_offset;
+ *name = get_coff_symfile_info (objfile)->strtbl + symbol->n_offset;
}
++*symnump;
*raw += coff_data (objfile->obfd)->local_symesz;
@@ -2133,6 +2132,7 @@ static void
scan_xcoff_symtab (struct objfile *objfile)
{
struct gdbarch *gdbarch = get_objfile_arch (objfile);
+ struct coff_symfile_info *info = get_coff_symfile_info (objfle);
CORE_ADDR toc_offset = 0; /* toc offset value in data section. */
char *filestring = NULL;
@@ -2183,8 +2183,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 = info->symtbl;
+ nsyms = info->symtbl_num_syms;
ssymnum = 0;
while (ssymnum < nsyms)
{
@@ -2843,7 +2843,7 @@ scan_xcoff_symtab (struct objfile *objfile)
If no XMC_TC0 is found, toc_offset should be zero. Another place to obtain
this information would be file auxiliary header. */
- ((struct coff_symfile_info *) objfile->deprecated_sym_private)->toc_offset = toc_offset;
+ info->toc_offset = toc_offset;
}
/* Return the toc offset value for a given objfile. */
@@ -2852,7 +2852,7 @@ CORE_ADDR
xcoff_get_toc_offset (struct objfile *objfile)
{
if (objfile)
- return ((struct coff_symfile_info *) objfile->deprecated_sym_private)->toc_offset;
+ return get_coff_symfile_info (objfile)->toc_offset;
return 0;
}
@@ -2874,11 +2874,10 @@ xcoff_initial_scan (struct objfile *objfile, int symfile_flags)
int num_symbols; /* # of symbols */
file_ptr symtab_offset; /* symbol table and */
file_ptr stringtab_offset; /* string table file offsets */
- struct coff_symfile_info *info;
+ struct coff_symfile_info *info = get_coff_symfile_info (objfile);
char *name;
unsigned int size;
- info = (struct coff_symfile_info *) objfile->deprecated_sym_private;
symfile_bfd = abfd = objfile->obfd;
name = objfile->name;
@@ -2919,8 +2918,7 @@ xcoff_initial_scan (struct objfile *objfile, int symfile_flags)
}
}
}
- ((struct coff_symfile_info *) objfile->deprecated_sym_private)->debugsec =
- debugsec;
+ info->debugsec = debugsec;
}
}
@@ -2931,13 +2929,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;
+ info->symtbl = obstack_alloc (&objfile->objfile_obstack, size);
+ info->symtbl_num_syms = num_symbols;
- val = bfd_bread (((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl,
- size, abfd);
+ val = bfd_bread (info->symtbl, size, abfd);
if (val != size)
perror_with_name (_("reading symbol table"));
@@ -3045,5 +3040,7 @@ extern initialize_file_ftype _initialize_xcoffread;
void
_initialize_xcoffread (void)
{
+ xcoff_objfile_data_key = register_objfile_data ();
+
add_symtab_fns (&xcoff_sym_fns);
}
--
1.6.2