aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPer Bothner <per@bothner.com>1996-01-12 07:16:20 +0000
committerPer Bothner <per@bothner.com>1996-01-12 07:16:20 +0000
commit7ef893139cfc56fba6db4909dfbcbe210d7e8143 (patch)
treeeba9b2a30953cb278aff5ceb9455ad5e129b52d6
parent34cfa2dab5a0d1f6c53b24847d6fd590c7a618c0 (diff)
downloadgdb-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/ChangeLog8
-rw-r--r--gdb/gdbtypes.c13
-rw-r--r--gdb/symfile.c14
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;