mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-18 12:24:38 +08:00
* mipsread.c (parse_partial_symbols): Use language from FDR if it
is unambigous. Patch from ptf@delcam.co.uk (Paul Flinders). * mipsread.c (ecoff_symfile_info): New struct to hold the global pending_list. * mipsread.c (mipscoff_symfile_init, parse_partial_symbols): Allocate the global pending list and link it to the objfile. * mipsread.c (is_pending_symbol, add_pending): Use global pending list from objfile. Allocate pending list entries from the psymbol_obstack. * mipsread.c (free_pending): Remove. The pending list is now freed when the psymbol_obstack is freed. * mipsread.c (psymtab_to_symtab1): Remove pending list allocation, the global pending list is used now. * mipsread.c (parse_partial_symbols): Skip only the first file indirect entry when building the dependency list.
This commit is contained in:
parent
d538b510a0
commit
e7e02420a7
@ -1,3 +1,21 @@
|
||||
Wed Sep 1 05:05:53 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
|
||||
|
||||
* mipsread.c (parse_partial_symbols): Use language from FDR if it
|
||||
is unambigous. Patch from ptf@delcam.co.uk (Paul Flinders).
|
||||
* mipsread.c (ecoff_symfile_info): New struct to hold the global
|
||||
pending_list.
|
||||
* mipsread.c (mipscoff_symfile_init, parse_partial_symbols):
|
||||
Allocate the global pending list and link it to the objfile.
|
||||
* mipsread.c (is_pending_symbol, add_pending): Use global pending
|
||||
list from objfile. Allocate pending list entries from the
|
||||
psymbol_obstack.
|
||||
* mipsread.c (free_pending): Remove. The pending list is now
|
||||
freed when the psymbol_obstack is freed.
|
||||
* mipsread.c (psymtab_to_symtab1): Remove pending list allocation,
|
||||
the global pending list is used now.
|
||||
* mipsread.c (parse_partial_symbols): Skip only the first
|
||||
file indirect entry when building the dependency list.
|
||||
|
||||
Tue Aug 31 15:01:27 1993 K. Richard Pixley (rich@sendai.cygnus.com)
|
||||
|
||||
Break dcache code out of remote.c.
|
||||
|
112
gdb/mipsread.c
112
gdb/mipsread.c
@ -110,6 +110,17 @@ typedef struct mips_extra_func_info {
|
||||
#include "expression.h"
|
||||
#include "language.h" /* Needed inside partial-stab.h */
|
||||
|
||||
/* Information is passed among various mipsread routines for accessing
|
||||
symbol files. A pointer to this structure is kept in the sym_private
|
||||
field of the objfile struct. */
|
||||
|
||||
struct ecoff_symfile_info {
|
||||
struct mips_pending **pending_list;
|
||||
};
|
||||
#define ECOFF_SYMFILE_INFO(o) ((struct ecoff_symfile_info *)((o)->sym_private))
|
||||
#define ECOFF_PENDING_LIST(o) (ECOFF_SYMFILE_INFO(o)->pending_list)
|
||||
|
||||
|
||||
/* Each partial symbol table entry contains a pointer to private data
|
||||
for the read_symtab() function to use when expanding a partial
|
||||
symbol table entry to a full symbol table entry.
|
||||
@ -128,7 +139,6 @@ struct symloc
|
||||
bfd *cur_bfd;
|
||||
EXTR *extern_tab; /* Pointer to external symbols for this file. */
|
||||
int extern_count; /* Size of extern_tab. */
|
||||
struct mips_pending **pending_list;
|
||||
enum language pst_language;
|
||||
};
|
||||
|
||||
@ -362,7 +372,8 @@ mipscoff_symfile_init (objfile)
|
||||
{
|
||||
mfree (objfile->md, objfile->sym_private);
|
||||
}
|
||||
objfile->sym_private = NULL;
|
||||
objfile->sym_private = (PTR)
|
||||
xmmalloc (objfile->md, sizeof (struct ecoff_symfile_info));
|
||||
}
|
||||
|
||||
static void
|
||||
@ -613,12 +624,12 @@ pop_parse_stack ()
|
||||
duplications we keep a quick fixup table, an array
|
||||
of lists of references indexed by file descriptor */
|
||||
|
||||
static struct mips_pending
|
||||
struct mips_pending
|
||||
{
|
||||
struct mips_pending *next; /* link */
|
||||
char *s; /* the unswapped symbol */
|
||||
struct type *t; /* its partial type descriptor */
|
||||
} **pending_list;
|
||||
};
|
||||
|
||||
|
||||
/* Check whether we already saw symbol SH in file FH as undefined */
|
||||
@ -630,6 +641,7 @@ is_pending_symbol (fh, sh)
|
||||
{
|
||||
int f_idx = fh - ecoff_data (cur_bfd)->fdr;
|
||||
register struct mips_pending *p;
|
||||
struct mips_pending **pending_list = ECOFF_PENDING_LIST (current_objfile);
|
||||
|
||||
/* Linear search is ok, list is typically no more than 10 deep */
|
||||
for (p = pending_list[f_idx]; p; p = p->next)
|
||||
@ -652,35 +664,17 @@ add_pending (fh, sh, t)
|
||||
/* Make sure we do not make duplicates */
|
||||
if (!p)
|
||||
{
|
||||
p = (struct mips_pending *) xmalloc (sizeof (*p));
|
||||
struct mips_pending **pending_list = ECOFF_PENDING_LIST (current_objfile);
|
||||
|
||||
p = ((struct mips_pending *)
|
||||
obstack_alloc (¤t_objfile->psymbol_obstack,
|
||||
sizeof (struct mips_pending)));
|
||||
p->s = sh;
|
||||
p->t = t;
|
||||
p->next = pending_list[f_idx];
|
||||
pending_list[f_idx] = p;
|
||||
}
|
||||
}
|
||||
|
||||
/* Throw away undef entries when done with file index F_IDX */
|
||||
/* FIXME -- storage leak. This is never called!!! --gnu */
|
||||
|
||||
#if 0
|
||||
|
||||
static void
|
||||
free_pending (f_idx)
|
||||
int f_idx;
|
||||
{
|
||||
register struct mips_pending *p, *q;
|
||||
|
||||
for (p = pending_list[f_idx]; p; p = q)
|
||||
{
|
||||
q = p->next;
|
||||
free ((PTR) p);
|
||||
}
|
||||
pending_list[f_idx] = 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/* Parsing Routines proper. */
|
||||
@ -2002,6 +1996,14 @@ parse_partial_symbols (objfile, section_offsets)
|
||||
FDR_IDX (pst) = -1;
|
||||
}
|
||||
|
||||
/* Allocate the global pending list. */
|
||||
ECOFF_PENDING_LIST (objfile) =
|
||||
((struct mips_pending **)
|
||||
obstack_alloc (&objfile->psymbol_obstack,
|
||||
hdr->ifdMax * sizeof (struct mips_pending *)));
|
||||
memset ((PTR) ECOFF_PENDING_LIST (objfile), 0,
|
||||
hdr->ifdMax * sizeof (struct mips_pending *));
|
||||
|
||||
/* Pass 0 over external syms: swap them in. */
|
||||
ext_block = (EXTR *) xmalloc (hdr->iextMax * sizeof (EXTR));
|
||||
make_cleanup (free, ext_block);
|
||||
@ -2102,15 +2104,28 @@ parse_partial_symbols (objfile, section_offsets)
|
||||
/* The way to turn this into a symtab is to call... */
|
||||
pst->read_symtab = mipscoff_psymtab_to_symtab;
|
||||
|
||||
/* Set up language for the pst. Native ecoff has every header file in
|
||||
a separate FDR. deduce_language_from_filename will return
|
||||
language_unknown for a header file, which is not what we want.
|
||||
/* Set up language for the pst.
|
||||
The language from the FDR is used if it is unambigious (e.g. cfront
|
||||
with native cc and g++ will set the language to C).
|
||||
Otherwise we have to deduce the language from the filename.
|
||||
Native ecoff has every header file in a separate FDR, so
|
||||
deduce_language_from_filename will return language_unknown for
|
||||
a header file, which is not what we want.
|
||||
But the FDRs for the header files are after the FDR for the source
|
||||
file, so we can assign the language of the source file to the
|
||||
following header files. Then we save the language in the private
|
||||
pst data so that we can reuse it when building symtabs. */
|
||||
prev_language = psymtab_language;
|
||||
psymtab_language = deduce_language_from_filename (fdr_name (fh));
|
||||
|
||||
switch (fh->lang)
|
||||
{
|
||||
case langCplusplusV2:
|
||||
psymtab_language = language_cplus;
|
||||
break;
|
||||
default:
|
||||
psymtab_language = deduce_language_from_filename (fdr_name (fh));
|
||||
break;
|
||||
}
|
||||
if (psymtab_language == language_unknown)
|
||||
psymtab_language = prev_language;
|
||||
PST_PRIVATE (pst)->pst_language = psymtab_language;
|
||||
@ -2392,7 +2407,6 @@ parse_partial_symbols (objfile, section_offsets)
|
||||
/* Now scan the FDRs for dependencies */
|
||||
for (f_idx = 0; f_idx < hdr->ifdMax; f_idx++)
|
||||
{
|
||||
int s_id0 = 0;
|
||||
fh = f_idx + ecoff_data (cur_bfd)->fdr;
|
||||
pst = fdr_to_pst[f_idx].pst;
|
||||
|
||||
@ -2403,31 +2417,15 @@ parse_partial_symbols (objfile, section_offsets)
|
||||
if (fh->crfd <= 1)
|
||||
continue;
|
||||
|
||||
if (fh->cpd == 0)
|
||||
{ /* If there are no functions defined here ... */
|
||||
/* ...then presumably a .h file: drop reverse depends .h->.c */
|
||||
for (; s_id0 < fh->crfd; s_id0++)
|
||||
{
|
||||
RFDT rh;
|
||||
|
||||
(*swap_rfd_in) (cur_bfd,
|
||||
((char *) ecoff_data (cur_bfd)->external_rfd
|
||||
+ (fh->rfdBase + s_id0) * external_rfd_size),
|
||||
&rh);
|
||||
if (rh == f_idx)
|
||||
{
|
||||
s_id0++; /* Skip self-dependency */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Skip the first file indirect entry as it is a self dependency
|
||||
for source files or a reverse .h -> .c dependency for header files. */
|
||||
pst->number_of_dependencies = 0;
|
||||
pst->dependencies =
|
||||
((struct partial_symtab **)
|
||||
obstack_alloc (&objfile->psymbol_obstack,
|
||||
((fh->crfd - s_id0)
|
||||
((fh->crfd - 1)
|
||||
* sizeof (struct partial_symtab *))));
|
||||
for (s_idx = s_id0; s_idx < fh->crfd; s_idx++)
|
||||
for (s_idx = 1; s_idx < fh->crfd; s_idx++)
|
||||
{
|
||||
RFDT rh;
|
||||
|
||||
@ -2441,7 +2439,7 @@ parse_partial_symbols (objfile, section_offsets)
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Skip self-dependency. */
|
||||
/* Skip self dependencies of header files. */
|
||||
if (rh == f_idx)
|
||||
continue;
|
||||
|
||||
@ -2681,14 +2679,6 @@ psymtab_to_symtab_1 (pst, filename)
|
||||
psymtab_language = st->language;
|
||||
|
||||
lines = LINETABLE (st);
|
||||
pending_list = PST_PRIVATE (pst)->pending_list;
|
||||
if (pending_list == 0)
|
||||
{
|
||||
pending_list = ((struct mips_pending **)
|
||||
xzalloc (ecoff_data (cur_bfd)->symbolic_header.ifdMax
|
||||
* sizeof (struct mips_pending *)));
|
||||
PST_PRIVATE (pst)->pending_list = pending_list;
|
||||
}
|
||||
|
||||
/* Get a new lexical context */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user