From: Per Bothner Date: Fri, 12 Jan 1996 07:16:20 +0000 (+0000) Subject: * symfile.c (decrement_reading_symtab): New function. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7ef893139cfc56fba6db4909dfbcbe210d7e8143;p=binutils-gdb.git * 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 99a3767d6a6..83a9f26e98c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +Thu Jan 11 23:13:24 1996 Per Bothner + + * 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 * stabsread.c (read_struct_type): Trivial simplification. diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 366ab34a713..a21f9598c05 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -878,12 +878,19 @@ check_typedef (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 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); @@ -899,7 +906,7 @@ check_typedef (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); /* FIXME: shouldn't we separately check the TYPE_NAME and the diff --git a/gdb/symfile.c b/gdb/symfile.c index dd10f5fddde..7782a042def 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -267,6 +267,17 @@ obconcat (obstackp, s1, s2, s3) 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 @@ -283,7 +294,10 @@ psymtab_to_symtab (pst) /* 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;