From 91f87016039cec17692114935282d7296223ec24 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Thu, 11 Nov 1993 23:27:21 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 14 +++++ gdb/partial-stab.h | 139 +++++++++++++++++++++++++++++---------------- gdb/printcmd.c | 20 +++++-- gdb/stabsread.c | 11 ++++ 4 files changed, 130 insertions(+), 54 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index bba4e3140c..74f58f8bab 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 d7a9b42576..bfefbcc665 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 ce6b96623b..87c20a2725 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 93800b435e..2ebaa6cc80 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); -- 2.34.1