aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog14
-rw-r--r--gdb/partial-stab.h139
-rw-r--r--gdb/printcmd.c20
-rw-r--r--gdb/stabsread.c11
4 files changed, 130 insertions, 54 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index bba4e31..74f58f8 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+Thu Nov 11 15:22:20 1993 Jeffrey A. Law (law@snake.cs.utah.edu)
+
+ * printcmd.c (address_info): Use fprintf_symbol_filtered
+ to print the symbol name.
+
+ * stabsread.c (define_symbol): Handle cfront lossage for
+ struct/union/enums and typedefs.
+
+ * partial-stab.h (case N_BINCL): Update psymtab_language
+ as appropriate when changing subfiles.
+ (case N_SOL): Update psymtab_language as appropriate when
+ changing subfiles. Add typedef for structs, unions, and enums
+ when processing C++ files.
+
Thu Nov 11 13:18:47 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
* README: Remove information on languages and just cite the (newly
diff --git a/gdb/partial-stab.h b/gdb/partial-stab.h
index d7a9b42..bfefbcc 100644
--- a/gdb/partial-stab.h
+++ b/gdb/partial-stab.h
@@ -240,69 +240,96 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
}
case N_BINCL:
+ {
#ifdef DBXREAD_ONLY
- /* Add this bincl to the bincl_list for future EXCLs. No
- need to save the string; it'll be around until
- read_dbx_symtab function returns */
+ enum language tmp_language;
+ /* Add this bincl to the bincl_list for future EXCLs. No
+ need to save the string; it'll be around until
+ read_dbx_symtab function returns */
- SET_NAMESTRING();
+ SET_NAMESTRING();
+
+ tmp_language = deduce_language_from_filename (namestring);
+
+ /* Only change the psymtab's language if we've learned
+ something useful (eg. tmp_language is not language_unknown).
+ In addition, to match what start_subfile does, never change
+ from C++ to C. */
+ if (tmp_language != language_unknown
+ && (tmp_language != language_c
+ || psymtab_language != language_cplus))
+ psymtab_language = tmp_language;
- add_bincl_to_list (pst, namestring, CUR_SYMBOL_VALUE);
+ add_bincl_to_list (pst, namestring, CUR_SYMBOL_VALUE);
- /* Mark down an include file in the current psymtab */
+ /* Mark down an include file in the current psymtab */
- goto record_include_file;
+ goto record_include_file;
#else /* DBXREAD_ONLY */
- continue;
+ continue;
#endif
+ }
case N_SOL:
- /* Mark down an include file in the current psymtab */
-
- SET_NAMESTRING();
-
- /* In C++, one may expect the same filename to come round many
- times, when code is coming alternately from the main file
- and from inline functions in other files. So I check to see
- if this is a file we've seen before -- either the main
- source file, or a previously included file.
-
- This seems to be a lot of time to be spending on N_SOL, but
- things like "break c-exp.y:435" need to work (I
- suppose the psymtab_include_list could be hashed or put
- in a binary tree, if profiling shows this is a major hog). */
- if (pst && STREQ (namestring, pst->filename))
- continue;
{
- register int i;
- for (i = 0; i < includes_used; i++)
- if (STREQ (namestring, psymtab_include_list[i]))
- {
- i = -1;
- break;
- }
- if (i == -1)
+ enum language tmp_language;
+ /* Mark down an include file in the current psymtab */
+
+ SET_NAMESTRING();
+
+ tmp_language = deduce_language_from_filename (namestring);
+
+ /* Only change the psymtab's language if we've learned
+ something useful (eg. tmp_language is not language_unknown).
+ In addition, to match what start_subfile does, never change
+ from C++ to C. */
+ if (tmp_language != language_unknown
+ && (tmp_language != language_c
+ || psymtab_language != language_cplus))
+ psymtab_language = tmp_language;
+
+ /* In C++, one may expect the same filename to come round many
+ times, when code is coming alternately from the main file
+ and from inline functions in other files. So I check to see
+ if this is a file we've seen before -- either the main
+ source file, or a previously included file.
+
+ This seems to be a lot of time to be spending on N_SOL, but
+ things like "break c-exp.y:435" need to work (I
+ suppose the psymtab_include_list could be hashed or put
+ in a binary tree, if profiling shows this is a major hog). */
+ if (pst && STREQ (namestring, pst->filename))
continue;
- }
-
-#ifdef DBXREAD_ONLY
- record_include_file:
-#endif
-
- psymtab_include_list[includes_used++] = namestring;
- if (includes_used >= includes_allocated)
{
- char **orig = psymtab_include_list;
-
- psymtab_include_list = (char **)
- alloca ((includes_allocated *= 2) *
- sizeof (char *));
- memcpy ((PTR)psymtab_include_list, (PTR)orig,
- includes_used * sizeof (char *));
+ register int i;
+ for (i = 0; i < includes_used; i++)
+ if (STREQ (namestring, psymtab_include_list[i]))
+ {
+ i = -1;
+ break;
+ }
+ if (i == -1)
+ continue;
}
- continue;
-
+
+#ifdef DBXREAD_ONLY
+ record_include_file:
+#endif
+
+ psymtab_include_list[includes_used++] = namestring;
+ if (includes_used >= includes_allocated)
+ {
+ char **orig = psymtab_include_list;
+
+ psymtab_include_list = (char **)
+ alloca ((includes_allocated *= 2) *
+ sizeof (char *));
+ memcpy ((PTR)psymtab_include_list, (PTR)orig,
+ includes_used * sizeof (char *));
+ }
+ continue;
+ }
case N_LSYM: /* Typedef or automatic variable. */
case N_STSYM: /* Data seg var -- static */
case N_LCSYM: /* BSS " */
@@ -375,6 +402,20 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
objfile);
p += 1;
}
+ /* The semantics of C++ state that "struct foo { ... }"
+ also defines a typedef for "foo". Unfortuantely, cfront
+ never makes the typedef when translating from C++ to C.
+ We make the typedef here so that "ptype foo" works as
+ expected for cfront translated code. */
+ else if (psymtab_language == language_cplus)
+ {
+ /* Also a typedef with the same name. */
+ ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
+ VAR_NAMESPACE, LOC_TYPEDEF,
+ objfile->static_psymbols,
+ CUR_SYMBOL_VALUE, psymtab_language,
+ objfile);
+ }
}
goto check_enum;
case 't':
diff --git a/gdb/printcmd.c b/gdb/printcmd.c
index ce6b966..87c20a2 100644
--- a/gdb/printcmd.c
+++ b/gdb/printcmd.c
@@ -883,22 +883,32 @@ address_info (exp, from_tty)
{
if (is_a_field_of_this)
{
- printf_unfiltered ("Symbol \"%s\" is a field of the local class variable `this'\n", exp);
+ printf_unfiltered ("Symbol \"");
+ fprintf_symbol_filtered (gdb_stdout, exp,
+ current_language->la_language, DMGL_ANSI);
+ printf_unfiltered ("\" is a field of the local class variable `this'\n");
return;
}
msymbol = lookup_minimal_symbol (exp, (struct objfile *) NULL);
if (msymbol != NULL)
- printf_unfiltered ("Symbol \"%s\" is at %s in a file compiled without debugging.\n",
- exp,
- local_hex_string((unsigned long) SYMBOL_VALUE_ADDRESS (msymbol)));
+ {
+ printf_unfiltered ("Symbol \"");
+ fprintf_symbol_filtered (gdb_stdout, exp,
+ current_language->la_language, DMGL_ANSI);
+ printf_unfiltered ("\" is at %s in a file compiled without debugging.\n",
+ local_hex_string((unsigned long) SYMBOL_VALUE_ADDRESS (msymbol)));
+ }
else
error ("No symbol \"%s\" in current context.", exp);
return;
}
- printf_unfiltered ("Symbol \"%s\" is ", SYMBOL_NAME (sym));
+ printf_unfiltered ("Symbol \"");
+ fprintf_symbol_filtered (gdb_stdout, SYMBOL_NAME (sym),
+ current_language->la_language, DMGL_ANSI);
+ printf_unfiltered ("\" is ", SYMBOL_NAME (sym));
val = SYMBOL_VALUE (sym);
basereg = SYMBOL_BASEREG (sym);
diff --git a/gdb/stabsread.c b/gdb/stabsread.c
index 93800b4..2ebaa6c 100644
--- a/gdb/stabsread.c
+++ b/gdb/stabsread.c
@@ -1035,6 +1035,17 @@ define_symbol (valu, string, desc, type, objfile)
strlen (SYMBOL_NAME (sym)),
&objfile -> symbol_obstack);
}
+ /* The semantics of C++ state that "struct foo { ... }" also defines
+ a typedef for "foo". Unfortunately, cfront never makes the typedef
+ when translating C++ into C. We make the typedef here so that
+ "ptype foo" works as expected for cfront translated code. */
+ else if (current_subfile->language == language_cplus)
+ {
+ synonym = 1;
+ type_synonym_name = obsavestring (SYMBOL_NAME (sym),
+ strlen (SYMBOL_NAME (sym)),
+ &objfile -> symbol_obstack);
+ }
SYMBOL_TYPE (sym) = read_type (&p, objfile);