Adjust testsuite/ld-plugin/pr22983.d
[deliverable/binutils-gdb.git] / gdb / symtab.c
index 3865420cd1e5de184a150319966388c2486a5b2d..41aaef7582dfd10000925dda6e785bbeb6b33915 100644 (file)
@@ -54,7 +54,7 @@
 #include <ctype.h>
 #include "cp-abi.h"
 #include "cp-support.h"
-#include "observer.h"
+#include "observable.h"
 #include "solist.h"
 #include "macrotab.h"
 #include "macroscope.h"
@@ -66,6 +66,7 @@
 #include "filename-seen-cache.h"
 #include "arch-utils.h"
 #include <algorithm>
+#include "common/pathstuff.h"
 
 /* Forward declarations for local functions.  */
 
@@ -75,6 +76,7 @@ static int find_line_common (struct linetable *, int, int *, int);
 
 static struct block_symbol
   lookup_symbol_aux (const char *name,
+                    symbol_name_match_type match_type,
                     const struct block *block,
                     const domain_enum domain,
                     enum language language,
@@ -82,6 +84,7 @@ static struct block_symbol
 
 static
 struct block_symbol lookup_local_symbol (const char *name,
+                                        symbol_name_match_type match_type,
                                         const struct block *block,
                                         const domain_enum domain,
                                         enum language language);
@@ -953,8 +956,7 @@ symbol_matches_search_name (const struct general_symbol_info *gsymbol,
                            const lookup_name_info &name)
 {
   symbol_name_matcher_ftype *name_match
-    = language_get_symbol_name_matcher (language_def (gsymbol->language),
-                                       name);
+    = get_symbol_name_matcher (language_def (gsymbol->language), name);
   return name_match (symbol_search_name (gsymbol), name, NULL);
 }
 
@@ -1773,14 +1775,18 @@ demangle_for_lookup_info::demangle_for_lookup_info
 
       if (without_params != NULL)
        {
-         m_demangled_name = demangle_for_lookup (without_params.get (),
-                                                 lang, storage);
+         if (lookup_name.match_type () != symbol_name_match_type::SEARCH_NAME)
+           m_demangled_name = demangle_for_lookup (without_params.get (),
+                                                   lang, storage);
          return;
        }
     }
 
-  m_demangled_name = demangle_for_lookup (lookup_name.name ().c_str (),
-                                         lang, storage);
+  if (lookup_name.match_type () == symbol_name_match_type::SEARCH_NAME)
+    m_demangled_name = lookup_name.name ();
+  else
+    m_demangled_name = demangle_for_lookup (lookup_name.name ().c_str (),
+                                           lang, storage);
 }
 
 /* See symtab.h.  */
@@ -1876,7 +1882,9 @@ lookup_symbol_in_language (const char *name, const struct block *block,
   demangle_result_storage storage;
   const char *modified_name = demangle_for_lookup (name, lang, storage);
 
-  return lookup_symbol_aux (modified_name, block, domain, lang,
+  return lookup_symbol_aux (modified_name,
+                           symbol_name_match_type::FULL,
+                           block, domain, lang,
                            is_a_field_of_this);
 }
 
@@ -1894,6 +1902,16 @@ lookup_symbol (const char *name, const struct block *block,
 
 /* See symtab.h.  */
 
+struct block_symbol
+lookup_symbol_search_name (const char *search_name, const struct block *block,
+                          domain_enum domain)
+{
+  return lookup_symbol_aux (search_name, symbol_name_match_type::SEARCH_NAME,
+                           block, domain, language_asm, NULL);
+}
+
+/* See symtab.h.  */
+
 struct block_symbol
 lookup_language_this (const struct language_defn *lang,
                      const struct block *block)
@@ -1915,7 +1933,9 @@ lookup_language_this (const struct language_defn *lang,
     {
       struct symbol *sym;
 
-      sym = block_lookup_symbol (block, lang->la_name_of_this, VAR_DOMAIN);
+      sym = block_lookup_symbol (block, lang->la_name_of_this,
+                                symbol_name_match_type::SEARCH_NAME,
+                                VAR_DOMAIN);
       if (sym != NULL)
        {
          if (symbol_lookup_debug > 1)
@@ -1986,7 +2006,8 @@ check_field (struct type *type, const char *name,
    (e.g., demangled name) of the symbol that we're looking for.  */
 
 static struct block_symbol
-lookup_symbol_aux (const char *name, const struct block *block,
+lookup_symbol_aux (const char *name, symbol_name_match_type match_type,
+                  const struct block *block,
                   const domain_enum domain, enum language language,
                   struct field_of_this_result *is_a_field_of_this)
 {
@@ -2015,7 +2036,7 @@ lookup_symbol_aux (const char *name, const struct block *block,
   /* Search specified block and its superiors.  Don't search
      STATIC_BLOCK or GLOBAL_BLOCK.  */
 
-  result = lookup_local_symbol (name, block, domain, language);
+  result = lookup_local_symbol (name, match_type, block, domain, language);
   if (result.symbol != NULL)
     {
       if (symbol_lookup_debug)
@@ -2097,7 +2118,9 @@ lookup_symbol_aux (const char *name, const struct block *block,
    Don't search STATIC_BLOCK or GLOBAL_BLOCK.  */
 
 static struct block_symbol
-lookup_local_symbol (const char *name, const struct block *block,
+lookup_local_symbol (const char *name,
+                    symbol_name_match_type match_type,
+                    const struct block *block,
                     const domain_enum domain,
                     enum language language)
 {
@@ -2112,7 +2135,7 @@ lookup_local_symbol (const char *name, const struct block *block,
 
   while (block != static_block)
     {
-      sym = lookup_symbol_in_block (name, block, domain);
+      sym = lookup_symbol_in_block (name, match_type, block, domain);
       if (sym != NULL)
        return (struct block_symbol) {sym, block};
 
@@ -2165,7 +2188,8 @@ lookup_objfile_from_block (const struct block *block)
 /* See symtab.h.  */
 
 struct symbol *
-lookup_symbol_in_block (const char *name, const struct block *block,
+lookup_symbol_in_block (const char *name, symbol_name_match_type match_type,
+                       const struct block *block,
                        const domain_enum domain)
 {
   struct symbol *sym;
@@ -2181,7 +2205,7 @@ lookup_symbol_in_block (const char *name, const struct block *block,
                          domain_name (domain));
     }
 
-  sym = block_lookup_symbol (block, name, domain);
+  sym = block_lookup_symbol (block, name, match_type, domain);
   if (sym)
     {
       if (symbol_lookup_debug > 1)
@@ -2370,7 +2394,8 @@ lookup_symbol_via_quick_fns (struct objfile *objfile, int block_index,
 
   bv = COMPUNIT_BLOCKVECTOR (cust);
   block = BLOCKVECTOR_BLOCK (bv, block_index);
-  result.symbol = block_lookup_symbol (block, name, domain);
+  result.symbol = block_lookup_symbol (block, name,
+                                      symbol_name_match_type::FULL, domain);
   if (result.symbol == NULL)
     error_in_psymtab_expansion (block_index, name, cust);
 
@@ -2483,7 +2508,9 @@ lookup_symbol_in_static_block (const char *name,
                          domain_name (domain));
     }
 
-  sym = lookup_symbol_in_block (name, static_block, domain);
+  sym = lookup_symbol_in_block (name,
+                               symbol_name_match_type::FULL,
+                               static_block, domain);
   if (symbol_lookup_debug)
     {
       fprintf_unfiltered (gdb_stdlog,
@@ -3019,8 +3046,6 @@ find_symbol_at_address (CORE_ADDR address)
    find the one whose first PC is closer than that of the next line in this
    symtab.  */
 
-/* If it's worth the effort, we could be using a binary search.  */
-
 struct symtab_and_line
 find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent)
 {
@@ -3187,15 +3212,17 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent)
       if (item->pc > pc && (!alt || item->pc < alt->pc))
        alt = item;
 
-      for (i = 0; i < len; i++, item++)
-       {
-         /* Leave prev pointing to the linetable entry for the last line
-            that started at or before PC.  */
-         if (item->pc > pc)
-           break;
+    auto pc_compare = [](const CORE_ADDR & pc,
+                       const struct linetable_entry & lhs)->bool
+    {
+      return pc < lhs.pc;
+    };
 
-         prev = item;
-       }
+    struct linetable_entry *first = item;
+    struct linetable_entry *last = item + len;
+    item = std::upper_bound (first, last, pc, pc_compare);
+    if (item != first)
+      prev = item - 1;         /* Found a matching item.  */
 
       /* At this point, prev points at the line whose start addr is <= pc, and
          item points at the next line.  If we ran off the end of the linetable
@@ -3220,7 +3247,7 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent)
       /* If another line (denoted by ITEM) is in the linetable and its
          PC is after BEST's PC, but before the current BEST_END, then
         use ITEM's PC as the new best_end.  */
-      if (best && i < len && item->pc > best->pc
+      if (best && item < last && item->pc > best->pc
           && (best_end == 0 || best_end > item->pc))
        best_end = item->pc;
     }
@@ -4677,24 +4704,10 @@ compare_symbol_name (const char *symbol_name, language symbol_language,
                     const lookup_name_info &lookup_name,
                     completion_match_result &match_res)
 {
-  const language_defn *lang;
-
-  /* If we're completing for an expression and the symbol doesn't have
-     an explicit language set, fallback to the current language.  Ada
-     minimal symbols won't have their language set to Ada, for
-     example, and if we compared using the default/C-like matcher,
-     then when completing e.g., symbols in a package named "pck", we'd
-     match internal Ada symbols like "pckS", which are invalid in an
-     Ada expression, unless you wrap them in '<' '>' to request a
-     verbatim match.  */
-  if (symbol_language == language_auto
-      && lookup_name.match_type () == symbol_name_match_type::EXPRESSION)
-    lang = current_language;
-  else
-    lang = language_def (symbol_language);
+  const language_defn *lang = language_def (symbol_language);
 
   symbol_name_matcher_ftype *name_match
-    = language_get_symbol_name_matcher (lang, lookup_name);
+    = get_symbol_name_matcher (lang, lookup_name);
 
   return name_match (symbol_name, lookup_name, &match_res);
 }
@@ -5142,7 +5155,7 @@ default_collect_symbol_completion_matches_break_on
   if (current_language->la_macro_expansion == macro_expansion_c
       && code == TYPE_CODE_UNDEF)
     {
-      struct macro_scope *scope;
+      gdb::unique_xmalloc_ptr<struct macro_scope> scope;
 
       /* This adds a macro's name to the current completion list.  */
       auto add_macro_name = [&] (const char *macro_name,
@@ -5163,11 +5176,8 @@ default_collect_symbol_completion_matches_break_on
         completion time.  */
       scope = default_macro_scope ();
       if (scope)
-       {
-         macro_for_each_in_scope (scope->file, scope->line,
-                                  add_macro_name);
-         xfree (scope);
-       }
+       macro_for_each_in_scope (scope->file, scope->line,
+                                add_macro_name);
 
       /* User-defined macros are always visible.  */
       macro_for_each (macro_user_macros, add_macro_name);
@@ -5907,7 +5917,7 @@ If zero then the symbol cache is disabled."),
           _("Flush the symbol cache for each program space."),
           &maintenancelist);
 
-  observer_attach_executable_changed (symtab_observer_executable_changed);
-  observer_attach_new_objfile (symtab_new_objfile_observer);
-  observer_attach_free_objfile (symtab_free_objfile_observer);
+  gdb::observers::executable_changed.attach (symtab_observer_executable_changed);
+  gdb::observers::new_objfile.attach (symtab_new_objfile_observer);
+  gdb::observers::free_objfile.attach (symtab_free_objfile_observer);
 }
This page took 0.029955 seconds and 4 git commands to generate.