Add everyone to write-after-approval.
[binutils-gdb.git] / gdb / symfile.c
index 7043b8023d41bb13cb7366f2cbf08db014c11e1a..d087b1fe4c79c5296dac77ec5133ef6e90932db3 100644 (file)
@@ -1,6 +1,8 @@
 /* Generic symbol file reading for the GNU debugger, GDB.
-   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001 Free Software Foundation, Inc.
+
+   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+   1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+
    Contributed by Cygnus Support, using pieces from other GDB modules.
 
    This file is part of GDB.
@@ -118,6 +120,8 @@ static void cashier_psymtab (struct partial_symtab *);
 
 bfd *symfile_bfd_open (char *);
 
+int get_section_index (struct objfile *, char *);
+
 static void find_sym_fns (struct objfile *);
 
 static void decrement_reading_symtab (void *);
@@ -535,6 +539,34 @@ default_symfile_offsets (struct objfile *objfile,
   if (sect) 
     objfile->sect_index_rodata = sect->index;
 
+  /* This is where things get really weird...  We MUST have valid
+     indices for the various sect_index_* members or gdb will abort.
+     So if for example, there is no ".text" section, we have to
+     accomodate that.  Except when explicitly adding symbol files at
+     some address, section_offsets contains nothing but zeros, so it
+     doesn't matter which slot in section_offsets the individual
+     sect_index_* members index into.  So if they are all zero, it is
+     safe to just point all the currently uninitialized indices to the
+     first slot. */
+
+  for (i = 0; i < objfile->num_sections; i++)
+    {
+      if (ANOFFSET (objfile->section_offsets, i) != 0)
+       {
+         break;
+       }
+    }
+  if (i == objfile->num_sections)
+    {
+      if (objfile->sect_index_text == -1)
+       objfile->sect_index_text = 0;
+      if (objfile->sect_index_data == -1)
+       objfile->sect_index_data = 0;
+      if (objfile->sect_index_bss == -1)
+       objfile->sect_index_bss = 0;
+      if (objfile->sect_index_rodata == -1)
+       objfile->sect_index_rodata = 0;
+    }
 }
 
 /* Process a symbol file, as either the main file or as a dynamically
@@ -575,6 +607,9 @@ syms_from_objfile (struct objfile *objfile, struct section_addr_info *addrs,
   init_entry_point_info (objfile);
   find_sym_fns (objfile);
 
+  if (objfile->sf == NULL)
+    return;    /* No symbols. */
+
   /* Make sure that partially constructed symbol tables will be cleaned up
      if an error occurs during symbol reading.  */
   old_chain = make_cleanup_free_objfile (objfile);
@@ -889,6 +924,9 @@ symbol_file_add (char *name, int from_tty, struct section_addr_info *addrs,
        }
     }
 
+  if (objfile->sf == NULL)
+    return objfile;    /* No symbols. */
+
   new_symfile_objfile (objfile, mainline, from_tty);
 
   if (target_new_objfile_hook)
@@ -1092,7 +1130,7 @@ symfile_bfd_open (char *name)
       error ("\"%s\": can't open to read symbols: %s.", name,
             bfd_errmsg (bfd_get_error ()));
     }
-  sym_bfd->cacheable = true;
+  sym_bfd->cacheable = 1;
 
   if (!bfd_check_format (sym_bfd, bfd_object))
     {
@@ -1107,6 +1145,18 @@ symfile_bfd_open (char *name)
   return (sym_bfd);
 }
 
+/* Return the section index for the given section name. Return -1 if
+   the section was not found. */
+int
+get_section_index (struct objfile *objfile, char *section_name)
+{
+  asection *sect = bfd_get_section_by_name (objfile->obfd, section_name);
+  if (sect)
+    return sect->index;
+  else
+    return -1;
+}
+
 /* Link a new symtab_fns into the global symtab_fns list.  Called on gdb
    startup by the _initialize routine in each object file format reader,
    to register information about each format the the reader is prepared
@@ -1132,6 +1182,11 @@ find_sym_fns (struct objfile *objfile)
   enum bfd_flavour our_flavour = bfd_get_flavour (objfile->obfd);
   char *our_target = bfd_get_target (objfile->obfd);
 
+  if (our_flavour == bfd_target_srec_flavour
+      || our_flavour == bfd_target_ihex_flavour
+      || our_flavour == bfd_target_tekhex_flavour)
+    return;    /* No symbols. */
+
   /* Special kludge for apollo.  See dstread.c.  */
   if (STREQN (our_target, "apollo", 6))
     our_flavour = (enum bfd_flavour) -2;
@@ -1222,14 +1277,8 @@ load_section_callback (bfd *abfd, asection *asec, void *data)
 
          /* Is this really necessary?  I guess it gives the user something
             to look at during a long download.  */
-#ifdef UI_OUT
          ui_out_message (uiout, 0, "Loading section %s, size 0x%s lma 0x%s\n",
                          sect_name, paddr_nz (size), paddr_nz (lma));
-#else
-         fprintf_unfiltered (gdb_stdout,
-                             "Loading section %s, size 0x%s lma 0x%s\n",
-                             sect_name, paddr_nz (size), paddr_nz (lma));
-#endif
 
          bfd_get_section_contents (abfd, asec, buffer, 0, size);
 
@@ -1355,17 +1404,11 @@ generic_load (char *args, int from_tty)
   end_time = time (NULL);
 
   entry = bfd_get_start_address (loadfile_bfd);
-#ifdef UI_OUT
   ui_out_text (uiout, "Start address ");
   ui_out_field_fmt (uiout, "address", "0x%s", paddr_nz (entry));
   ui_out_text (uiout, ", load size ");
   ui_out_field_fmt (uiout, "load-size", "%lu", cbdata.data_count);
   ui_out_text (uiout, "\n");
-#else
-  fprintf_unfiltered (gdb_stdout,
-                     "Start address 0x%s, load size %lu\n",
-                     paddr_nz (entry), cbdata.data_count);
-#endif
   /* We were doing this in remote-mips.c, I suspect it is right
      for other targets too.  */
   write_pc (entry);
@@ -1402,7 +1445,6 @@ print_transfer_performance (struct ui_file *stream,
                            unsigned long write_count,
                            unsigned long time_count)
 {
-#ifdef UI_OUT
   ui_out_text (uiout, "Transfer rate: ");
   if (time_count > 0)
     {
@@ -1422,16 +1464,6 @@ print_transfer_performance (struct ui_file *stream,
       ui_out_text (uiout, " bytes/write");
     }
   ui_out_text (uiout, ".\n");
-#else
-  fprintf_unfiltered (stream, "Transfer rate: ");
-  if (time_count > 0)
-    fprintf_unfiltered (stream, "%lu bits/sec", (data_count * 8) / time_count);
-  else
-    fprintf_unfiltered (stream, "%lu bits in <1 sec", (data_count * 8));
-  if (write_count > 0)
-    fprintf_unfiltered (stream, ", %lu bytes/write", data_count / write_count);
-  fprintf_unfiltered (stream, ".\n");
-#endif
 }
 
 /* This function allows the addition of incrementally linked object files.
@@ -1709,6 +1741,7 @@ reread_symbols (void)
 
              /* Free the obstacks for non-reusable objfiles */
              free_bcache (&objfile->psymbol_cache);
+             free_bcache (&objfile->macro_cache);
              obstack_free (&objfile->psymbol_obstack, 0);
              obstack_free (&objfile->symbol_obstack, 0);
              obstack_free (&objfile->type_obstack, 0);
@@ -1734,6 +1767,8 @@ reread_symbols (void)
                 it is empty.  */
              obstack_specify_allocation (&objfile->psymbol_cache.cache, 0, 0,
                                          xmalloc, xfree);
+             obstack_specify_allocation (&objfile->macro_cache.cache, 0, 0,
+                                         xmalloc, xfree);
              obstack_specify_allocation (&objfile->psymbol_obstack, 0, 0,
                                          xmalloc, xfree);
              obstack_specify_allocation (&objfile->symbol_obstack, 0, 0,
@@ -1827,8 +1862,9 @@ add_filename_language (char *ext, enum language lang)
   if (fl_table_next >= fl_table_size)
     {
       fl_table_size += 10;
-      filename_language_table = xrealloc (filename_language_table,
-                                         fl_table_size);
+      filename_language_table = 
+       xrealloc (filename_language_table,
+                 fl_table_size * sizeof (*filename_language_table));
     }
 
   filename_language_table[fl_table_next].ext = xstrdup (ext);
@@ -2530,7 +2566,7 @@ init_psymbol_list (struct objfile *objfile, int total_symbols)
 
 /* Overlay debugging state: */
 
-int overlay_debugging = 0;     /* 0 == off, 1 == manual, -1 == auto */
+enum overlay_debugging_state overlay_debugging = ovly_off;
 int overlay_cache_invalid = 0; /* True if need to refresh mapped state */
 
 /* Target vector for refreshing overlay mapped state */
@@ -2587,9 +2623,9 @@ overlay_is_mapped (struct obj_section *osect)
   switch (overlay_debugging)
     {
     default:
-    case 0:
+    case ovly_off:
       return 0;                        /* overlay debugging off */
-    case -1:                   /* overlay debugging automatic */
+    case ovly_auto:            /* overlay debugging automatic */
       /* Unles there is a target_overlay_update function, 
          there's really nothing useful to do here (can't really go auto)  */
       if (target_overlay_update)
@@ -2603,7 +2639,7 @@ overlay_is_mapped (struct obj_section *osect)
            (*target_overlay_update) (osect);
        }
       /* fall thru to manual case */
-    case 1:                    /* overlay debugging manual */
+    case ovly_on:              /* overlay debugging manual */
       return osect->ovly_mapped == 1;
     }
 }
@@ -2918,7 +2954,8 @@ the 'overlay manual' command.");
 static void
 overlay_auto_command (char *args, int from_tty)
 {
-  overlay_debugging = -1;
+  overlay_debugging = ovly_auto;
+  enable_overlay_breakpoints ();
   if (info_verbose)
     printf_filtered ("Automatic overlay debugging enabled.");
 }
@@ -2930,7 +2967,8 @@ overlay_auto_command (char *args, int from_tty)
 static void
 overlay_manual_command (char *args, int from_tty)
 {
-  overlay_debugging = 1;
+  overlay_debugging = ovly_on;
+  disable_overlay_breakpoints ();
   if (info_verbose)
     printf_filtered ("Overlay debugging enabled.");
 }
@@ -2942,7 +2980,8 @@ overlay_manual_command (char *args, int from_tty)
 static void
 overlay_off_command (char *args, int from_tty)
 {
-  overlay_debugging = 0;
+  overlay_debugging = ovly_off;
+  disable_overlay_breakpoints ();
   if (info_verbose)
     printf_filtered ("Overlay debugging disabled.");
 }
@@ -3232,7 +3271,7 @@ _initialize_symfile (void)
               "Load symbol table from executable file FILE.\n\
 The `file' command can also load symbol tables, as well as setting the file\n\
 to execute.", &cmdlist);
-  c->completer = filename_completer;
+  set_cmd_completer (c, filename_completer);
 
   c = add_cmd ("add-symbol-file", class_files, add_symbol_file_command,
               "Usage: add-symbol-file FILE ADDR [-s <SECT> <SECT_ADDR> -s <SECT> <SECT_ADDR> ...]\n\
@@ -3240,9 +3279,9 @@ Load the symbols from FILE, assuming FILE has been dynamically loaded.\n\
 ADDR is the starting address of the file's text.\n\
 The optional arguments are section-name section-address pairs and\n\
 should be specified if the data and bss segments are not contiguous\n\
-with the text. SECT is a section name to be loaded at SECT_ADDR.",
+with the text.  SECT is a section name to be loaded at SECT_ADDR.",
               &cmdlist);
-  c->completer = filename_completer;
+  set_cmd_completer (c, filename_completer);
 
   c = add_cmd ("add-shared-symbol-files", class_files,
               add_shared_symbol_files_command,
@@ -3254,7 +3293,7 @@ with the text. SECT is a section name to be loaded at SECT_ADDR.",
   c = add_cmd ("load", class_files, load_command,
               "Dynamically load FILE into the running program, and record its symbols\n\
 for access from GDB.", &cmdlist);
-  c->completer = filename_completer;
+  set_cmd_completer (c, filename_completer);
 
   add_show_from_set
     (add_set_cmd ("symbol-reloading", class_support, var_boolean,
@@ -3295,7 +3334,7 @@ for access from GDB.", &cmdlist);
                   "Set mapping between filename extension and source language.\n\
 Usage: set extension-language .foo bar",
                   &setlist);
-  c->function.cfunc = set_ext_lang_command;
+  set_cmd_cfunc (c, set_ext_lang_command);
 
   add_info ("extensions", info_ext_lang_command,
            "All filename extensions associated with a source language.");