* 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.
+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>
* stabsread.c (read_struct_type): Trivial simplification.
{
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
TYPE_TAG_NAME, and look in STRUCT_NAMESPACE and/or VAR_NAMESPACE
as appropriate? (this code was written before TYPE_NAME and
TYPE_TAG_NAME were separate). */
- struct symbol *sym;
if (name == NULL)
{
complain (&stub_noname_complaint);
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);
/* FIXME: shouldn't we separately check the TYPE_NAME and the
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.
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
/* If it has not yet been read in, read it. */
if (!pst->readin)
{
+ struct cleanup *back_to = make_cleanup (decrement_reading_symtab, NULL);
+ currently_reading_symtab++;
(*pst->read_symtab) (pst);
+ do_cleanups (back_to);
}
return pst->symtab;