* printcmd.c (address_info): Use fprintf_symbol_filtered
authorJeff Law <law@redhat.com>
Thu, 11 Nov 1993 23:27:21 +0000 (23:27 +0000)
committerJeff Law <law@redhat.com>
Thu, 11 Nov 1993 23:27:21 +0000 (23:27 +0000)
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
gdb/partial-stab.h
gdb/printcmd.c
gdb/stabsread.c

index bba4e31..74f58f8 100644 (file)
@@ -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
index d7a9b42..bfefbcc 100644 (file)
@@ -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':
index ce6b966..87c20a2 100644 (file)
@@ -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);
 
index 93800b4..2ebaa6c 100644 (file)
@@ -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);