Automatic date update in version.in
[external/binutils.git] / gdb / symtab.c
index b32eca1..774f209 100644 (file)
@@ -41,6 +41,7 @@
 #include "p-lang.h"
 #include "addrmap.h"
 #include "cli/cli-utils.h"
+#include "cli/cli-style.h"
 #include "fnmatch.h"
 #include "hashtab.h"
 #include "typeprint.h"
@@ -311,6 +312,31 @@ compunit_language (const struct compunit_symtab *cust)
   return SYMTAB_LANGUAGE (symtab);
 }
 
+/* See symtab.h.  */
+
+bool
+minimal_symbol::data_p () const
+{
+  return type == mst_data
+    || type == mst_bss
+    || type == mst_abs
+    || type == mst_file_data
+    || type == mst_file_bss;
+}
+
+/* See symtab.h.  */
+
+bool
+minimal_symbol::text_p () const
+{
+  return type == mst_text
+    || type == mst_text_gnu_ifunc
+    || type == mst_data_gnu_ifunc
+    || type == mst_slot_got_plt
+    || type == mst_solib_trampoline
+    || type == mst_file_text;
+}
+
 /* See whether FILENAME matches SEARCH_NAME using the rule that we
    advertise to the user.  (The manual's description of linespecs
    describes what we advertise).  Returns true if they match, false
@@ -473,7 +499,7 @@ iterate_over_symtabs (const char *name,
       gdb_assert (IS_ABSOLUTE_PATH (real_path.get ()));
     }
 
-  for (objfile *objfile : all_objfiles (current_program_space))
+  for (objfile *objfile : current_program_space->objfiles ())
     {
       if (iterate_over_some_symtabs (name, real_path.get (),
                                     objfile->compunit_symtabs, NULL,
@@ -484,7 +510,7 @@ iterate_over_symtabs (const char *name,
   /* Same search rules as above apply here, but now we look thru the
      psymtabs.  */
 
-  for (objfile *objfile : all_objfiles (current_program_space))
+  for (objfile *objfile : current_program_space->objfiles ())
     {
       if (objfile->sf
          && objfile->sf->qf->map_symtabs_matching_filename (objfile,
@@ -675,6 +701,7 @@ symbol_set_language (struct general_symbol_info *gsymbol,
 struct demangled_name_entry
 {
   const char *mangled;
+  ENUM_BITFIELD(language) language : LANGUAGE_BITS;
   char demangled[1];
 };
 
@@ -707,14 +734,14 @@ eq_demangled_name_entry (const void *a, const void *b)
    name.  The entry is hashed via just the mangled name.  */
 
 static void
-create_demangled_names_hash (struct objfile *objfile)
+create_demangled_names_hash (struct objfile_per_bfd_storage *per_bfd)
 {
   /* Choose 256 as the starting size of the hash table, somewhat arbitrarily.
      The hash table code will round this up to the next prime number.
      Choosing a much larger table size wastes memory, and saves only about
      1% in symbol reading.  */
 
-  objfile->per_bfd->demangled_names_hash = htab_create_alloc
+  per_bfd->demangled_names_hash = htab_create_alloc
     (256, hash_demangled_name_entry, eq_demangled_name_entry,
      NULL, xcalloc, xfree);
 }
@@ -772,13 +799,12 @@ symbol_find_demangled_name (struct general_symbol_info *gsymbol,
 void
 symbol_set_names (struct general_symbol_info *gsymbol,
                  const char *linkage_name, int len, int copy_name,
-                 struct objfile *objfile)
+                 struct objfile_per_bfd_storage *per_bfd)
 {
   struct demangled_name_entry **slot;
   /* A 0-terminated copy of the linkage name.  */
   const char *linkage_name_copy;
   struct demangled_name_entry entry;
-  struct objfile_per_bfd_storage *per_bfd = objfile->per_bfd;
 
   if (gsymbol->language == language_ada)
     {
@@ -801,7 +827,7 @@ symbol_set_names (struct general_symbol_info *gsymbol,
     }
 
   if (per_bfd->demangled_names_hash == NULL)
-    create_demangled_names_hash (objfile);
+    create_demangled_names_hash (per_bfd);
 
   if (linkage_name[len] != '\0')
     {
@@ -816,11 +842,6 @@ symbol_set_names (struct general_symbol_info *gsymbol,
   else
     linkage_name_copy = linkage_name;
 
-  /* Set the symbol language.  */
-  char *demangled_name_ptr
-    = symbol_find_demangled_name (gsymbol, linkage_name_copy);
-  gdb::unique_xmalloc_ptr<char> demangled_name (demangled_name_ptr);
-
   entry.mangled = linkage_name_copy;
   slot = ((struct demangled_name_entry **)
          htab_find_slot (per_bfd->demangled_names_hash,
@@ -833,6 +854,9 @@ symbol_set_names (struct general_symbol_info *gsymbol,
       || (gsymbol->language == language_go
          && (*slot)->demangled[0] == '\0'))
     {
+      char *demangled_name_ptr
+       = symbol_find_demangled_name (gsymbol, linkage_name_copy);
+      gdb::unique_xmalloc_ptr<char> demangled_name (demangled_name_ptr);
       int demangled_len = demangled_name ? strlen (demangled_name.get ()) : 0;
 
       /* Suppose we have demangled_name==NULL, copy_name==0, and
@@ -869,12 +893,16 @@ symbol_set_names (struct general_symbol_info *gsymbol,
          strcpy (mangled_ptr, linkage_name_copy);
          (*slot)->mangled = mangled_ptr;
        }
+      (*slot)->language = gsymbol->language;
 
       if (demangled_name != NULL)
-       strcpy ((*slot)->demangled, demangled_name.get());
+       strcpy ((*slot)->demangled, demangled_name.get ());
       else
        (*slot)->demangled[0] = '\0';
     }
+  else if (gsymbol->language == language_unknown
+          || gsymbol->language == language_auto)
+    gsymbol->language = (*slot)->language;
 
   gsymbol->name = (*slot)->mangled;
   if ((*slot)->demangled[0] != '\0')
@@ -971,7 +999,6 @@ matching_obj_sections (struct obj_section *obj_first,
 {
   asection *first = obj_first? obj_first->the_bfd_section : NULL;
   asection *second = obj_second? obj_second->the_bfd_section : NULL;
-  struct objfile *obj;
 
   /* If they're the same section, then they match.  */
   if (first == second)
@@ -1011,7 +1038,8 @@ matching_obj_sections (struct obj_section *obj_first,
 
   /* Otherwise check that they are in corresponding objfiles.  */
 
-  for (objfile *objfile : all_objfiles (current_program_space))
+  struct objfile *obj = NULL;
+  for (objfile *objfile : current_program_space->objfiles ())
     if (objfile->obfd == first->owner)
       {
        obj = objfile;
@@ -1040,15 +1068,10 @@ expand_symtab_containing_pc (CORE_ADDR pc, struct obj_section *section)
      necessary because we loop based on texthigh and textlow, which do
      not include the data ranges.  */
   msymbol = lookup_minimal_symbol_by_pc_section (pc, section);
-  if (msymbol.minsym
-      && (MSYMBOL_TYPE (msymbol.minsym) == mst_data
-         || MSYMBOL_TYPE (msymbol.minsym) == mst_bss
-         || MSYMBOL_TYPE (msymbol.minsym) == mst_abs
-         || MSYMBOL_TYPE (msymbol.minsym) == mst_file_data
-         || MSYMBOL_TYPE (msymbol.minsym) == mst_file_bss))
+  if (msymbol.minsym && msymbol.minsym->data_p ())
     return;
 
-  for (objfile *objfile : all_objfiles (current_program_space))
+  for (objfile *objfile : current_program_space->objfiles ())
     {
       struct compunit_symtab *cust = NULL;
 
@@ -2170,9 +2193,9 @@ lookup_objfile_from_block (const struct block *block)
 
   block = block_global_block (block);
   /* Look through all blockvectors.  */
-  for (objfile *obj : all_objfiles (current_program_space))
+  for (objfile *obj : current_program_space->objfiles ())
     {
-      for (compunit_symtab *cust : objfile_compunits (obj))
+      for (compunit_symtab *cust : obj->compunits ())
        if (block == BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust),
                                        GLOBAL_BLOCK))
          {
@@ -2266,7 +2289,7 @@ lookup_symbol_in_objfile_symtabs (struct objfile *objfile, int block_index,
                          name, domain_name (domain));
     }
 
-  for (compunit_symtab *cust : objfile_compunits (objfile))
+  for (compunit_symtab *cust : objfile->compunits ())
     {
       const struct blockvector *bv;
       const struct block *block;
@@ -2302,7 +2325,7 @@ lookup_symbol_in_objfile_symtabs (struct objfile *objfile, int block_index,
    Normally we only look in OBJFILE, and not any separate debug objfiles
    because the outer loop will cause them to be searched too.  This case is
    different.  Here we're called from search_symbols where it will only
-   call us for the the objfile that contains a matching minsym.  */
+   call us for the objfile that contains a matching minsym.  */
 
 static struct block_symbol
 lookup_symbol_in_objfile_from_linkage_name (struct objfile *objfile,
@@ -2589,7 +2612,7 @@ lookup_static_symbol (const char *name, const domain_enum domain)
       return result;
     }
 
-  for (objfile *objfile : all_objfiles (current_program_space))
+  for (objfile *objfile : current_program_space->objfiles ())
     {
       result = lookup_symbol_in_objfile (objfile, STATIC_BLOCK, name, domain);
       if (result.symbol != NULL)
@@ -2764,7 +2787,7 @@ basic_lookup_transparent_type_1 (struct objfile *objfile, int block_index,
   const struct block *block;
   const struct symbol *sym;
 
-  for (compunit_symtab *cust : objfile_compunits (objfile))
+  for (compunit_symtab *cust : objfile->compunits ())
     {
       bv = COMPUNIT_BLOCKVECTOR (cust);
       block = BLOCKVECTOR_BLOCK (bv, block_index);
@@ -2796,14 +2819,14 @@ basic_lookup_transparent_type (const char *name)
      of the desired name as a global, then do psymtab-to-symtab
      conversion on the fly and return the found symbol.  */
 
-  for (objfile *objfile : all_objfiles (current_program_space))
+  for (objfile *objfile : current_program_space->objfiles ())
     {
       t = basic_lookup_transparent_type_1 (objfile, GLOBAL_BLOCK, name);
       if (t)
        return t;
     }
 
-  for (objfile *objfile : all_objfiles (current_program_space))
+  for (objfile *objfile : current_program_space->objfiles ())
     {
       t = basic_lookup_transparent_type_quick (objfile, GLOBAL_BLOCK, name);
       if (t)
@@ -2817,14 +2840,14 @@ basic_lookup_transparent_type (const char *name)
      of the desired name as a file-level static, then do psymtab-to-symtab
      conversion on the fly and return the found symbol.  */
 
-  for (objfile *objfile : all_objfiles (current_program_space))
+  for (objfile *objfile : current_program_space->objfiles ())
     {
       t = basic_lookup_transparent_type_1 (objfile, STATIC_BLOCK, name);
       if (t)
        return t;
     }
 
-  for (objfile *objfile : all_objfiles (current_program_space))
+  for (objfile *objfile : current_program_space->objfiles ())
     {
       t = basic_lookup_transparent_type_quick (objfile, STATIC_BLOCK, name);
       if (t)
@@ -2880,12 +2903,7 @@ find_pc_sect_compunit_symtab (CORE_ADDR pc, struct obj_section *section)
      we call find_pc_sect_psymtab which has a similar restriction based
      on the partial_symtab's texthigh and textlow.  */
   msymbol = lookup_minimal_symbol_by_pc_section (pc, section);
-  if (msymbol.minsym
-      && (MSYMBOL_TYPE (msymbol.minsym) == mst_data
-         || MSYMBOL_TYPE (msymbol.minsym) == mst_bss
-         || MSYMBOL_TYPE (msymbol.minsym) == mst_abs
-         || MSYMBOL_TYPE (msymbol.minsym) == mst_file_data
-         || MSYMBOL_TYPE (msymbol.minsym) == mst_file_bss))
+  if (msymbol.minsym && msymbol.minsym->data_p ())
     return NULL;
 
   /* Search all symtabs for the one whose file contains our address, and which
@@ -2903,9 +2921,9 @@ find_pc_sect_compunit_symtab (CORE_ADDR pc, struct obj_section *section)
      It also happens for objfiles that have their functions reordered.
      For these, the symtab we are looking for is not necessarily read in.  */
 
-  for (objfile *obj_file : all_objfiles (current_program_space))
+  for (objfile *obj_file : current_program_space->objfiles ())
     {
-      for (compunit_symtab *cust : objfile_compunits (obj_file))
+      for (compunit_symtab *cust : obj_file->compunits ())
        {
          struct block *b;
          const struct blockvector *bv;
@@ -2965,7 +2983,7 @@ find_pc_sect_compunit_symtab (CORE_ADDR pc, struct obj_section *section)
 
   /* Not found in symtabs, search the "quick" symtabs (e.g. psymtabs).  */
 
-  for (objfile *objf : all_objfiles (current_program_space))
+  for (objfile *objf : current_program_space->objfiles ())
     {
       struct compunit_symtab *result;
 
@@ -2997,7 +3015,7 @@ find_pc_compunit_symtab (CORE_ADDR pc)
 struct symbol *
 find_symbol_at_address (CORE_ADDR address)
 {
-  for (objfile *objfile : all_objfiles (current_program_space))
+  for (objfile *objfile : current_program_space->objfiles ())
     {
       if (objfile->sf == NULL
          || objfile->sf->qf->find_compunit_symtab_by_address == NULL)
@@ -3352,44 +3370,49 @@ find_line_symtab (struct symtab *sym_tab, int line,
       else
        best = 0;
 
-      for (objfile *objfile : all_objfiles (current_program_space))
+      for (objfile *objfile : current_program_space->objfiles ())
        {
          if (objfile->sf)
            objfile->sf->qf->expand_symtabs_with_fullname
              (objfile, symtab_to_fullname (sym_tab));
        }
 
-      struct objfile *objfile;
-      ALL_FILETABS (objfile, cu, s)
-      {
-       struct linetable *l;
-       int ind;
-
-       if (FILENAME_CMP (sym_tab->filename, s->filename) != 0)
-         continue;
-       if (FILENAME_CMP (symtab_to_fullname (sym_tab),
-                         symtab_to_fullname (s)) != 0)
-         continue;     
-       l = SYMTAB_LINETABLE (s);
-       ind = find_line_common (l, line, &exact, 0);
-       if (ind >= 0)
-         {
-           if (exact)
-             {
-               best_index = ind;
-               best_linetable = l;
-               best_symtab = s;
-               goto done;
-             }
-           if (best == 0 || l->item[ind].line < best)
-             {
-               best = l->item[ind].line;
-               best_index = ind;
-               best_linetable = l;
-               best_symtab = s;
-             }
-         }
-      }
+      for (objfile *objfile : current_program_space->objfiles ())
+       {
+         for (compunit_symtab *cu : objfile->compunits ())
+           {
+             for (symtab *s : compunit_filetabs (cu))
+               {
+                 struct linetable *l;
+                 int ind;
+
+                 if (FILENAME_CMP (sym_tab->filename, s->filename) != 0)
+                   continue;
+                 if (FILENAME_CMP (symtab_to_fullname (sym_tab),
+                                   symtab_to_fullname (s)) != 0)
+                   continue;   
+                 l = SYMTAB_LINETABLE (s);
+                 ind = find_line_common (l, line, &exact, 0);
+                 if (ind >= 0)
+                   {
+                     if (exact)
+                       {
+                         best_index = ind;
+                         best_linetable = l;
+                         best_symtab = s;
+                         goto done;
+                       }
+                     if (best == 0 || l->item[ind].line < best)
+                       {
+                         best = l->item[ind].line;
+                         best_index = ind;
+                         best_linetable = l;
+                         best_symtab = s;
+                       }
+                   }
+               }
+           }
+       }
     }
 done:
   if (best_index < 0)
@@ -4164,7 +4187,7 @@ output_source_filename (const char *name,
   data->first = 0;
 
   wrap_here ("");
-  fputs_filtered (name, gdb_stdout);
+  fputs_styled (name, file_name_style.style (), gdb_stdout);
 }
 
 /* A callback for map_partial_symbol_filenames.  */
@@ -4180,7 +4203,6 @@ output_partial_symbol_filename (const char *filename, const char *fullname,
 static void
 info_sources_command (const char *ignore, int from_tty)
 {
-  struct objfile *objfile;
   struct output_source_filename_data data;
 
   if (!have_full_symbols () && !have_partial_symbols ())
@@ -4195,12 +4217,18 @@ info_sources_command (const char *ignore, int from_tty)
   printf_filtered ("Source files for which symbols have been read in:\n\n");
 
   data.first = 1;
-  ALL_FILETABS (objfile, cu, s)
-  {
-    const char *fullname = symtab_to_fullname (s);
+  for (objfile *objfile : current_program_space->objfiles ())
+    {
+      for (compunit_symtab *cu : objfile->compunits ())
+       {
+         for (symtab *s : compunit_filetabs (cu))
+           {
+             const char *fullname = symtab_to_fullname (s);
 
-    output_source_filename (fullname, &data);
-  }
+             output_source_filename (fullname, &data);
+           }
+       }
+    }
   printf_filtered ("\n\n");
 
   printf_filtered ("Source files for which symbols "
@@ -4444,9 +4472,9 @@ search_symbols (const char *regexp, enum search_domain kind,
 
   if (nfiles == 0 && (kind == VARIABLES_DOMAIN || kind == FUNCTIONS_DOMAIN))
     {
-      for (objfile *objfile : all_objfiles (current_program_space))
+      for (objfile *objfile : current_program_space->objfiles ())
        {
-         for (minimal_symbol *msymbol : objfile_msymbols (objfile))
+         for (minimal_symbol *msymbol : objfile->msymbols ())
            {
              QUIT;
 
@@ -4481,9 +4509,9 @@ search_symbols (const char *regexp, enum search_domain kind,
        }
     }
 
-  for (objfile *objfile : all_objfiles (current_program_space))
+  for (objfile *objfile : current_program_space->objfiles ())
     {
-      for (compunit_symtab *cust : objfile_compunits (objfile))
+      for (compunit_symtab *cust : objfile->compunits ())
        {
          bv = COMPUNIT_BLOCKVECTOR (cust);
          for (i = GLOBAL_BLOCK; i <= STATIC_BLOCK; i++)
@@ -4547,9 +4575,9 @@ search_symbols (const char *regexp, enum search_domain kind,
   if ((found_misc || (nfiles == 0 && kind != FUNCTIONS_DOMAIN))
       && !treg.has_value ())
     {
-      for (objfile *objfile : all_objfiles (current_program_space))
+      for (objfile *objfile : current_program_space->objfiles ())
        {
-         for (minimal_symbol *msymbol : objfile_msymbols (objfile))
+         for (minimal_symbol *msymbol : objfile->msymbols ())
            {
              QUIT;
 
@@ -4611,7 +4639,7 @@ print_symbol_info (enum search_domain kind,
       if (filename_cmp (last, s_filename) != 0)
        {
          fputs_filtered ("\nFile ", gdb_stdout);
-         fputs_filtered (s_filename, gdb_stdout);
+         fputs_styled (s_filename, file_name_style.style (), gdb_stdout);
          fputs_filtered (":\n", gdb_stdout);
        }
 
@@ -4658,8 +4686,15 @@ print_msymbol_info (struct bound_minimal_symbol msymbol)
   else
     tmp = hex_string_custom (BMSYMBOL_VALUE_ADDRESS (msymbol),
                             16);
-  printf_filtered ("%s  %s\n",
-                  tmp, MSYMBOL_PRINT_NAME (msymbol.minsym));
+  fputs_styled (tmp, address_style.style (), gdb_stdout);
+  fputs_filtered ("  ", gdb_stdout);
+  if (msymbol.minsym->text_p ())
+    fputs_styled (MSYMBOL_PRINT_NAME (msymbol.minsym),
+                 function_name_style.style (),
+                 gdb_stdout);
+  else
+    fputs_filtered (MSYMBOL_PRINT_NAME (msymbol.minsym), gdb_stdout);
+  fputs_filtered ("\n", gdb_stdout);
 }
 
 /* This is the guts of the commands "info functions", "info types", and
@@ -4690,7 +4725,7 @@ symtab_symbol_info (bool quiet,
          if (t_regexp != NULL)
            printf_filtered
              (_("All %ss matching regular expression \"%s\""
-                " with type matching regulation expression \"%s\":\n"),
+                " with type matching regular expression \"%s\":\n"),
               classnames[kind], regexp, t_regexp);
          else
            printf_filtered (_("All %ss matching regular expression \"%s\":\n"),
@@ -4701,7 +4736,7 @@ symtab_symbol_info (bool quiet,
          if (t_regexp != NULL)
            printf_filtered
              (_("All defined %ss"
-                " with type matching regulation expression \"%s\" :\n"),
+                " with type matching regular expression \"%s\" :\n"),
               classnames[kind], t_regexp);
          else
            printf_filtered (_("All defined %ss:\n"), classnames[kind]);
@@ -5263,9 +5298,9 @@ default_collect_symbol_completion_matches_break_on
 
   if (code == TYPE_CODE_UNDEF)
     {
-      for (objfile *objfile : all_objfiles (current_program_space))
+      for (objfile *objfile : current_program_space->objfiles ())
        {
-         for (minimal_symbol *msymbol : objfile_msymbols (objfile))
+         for (minimal_symbol *msymbol : objfile->msymbols ())
            {
              QUIT;
 
@@ -5282,9 +5317,9 @@ default_collect_symbol_completion_matches_break_on
     }
 
   /* Add completions for all currently loaded symbol tables.  */
-  for (objfile *objfile : all_objfiles (current_program_space))
+  for (objfile *objfile : current_program_space->objfiles ())
     {
-      for (compunit_symtab *cust : objfile_compunits (objfile))
+      for (compunit_symtab *cust : objfile->compunits ())
        add_symtab_completions (cust, tracker, mode, lookup_name,
                                sym_text, word, code);
     }
@@ -5581,7 +5616,6 @@ maybe_add_partial_symtab_filename (const char *filename, const char *fullname,
 completion_list
 make_source_files_completion_list (const char *text, const char *word)
 {
-  struct objfile *objfile;
   size_t text_len = strlen (text);
   completion_list list;
   const char *base_name;
@@ -5592,28 +5626,34 @@ make_source_files_completion_list (const char *text, const char *word)
 
   filename_seen_cache filenames_seen;
 
-  ALL_FILETABS (objfile, cu, s)
+  for (objfile *objfile : current_program_space->objfiles ())
     {
-      if (not_interesting_fname (s->filename))
-       continue;
-      if (!filenames_seen.seen (s->filename)
-         && filename_ncmp (s->filename, text, text_len) == 0)
-       {
-         /* This file matches for a completion; add it to the current
-            list of matches.  */
-         add_filename_to_list (s->filename, text, word, &list);
-       }
-      else
+      for (compunit_symtab *cu : objfile->compunits ())
        {
-         /* NOTE: We allow the user to type a base name when the
-            debug info records leading directories, but not the other
-            way around.  This is what subroutines of breakpoint
-            command do when they parse file names.  */
-         base_name = lbasename (s->filename);
-         if (base_name != s->filename
-             && !filenames_seen.seen (base_name)
-             && filename_ncmp (base_name, text, text_len) == 0)
-           add_filename_to_list (base_name, text, word, &list);
+         for (symtab *s : compunit_filetabs (cu))
+           {
+             if (not_interesting_fname (s->filename))
+               continue;
+             if (!filenames_seen.seen (s->filename)
+                 && filename_ncmp (s->filename, text, text_len) == 0)
+               {
+                 /* This file matches for a completion; add it to the current
+                    list of matches.  */
+                 add_filename_to_list (s->filename, text, word, &list);
+               }
+             else
+               {
+                 /* NOTE: We allow the user to type a base name when the
+                    debug info records leading directories, but not the other
+                    way around.  This is what subroutines of breakpoint
+                    command do when they parse file names.  */
+                 base_name = lbasename (s->filename);
+                 if (base_name != s->filename
+                     && !filenames_seen.seen (base_name)
+                     && filename_ncmp (base_name, text, text_len) == 0)
+                   add_filename_to_list (base_name, text, word, &list);
+               }
+           }
        }
     }
 
@@ -5703,7 +5743,7 @@ find_main_name (void)
      relies on the order of objfile creation -- which still isn't
      guaranteed to get the correct answer, but is just probably more
      accurate.  */
-  for (objfile *objfile : all_objfiles (current_program_space))
+  for (objfile *objfile : current_program_space->objfiles ())
     {
       if (objfile->per_bfd->name_of_main != NULL)
        {