From 7ef893139cfc56fba6db4909dfbcbe210d7e8143 Mon Sep 17 00:00:00 2001 From: Per Bothner Date: Fri, 12 Jan 1996 07:16:20 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 8 ++++++++ gdb/gdbtypes.c | 13 ++++++++++--- gdb/symfile.c | 14 ++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 99a3767d6a..83a9f26e98 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 366ab34a71..a21f9598c0 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 dd10f5fddd..7782a042de 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;