* symfile.c (decrement_reading_symtab): New function.

* symfile.c, symtab.h (currently_reading_symtab):  New variable.
	* symfile.c (psymtab_to_symtab):  Adjust currently_reading_symtab.
	* gdbtypes.c (check_typedef):  Don't call lookup_symbol if
	currently_reading_symtab (since that could infinitely recurse).
This fixes PR chill/8793.
This commit is contained in:
Per Bothner 1996-01-12 07:16:20 +00:00
parent 34cfa2dab5
commit 7ef893139c
3 changed files with 32 additions and 3 deletions

View File

@ -1,3 +1,11 @@
Thu Jan 11 23:13:24 1996 Per Bothner <bothner@cygnus.com>
* symfile.c (decrement_reading_symtab): New function.
* symfile.c, symtab.h (currently_reading_symtab): New variable.
* symfile.c (psymtab_to_symtab): Adjust currently_reading_symtab.
* gdbtypes.c (check_typedef): Don't call lookup_symbol if
currently_reading_symtab (since that could infinitely recurse).
Thu Jan 11 17:21:25 1996 Per Bothner <bothner@kalessin.cygnus.com> Thu Jan 11 17:21:25 1996 Per Bothner <bothner@kalessin.cygnus.com>
* stabsread.c (read_struct_type): Trivial simplification. * stabsread.c (read_struct_type): Trivial simplification.

View File

@ -878,12 +878,19 @@ check_typedef (type)
{ {
if (!TYPE_TARGET_TYPE (type)) if (!TYPE_TARGET_TYPE (type))
{ {
char* name = type_name_no_tag (type); char* name;
struct symbol *sym;
/* It is dangerous to call lookup_symbol if we are currently
reading a symtab. Infinite recursion is one danger. */
if (currently_reading_symtab)
return type;
name = type_name_no_tag (type);
/* FIXME: shouldn't we separately check the TYPE_NAME and the /* FIXME: shouldn't we separately check the TYPE_NAME and the
TYPE_TAG_NAME, and look in STRUCT_NAMESPACE and/or VAR_NAMESPACE TYPE_TAG_NAME, and look in STRUCT_NAMESPACE and/or VAR_NAMESPACE
as appropriate? (this code was written before TYPE_NAME and as appropriate? (this code was written before TYPE_NAME and
TYPE_TAG_NAME were separate). */ TYPE_TAG_NAME were separate). */
struct symbol *sym;
if (name == NULL) if (name == NULL)
{ {
complain (&stub_noname_complaint); complain (&stub_noname_complaint);
@ -899,7 +906,7 @@ check_typedef (type)
type = TYPE_TARGET_TYPE (type); type = TYPE_TARGET_TYPE (type);
} }
if (TYPE_FLAGS(type) & TYPE_FLAG_STUB) if ((TYPE_FLAGS(type) & TYPE_FLAG_STUB) && ! currently_reading_symtab)
{ {
char* name = type_name_no_tag (type); char* name = type_name_no_tag (type);
/* FIXME: shouldn't we separately check the TYPE_NAME and the /* FIXME: shouldn't we separately check the TYPE_NAME and the

View File

@ -267,6 +267,17 @@ obconcat (obstackp, s1, s2, s3)
return val; return val;
} }
/* True if we are nested inside psymtab_to_symtab. */
int currently_reading_symtab = 0;
static int
decrement_reading_symtab (dummy)
void *dummy;
{
currently_reading_symtab--;
}
/* Get the symbol table that corresponds to a partial_symtab. /* Get the symbol table that corresponds to a partial_symtab.
This is fast after the first time you do it. In fact, there This is fast after the first time you do it. In fact, there
is an even faster macro PSYMTAB_TO_SYMTAB that does the fast is an even faster macro PSYMTAB_TO_SYMTAB that does the fast
@ -283,7 +294,10 @@ psymtab_to_symtab (pst)
/* If it has not yet been read in, read it. */ /* If it has not yet been read in, read it. */
if (!pst->readin) if (!pst->readin)
{ {
struct cleanup *back_to = make_cleanup (decrement_reading_symtab, NULL);
currently_reading_symtab++;
(*pst->read_symtab) (pst); (*pst->read_symtab) (pst);
do_cleanups (back_to);
} }
return pst->symtab; return pst->symtab;