diff options
author | Per Bothner <per@bothner.com> | 1996-01-12 07:16:20 +0000 |
---|---|---|
committer | Per Bothner <per@bothner.com> | 1996-01-12 07:16:20 +0000 |
commit | 7ef893139cfc56fba6db4909dfbcbe210d7e8143 (patch) | |
tree | eba9b2a30953cb278aff5ceb9455ad5e129b52d6 | |
parent | 34cfa2dab5a0d1f6c53b24847d6fd590c7a618c0 (diff) | |
download | gdb-7ef893139cfc56fba6db4909dfbcbe210d7e8143.zip gdb-7ef893139cfc56fba6db4909dfbcbe210d7e8143.tar.gz gdb-7ef893139cfc56fba6db4909dfbcbe210d7e8143.tar.bz2 |
* 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.
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/gdbtypes.c | 13 | ||||
-rw-r--r-- | gdb/symfile.c | 14 |
3 files changed, 32 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 99a3767..83a9f26 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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> * stabsread.c (read_struct_type): Trivial simplification. diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 366ab34..a21f959 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 dd10f5f..7782a04 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; |