/* Read a symbol table in ECOFF format (Third-Eye).
- Copyright (C) 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
- 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009, 2010,
- 2011 Free Software Foundation, Inc.
+ Copyright (C) 1986-2014 Free Software Foundation, Inc.
Original version contributed by Alessandro Forin (af@cs.cmu.edu) at
CMU. Major work by Per Bothner, John Gilmore and Ian Lance Taylor
#include "symtab.h"
#include "gdbtypes.h"
#include "gdbcore.h"
+#include "filenames.h"
#include "objfiles.h"
#include "gdb_obstack.h"
#include "buildsym.h"
#include "stabsread.h"
#include "complaints.h"
#include "demangle.h"
-#include "gdb_assert.h"
+#include "gdb-demangle.h"
#include "block.h"
#include "dictionary.h"
#include "mdebugread.h"
-#include "gdb_stat.h"
-#include "gdb_string.h"
+#include <sys/stat.h>
#include "psympriv.h"
+#include "source.h"
#include "bfd.h"
case the symbol's ELF section could not be represented in ECOFF. */
#define ECOFF_IN_ELF(bfd) (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
&& bfd_get_section_by_name (bfd, ".mdebug") != NULL)
+
+/* The objfile we are currently reading. */
+
+static struct objfile *mdebugread_objfile;
+
\f
/* We put a pointer to this structure in the read_symtab_private field
static struct type *parse_type (int, union aux_ext *, unsigned int, int *,
int, char *);
-static struct symbol *mylookup_symbol (char *, struct block *, domain_enum,
- enum address_class);
+static struct symbol *mylookup_symbol (char *, const struct block *,
+ domain_enum, enum address_class);
static void sort_blocks (struct symtab *);
static struct partial_symtab *new_psymtab (char *, struct objfile *);
-static void psymtab_to_symtab_1 (struct partial_symtab *, const char *);
+static void psymtab_to_symtab_1 (struct objfile *objfile,
+ struct partial_symtab *, const char *);
static void add_block (struct block *, struct symtab *);
static char *mdebug_next_symbol_text (struct objfile *);
\f
-/* Exported procedure: Builds a symtab from the PST partial one.
- Restores the environment in effect when PST was created, delegates
+/* Exported procedure: Builds a symtab from the partial symtab SELF.
+ Restores the environment in effect when SELF was created, delegates
most of the work to an ancillary procedure, and sorts
- and reorders the symtab list at the end. */
+ and reorders the symtab list at the end. SELF is not NULL. */
static void
-mdebug_psymtab_to_symtab (struct partial_symtab *pst)
+mdebug_read_symtab (struct partial_symtab *self, struct objfile *objfile)
{
- if (!pst)
- return;
-
if (info_verbose)
{
- printf_filtered (_("Reading in symbols for %s..."), pst->filename);
+ printf_filtered (_("Reading in symbols for %s..."), self->filename);
gdb_flush (gdb_stdout);
}
next_symbol_text_func = mdebug_next_symbol_text;
- psymtab_to_symtab_1 (pst, pst->filename);
+ psymtab_to_symtab_1 (objfile, self, self->filename);
/* Match with global symbols. This only needs to be done once,
after all of the symtabs and dependencies have been read in. */
- scan_file_globals (pst->objfile);
+ scan_file_globals (objfile);
if (info_verbose)
printf_filtered (_("done.\n"));
};
-/* 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;
if (!p)
{
p = ((struct mdebug_pending *)
- obstack_alloc (¤t_objfile->objfile_obstack,
+ obstack_alloc (&mdebugread_objfile->objfile_obstack,
sizeof (struct mdebug_pending)));
p->s = sh;
p->t = t;
mdebug_reg_to_regnum
};
+/* The "aclass" indices for computed symbols. */
+
+static int mdebug_register_index;
+static int mdebug_regparm_index;
+
static int
parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
struct section_offsets *section_offsets, struct objfile *objfile)
s = new_symbol (name);
SYMBOL_VALUE (s) = svalue;
if (sh->sc == scRegister)
- {
- class = LOC_REGISTER;
- SYMBOL_REGISTER_OPS (s) = &mdebug_register_funcs;
- }
+ class = mdebug_register_index;
else
class = LOC_LOCAL;
data: /* Common code for symbols describing data. */
SYMBOL_DOMAIN (s) = VAR_DOMAIN;
- SYMBOL_CLASS (s) = class;
+ SYMBOL_ACLASS_INDEX (s) = class;
add_symbol (s, top_stack->cur_st, b);
/* Type could be missing if file is compiled without debugging info. */
{
case scRegister:
/* Pass by value in register. */
- SYMBOL_CLASS (s) = LOC_REGISTER;
- SYMBOL_REGISTER_OPS (s) = &mdebug_register_funcs;
+ SYMBOL_ACLASS_INDEX (s) = mdebug_register_index;
break;
case scVar:
/* Pass by reference on stack. */
- SYMBOL_CLASS (s) = LOC_REF_ARG;
+ SYMBOL_ACLASS_INDEX (s) = LOC_REF_ARG;
break;
case scVarRegister:
/* Pass by reference in register. */
- SYMBOL_CLASS (s) = LOC_REGPARM_ADDR;
- SYMBOL_REGISTER_OPS (s) = &mdebug_register_funcs;
+ SYMBOL_ACLASS_INDEX (s) = mdebug_regparm_index;
break;
default:
/* Pass by value on stack. */
- SYMBOL_CLASS (s) = LOC_ARG;
+ SYMBOL_ACLASS_INDEX (s) = LOC_ARG;
break;
}
SYMBOL_VALUE (s) = svalue;
case stLabel: /* label, goes into current block. */
s = new_symbol (name);
SYMBOL_DOMAIN (s) = VAR_DOMAIN; /* So that it can be used */
- SYMBOL_CLASS (s) = LOC_LABEL; /* but not misused. */
+ SYMBOL_ACLASS_INDEX (s) = LOC_LABEL; /* but not misused. */
SYMBOL_VALUE_ADDRESS (s) = (CORE_ADDR) sh->value;
SYMBOL_TYPE (s) = objfile_type (objfile)->builtin_int;
add_symbol (s, top_stack->cur_st, top_stack->cur_block);
}
s = new_symbol (name);
SYMBOL_DOMAIN (s) = VAR_DOMAIN;
- SYMBOL_CLASS (s) = LOC_BLOCK;
+ SYMBOL_ACLASS_INDEX (s) = LOC_BLOCK;
/* Type of the return value. */
if (SC_IS_UNDEF (sh->sc) || sh->sc == scNil)
t = objfile_type (objfile)->builtin_int;
b = top_stack->cur_block;
if (sh->st == stProc)
{
- struct blockvector *bv = BLOCKVECTOR (top_stack->cur_st);
+ const struct blockvector *bv = BLOCKVECTOR (top_stack->cur_st);
/* The next test should normally be true, but provides a
hook for nested functions (which we don't want to make
if (sh->iss == 0 || name[0] == '.' || name[0] == '\0')
TYPE_TAG_NAME (t) = NULL;
else
- TYPE_TAG_NAME (t) = obconcat (¤t_objfile->objfile_obstack,
+ TYPE_TAG_NAME (t) = obconcat (&mdebugread_objfile->objfile_obstack,
name, (char *) NULL);
TYPE_CODE (t) = type_code;
if (tsym.st != stMember)
break;
- SET_FIELD_BITPOS (*f, tsym.value);
+ SET_FIELD_ENUMVAL (*f, tsym.value);
FIELD_TYPE (*f) = t;
FIELD_NAME (*f) = debug_info->ss + cur_fdr->issBase + tsym.iss;
FIELD_BITSIZE (*f) = 0;
- enum_sym = ((struct symbol *)
- obstack_alloc (¤t_objfile->objfile_obstack,
- sizeof (struct symbol)));
- memset (enum_sym, 0, sizeof (struct symbol));
+ enum_sym = allocate_symbol (mdebugread_objfile);
SYMBOL_SET_LINKAGE_NAME
- (enum_sym, obsavestring (f->name, strlen (f->name),
- ¤t_objfile->objfile_obstack));
- SYMBOL_CLASS (enum_sym) = LOC_CONST;
+ (enum_sym,
+ obstack_copy0 (&mdebugread_objfile->objfile_obstack,
+ f->name, strlen (f->name)));
+ SYMBOL_ACLASS_INDEX (enum_sym) = LOC_CONST;
SYMBOL_TYPE (enum_sym) = t;
SYMBOL_DOMAIN (enum_sym) = VAR_DOMAIN;
SYMBOL_VALUE (enum_sym) = tsym.value;
s = new_symbol (name);
SYMBOL_DOMAIN (s) = STRUCT_DOMAIN;
- SYMBOL_CLASS (s) = LOC_TYPEDEF;
+ SYMBOL_ACLASS_INDEX (s) = LOC_TYPEDEF;
SYMBOL_VALUE (s) = 0;
SYMBOL_TYPE (s) = t;
add_symbol (s, top_stack->cur_st, top_stack->cur_block);
top_stack->blocktype == stStaticProc))
{
/* Finished with procedure */
- struct blockvector *bv = BLOCKVECTOR (top_stack->cur_st);
+ const struct blockvector *bv = BLOCKVECTOR (top_stack->cur_st);
struct mdebug_extra_func_info *e;
struct block *b = top_stack->cur_block;
struct type *ftype = top_stack->cur_type;
/* Make up special symbol to contain procedure specific info. */
s = new_symbol (MDEBUG_EFI_SYMBOL_NAME);
SYMBOL_DOMAIN (s) = LABEL_DOMAIN;
- SYMBOL_CLASS (s) = LOC_CONST;
- SYMBOL_TYPE (s) = objfile_type (current_objfile)->builtin_void;
+ SYMBOL_ACLASS_INDEX (s) = LOC_CONST;
+ SYMBOL_TYPE (s) = objfile_type (mdebugread_objfile)->builtin_void;
e = ((struct mdebug_extra_func_info *)
- obstack_alloc (¤t_objfile->objfile_obstack,
+ obstack_alloc (&mdebugread_objfile->objfile_obstack,
sizeof (struct mdebug_extra_func_info)));
memset (e, 0, sizeof (struct mdebug_extra_func_info));
SYMBOL_VALUE_BYTES (s) = (gdb_byte *) e;
if (nparams > 0)
{
- struct dict_iterator iter;
+ struct block_iterator iter;
TYPE_NFIELDS (ftype) = nparams;
TYPE_FIELDS (ftype) = (struct field *)
break;
s = new_symbol (name);
SYMBOL_DOMAIN (s) = VAR_DOMAIN;
- SYMBOL_CLASS (s) = LOC_TYPEDEF;
+ SYMBOL_ACLASS_INDEX (s) = LOC_TYPEDEF;
SYMBOL_BLOCK_VALUE (s) = top_stack->cur_block;
SYMBOL_TYPE (s) = t;
add_symbol (s, top_stack->cur_st, top_stack->cur_block);
/* Handle undefined types, they have indexNil. */
if (aux_index == indexNil)
- return basic_type (btInt, current_objfile);
+ return basic_type (btInt, mdebugread_objfile);
/* Handle corrupt aux indices. */
if (aux_index >= (debug_info->fdr + fd)->caux)
{
index_complaint (sym_name);
- return basic_type (btInt, current_objfile);
+ return basic_type (btInt, mdebugread_objfile);
}
ax += aux_index;
/* Use aux as a type information record, map its basic type. */
(*debug_swap->swap_tir_in) (bigend, &ax->a_ti, t);
- tp = basic_type (t->bt, current_objfile);
+ tp = basic_type (t->bt, mdebugread_objfile);
if (tp == NULL)
{
/* Cannot use builtin types -- build our own. */
break;
default:
basic_type_complaint (t->bt, sym_name);
- return basic_type (btInt, current_objfile);
+ return basic_type (btInt, mdebugread_objfile);
}
}
as short and unsigned short types with a field width of 8.
Enum types also have a field width which we ignore for now. */
if (t->bt == btShort && width == 8)
- tp = basic_type (btChar, current_objfile);
+ tp = basic_type (btChar, mdebugread_objfile);
else if (t->bt == btUShort && width == 8)
- tp = basic_type (btUChar, current_objfile);
+ tp = basic_type (btUChar, mdebugread_objfile);
else if (t->bt == btEnum)
;
else
{
complaint (&symfile_complaints,
_("unable to cross ref btIndirect for %s"), sym_name);
- return basic_type (btInt, current_objfile);
+ return basic_type (btInt, mdebugread_objfile);
}
xref_fh = get_rfd (fd, rf);
xref_fd = xref_fh - debug_info->fdr;
/* Try to cross reference this type, build new type on failure. */
ax += cross_ref (fd, ax, &tp, type_code, &name, bigend, sym_name);
if (tp == (struct type *) NULL)
- tp = init_type (type_code, 0, 0, (char *) NULL, current_objfile);
+ tp = init_type (type_code, 0, 0, (char *) NULL, mdebugread_objfile);
/* DEC c89 produces cross references to qualified aggregate types,
dereference them. */
else if (TYPE_TAG_NAME (tp) == NULL
|| strcmp (TYPE_TAG_NAME (tp), name) != 0)
TYPE_TAG_NAME (tp)
- = obsavestring (name, strlen (name),
- ¤t_objfile->objfile_obstack);
+ = obstack_copy0 (&mdebugread_objfile->objfile_obstack,
+ name, strlen (name));
}
}
/* Try to cross reference this type, build new type on failure. */
ax += cross_ref (fd, ax, &tp, type_code, &name, bigend, sym_name);
if (tp == (struct type *) NULL)
- tp = init_type (type_code, 0, 0, (char *) NULL, current_objfile);
+ tp = init_type (type_code, 0, 0, (char *) NULL, mdebugread_objfile);
/* Make sure that TYPE_CODE(tp) has an expected type code.
Any type may be returned from cross_ref if file indirect entries
}
if (TYPE_NAME (tp) == NULL
|| strcmp (TYPE_NAME (tp), name) != 0)
- TYPE_NAME (tp) = obsavestring (name, strlen (name),
- ¤t_objfile->objfile_obstack);
+ TYPE_NAME (tp)
+ = obstack_copy0 (&mdebugread_objfile->objfile_obstack,
+ name, strlen (name));
}
}
if (t->bt == btTypedef)
{
complaint (&symfile_complaints,
_("unable to cross ref btTypedef for %s"), sym_name);
- tp = basic_type (btInt, current_objfile);
+ tp = basic_type (btInt, mdebugread_objfile);
}
}
complaint (&symfile_complaints,
_("illegal array index type for %s, assuming int"),
sym_name);
- indx = objfile_type (current_objfile)->builtin_int;
+ indx = objfile_type (mdebugread_objfile)->builtin_int;
}
/* Get the bounds, and create the array type. */
ax++;
rf = AUX_GET_WIDTH (bigend, ax); /* bit size of array element */
- range = create_range_type ((struct type *) NULL, indx,
- lower, upper);
+ range = create_static_range_type ((struct type *) NULL, indx,
+ lower, upper);
t = create_array_type ((struct type *) NULL, *tpp, range);
to look for the function which contains the MDEBUG_EFI_SYMBOL_NAME symbol
in question, or NULL to use top_stack->cur_block. */
-static void parse_procedure (PDR *, struct symtab *, struct partial_symtab *);
-
static void
parse_procedure (PDR *pr, struct symtab *search_symtab,
struct partial_symtab *pst)
{
struct symbol *s, *i;
- struct block *b;
+ const struct block *b;
char *sh_name;
/* Simple rule to find files linked "-x". */
if (processing_gcc_compilation == 0
&& found_ecoff_debugging_info == 0
&& TYPE_CODE (TYPE_TARGET_TYPE (SYMBOL_TYPE (s))) == TYPE_CODE_VOID)
- SYMBOL_TYPE (s) = objfile_type (pst->objfile)->nodebug_text_symbol;
+ SYMBOL_TYPE (s) = objfile_type (mdebugread_objfile)->nodebug_text_symbol;
}
/* Parse the external symbol ES. Just call parse_symbol() after
struct objfile *objfile)
{
int section;
- asection *bfd_section;
switch (storage_class)
{
case scText:
section = SECT_OFF_TEXT (objfile);
- bfd_section = bfd_get_section_by_name (cur_bfd, ".text");
break;
case scData:
section = SECT_OFF_DATA (objfile);
- bfd_section = bfd_get_section_by_name (cur_bfd, ".data");
break;
case scBss:
section = SECT_OFF_BSS (objfile);
- bfd_section = bfd_get_section_by_name (cur_bfd, ".bss");
break;
case scSData:
section = get_section_index (objfile, ".sdata");
- bfd_section = bfd_get_section_by_name (cur_bfd, ".sdata");
break;
case scSBss:
section = get_section_index (objfile, ".sbss");
- bfd_section = bfd_get_section_by_name (cur_bfd, ".sbss");
break;
case scRData:
section = get_section_index (objfile, ".rdata");
- bfd_section = bfd_get_section_by_name (cur_bfd, ".rdata");
break;
case scInit:
section = get_section_index (objfile, ".init");
- bfd_section = bfd_get_section_by_name (cur_bfd, ".init");
break;
case scXData:
section = get_section_index (objfile, ".xdata");
- bfd_section = bfd_get_section_by_name (cur_bfd, ".xdata");
break;
case scPData:
section = get_section_index (objfile, ".pdata");
- bfd_section = bfd_get_section_by_name (cur_bfd, ".pdata");
break;
case scFini:
section = get_section_index (objfile, ".fini");
- bfd_section = bfd_get_section_by_name (cur_bfd, ".fini");
break;
case scRConst:
section = get_section_index (objfile, ".rconst");
- bfd_section = bfd_get_section_by_name (cur_bfd, ".rconst");
break;
#ifdef scTlsData
case scTlsData:
section = get_section_index (objfile, ".tlsdata");
- bfd_section = bfd_get_section_by_name (cur_bfd, ".tlsdata");
break;
#endif
#ifdef scTlsBss
case scTlsBss:
section = get_section_index (objfile, ".tlsbss");
- bfd_section = bfd_get_section_by_name (cur_bfd, ".tlsbss");
break;
#endif
default:
/* This kind of symbol is not associated to a section. */
section = -1;
- bfd_section = NULL;
}
prim_record_minimal_symbol_and_info (name, address, ms_type,
- section, bfd_section, objfile);
+ section, objfile);
}
/* Master parsing procedure for first-pass reading of file symbols
int past_first_source_file = 0;
/* List of current psymtab's include files. */
- char **psymtab_include_list;
+ const char **psymtab_include_list;
int includes_allocated;
int includes_used;
EXTR *extern_tab;
includes_allocated = 30;
includes_used = 0;
- psymtab_include_list = (char **) alloca (includes_allocated *
- sizeof (char *));
+ psymtab_include_list = (const char **) alloca (includes_allocated *
+ sizeof (const char *));
next_symbol_text_func = mdebug_next_symbol_text;
dependencies_allocated = 30;
(struct partial_symtab **) alloca (dependencies_allocated *
sizeof (struct partial_symtab *));
- last_source_file = NULL;
+ set_last_source_file (NULL);
/*
* Big plan:
{
case stProc:
/* Beginnning of Procedure */
- svalue += ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile));
break;
case stStaticProc:
/* Load time only static procs */
ms_type = mst_file_text;
- svalue += ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile));
break;
case stGlobal:
/* External symbol */
else if (SC_IS_DATA (ext_in->asym.sc))
{
ms_type = mst_data;
- svalue += ANOFFSET (objfile->section_offsets,
- SECT_OFF_DATA (objfile));
}
else if (SC_IS_BSS (ext_in->asym.sc))
{
ms_type = mst_bss;
- svalue += ANOFFSET (objfile->section_offsets,
- SECT_OFF_BSS (objfile));
}
else if (SC_IS_SBSS (ext_in->asym.sc))
{
ms_type = mst_bss;
- svalue += ANOFFSET (objfile->section_offsets,
- get_section_index (objfile, ".sbss"));
}
else
ms_type = mst_abs;
continue;
ms_type = mst_file_text;
- svalue += ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile));
}
else if (SC_IS_DATA (ext_in->asym.sc))
{
continue;
ms_type = mst_file_data;
- svalue += ANOFFSET (objfile->section_offsets,
- SECT_OFF_DATA (objfile));
}
else if (SC_IS_BSS (ext_in->asym.sc))
{
continue;
ms_type = mst_file_bss;
- svalue += ANOFFSET (objfile->section_offsets,
- SECT_OFF_BSS (objfile));
}
else if (SC_IS_SBSS (ext_in->asym.sc))
{
continue;
ms_type = mst_file_bss;
- svalue += ANOFFSET (objfile->section_offsets, sbss_sect_index);
}
else
ms_type = mst_abs;
PENDING_LIST (pst) = pending_list;
/* The way to turn this into a symtab is to call... */
- pst->read_symtab = mdebug_psymtab_to_symtab;
+ pst->read_symtab = mdebug_read_symtab;
/* Set up language for the pst.
The language from the FDR is used if it is unambigious (e.g. cfront
for (cur_sdx = 2; cur_sdx < fh->csym; cur_sdx++)
{
int type_code;
- char *namestring;
+ const char *namestring;
(*swap_sym_in) (cur_bfd,
(((char *) debug_info->external_sym)
CORE_ADDR procaddr;
long isym;
- sh.value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile));
if (sh.st == stStaticProc)
{
namestring = debug_info->ss + fh->issBase + sh.iss;
mst_file_text, sh.sc,
objfile);
}
+ sh.value += ANOFFSET (objfile->section_offsets,
+ SECT_OFF_TEXT (objfile));
procaddr = sh.value;
isym = AUX_GET_ISYM (fh->fBigendian,
case scPData:
case scXData:
namestring = debug_info->ss + fh->issBase + sh.iss;
- sh.value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_DATA (objfile));
record_minimal_symbol (namestring, sh.value,
mst_file_data, sh.sc,
objfile);
+ sh.value += ANOFFSET (objfile->section_offsets,
+ SECT_OFF_DATA (objfile));
break;
default:
/* FIXME! Shouldn't this use cases for bss,
then have the default be abs? */
namestring = debug_info->ss + fh->issBase + sh.iss;
- sh.value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_BSS (objfile));
record_minimal_symbol (namestring, sh.value,
mst_file_bss, sh.sc,
objfile);
+ sh.value += ANOFFSET (objfile->section_offsets,
+ SECT_OFF_BSS (objfile));
break;
}
}
CORE_ADDR valu;
static int prev_so_symnum = -10;
static int first_so_symnum;
- char *p;
+ const char *p;
int prev_textlow_not_set;
valu = sh.value + ANOFFSET (objfile->section_offsets,
the second the file name. If pst exists, is
empty, and has a filename ending in '/', we assume
the previous N_SO was a directory name. */
-
- p = strrchr (namestring, '/');
- if (p && *(p + 1) == '\000')
+ p = lbasename (namestring);
+ if (p != namestring && *p == '\000')
continue; /* Simply ignore directory
name SOs. */
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 && strcmp (namestring, pst->filename) == 0)
+ if (pst && filename_cmp (namestring, pst->filename) == 0)
continue;
{
int i;
for (i = 0; i < includes_used; i++)
- if (strcmp (namestring,
- psymtab_include_list[i]) == 0)
+ if (filename_cmp (namestring,
+ psymtab_include_list[i]) == 0)
{
i = -1;
break;
psymtab_include_list[includes_used++] = namestring;
if (includes_used >= includes_allocated)
{
- char **orig = psymtab_include_list;
+ const char **orig = psymtab_include_list;
- psymtab_include_list = (char **)
+ psymtab_include_list = (const char **)
alloca ((includes_allocated *= 2) *
- sizeof (char *));
+ sizeof (const char *));
memcpy (psymtab_include_list, orig,
- includes_used * sizeof (char *));
+ includes_used * sizeof (const char *));
}
continue;
}
{
char *name;
enum address_class class;
+ CORE_ADDR minsym_value;
(*swap_sym_in) (cur_bfd,
((char *) debug_info->external_sym
name = debug_info->ss + fh->issBase + sh.iss;
+ minsym_value = sh.value;
+
switch (sh.sc)
{
case scText:
int new_sdx;
case stStaticProc:
- prim_record_minimal_symbol_and_info (name, sh.value,
+ prim_record_minimal_symbol_and_info (name, minsym_value,
mst_file_text,
SECT_OFF_TEXT (objfile),
- NULL, objfile);
+ objfile);
/* FALLTHROUGH */
case stStatic: /* Variable */
if (SC_IS_DATA (sh.sc))
- prim_record_minimal_symbol_and_info (name, sh.value,
+ prim_record_minimal_symbol_and_info (name, minsym_value,
mst_file_data,
SECT_OFF_DATA (objfile),
- NULL,
objfile);
else
- prim_record_minimal_symbol_and_info (name, sh.value,
+ prim_record_minimal_symbol_and_info (name, minsym_value,
mst_file_bss,
SECT_OFF_BSS (objfile),
- NULL,
objfile);
class = LOC_STATIC;
break;
/* Link pst to FDR. end_psymtab returns NULL if the psymtab was
empty and put on the free list. */
- fdr_to_pst[f_idx].pst = end_psymtab (save_pst,
+ fdr_to_pst[f_idx].pst = end_psymtab (objfile, save_pst,
psymtab_include_list, includes_used,
-1, save_pst->texthigh,
dependency_list, dependencies_used, textlow_not_set);
The flow of control and even the memory allocation differs. FIXME. */
static void
-psymtab_to_symtab_1 (struct partial_symtab *pst, const char *filename)
+psymtab_to_symtab_1 (struct objfile *objfile,
+ struct partial_symtab *pst, const char *filename)
{
bfd_size_type external_sym_size;
bfd_size_type external_pdr_size;
gdb_flush (gdb_stdout);
}
/* We only pass the filename for debug purposes. */
- psymtab_to_symtab_1 (pst->dependencies[i],
+ psymtab_to_symtab_1 (objfile, pst->dependencies[i],
pst->dependencies[i]->filename);
}
external_pdr_size = debug_swap->external_pdr_size;
swap_sym_in = debug_swap->swap_sym_in;
swap_pdr_in = debug_swap->swap_pdr_in;
- current_objfile = pst->objfile;
+ mdebugread_objfile = objfile;
cur_fd = FDR_IDX (pst);
fh = ((cur_fd == -1)
? (FDR *) NULL
if (processing_gcc_compilation != 0)
{
- struct gdbarch *gdbarch = get_objfile_arch (pst->objfile);
+ struct gdbarch *gdbarch = get_objfile_arch (objfile);
/* This symbol table contains stabs-in-ecoff entries. */
if (fh->csym <= 2) /* FIXME, this blows psymtab->symtab ptr. */
{
- current_objfile = NULL;
+ mdebugread_objfile = NULL;
return;
}
for (cur_sdx = 2; cur_sdx < fh->csym; cur_sdx++)
would otherwise be ended twice, once in
process_one_symbol, and once after this loop. */
if (type_code == N_SO
- && last_source_file
+ && get_last_source_file ()
&& previous_stab_code != (unsigned char) N_SO
&& *name == '\000')
{
valu += ANOFFSET (pst->section_offsets,
- SECT_OFF_TEXT (pst->objfile));
+ SECT_OFF_TEXT (objfile));
previous_stab_code = N_SO;
- st = end_symtab (valu, pst->objfile,
- SECT_OFF_TEXT (pst->objfile));
+ st = end_symtab (valu, objfile,
+ SECT_OFF_TEXT (objfile));
end_stabs ();
last_symtab_ended = 1;
}
{
last_symtab_ended = 0;
process_one_symbol (type_code, 0, valu, name,
- pst->section_offsets, pst->objfile);
+ pst->section_offsets, objfile);
}
}
/* Similarly a hack. */
else if (name[0] == '#')
{
process_one_symbol (N_SLINE, 0, valu, name,
- pst->section_offsets, pst->objfile);
+ pst->section_offsets, objfile);
}
if (type_code == N_FUN)
{
procedure specific info. */
struct mdebug_extra_func_info *e =
((struct mdebug_extra_func_info *)
- obstack_alloc (¤t_objfile->objfile_obstack,
+ obstack_alloc (&mdebugread_objfile->objfile_obstack,
sizeof (struct mdebug_extra_func_info)));
struct symbol *s = new_symbol (MDEBUG_EFI_SYMBOL_NAME);
memset (e, 0, sizeof (struct mdebug_extra_func_info));
SYMBOL_DOMAIN (s) = LABEL_DOMAIN;
- SYMBOL_CLASS (s) = LOC_CONST;
- SYMBOL_TYPE (s) = objfile_type (pst->objfile)->builtin_void;
+ SYMBOL_ACLASS_INDEX (s) = LOC_CONST;
+ SYMBOL_TYPE (s) = objfile_type (objfile)->builtin_void;
SYMBOL_VALUE_BYTES (s) = (gdb_byte *) e;
e->pdr.framereg = -1;
add_symbol_to_list (s, &local_symbols);
{
/* Handle encoded stab line number. */
valu += ANOFFSET (pst->section_offsets,
- SECT_OFF_TEXT (pst->objfile));
+ SECT_OFF_TEXT (objfile));
record_line (current_subfile, sh.index,
gdbarch_addr_bits_remove (gdbarch, valu));
}
if (! last_symtab_ended)
{
- st = end_symtab (pst->texthigh, pst->objfile,
- SECT_OFF_TEXT (pst->objfile));
+ st = end_symtab (pst->texthigh, objfile,
+ SECT_OFF_TEXT (objfile));
end_stabs ();
}
{
/* This symbol table contains ordinary ecoff entries. */
- int maxlines;
+ int maxlines, size;
EXTR *ext_ptr;
if (fh == 0)
{
maxlines = 0;
- st = new_symtab ("unknown", 0, pst->objfile);
+ st = new_symtab ("unknown", 0, objfile);
}
else
{
maxlines = 2 * fh->cline;
- st = new_symtab (pst->filename, maxlines, pst->objfile);
+ st = new_symtab (pst->filename, maxlines, objfile);
/* The proper language was already determined when building
the psymtab, use it. */
psymtab_language = st->language;
- lines = LINETABLE (st);
+ lines = SYMTAB_LINETABLE (st);
/* Get a new lexical context. */
c = parse_symbol (&sh,
debug_info->external_aux + fh->iauxBase,
sym_ptr, fh->fBigendian,
- pst->section_offsets, pst->objfile);
+ pst->section_offsets, objfile);
sym_ptr += c * external_sym_size;
}
}
}
- LINETABLE (st) = lines;
+ size = lines->nitems;
+ if (size > 1)
+ --size;
+ SYMTAB_LINETABLE (st)
+ = obstack_copy (&mdebugread_objfile->objfile_obstack,
+ lines,
+ (sizeof (struct linetable)
+ + size * sizeof (lines->item)));
+ xfree (lines);
/* .. and our share of externals.
XXX use the global list to speed up things here. How?
ext_ptr = PST_PRIVATE (pst)->extern_tab;
for (i = PST_PRIVATE (pst)->extern_count; --i >= 0; ext_ptr++)
parse_external (ext_ptr, fh->fBigendian,
- pst->section_offsets, pst->objfile);
+ pst->section_offsets, objfile);
/* If there are undefined symbols, tell the user.
The alpha has an undefined symbol for every symbol that is
if (info_verbose && n_undef_symbols)
{
printf_filtered (_("File %s contains %d unresolved references:"),
- st->filename, n_undef_symbols);
+ symtab_to_filename_for_display (st),
+ n_undef_symbols);
printf_filtered ("\n\t%4d variables\n\t%4d "
"procedures\n\t%4d labels\n",
n_undef_vars, n_undef_procs, n_undef_labels);
}
pop_parse_stack ();
- st->primary = 1;
+ set_symtab_primary (st, 1);
sort_blocks (st);
}
/* Now link the psymtab and the symtab. */
pst->symtab = st;
- current_objfile = NULL;
+ mdebugread_objfile = NULL;
}
\f
/* Ancillary parsing procedures. */
{
*pname = "<undefined>";
*tpp = init_type (type_code, 0, TYPE_FLAG_STUB,
- (char *) NULL, current_objfile);
+ (char *) NULL, mdebugread_objfile);
return result;
}
{
case btVoid:
*tpp = init_type (type_code, 0, 0, (char *) NULL,
- current_objfile);
+ mdebugread_objfile);
*pname = "<undefined>";
break;
_("illegal bt %d in forward typedef for %s"), tir.bt,
sym_name);
*tpp = init_type (type_code, 0, 0, (char *) NULL,
- current_objfile);
+ mdebugread_objfile);
break;
}
return result;
has not been parsed yet.
Initialize the type only, it will be filled in when
it's definition is parsed. */
- *tpp = init_type (type_code, 0, 0, (char *) NULL, current_objfile);
+ *tpp = init_type (type_code, 0, 0, (char *) NULL, mdebugread_objfile);
}
add_pending (fh, esh, *tpp);
}
keeping the symtab sorted. */
static struct symbol *
-mylookup_symbol (char *name, struct block *block,
+mylookup_symbol (char *name, const struct block *block,
domain_enum domain, enum address_class class)
{
- struct dict_iterator iter;
+ struct block_iterator iter;
int inc;
struct symbol *sym;
static void
add_block (struct block *b, struct symtab *s)
{
- struct blockvector *bv = BLOCKVECTOR (s);
+ /* Cast away "const", but that's ok because we're building the
+ symtab and blockvector here. */
+ struct blockvector *bv = (struct blockvector *) BLOCKVECTOR (s);
bv = (struct blockvector *) xrealloc ((void *) bv,
(sizeof (struct blockvector)
static void
sort_blocks (struct symtab *s)
{
- struct blockvector *bv = BLOCKVECTOR (s);
+ /* We have to cast away const here, but this is ok because we're
+ constructing the blockvector in this code. */
+ struct blockvector *bv = (struct blockvector *) BLOCKVECTOR (s);
- if (BLOCKVECTOR_NBLOCKS (bv) <= 2)
+ if (BLOCKVECTOR_NBLOCKS (bv) <= FIRST_LOCAL_BLOCK)
{
/* Cosmetic */
if (BLOCK_END (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK)) == 0)
* are very different. It would be nice to find a reliable test
* to detect -O3 images in advance.
*/
- if (BLOCKVECTOR_NBLOCKS (bv) > 3)
+ if (BLOCKVECTOR_NBLOCKS (bv) > FIRST_LOCAL_BLOCK + 1)
qsort (&BLOCKVECTOR_BLOCK (bv, FIRST_LOCAL_BLOCK),
BLOCKVECTOR_NBLOCKS (bv) - FIRST_LOCAL_BLOCK,
sizeof (struct block *),
new_symtab (const char *name, int maxlines, struct objfile *objfile)
{
struct symtab *s = allocate_symtab (name, objfile);
+ struct blockvector *bv;
- LINETABLE (s) = new_linetable (maxlines);
+ SYMTAB_LINETABLE (s) = new_linetable (maxlines);
/* All symtabs must have at least two blocks. */
- BLOCKVECTOR (s) = new_bvect (2);
- BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK)
- = new_block (NON_FUNCTION_BLOCK);
- BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK)
- = new_block (NON_FUNCTION_BLOCK);
- BLOCK_SUPERBLOCK (BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK)) =
- BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK);
-
- s->free_code = free_linetable;
+ bv = new_bvect (2);
+ BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK) = new_block (NON_FUNCTION_BLOCK);
+ BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK) = new_block (NON_FUNCTION_BLOCK);
+ BLOCK_SUPERBLOCK (BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK)) =
+ BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
+ BLOCKVECTOR (s) = bv;
+
s->debugformat = "ECOFF";
return (s);
}
PENDING_LIST (psymtab) = pending_list;
/* The way to turn this into a symtab is to call... */
- psymtab->read_symtab = mdebug_psymtab_to_symtab;
+ psymtab->read_symtab = mdebug_read_symtab;
return (psymtab);
}
{
struct linetable *l;
- size = (size - 1) * sizeof (l->item) + sizeof (struct linetable);
+ if (size > 1)
+ --size;
+ size = size * sizeof (l->item) + sizeof (struct linetable);
l = (struct linetable *) xmalloc (size);
l->nitems = 0;
return l;
static struct symbol *
new_symbol (char *name)
{
- struct symbol *s = ((struct symbol *)
- obstack_alloc (¤t_objfile->objfile_obstack,
- sizeof (struct symbol)));
+ struct symbol *s = allocate_symbol (mdebugread_objfile);
- memset (s, 0, sizeof (*s));
- SYMBOL_SET_LANGUAGE (s, psymtab_language);
- SYMBOL_SET_NAMES (s, name, strlen (name), 1, current_objfile);
+ SYMBOL_SET_LANGUAGE (s, psymtab_language,
+ &mdebugread_objfile->objfile_obstack);
+ SYMBOL_SET_NAMES (s, name, strlen (name), 1, mdebugread_objfile);
return s;
}
{
struct type *t;
- t = alloc_type (current_objfile);
+ t = alloc_type (mdebugread_objfile);
TYPE_NAME (t) = name;
INIT_CPLUS_SPECIFIC (t);
return t;
_initialize_mdebugread (void)
{
basic_type_data = register_objfile_data ();
+
+ mdebug_register_index
+ = register_symbol_register_impl (LOC_REGISTER, &mdebug_register_funcs);
+ mdebug_regparm_index
+ = register_symbol_register_impl (LOC_REGPARM_ADDR, &mdebug_register_funcs);
}