* gdbserver/{remote-gutils.c remote-server.c Makefile.in
[deliverable/binutils-gdb.git] / gdb / symfile.c
index 8ef5ed90e2ffcde7b8260ff68f2e4f0f87fe6059..ec582da8ca5e95d80aa335bbc43e776fe5353eb3 100644 (file)
@@ -1,5 +1,5 @@
 /* Generic symbol file reading for the GNU debugger, GDB.
-   Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
+   Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
    Contributed by Cygnus Support, using pieces from other GDB modules.
 
 This file is part of GDB.
@@ -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>
@@ -37,17 +40,33 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include <fcntl.h>
 #include <string.h>
 #include <sys/stat.h>
+#include <ctype.h>
+
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
 
 /* Global variables owned by this file */
 
 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));
 
@@ -69,7 +88,7 @@ symfile_bfd_open PARAMS ((char *));
 static void
 find_sym_fns PARAMS ((struct objfile *));
 
-static void
+void
 clear_symtab_users_once PARAMS ((void));
 
 /* List of all available sym_fns.  On gdb startup, each object file reader
@@ -91,20 +110,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
@@ -131,7 +136,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.  */
@@ -179,7 +184,7 @@ compare_psymbols (s1p, s2p)
     }
   else
     {
-      return (strcmp (st1 + 2, st2 + 2));
+      return (STRCMP (st1 + 2, st2 + 2));
     }
 }
 
@@ -331,6 +336,27 @@ init_entry_point_info (objfile)
     }
 }
 
+/* Remember the lowest-addressed loadable section we've seen.  
+   This function is called via bfd_map_over_sections.  */
+
+#if 0  /* Not used yet */
+static void
+find_lowest_section (abfd, sect, obj)
+     bfd *abfd;
+     asection *sect;
+     PTR obj;
+{
+  asection **lowest = (asection **)obj;
+
+  if (0 == (bfd_get_section_flags (abfd, sect) & SEC_LOAD))
+    return;
+  if (!*lowest)
+    *lowest = sect;            /* First loadable section */
+  else if (bfd_section_vma (abfd, *lowest) >= bfd_section_vma (abfd, sect))
+    *lowest = sect;            /* A lower loadable section */
+}
+#endif 
+
 /* Process a symbol file, as either the main file or as a dynamically
    loaded file.
 
@@ -350,22 +376,8 @@ syms_from_objfile (objfile, addr, mainline, verbo)
      int mainline;
      int verbo;
 {
-  asection *text_sect;
-
-  /* There is a distinction between having no symbol table
-     (we refuse to read the file, leaving the old set of symbols around)
-     and having no debugging symbols in your symbol table (we read
-     the file and end up with a mostly empty symbol table).
-
-     FIXME:  This strategy works correctly when the debugging symbols are
-     intermixed with "normal" symbols.  However, when the debugging symbols
-     are separate, such as with ELF/DWARF, it is perfectly plausible for
-     the symbol table to be missing but still have all the DWARF info
-     intact.  Thus in general it is wrong to assume that having no symbol
-     table implies no debugging information. */
-
-  if (!(bfd_get_file_flags (objfile -> obfd) & HAS_SYMS))
-    return;
+  struct section_offsets *section_offsets;
+  asection *lowest_sect;
 
   init_entry_point_info (objfile);
   find_sym_fns (objfile);
@@ -381,12 +393,40 @@ syms_from_objfile (objfile, addr, mainline, verbo)
        }
 
       (*objfile -> sf -> sym_new_init) (objfile);
+    }
 
-      /* For mainline, caller didn't know the specified address of the
-         text section.  We fix that here.  */
+  /* Convert addr into an offset rather than an absolute address.
+     We find the lowest address of a loaded segment in the objfile,
+     and assume that <addr> is where that got loaded.  Due to historical
+     precedent, we warn if that doesn't happen to be the ".text"
+     segment.  */
+
+  if (mainline)
+    {
+      addr = 0;                /* No offset from objfile addresses.  */
+    }
+  else
+    {
+      lowest_sect = bfd_get_section_by_name (objfile->obfd, ".text");
+#if 0
+      lowest_sect = 0;
+      bfd_map_over_sections (objfile->obfd, find_lowest_section,
+                            (PTR) &lowest_sect);
+#endif
 
-      text_sect = bfd_get_section_by_name (objfile -> obfd, ".text");
-      addr = bfd_section_vma (objfile -> obfd, text_sect);
+      if (lowest_sect == 0)
+       warning ("no loadable sections found in added symbol-file %s",
+                objfile->name);
+      else if (0 == bfd_get_section_name (objfile->obfd, lowest_sect)
+              || !STREQ (".text",
+                             bfd_get_section_name (objfile->obfd, lowest_sect)))
+       warning ("Lowest section in %s is %s at 0x%x",
+                objfile->name,
+                bfd_section_name (objfile->obfd, lowest_sect),
+                bfd_section_vma (objfile->obfd, lowest_sect));
+
+      if (lowest_sect)
+       addr -= bfd_section_vma (objfile->obfd, lowest_sect);
     }
 
   /* Initialize symbol reading routines for this objfile, allow complaints to
@@ -395,7 +435,48 @@ syms_from_objfile (objfile, addr, mainline, verbo)
 
   (*objfile -> sf -> sym_init) (objfile);
   clear_complaints (1, verbo);
-  (*objfile -> sf -> sym_read) (objfile, addr, mainline);
+
+  /* If objfile->sf->sym_offsets doesn't set this, we don't care
+     (currently).  */
+  objfile->num_sections = 0;  /* krp-FIXME: why zero? */
+  section_offsets = (*objfile -> sf -> sym_offsets) (objfile, addr);
+  objfile->section_offsets = section_offsets;
+
+#ifndef IBM6000_TARGET
+  /* This is a SVR4/SunOS specific hack, I think.  In any event, it
+     screws RS/6000.  sym_offsets should be doing this sort of thing,
+     because it knows the mapping between bfd sections and
+     section_offsets.  */
+  /* This is a hack.  As far as I can tell, section offsets are not
+     target dependent.  They are all set to addr with a couple of
+     exceptions.  The exceptions are sysvr4 shared libraries, whose
+     offsets are kept in solib structures anyway and rs6000 xcoff
+     which handles shared libraries in a completely unique way.
+
+     Section offsets are built similarly, except that they are built
+     by adding addr in all cases because there is no clear mapping
+     from section_offsets into actual sections.  Note that solib.c
+     has a different algorythm for finding section offsets.
+
+     These should probably all be collapsed into some target
+     independent form of shared library support.  FIXME.  */
+
+  if (addr)
+    {
+      struct obj_section *s;
+
+      for (s = objfile->sections; s < objfile->sections_end; ++s)
+       {
+         s->addr -= s->offset;
+         s->addr += addr;
+         s->endaddr -= s->offset;
+         s->endaddr += addr;
+         s->offset += addr;
+       }
+    }
+#endif /* not IBM6000_TARGET */
+
+  (*objfile -> sf -> sym_read) (objfile, section_offsets, mainline);
 
   /* Don't allow char * to have a typename (else would get caddr_t.)  */
   /* Ditto void *.  FIXME should do this for all the builtin types.  */
@@ -403,6 +484,22 @@ syms_from_objfile (objfile, addr, mainline, verbo)
   TYPE_NAME (lookup_pointer_type (builtin_type_char)) = 0;
   TYPE_NAME (lookup_pointer_type (builtin_type_void)) = 0;
 
+  /* Mark the objfile has having had initial symbol read attempted.  Note
+     that this does not mean we found any symbols... */
+
+  objfile -> flags |= OBJF_SYMS;
+}
+
+/* Perform required actions immediately after either reading in the initial
+   symbols for a new objfile, or mapping in the symbols from a reusable
+   objfile. */
+   
+void
+new_symfile_objfile (objfile, mainline, verbo)
+     struct objfile *objfile;
+     int mainline;
+     int verbo;
+{
   if (mainline)
     {
       /* OK, make it the "real" symbol file.  */
@@ -447,26 +544,10 @@ symbol_file_add (name, from_tty, addr, mainline, mapped, readnow)
   struct partial_symtab *psymtab;
   bfd *abfd;
 
-  /* Open a bfd for the file and then check to see if the file has a
-     symbol table.  There is a distinction between having no symbol table
-     (we refuse to read the file, leaving the old set of symbols around)
-     and having no debugging symbols in the symbol table (we read the file
-     and end up with a mostly empty symbol table, but with lots of stuff in
-     the minimal symbol table).  We need to make the decision about whether
-     to continue with the file before allocating and building a objfile.
-
-     FIXME:  This strategy works correctly when the debugging symbols are
-     intermixed with "normal" symbols.  However, when the debugging symbols
-     are separate, such as with ELF/DWARF, it is perfectly plausible for
-     the symbol table to be missing but still have all the DWARF info
-     intact.  Thus in general it is wrong to assume that having no symbol
-     table implies no debugging information. */
+  /* Open a bfd for the file, and give user a chance to burp if we'd be
+     interactively wiping out any existing symbols.  */
 
   abfd = symfile_bfd_open (name);
-  if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
-    {
-      error ("%s has no symbol-table", name);
-    }
 
   if ((have_full_symbols () || have_partial_symbols ())
       && mainline
@@ -474,6 +555,11 @@ symbol_file_add (name, from_tty, addr, mainline, mapped, readnow)
       && !query ("Load new symbol table from \"%s\"? ", name))
       error ("Not confirmed.");
       
+  /* Getting new symbols may change our opinion about what is
+     frameless.  */
+
+  reinit_frame_cache ();
+
   objfile = allocate_objfile (abfd, mapped);
 
   /* If the objfile uses a mapped symbol file, and we have a psymtab for
@@ -491,6 +577,8 @@ symbol_file_add (name, from_tty, addr, mainline, mapped, readnow)
          wrap_here ("");
          fflush (stdout);
        }
+      init_entry_point_info (objfile);
+      find_sym_fns (objfile);
     }
   else
     {
@@ -504,9 +592,10 @@ symbol_file_add (name, from_tty, addr, mainline, mapped, readnow)
          fflush (stdout);
        }
       syms_from_objfile (objfile, addr, mainline, from_tty);
-      objfile -> flags |= OBJF_SYMS;
     }      
 
+  new_symfile_objfile (objfile, mainline, from_tty);
+
   /* We now have at least a partial symbol table.  Check to see if the
      user requested that all symbols be read on initial access via either
      the gdb startup command line or on a per symbol file basis.  Expand
@@ -525,7 +614,7 @@ symbol_file_add (name, from_tty, addr, mainline, mapped, readnow)
           psymtab != NULL;
           psymtab = psymtab -> next)
        {
-         (void) psymtab_to_symtab (psymtab);
+         psymtab_to_symtab (psymtab);
        }
     }
 
@@ -563,6 +652,12 @@ symbol_file_command (args, from_tty)
        error ("Not confirmed.");
       free_all_objfiles ();
       symfile_objfile = NULL;
+      current_source_symtab = NULL;
+      current_source_line = 0;
+      if (from_tty)
+       {
+         printf ("No symbol file now.\n");
+       }
     }
   else
     {
@@ -573,11 +668,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;
            }
@@ -598,16 +693,46 @@ symbol_file_command (args, from_tty)
        }
       else
        {
-         /* Getting new symbols may change our opinion about what is
-            frameless.  */
-         reinit_frame_cache ();
-         (void) symbol_file_add (name, from_tty, (CORE_ADDR)0, 1,
-                                    mapped, readnow);
+         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).
@@ -624,7 +749,7 @@ symfile_bfd_open (name)
   name = tilde_expand (name);  /* Returns 1st new malloc'd copy */
 
   /* Look down path for it, allocate 2nd new malloc'd copy.  */
-  desc = openp (getenv ("PATH"), 1, name, O_RDONLY, 0, &absolute_name);
+  desc = openp (getenv ("PATH"), 1, name, O_RDONLY | O_BINARY, 0, &absolute_name);
   if (desc < 0)
     {
       make_cleanup (free, name);
@@ -632,6 +757,7 @@ symfile_bfd_open (name)
     }
   free (name);                 /* Free 1st new malloc'd copy */
   name = absolute_name;                /* Keep 2nd malloc'd copy in bfd */
+                               /* It'll be freed in free_objfile(). */
 
   sym_bfd = bfd_fdopenr (name, NULL, desc);
   if (!sym_bfd)
@@ -641,6 +767,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))
     {
@@ -743,11 +870,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;
        }
@@ -774,12 +901,7 @@ add_symbol_file_command (args, from_tty)
              name, local_hex_string (text_addr)))
     error ("Not confirmed.");
 
-  /* Getting new symbols may change our opinion about what is
-     frameless.  */
-
-  reinit_frame_cache ();
-
-  (void) symbol_file_add (name, 0, text_addr, 0, mapped, readnow);
+  symbol_file_add (name, 0, text_addr, 0, mapped, readnow);
 }
 \f
 /* Re-read symbols if a symbol-file has changed.  */
@@ -836,109 +958,26 @@ 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)
      char *filename;
 {
-  char *c = strrchr (filename, '.');
+  char *c;
   
-  if (!c) ; /* Get default. */
-  else if(!strcmp(c,".mod"))
-     return language_m2;
-  else if(!strcmp(c,".c"))
-     return language_c;
-  else if(!strcmp(c,".cc") || !strcmp(c,".C"))
-     return language_cplus;
+  if (0 == filename) 
+    ; /* Get default */
+  else if (0 == (c = strrchr (filename, '.')))
+    ; /* Get default. */
+  else if(STREQ(c,".mod"))
+    return language_m2;
+  else if(STREQ(c,".c"))
+    return language_c;
+  else if(STREQ(c,".cc") || STREQ(c,".C"))
+    return language_cplus;
+  else if(STREQ(c,".ch") || STREQ(c,".c186") || STREQ(c,".c286"))
+    return language_chill;
 
   return language_unknown;             /* default */
 }
@@ -967,7 +1006,7 @@ allocate_symtab (filename, objfile)
 
   symtab = (struct symtab *)
     obstack_alloc (&objfile -> symbol_obstack, sizeof (struct symtab));
-  (void) memset (symtab, 0, sizeof (*symtab));
+  memset (symtab, 0, sizeof (*symtab));
   symtab -> filename = obsavestring (filename, strlen (filename),
                                     &objfile -> symbol_obstack);
   symtab -> fullname = NULL;
@@ -1003,7 +1042,7 @@ allocate_psymtab (filename, objfile)
       obstack_alloc (&objfile -> psymbol_obstack,
                     sizeof (struct partial_symtab));
 
-  (void) memset (psymtab, 0, sizeof (struct partial_symtab));
+  memset (psymtab, 0, sizeof (struct partial_symtab));
   psymtab -> filename = obsavestring (filename, strlen (filename),
                                      &objfile -> psymbol_obstack);
   psymtab -> symtab = NULL;
@@ -1046,7 +1085,7 @@ allocate_psymtab (filename, objfile)
 static int clear_symtab_users_queued;
 static int clear_symtab_users_done;
 
-static void
+void
 clear_symtab_users_once ()
 {
   /* Enforce once-per-`do_cleanups'-semantics */
@@ -1153,7 +1192,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 */
     }
@@ -1163,7 +1202,7 @@ again2:
 
   for (s = symtab_list; s; s = s->next)
     {
-      if (!strcmp (name, s->filename))
+      if (STREQ (name, s->filename))
        break;
       prev = s;
     }
@@ -1228,10 +1267,10 @@ again2:
 
 
 struct partial_symtab *
-start_psymtab_common (objfile, addr,
+start_psymtab_common (objfile, section_offsets,
                      filename, textlow, global_syms, static_syms)
      struct objfile *objfile;
-     CORE_ADDR addr;
+     struct section_offsets *section_offsets;
      char *filename;
      CORE_ADDR textlow;
      struct partial_symbol *global_syms;
@@ -1240,13 +1279,89 @@ start_psymtab_common (objfile, addr,
   struct partial_symtab *psymtab;
 
   psymtab = allocate_psymtab (filename, objfile);
-  psymtab -> addr = addr;
+  psymtab -> section_offsets = section_offsets;
   psymtab -> textlow = textlow;
   psymtab -> texthigh = psymtab -> textlow;  /* default */
   psymtab -> globals_offset = global_syms - objfile -> global_psymbols.list;
   psymtab -> statics_offset = static_syms - objfile -> static_psymbols.list;
   return (psymtab);
 }
+\f
+/* Debugging versions of functions that are usually inline macros
+   (see symfile.h).  */
+
+#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, 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;
+{
+  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,
+                         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;
+{
+  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 /* !INLINE_ADD_PSYMBOL */
 
 \f
 void
@@ -1266,13 +1381,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.030981 seconds and 4 git commands to generate.