gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / linespec.c
index 8e2ade07c73adcb7dbe063f65cf6355efe8d0f40..ddca05b3dbf6d0419a2676fc147da5cce65c593e 100644 (file)
@@ -1,6 +1,6 @@
 /* Parser for linespec for the GNU debugger, GDB.
 
-   Copyright (C) 1986-2019 Free Software Foundation, Inc.
+   Copyright (C) 1986-2020 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -44,8 +44,8 @@
 #include "ada-lang.h"
 #include "stack.h"
 #include "location.h"
-#include "common/function-view.h"
-#include "common/def-vector.h"
+#include "gdbsupport/function-view.h"
+#include "gdbsupport/def-vector.h"
 #include <algorithm>
 
 /* An enumeration of the various things a user might attempt to
@@ -555,7 +555,7 @@ copy_token_string (linespec_token token)
   const char *str, *s;
 
   if (token.type == LSTOKEN_KEYWORD)
-    return gdb::unique_xmalloc_ptr<char> (xstrdup (LS_TOKEN_KEYWORD (token)));
+    return make_unique_xstrdup (LS_TOKEN_KEYWORD (token));
 
   str = LS_TOKEN_STOKEN (token).ptr;
   s = remove_trailing_whitespace (str, str + LS_TOKEN_STOKEN (token).length);
@@ -760,7 +760,9 @@ linespec_lexer_lex_string (linespec_parser *parser)
              /* Do not tokenize ABI tags such as "[abi:cxx11]".  */
              else if (PARSER_STREAM (parser) - start > 4
                       && startswith (PARSER_STREAM (parser) - 4, "[abi"))
-               ++(PARSER_STREAM (parser));
+               {
+                 /* Nothing.  */
+               }
 
              /* Do not tokenify if the input length so far is one
                 (i.e, a single-letter drive name) and the next character
@@ -861,6 +863,7 @@ linespec_lexer_lex_string (linespec_parser *parser)
            }
 
          /* Advance the stream.  */
+         gdb_assert (*(PARSER_STREAM (parser)) != '\0');
          ++(PARSER_STREAM (parser));
        }
     }
@@ -1130,58 +1133,56 @@ iterate_over_all_matching_symtabs
    struct program_space *search_pspace, bool include_inline,
    gdb::function_view<symbol_found_callback_ftype> callback)
 {
-  struct program_space *pspace;
-
-  ALL_PSPACES (pspace)
-  {
-    if (search_pspace != NULL && search_pspace != pspace)
-      continue;
-    if (pspace->executing_startup)
-      continue;
+  for (struct program_space *pspace : program_spaces)
+    {
+      if (search_pspace != NULL && search_pspace != pspace)
+       continue;
+      if (pspace->executing_startup)
+       continue;
 
-    set_current_program_space (pspace);
+      set_current_program_space (pspace);
 
-    for (objfile *objfile : current_program_space->objfiles ())
-      {
-       if (objfile->sf)
-         objfile->sf->qf->expand_symtabs_matching (objfile,
-                                                   NULL,
-                                                   lookup_name,
-                                                   NULL, NULL,
-                                                   search_domain);
-
-       for (compunit_symtab *cu : objfile->compunits ())
-         {
-           struct symtab *symtab = COMPUNIT_FILETABS (cu);
+      for (objfile *objfile : current_program_space->objfiles ())
+       {
+         if (objfile->sf)
+           objfile->sf->qf->expand_symtabs_matching (objfile,
+                                                     NULL,
+                                                     &lookup_name,
+                                                     NULL, NULL,
+                                                     search_domain);
+
+         for (compunit_symtab *cu : objfile->compunits ())
+           {
+             struct symtab *symtab = COMPUNIT_FILETABS (cu);
 
-           iterate_over_file_blocks (symtab, lookup_name, name_domain,
-                                     callback);
+             iterate_over_file_blocks (symtab, lookup_name, name_domain,
+                                       callback);
 
-           if (include_inline)
-             {
-               struct block *block;
-               int i;
+             if (include_inline)
+               {
+                 const struct block *block;
+                 int i;
 
-               for (i = FIRST_LOCAL_BLOCK;
-                    i < BLOCKVECTOR_NBLOCKS (SYMTAB_BLOCKVECTOR (symtab));
-                    i++)
-                 {
-                   block = BLOCKVECTOR_BLOCK (SYMTAB_BLOCKVECTOR (symtab), i);
-                   state->language->la_iterate_over_symbols
-                     (block, lookup_name, name_domain,
-                      [&] (block_symbol *bsym)
-                      {
-                        /* Restrict calls to CALLBACK to symbols
-                           representing inline symbols only.  */
-                        if (SYMBOL_INLINED (bsym->symbol))
-                          return callback (bsym);
-                        return true;
-                      });
-                 }
-             }
-         }
-      }
-  }
+                 for (i = FIRST_LOCAL_BLOCK;
+                      i < BLOCKVECTOR_NBLOCKS (SYMTAB_BLOCKVECTOR (symtab));
+                      i++)
+                   {
+                     block = BLOCKVECTOR_BLOCK (SYMTAB_BLOCKVECTOR (symtab), i);
+                     state->language->iterate_over_symbols
+                       (block, lookup_name, name_domain,
+                        [&] (block_symbol *bsym)
+                        {
+                          /* Restrict calls to CALLBACK to symbols
+                             representing inline symbols only.  */
+                          if (SYMBOL_INLINED (bsym->symbol))
+                            return callback (bsym);
+                          return true;
+                        });
+                   }
+               }
+           }
+       }
+    }
 }
 
 /* Returns the block to be used for symbol searches from
@@ -1203,7 +1204,7 @@ iterate_over_file_blocks
   (struct symtab *symtab, const lookup_name_info &name,
    domain_enum domain, gdb::function_view<symbol_found_callback_ftype> callback)
 {
-  struct block *block;
+  const struct block *block;
 
   for (block = BLOCKVECTOR_BLOCK (SYMTAB_BLOCKVECTOR (symtab), STATIC_BLOCK);
        block != NULL;
@@ -1221,7 +1222,7 @@ find_methods (struct type *t, enum language t_lang, const char *name,
              std::vector<struct type *> *superclasses)
 {
   int ibase;
-  const char *class_name = TYPE_NAME (t);
+  const char *class_name = t->name ();
 
   /* Ignore this class if it doesn't have a name.  This is ugly, but
      unless we figure out how to get the physname without the name of
@@ -1486,7 +1487,7 @@ decode_line_2 (struct linespec_state *self,
               std::vector<symtab_and_line> *result,
               const char *select_mode)
 {
-  char *args;
+  const char *args;
   const char *prompt;
   int i;
   std::vector<const char *> filters;
@@ -2063,8 +2064,7 @@ canonicalize_linespec (struct linespec_state *state, const linespec_p ls)
          gdb_assert (!ls->labels.function_symbols->empty ()
                      && (ls->labels.function_symbols->size () == 1));
          block_symbol s = ls->labels.function_symbols->front ();
-         explicit_loc->function_name
-           = xstrdup (SYMBOL_NATURAL_NAME (s.symbol));
+         explicit_loc->function_name = xstrdup (s.symbol->natural_name ());
        }
     }
 
@@ -2192,7 +2192,7 @@ create_sals_line_offset (struct linespec_state *self,
              skip_prologue_sal (&intermediate_results[i]);
            intermediate_results[i].symbol = sym;
            add_sal_to_sals (self, &values, &intermediate_results[i],
-                            sym ? SYMBOL_NATURAL_NAME (sym) : NULL, 0);
+                            sym ? sym->natural_name () : NULL, 0);
          }
     }
 
@@ -2247,7 +2247,7 @@ convert_linespec_to_sals (struct linespec_state *state, linespec_p ls)
          if (symbol_to_sal (&sal, state->funfirstline, sym.symbol)
              && maybe_add_address (state->addr_set, pspace, sal.pc))
            add_sal_to_sals (state, &sals, &sal,
-                            SYMBOL_NATURAL_NAME (sym.symbol), 0);
+                            sym.symbol->natural_name (), 0);
        }
     }
   else if (ls->function_symbols != NULL || ls->minimal_symbols != NULL)
@@ -2289,7 +2289,7 @@ convert_linespec_to_sals (struct linespec_state *state, linespec_p ls)
                          if (MSYMBOL_TYPE (elem.minsym) == mst_data_gnu_ifunc)
                            {
                              struct gdbarch *gdbarch
-                               = get_objfile_arch (elem.objfile);
+                               = elem.objfile->arch ();
                              msym_addr
                                = (gdbarch_convert_from_func_ptr_addr
                                   (gdbarch,
@@ -2312,7 +2312,7 @@ convert_linespec_to_sals (struct linespec_state *state, linespec_p ls)
                  if (symbol_to_sal (&sal, state->funfirstline, sym.symbol)
                      && maybe_add_address (state->addr_set, pspace, sal.pc))
                    add_sal_to_sals (state, &sals, &sal,
-                                    SYMBOL_NATURAL_NAME (sym.symbol), 0);
+                                    sym.symbol->natural_name (), 0);
                }
            }
        }
@@ -2383,16 +2383,15 @@ convert_explicit_location_to_linespec (struct linespec_state *self,
 
   if (source_filename != NULL)
     {
-      TRY
+      try
        {
          *result->file_symtabs
            = symtabs_from_filename (source_filename, self->search_pspace);
        }
-      CATCH (except, RETURN_MASK_ERROR)
+      catch (const gdb_exception_error &except)
        {
          source_file_not_found_error (source_filename);
        }
-      END_CATCH
       result->explicit_loc.source_filename = xstrdup (source_filename);
     }
   else
@@ -2509,7 +2508,7 @@ parse_linespec (linespec_parser *parser, const char *arg,
                symbol_name_match_type match_type)
 {
   linespec_token token;
-  struct gdb_exception file_exception = exception_none;
+  struct gdb_exception file_exception;
 
   /* A special case to start.  It has become quite popular for
      IDEs to work around bugs in the previous parser by quoting
@@ -2608,17 +2607,16 @@ parse_linespec (linespec_parser *parser, const char *arg,
       gdb::unique_xmalloc_ptr<char> user_filename = copy_token_string (token);
 
       /* Check if the input is a filename.  */
-      TRY
+      try
        {
          *PARSER_RESULT (parser)->file_symtabs
            = symtabs_from_filename (user_filename.get (),
                                     PARSER_STATE (parser)->search_pspace);
        }
-      CATCH (ex, RETURN_MASK_ERROR)
+      catch (gdb_exception_error &ex)
        {
-         file_exception = ex;
+         file_exception = std::move (ex);
        }
-      END_CATCH
 
       if (file_exception.reason >= 0)
        {
@@ -2665,7 +2663,7 @@ parse_linespec (linespec_parser *parser, const char *arg,
       /* The linespec didn't parse.  Re-throw the file exception if
         there was one.  */
       if (file_exception.reason < 0)
-       throw_exception (file_exception);
+       throw_exception (std::move (file_exception));
 
       /* Otherwise, the symbol is not found.  */
       symbol_not_found_error (PARSER_EXPLICIT (parser)->function_name,
@@ -2902,7 +2900,7 @@ complete_label (completion_tracker &tracker,
     {
       for (const auto &label : *labels)
        {
-         char *match = xstrdup (SYMBOL_SEARCH_NAME (label.symbol));
+         char *match = xstrdup (label.symbol->search_name ());
          tracker.add_completion (gdb::unique_xmalloc_ptr<char> (match));
        }
       delete labels;
@@ -2923,7 +2921,7 @@ linespec_complete_label (completion_tracker &tracker,
 
   line_offset unknown_offset = { 0, LINE_OFFSET_UNKNOWN };
 
-  TRY
+  try
     {
       convert_explicit_location_to_linespec (PARSER_STATE (&parser),
                                             PARSER_RESULT (&parser),
@@ -2932,11 +2930,10 @@ linespec_complete_label (completion_tracker &tracker,
                                             func_name_match_type,
                                             NULL, unknown_offset);
     }
-  CATCH (ex, RETURN_MASK_ERROR)
+  catch (const gdb_exception_error &ex)
     {
       return;
     }
-  END_CATCH
 
   complete_label (tracker, &parser, label_name);
 }
@@ -2959,14 +2956,13 @@ linespec_complete (completion_tracker &tracker, const char *text,
 
   /* Parse as much as possible.  parser.completion_word will hold
      furthest completion point we managed to parse to.  */
-  TRY
+  try
     {
       parse_linespec (&parser, text, match_type);
     }
-  CATCH (except, RETURN_MASK_ERROR)
+  catch (const gdb_exception_error &except)
     {
     }
-  END_CATCH
 
   if (parser.completion_quote_char != '\0'
       && parser.completion_quote_end != NULL
@@ -3148,17 +3144,16 @@ event_location_to_sals (linespec_parser *parser,
     case LINESPEC_LOCATION:
       {
        PARSER_STATE (parser)->is_linespec = 1;
-       TRY
+       try
          {
            const linespec_location *ls = get_linespec_location (location);
            result = parse_linespec (parser,
                                     ls->spec_string, ls->match_type);
          }
-       CATCH (except, RETURN_MASK_ERROR)
+       catch (const gdb_exception_error &except)
          {
-           throw_exception (except);
+           throw;
          }
-       END_CATCH
       }
       break;
 
@@ -3323,8 +3318,7 @@ decode_line_with_last_displayed (const char *string, int flags)
        ? decode_line_1 (location.get (), flags, NULL,
                        get_last_displayed_symtab (),
                        get_last_displayed_line ())
-       : decode_line_1 (location.get (), flags, NULL,
-                       (struct symtab *) NULL, 0));
+       : decode_line_1 (location.get (), flags, NULL, NULL, 0));
 
   if (*string)
     error (_("Junk at end of line specification: %s"), string);
@@ -3334,7 +3328,7 @@ decode_line_with_last_displayed (const char *string, int flags)
 
 \f
 
-/* First, some functions to initialize stuff at the beggining of the
+/* First, some functions to initialize stuff at the beginning of the
    function.  */
 
 static void
@@ -3497,9 +3491,9 @@ decode_compound_collector::operator () (block_symbol *bsym)
 
   t = SYMBOL_TYPE (sym);
   t = check_typedef (t);
-  if (TYPE_CODE (t) != TYPE_CODE_STRUCT
-      && TYPE_CODE (t) != TYPE_CODE_UNION
-      && TYPE_CODE (t) != TYPE_CODE_NAMESPACE)
+  if (t->code () != TYPE_CODE_STRUCT
+      && t->code () != TYPE_CODE_UNION
+      && t->code () != TYPE_CODE_NAMESPACE)
     return true; /* Continue iterating.  */
 
   slot = htab_find_slot (m_unique_syms, sym, INSERT);
@@ -3674,12 +3668,12 @@ find_method (struct linespec_state *self, std::vector<symtab *> *file_symtabs,
      because we collect data across the program space before deciding
      what to do.  */
   last_result_len = 0;
-  unsigned int ix = 0;
   for (const auto &elt : *sym_classes)
     {
       struct type *t;
       struct program_space *pspace;
       struct symbol *sym = elt.symbol;
+      unsigned int ix = &elt - &*sym_classes->begin ();
 
       /* Program spaces that are executing startup should have
         been filtered out earlier.  */
@@ -3687,7 +3681,7 @@ find_method (struct linespec_state *self, std::vector<symtab *> *file_symtabs,
       gdb_assert (!pspace->executing_startup);
       set_current_program_space (pspace);
       t = check_typedef (SYMBOL_TYPE (sym));
-      find_methods (t, SYMBOL_LANGUAGE (sym),
+      find_methods (t, sym->language (),
                    method_name, &result_names, &superclass_vec);
 
       /* Handle all items from a single program space at once; and be
@@ -3700,7 +3694,7 @@ find_method (struct linespec_state *self, std::vector<symtab *> *file_symtabs,
             this program space, consider superclasses.  */
          if (result_names.size () == last_result_len)
            find_superclass_methods (std::move (superclass_vec), method_name,
-                                    SYMBOL_LANGUAGE (sym), &result_names);
+                                    sym->language (), &result_names);
 
          /* We have a list of candidate symbol names, so now we
             iterate over the symbol tables looking for all
@@ -3710,7 +3704,6 @@ find_method (struct linespec_state *self, std::vector<symtab *> *file_symtabs,
 
          superclass_vec.clear ();
          last_result_len = result_names.size ();
-         ++ix;
        }
     }
 
@@ -3791,9 +3784,7 @@ collect_symtabs_from_filename (const char *file,
   /* Find that file's data.  */
   if (search_pspace == NULL)
     {
-      struct program_space *pspace;
-
-      ALL_PSPACES (pspace)
+      for (struct program_space *pspace : program_spaces)
         {
          if (pspace->executing_startup)
            continue;
@@ -3903,9 +3894,10 @@ find_linespec_symbols (struct linespec_state *state,
                       std::vector <block_symbol> *symbols,
                       std::vector<bound_minimal_symbol> *minsyms)
 {
-  std::string canon = cp_canonicalize_string_no_typedefs (lookup_name);
-  if (!canon.empty ())
-    lookup_name = canon.c_str ();
+  gdb::unique_xmalloc_ptr<char> canon
+    = cp_canonicalize_string_no_typedefs (lookup_name);
+  if (canon != nullptr)
+    lookup_name = canon.get ();
 
   /* It's important to not call expand_symtabs_matching unnecessarily
      as it can really slow things down (by unnecessarily expanding
@@ -3959,7 +3951,7 @@ find_linespec_symbols (struct linespec_state *state,
       if (!classes.empty ())
        {
          /* Now locate a list of suitable methods named METHOD.  */
-         TRY
+         try
            {
              find_method (state, file_symtabs,
                           klass.c_str (), method.c_str (),
@@ -3968,12 +3960,11 @@ find_linespec_symbols (struct linespec_state *state,
 
          /* If successful, we're done.  If NOT_FOUND_ERROR
             was not thrown, rethrow the exception that we did get.  */
-         CATCH (except, RETURN_MASK_ERROR)
+         catch (const gdb_exception_error &except)
            {
              if (except.error != NOT_FOUND_ERROR)
-               throw_exception (except);
+               throw;
            }
-         END_CATCH
        }
     }
 }
@@ -4003,9 +3994,9 @@ find_label_symbols_in_block (const struct block *block,
 
       ALL_BLOCK_SYMBOLS (block, iter, sym)
        {
-         if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
+         if (symbol_matches_domain (sym->language (),
                                     SYMBOL_DOMAIN (sym), LABEL_DOMAIN)
-             && cmp (SYMBOL_SEARCH_NAME (sym), name, name_len) == 0)
+             && cmp (sym->search_name (), name, name_len) == 0)
            {
              result->push_back ({sym, block});
              label_funcs_ret->push_back ({fn_sym, block});
@@ -4105,7 +4096,7 @@ decode_digits_list_mode (struct linespec_state *self,
        val.symtab = elt;
       val.pspace = SYMTAB_PSPACE (elt);
       val.pc = 0;
-      val.explicit_line = 1;
+      val.explicit_line = true;
 
       add_sal_to_sals (self, &values, &val, NULL, 0);
     }
@@ -4113,8 +4104,9 @@ decode_digits_list_mode (struct linespec_state *self,
   return values;
 }
 
-/* A helper for create_sals_line_offset that iterates over the symtabs,
-   adding lines to the VEC.  */
+/* A helper for create_sals_line_offset that iterates over the symtabs
+   associated with LS and returns a vector of corresponding symtab_and_line
+   structures.  */
 
 static std::vector<symtab_and_line>
 decode_digits_ordinary (struct linespec_state *self,
@@ -4139,6 +4131,7 @@ decode_digits_ordinary (struct linespec_state *self,
          sal.pspace = SYMTAB_PSPACE (elt);
          sal.symtab = elt;
          sal.line = line;
+         sal.explicit_line = true;
          sal.pc = pc;
          sals.push_back (std::move (sal));
        }
@@ -4171,7 +4164,7 @@ linespec_parse_variable (struct linespec_state *self, const char *variable)
       sscanf ((variable[1] == '$') ? variable + 2 : variable + 1, "%d", &index);
       val_history
        = access_value_history ((variable[1] == '$') ? -index : index);
-      if (TYPE_CODE (value_type (val_history)) != TYPE_CODE_INT)
+      if (value_type (val_history)->code () != TYPE_CODE_INT)
        error (_("History values used in line "
                 "specs must have integer values."));
       offset.offset = value_as_long (val_history);
@@ -4223,7 +4216,7 @@ minsym_found (struct linespec_state *self, struct objfile *objfile,
 
   if (is_function)
     {
-      const char *msym_name = MSYMBOL_LINKAGE_NAME (msymbol);
+      const char *msym_name = msymbol->linkage_name ();
 
       if (MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc
          || MSYMBOL_TYPE (msymbol) == mst_data_gnu_ifunc)
@@ -4252,7 +4245,7 @@ minsym_found (struct linespec_state *self, struct objfile *objfile,
   sal.section = MSYMBOL_OBJ_SECTION (objfile, msymbol);
 
   if (maybe_add_address (self->addr_set, objfile->pspace, sal.pc))
-    add_sal_to_sals (self, result, &sal, MSYMBOL_NATURAL_NAME (msymbol), 0);
+    add_sal_to_sals (self, result, &sal, msymbol->natural_name (), 0);
 }
 
 /* A helper function to classify a minimal_symbol_type according to
@@ -4338,29 +4331,27 @@ search_minsyms_for_name (struct collect_info *info,
 
   if (symtab == NULL)
     {
-      struct program_space *pspace;
-
-      ALL_PSPACES (pspace)
-      {
-       if (search_pspace != NULL && search_pspace != pspace)
-         continue;
-       if (pspace->executing_startup)
-         continue;
+      for (struct program_space *pspace : program_spaces)
+       {
+         if (search_pspace != NULL && search_pspace != pspace)
+           continue;
+         if (pspace->executing_startup)
+           continue;
 
-       set_current_program_space (pspace);
+         set_current_program_space (pspace);
 
-       for (objfile *objfile : current_program_space->objfiles ())
-         {
-           iterate_over_minimal_symbols (objfile, name,
-                                         [&] (struct minimal_symbol *msym)
-                                         {
-                                           add_minsym (msym, objfile, nullptr,
-                                                       info->state->list_mode,
-                                                       &minsyms);
-                                           return false;
-                                         });
-         }
-      }
+         for (objfile *objfile : current_program_space->objfiles ())
+           {
+             iterate_over_minimal_symbols (objfile, name,
+                                           [&] (struct minimal_symbol *msym)
+                                           {
+                                             add_minsym (msym, objfile, nullptr,
+                                                         info->state->list_mode,
+                                                         &minsyms);
+                                             return false;
+                                           });
+           }
+       }
     }
   else
     {
This page took 0.049215 seconds and 4 git commands to generate.