Lint fixes from Paul Eggert (eggert@twinsun.com):
[deliverable/binutils-gdb.git] / gdb / symfile.c
index 21ead48d5184980ab2c146b9127d41a864d2daee..06bce27a034906cdc7d01f199f9938537cee7c29 100644 (file)
@@ -29,6 +29,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "objfiles.h"
 #include "gdbcmd.h"
 #include "breakpoint.h"
+#include "language.h"
+#include "complaints.h"
+#include "demangle.h"
 
 #include <obstack.h>
 #include <assert.h>
@@ -43,12 +46,23 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 int readnow_symbol_files;              /* Read full symbols immediately */
 
+struct complaint oldsyms_complaint = {
+  "Replacing old symbols for `%s'", 0, 0
+};
+
+struct complaint empty_symtab_complaint = {
+  "Empty symbol table found for `%s'", 0, 0
+};
+
 /* External variables and functions referenced. */
 
 extern int info_verbose;
 
 /* Functions this file defines */
 
+static void
+set_initial_language PARAMS ((void));
+
 static void
 load_command PARAMS ((char *, int));
 
@@ -92,20 +106,6 @@ int symbol_reloading = SYMBOL_RELOADING_DEFAULT;
 int symbol_reloading = 0;
 #endif
 
-/* Structure to manage complaints about symbol file contents.  */
-
-struct complaint complaint_root[1] = {
-  {(char *) 0, 0, complaint_root},
-};
-
-/* Some actual complaints.  */
-
-struct complaint oldsyms_complaint = {
-       "Replacing old symbols for `%s'", 0, 0 };
-
-struct complaint empty_symtab_complaint = {
-       "Empty symbol table found for `%s'", 0, 0 };
-
 \f
 /* In the following sort, we always make sure that
    register debug symbol declarations always come before regular
@@ -132,7 +132,7 @@ compare_symbols (s1p, s2p)
   if (namediff != 0) return namediff;
 
   /* If they match, compare the rest of the names.  */
-  namediff = strcmp (SYMBOL_NAME (*s1), SYMBOL_NAME (*s2));
+  namediff = STRCMP (SYMBOL_NAME (*s1), SYMBOL_NAME (*s2));
   if (namediff != 0) return namediff;
 
   /* For symbols of the same name, registers should come first.  */
@@ -180,7 +180,7 @@ compare_psymbols (s1p, s2p)
     }
   else
     {
-      return (strcmp (st1 + 2, st2 + 2));
+      return (STRCMP (st1 + 2, st2 + 2));
     }
 }
 
@@ -429,7 +429,7 @@ syms_from_objfile (objfile, addr, mainline, verbo)
        warning ("no loadable sections found in added symbol-file %s",
                 objfile->name);
       else if (0 == bfd_get_section_name (objfile->obfd, lowest_sect)
-              || 0 != strcmp(".text",
+              || !STREQ (".text",
                              bfd_get_section_name (objfile->obfd, lowest_sect)))
        warning ("Lowest section in %s is %s at 0x%x",
                 objfile->name,
@@ -440,6 +440,41 @@ syms_from_objfile (objfile, addr, mainline, verbo)
        addr -= bfd_section_vma (objfile->obfd, lowest_sect);
     }
 
+  {
+  /* Debugging check inserted for testing elimination of NAMES_HAVE_UNDERSCORE.
+     Complain if the dynamic setting of NAMES_HAVE_UNDERSCORE from BFD
+     doesn't match the static setting from the GDB config files, but only
+     if we are using the first BFD target (the default target selected by
+     the same configuration that decided whether NAMES_HAVE_UNDERSCORE is
+     defined or not).  For other targets (such as when the user sets GNUTARGET
+     or we are reading a "foreign" object file), it is likely that the value
+     of bfd_get_symbol_leading_char has no relation to the value of
+     NAMES_HAVE_UNDERSCORE for the target for which this gdb was built.
+     Hack alert: the only way to currently do this with bfd is to ask it to
+     produce a list of known target names and compare the first one in the
+     list with the one for the bfd we are using.
+     FIXME:  Remove this check after a round of testing.  
+                                               -- gnu@cygnus.com, 16dec92 */
+    CONST char **targets = bfd_target_list ();
+    if (targets != NULL && *targets != NULL)
+      {
+       if (bfd_get_symbol_leading_char (objfile->obfd) !=
+#ifdef NAMES_HAVE_UNDERSCORE
+           '_'
+#else
+           0
+#endif
+           && STREQ (bfd_get_target (objfile->obfd), *targets))
+         {
+           fprintf (stderr, "GDB internal error!  NAMES_HAVE_UNDERSCORE set wrong for %s BFD:\n%s\n",
+                    bfd_get_target (objfile->obfd),
+                    bfd_get_filename (objfile->obfd));
+         }
+       free (targets);
+      }
+    /* End of debugging check.  FIXME.  */
+  }
+
   /* Initialize symbol reading routines for this objfile, allow complaints to
      appear for this new file, and record how verbose to be, then do the
      initial symbol reading for this file. */
@@ -643,7 +678,7 @@ symbol_file_command (args, from_tty)
       current_source_line = 0;
       if (from_tty)
        {
-         printf_filtered ("No symbol file now.\n");
+         printf ("No symbol file now.\n");
        }
     }
   else
@@ -655,11 +690,11 @@ symbol_file_command (args, from_tty)
       cleanups = make_cleanup (freeargv, (char *) argv);
       while (*argv != NULL)
        {
-         if (strcmp (*argv, "-mapped") == 0)
+         if (STREQ (*argv, "-mapped"))
            {
              mapped = 1;
            }
-         else if (strcmp (*argv, "-readnow") == 0)
+         else if (STREQ (*argv, "-readnow"))
            {
              readnow = 1;
            }
@@ -681,11 +716,45 @@ symbol_file_command (args, from_tty)
       else
        {
          symbol_file_add (name, from_tty, (CORE_ADDR)0, 1, mapped, readnow);
+         set_initial_language ();
        }
       do_cleanups (cleanups);
     }
 }
 
+/* Set the initial language.
+
+   A better solution would be to record the language in the psymtab when reading
+   partial symbols, and then use it (if known) to set the language.  This would
+   be a win for formats that encode the language in an easily discoverable place,
+   such as DWARF.  For stabs, we can jump through hoops looking for specially
+   named symbols or try to intuit the language from the specific type of stabs
+   we find, but we can't do that until later when we read in full symbols.
+   FIXME.  */
+
+static void
+set_initial_language ()
+{
+  struct partial_symtab *pst;
+  enum language lang = language_unknown;       
+
+  pst = find_main_psymtab ();
+  if (pst != NULL)
+    {
+      if (pst -> filename != NULL)
+       {
+         lang = deduce_language_from_filename (pst -> filename);
+        }
+      if (lang == language_unknown)
+       {
+           /* Make C the default language */
+           lang = language_c;
+       }
+      set_language (lang);
+      expected_language = current_language;    /* Don't warn the user */
+    }
+}
+
 /* Open file specified by NAME and hand it off to BFD for preliminary
    analysis.  Result is a newly initialized bfd *, which includes a newly
    malloc'd` copy of NAME (tilde-expanded and made absolute).
@@ -720,6 +789,7 @@ symfile_bfd_open (name)
       error ("\"%s\": can't open to read symbols: %s.", name,
             bfd_errmsg (bfd_error));
     }
+  sym_bfd->cacheable = true;
 
   if (!bfd_check_format (sym_bfd, bfd_object))
     {
@@ -822,11 +892,11 @@ add_symbol_file_command (args, from_tty)
        {
          name = arg;
        }
-      else if (strcmp (arg, "-mapped") == 0)
+      else if (STREQ (arg, "-mapped"))
        {
          mapped = 1;
        }
-      else if (strcmp (arg, "-readnow") == 0)
+      else if (STREQ (arg, "-readnow"))
        {
          readnow = 1;
        }
@@ -910,95 +980,7 @@ the_big_top:
   if (reread_one)
     breakpoint_re_set ();
 }
-\f
-/* Functions to handle complaints during symbol reading.  */
-
-/* How many complaints about a particular thing should be printed before
-   we stop whining about it?  Default is no whining at all, since so many
-   systems have ill-constructed symbol files.  */
-
-static unsigned stop_whining = 0;
-
-/* Should each complaint be self explanatory, or should we assume that
-   a series of complaints is being produced? 
-   case 0:  self explanatory message.
-   case 1:  First message of a series that must start off with explanation.
-   case 2:  Subsequent message, when user already knows we are reading
-            symbols and we can just state our piece.  */
-
-static int complaint_series = 0;
-
-/* Print a complaint about the input symbols, and link the complaint block
-   into a chain for later handling.  */
-
-void
-complain (complaint, val)
-     struct complaint *complaint;
-     char *val;
-{
-  complaint->counter++;
-  if (complaint->next == 0) {
-    complaint->next = complaint_root->next;
-    complaint_root->next = complaint;
-  }
-  if (complaint->counter > stop_whining)
-    return;
-  wrap_here ("");
-
-  switch (complaint_series + (info_verbose << 1)) {
-
-  /* Isolated messages, must be self-explanatory.  */
-  case 0:
-    puts_filtered ("During symbol reading, ");
-    wrap_here("");
-    printf_filtered (complaint->message, val);
-    puts_filtered (".\n");
-    break;
-
-  /* First of a series, without `set verbose'.  */
-  case 1:
-    puts_filtered ("During symbol reading...");
-    printf_filtered (complaint->message, val);
-    puts_filtered ("...");
-    wrap_here("");
-    complaint_series++;
-    break;
-
-  /* Subsequent messages of a series, or messages under `set verbose'.
-     (We'll already have produced a "Reading in symbols for XXX..." message
-      and will clean up at the end with a newline.)  */
-  default:
-    printf_filtered (complaint->message, val);
-    puts_filtered ("...");
-    wrap_here("");
-  }
-}
 
-/* Clear out all complaint counters that have ever been incremented.
-   If sym_reading is 1, be less verbose about successive complaints,
-   since the messages are appearing all together during a command that
-   reads symbols (rather than scattered around as psymtabs get fleshed
-   out into symtabs at random times).  If noisy is 1, we are in a
-   noisy symbol reading command, and our caller will print enough
-   context for the user to figure it out.  */
-
-void
-clear_complaints (sym_reading, noisy)
-     int sym_reading;
-     int noisy;
-{
-  struct complaint *p;
-
-  for (p = complaint_root->next; p != complaint_root; p = p->next)
-    p->counter = 0;
-
-  if (!sym_reading && !noisy && complaint_series > 1) {
-    /* Terminate previous series, since caller won't.  */
-    puts_filtered ("\n");
-  }
-
-  complaint_series = sym_reading? 1 + noisy: 0;
-}
 \f
 enum language
 deduce_language_from_filename (filename)
@@ -1007,12 +989,16 @@ deduce_language_from_filename (filename)
   char *c = strrchr (filename, '.');
   
   if (!c) ; /* Get default. */
-  else if(!strcmp(c,".mod"))
+  else if(STREQ(c,".mod"))
      return language_m2;
-  else if(!strcmp(c,".c"))
+  else if(STREQ(c,".c"))
      return language_c;
-  else if(!strcmp(c,".cc") || !strcmp(c,".C"))
+  else if(STREQ(c,".cc") || STREQ(c,".C"))
      return language_cplus;
+  /* start-sanitize-chill */
+  else if(STREQ(c,".ch") || STREQ(c,".c186") || STREQ(c,".c286"))
+     return language_chill;
+  /* end-sanitize-chill */
 
   return language_unknown;             /* default */
 }
@@ -1128,7 +1114,7 @@ clear_symtab_users_once ()
     return;
   clear_symtab_users_done = clear_symtab_users_queued;
 
-  printf_filtered ("Resetting debugger state after updating old symbol tables\n");
+  printf ("Resetting debugger state after updating old symbol tables\n");
 
   /* Someday, we should do better than this, by only blowing away
      the things that really need to be blown.  */
@@ -1227,7 +1213,7 @@ free_named_symtabs (name)
 
 again2:
   for (ps = partial_symtab_list; ps; ps = ps->next) {
-    if (!strcmp (name, ps->filename)) {
+    if (STREQ (name, ps->filename)) {
       cashier_psymtab (ps);    /* Blow it away...and its little dog, too.  */
       goto again2;             /* Must restart, chain has been munged */
     }
@@ -1237,7 +1223,7 @@ again2:
 
   for (s = symtab_list; s; s = s->next)
     {
-      if (!strcmp (name, s->filename))
+      if (STREQ (name, s->filename))
        break;
       prev = s;
     }
@@ -1325,40 +1311,79 @@ start_psymtab_common (objfile, section_offsets,
 /* Debugging versions of functions that are usually inline macros
    (see symfile.h).  */
 
-#if 0          /* Don't quite work nowadays... */
+#if !INLINE_ADD_PSYMBOL
 
 /* Add a symbol with a long value to a psymtab.
    Since one arg is a struct, we pass in a ptr and deref it (sigh).  */
 
 void
-add_psymbol_to_list (name, namelength, namespace, class, list, val)
+add_psymbol_to_list (name, namelength, namespace, class, list, val, language,
+                    objfile)
      char *name;
      int namelength;
      enum namespace namespace;
      enum address_class class;
      struct psymbol_allocation_list *list;
      long val;
+     enum language language;
+     struct objfile *objfile;
 {
-  ADD_PSYMBOL_VT_TO_LIST (name, namelength, namespace, class, (*list), val,
-                         SYMBOL_VALUE);
+  register struct partial_symbol *psym;
+  register char *demangled_name;
+
+  if (list->next >= list->list + list->size)
+    {
+      extend_psymbol_list (list,objfile);
+    }
+  psym = list->next++;
+  
+  SYMBOL_NAME (psym) =
+    (char *) obstack_alloc (&objfile->psymbol_obstack, namelength + 1);
+  memcpy (SYMBOL_NAME (psym), name, namelength);
+  SYMBOL_NAME (psym)[namelength] = '\0';
+  SYMBOL_VALUE (psym) = val;
+  SYMBOL_LANGUAGE (psym) = language;
+  PSYMBOL_NAMESPACE (psym) = namespace;
+  PSYMBOL_CLASS (psym) = class;
+  SYMBOL_INIT_DEMANGLED_NAME (psym, &objfile->psymbol_obstack);
 }
 
 /* Add a symbol with a CORE_ADDR value to a psymtab. */
 
 void
-add_psymbol_addr_to_list (name, namelength, namespace, class, list, val)
+add_psymbol_addr_to_list (name, namelength, namespace, class, list, val,
+                         language, objfile)
      char *name;
      int namelength;
      enum namespace namespace;
      enum address_class class;
      struct psymbol_allocation_list *list;
      CORE_ADDR val;
+     enum language language;
+     struct objfile *objfile;
 {
-  ADD_PSYMBOL_VT_TO_LIST (name, namelength, namespace, class, (*list), val,
-                         SYMBOL_VALUE_ADDRESS);
+  register struct partial_symbol *psym;
+  register char *demangled_name;
+
+  if (list->next >= list->list + list->size)
+    {
+      extend_psymbol_list (list,objfile);
+    }
+  psym = list->next++;
+  
+  SYMBOL_NAME (psym) =
+    (char *) obstack_alloc (&objfile->psymbol_obstack, namelength + 1);
+  memcpy (SYMBOL_NAME (psym), name, namelength);
+  SYMBOL_NAME (psym)[namelength] = '\0';
+  SYMBOL_VALUE_ADDRESS (psym) = val;
+  SYMBOL_LANGUAGE (psym) = language;
+  PSYMBOL_NAMESPACE (psym) = namespace;
+  PSYMBOL_CLASS (psym) = class;
+  SYMBOL_INIT_DEMANGLED_NAME (psym, &objfile->psymbol_obstack);
 }
 
-#endif /* 0 */
+#endif /* !INLINE_ADD_PSYMBOL */
+
 \f
 void
 _initialize_symfile ()
@@ -1377,13 +1402,6 @@ The second argument provides the starting address of the file's text.");
    "Dynamically load FILE into the running program, and record its symbols\n\
 for access from GDB.");
 
-  add_show_from_set
-    (add_set_cmd ("complaints", class_support, var_zinteger,
-                 (char *)&stop_whining,
-         "Set max number of complaints about incorrect symbols.",
-                 &setlist),
-     &showlist);
-
   add_show_from_set
     (add_set_cmd ("symbol-reloading", class_support, var_boolean,
                  (char *)&symbol_reloading,
This page took 0.027795 seconds and 4 git commands to generate.