/* Read AIX xcoff symbol tables and convert to internal format, for GDB.
Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
- 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+ 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
Free Software Foundation, Inc.
Derived from coffread.c, dbxread.c, and a lot of hacking.
Contributed by IBM Corporation.
#include "gdb_string.h"
#include <sys/param.h>
-#ifndef NO_SYS_FILE
+#ifdef HAVE_SYS_FILE_H
#include <sys/file.h>
#endif
#include "gdb_stat.h"
#include "symtab.h"
#include "gdbtypes.h"
+/* FIXME: ezannoni/2004-02-13 Verify if the include below is really needed. */
#include "symfile.h"
#include "objfiles.h"
#include "buildsym.h"
static void xcoff_symfile_offsets (struct objfile *,
struct section_addr_info *addrs);
-static void find_linenos (bfd *, sec_ptr, void *);
-
static char *coff_getfilename (union internal_auxent *, struct objfile *);
static void read_symbol (struct internal_syment *, int);
{
int offset, ii;
file_ptr max_offset =
- ((struct coff_symfile_info *) this_symtab_psymtab->objfile->sym_private)
+ ((struct coff_symfile_info *) this_symtab_psymtab->objfile->deprecated_sym_private)
->max_lineno_offset;
/* subfile structure for the main compilation unit. */
return;
curoffset = beginoffset;
limit_offset =
- ((struct coff_symfile_info *) this_symtab_psymtab->objfile->sym_private)
+ ((struct coff_symfile_info *) this_symtab_psymtab->objfile->deprecated_sym_private)
->max_lineno_offset;
if (endoffset != 0)
else if (symbol.n_sclass & 0x80)
{
retval =
- ((struct coff_symfile_info *) objfile->sym_private)->debugsec
+ ((struct coff_symfile_info *) objfile->deprecated_sym_private)->debugsec
+ symbol.n_offset;
raw_symbol +=
coff_data (objfile->obfd)->local_symesz;
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->sym_private)->strtbl;
+ char *strtbl = ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl;
char *debugsec =
- ((struct coff_symfile_info *) objfile->sym_private)->debugsec;
+ ((struct coff_symfile_info *) objfile->deprecated_sym_private)->debugsec;
char *debugfmt = bfd_xcoff_is_xcoff64 (abfd) ? "XCOFF64" : "XCOFF";
struct internal_syment symbol[1];
first_object_file_end = 0;
raw_symbol =
- ((struct coff_symfile_info *) objfile->sym_private)->symtbl
+ ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl
+ symnum * local_symesz;
while (symnum < max_symnum)
if (cs->c_name[E_SYMNMLEN - 1] != '\0')
{
char *p;
- p = obstack_alloc (&objfile->symbol_obstack, E_SYMNMLEN + 1);
+ p = obstack_alloc (&objfile->objfile_obstack, E_SYMNMLEN + 1);
strncpy (p, cs->c_name, E_SYMNMLEN);
p[E_SYMNMLEN] = '\0';
cs->c_name = p;
break;
case C_FCN:
- if (STREQ (cs->c_name, ".bf"))
+ if (DEPRECATED_STREQ (cs->c_name, ".bf"))
{
CORE_ADDR off = ANOFFSET (objfile->section_offsets,
SECT_OFF_TEXT (objfile));
if (new->name != NULL)
SYMBOL_SECTION (new->name) = SECT_OFF_TEXT (objfile);
}
- else if (STREQ (cs->c_name, ".ef"))
+ else if (DEPRECATED_STREQ (cs->c_name, ".ef"))
{
bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
break;
case C_BLOCK:
- if (STREQ (cs->c_name, ".bb"))
+ if (DEPRECATED_STREQ (cs->c_name, ".bb"))
{
depth++;
new = push_context (depth,
+ ANOFFSET (objfile->section_offsets,
SECT_OFF_TEXT (objfile))));
}
- else if (STREQ (cs->c_name, ".eb"))
+ else if (DEPRECATED_STREQ (cs->c_name, ".eb"))
{
if (context_stack_depth <= 0)
{ /* We attempted to pop an empty context stack */
#define SYMBOL_DUP(SYMBOL1, SYMBOL2) \
(SYMBOL2) = (struct symbol *) \
- obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol)); \
+ obstack_alloc (&objfile->objfile_obstack, sizeof (struct symbol)); \
*(SYMBOL2) = *(SYMBOL1);
#define SYMNAME_ALLOC(NAME, ALLOCED) \
- (ALLOCED) ? (NAME) : obsavestring ((NAME), strlen (NAME), &objfile->symbol_obstack);
+ (ALLOCED) ? (NAME) : obsavestring ((NAME), strlen (NAME), &objfile->objfile_obstack);
static struct type *func_symbol_type;
/* process one xcoff symbol. */
static struct symbol *
-process_xcoff_symbol (register struct coff_symbol *cs, struct objfile *objfile)
+process_xcoff_symbol (struct coff_symbol *cs, struct objfile *objfile)
{
struct symbol onesymbol;
- register struct symbol *sym = &onesymbol;
+ struct symbol *sym = &onesymbol;
struct symbol *sym2 = NULL;
char *name, *pp;
if (aux_entry->x_file.x_n.x_zeroes == 0)
strcpy (buffer,
- ((struct coff_symfile_info *) objfile->sym_private)->strtbl
+ ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl
+ aux_entry->x_file.x_n.x_offset);
else
{
read_symbol (struct internal_syment *symbol, int symno)
{
int nsyms =
- ((struct coff_symfile_info *) this_symtab_psymtab->objfile->sym_private)
- ->symtbl_num_syms;
+ ((struct coff_symfile_info *) this_symtab_psymtab->objfile->deprecated_sym_private)->symtbl_num_syms;
char *stbl =
- ((struct coff_symfile_info *) this_symtab_psymtab->objfile->sym_private)
- ->symtbl;
+ ((struct coff_symfile_info *) this_symtab_psymtab->objfile->deprecated_sym_private)->symtbl;
if (symno < 0 || symno >= nsyms)
{
complaint (&symfile_complaints, "Invalid symbol offset");
int xcoff64 = bfd_xcoff_is_xcoff64 (objfile->obfd);
struct coff_symfile_info *info =
- (struct coff_symfile_info *)objfile->sym_private;
+ (struct coff_symfile_info *)objfile->deprecated_sym_private;
int nsyms = info->symtbl_num_syms;
char *stbl = info->symtbl;
char *strtbl = info->strtbl;
if (symbol->n_sclass == C_FCN)
{
char *name = xcoff64 ? strtbl + symbol->n_offset : symbol->n_name;
- if (STREQ (name, ".bf"))
+ if (DEPRECATED_STREQ (name, ".bf"))
goto gotit;
}
symno += symbol->n_numaux + 1;
* mainline code can read the whole thing for efficiency.
*/
static void
-find_linenos (bfd *abfd, sec_ptr asect, void *vpinfo)
+find_linenos (struct bfd *abfd, struct bfd_section *asect, void *vpinfo)
{
struct coff_symfile_info *info;
int size, count;
count = asect->lineno_count;
- if (!STREQ (asect->name, ".text") || count == 0)
+ if (!DEPRECATED_STREQ (asect->name, ".text") || count == 0)
return;
size = count * coff_data (abfd)->local_linesz;
xcoff_symfile_init (struct objfile *objfile)
{
/* Allocate struct to keep track of the symfile */
- objfile->sym_private = xmmalloc (objfile->md,
- sizeof (struct coff_symfile_info));
+ objfile->deprecated_sym_private = xmalloc (sizeof (struct coff_symfile_info));
/* XCOFF objects may be reordered, so set OBJF_REORDERED. If we
find this causes a significant slowdown in gdb then we could
static void
xcoff_symfile_finish (struct objfile *objfile)
{
- if (objfile->sym_private != NULL)
+ if (objfile->deprecated_sym_private != NULL)
{
- xmfree (objfile->md, objfile->sym_private);
+ xfree (objfile->deprecated_sym_private);
}
/* Start with a fresh include table for the next objfile. */
unsigned char lengthbuf[4];
char *strtbl;
- ((struct coff_symfile_info *) objfile->sym_private)->strtbl = NULL;
+ ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl = NULL;
if (bfd_seek (abfd, offset, SEEK_SET) < 0)
error ("cannot seek to string table in %s: %s",
if (val != sizeof lengthbuf || length < sizeof lengthbuf)
return;
- /* Allocate string table from symbol_obstack. We will need this table
+ /* Allocate string table from objfile_obstack. We will need this table
as long as we have its symbol table around. */
- strtbl = (char *) obstack_alloc (&objfile->symbol_obstack, length);
- ((struct coff_symfile_info *) objfile->sym_private)->strtbl = strtbl;
+ strtbl = (char *) obstack_alloc (&objfile->objfile_obstack, length);
+ ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl = strtbl;
/* Copy length buffer, the first byte is usually zero and is
used for stabs with a name length of zero. */
global_syms, static_syms);
result->read_symtab_private = (char *)
- obstack_alloc (&objfile->psymbol_obstack, sizeof (struct symloc));
+ obstack_alloc (&objfile->objfile_obstack, sizeof (struct symloc));
((struct symloc *) result->read_symtab_private)->first_symnum = first_symnum;
result->read_symtab = xcoff_psymtab_to_symtab;
if (number_dependencies)
{
pst->dependencies = (struct partial_symtab **)
- obstack_alloc (&objfile->psymbol_obstack,
+ obstack_alloc (&objfile->objfile_obstack,
number_dependencies * sizeof (struct partial_symtab *));
memcpy (pst->dependencies, dependency_list,
number_dependencies * sizeof (struct partial_symtab *));
subpst->section_offsets = pst->section_offsets;
subpst->read_symtab_private =
- (char *) obstack_alloc (&objfile->psymbol_obstack,
+ (char *) obstack_alloc (&objfile->objfile_obstack,
sizeof (struct symloc));
((struct symloc *) subpst->read_symtab_private)->first_symnum = 0;
((struct symloc *) subpst->read_symtab_private)->numsyms = 0;
/* We could save slight bits of space by only making one of these,
shared by the entire set of include files. FIXME-someday. */
subpst->dependencies = (struct partial_symtab **)
- obstack_alloc (&objfile->psymbol_obstack,
+ obstack_alloc (&objfile->objfile_obstack,
sizeof (struct partial_symtab *));
subpst->dependencies[0] = pst;
subpst->number_of_dependencies = 1;
/* FIXME: wastes memory for symbols which we don't end up putting
into the minimal symbols. */
char *p;
- p = obstack_alloc (&objfile->psymbol_obstack, E_SYMNMLEN + 1);
+ p = obstack_alloc (&objfile->objfile_obstack, E_SYMNMLEN + 1);
strncpy (p, symbol->n_name, E_SYMNMLEN);
p[E_SYMNMLEN] = '\0';
*name = p;
}
else if (symbol->n_sclass & 0x80)
{
- *name = ((struct coff_symfile_info *) objfile->sym_private)->debugsec
+ *name = ((struct coff_symfile_info *) objfile->deprecated_sym_private)->debugsec
+ symbol->n_offset;
}
else
{
- *name = ((struct coff_symfile_info *) objfile->sym_private)->strtbl
+ *name = ((struct coff_symfile_info *) objfile->deprecated_sym_private)->strtbl
+ symbol->n_offset;
}
++*symnump;
abfd = objfile->obfd;
- sraw_symbol = ((struct coff_symfile_info *) objfile->sym_private)->symtbl;
- nsyms = ((struct coff_symfile_info *) objfile->sym_private)->symtbl_num_syms;
+ sraw_symbol = ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl;
+ nsyms = ((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl_num_syms;
ssymnum = 0;
while (ssymnum < nsyms)
{
things like "break c-exp.y:435" need to work (I
suppose the psymtab_include_list could be hashed or put
in a binary tree, if profiling shows this is a major hog). */
- if (pst && STREQ (namestring, pst->filename))
+ if (pst && DEPRECATED_STREQ (namestring, pst->filename))
continue;
{
- register int i;
+ int i;
for (i = 0; i < includes_used; i++)
- if (STREQ (namestring, psymtab_include_list[i]))
+ if (DEPRECATED_STREQ (namestring, psymtab_include_list[i]))
{
i = -1;
break;
psymtab_language, objfile);
p += 1;
}
-#if 0 /* OBSOLETE CFront */
-// OBSOLETE /* The semantics of C++ state that "struct foo { ... }"
-// OBSOLETE also defines a typedef for "foo". Unfortuantely, cfront
-// OBSOLETE never makes the typedef when translating from C++ to C.
-// OBSOLETE We make the typedef here so that "ptype foo" works as
-// OBSOLETE expected for cfront translated code. */
-// OBSOLETE else if (psymtab_language == language_cplus)
-// OBSOLETE {
-// OBSOLETE /* Also a typedef with the same name. */
-// OBSOLETE add_psymbol_to_list (namestring, p - namestring,
-// OBSOLETE VAR_DOMAIN, LOC_TYPEDEF,
-// OBSOLETE &objfile->static_psymbols,
-// OBSOLETE symbol.n_value, 0,
-// OBSOLETE psymtab_language, objfile);
-// OBSOLETE }
-#endif /* OBSOLETE CFront */
}
goto check_enum;
case '9':
case '-':
case '#': /* for symbol identification (used in live ranges) */
-#if 0 /* OBSOLETE CFront */
-// OBSOLETE /* added to support cfront stabs strings */
-// OBSOLETE case 'Z': /* for definition continuations */
-// OBSOLETE case 'P': /* for prototypes */
-#endif /* OBSOLETE CFront */
continue;
case ':':
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->sym_private)->toc_offset = toc_offset;
+ ((struct coff_symfile_info *) objfile->deprecated_sym_private)->toc_offset = toc_offset;
}
/* Return the toc offset value for a given objfile. */
get_toc_offset (struct objfile *objfile)
{
if (objfile)
- return ((struct coff_symfile_info *) objfile->sym_private)->toc_offset;
+ return ((struct coff_symfile_info *) objfile->deprecated_sym_private)->toc_offset;
return 0;
}
char *name;
unsigned int size;
- info = (struct coff_symfile_info *) objfile->sym_private;
+ info = (struct coff_symfile_info *) objfile->deprecated_sym_private;
symfile_bfd = abfd = objfile->obfd;
name = objfile->name;
/* Read the .debug section, if present. */
{
- sec_ptr secp;
+ struct bfd_section *secp;
bfd_size_type length;
char *debugsec = NULL;
if (length)
{
debugsec =
- (char *) obstack_alloc (&objfile->symbol_obstack, length);
+ (char *) obstack_alloc (&objfile->objfile_obstack, length);
if (!bfd_get_section_contents (abfd, secp, debugsec,
(file_ptr) 0, length))
}
}
}
- ((struct coff_symfile_info *) objfile->sym_private)->debugsec =
+ ((struct coff_symfile_info *) objfile->deprecated_sym_private)->debugsec =
debugsec;
}
}
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->sym_private)->symtbl =
- obstack_alloc (&objfile->symbol_obstack, size);
- ((struct coff_symfile_info *) objfile->sym_private)->symtbl_num_syms =
+ ((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->sym_private)->symtbl,
+ val = bfd_bread (((struct coff_symfile_info *) objfile->deprecated_sym_private)->symtbl,
size, abfd);
if (val != size)
perror_with_name ("reading symbol table");
objfile->num_sections = bfd_count_sections (objfile->obfd);
objfile->section_offsets = (struct section_offsets *)
- obstack_alloc (&objfile->psymbol_obstack,
+ obstack_alloc (&objfile->objfile_obstack,
SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
/* Initialize the section indexes for future use. */