gdb, ada: collect standard exceptions in all objfiles
authorMarkus Metzger <markus.t.metzger@intel.com>
Mon, 11 Apr 2022 15:58:23 +0000 (17:58 +0200)
committerMarkus Metzger <markus.t.metzger@intel.com>
Tue, 18 Oct 2022 12:16:09 +0000 (14:16 +0200)
When searching for standard exceptions for Ada, we lookup the minimal
symbol of each exception.  With linker namespaces there can be multiple
instances in different namespaces.  Collect them all.

gdb/ada-lang.c

index adacf1dd1c9ad8e7552ae6a9c778cb6845c8d826..f4d3f32d3397c124e6532534ce62e39c80a1c730 100644 (file)
@@ -13020,15 +13020,29 @@ ada_add_standard_exceptions (compiled_regex *preg,
     {
       if (preg == NULL || preg->exec (name, 0, NULL, 0) == 0)
        {
-         struct bound_minimal_symbol msymbol
-           = ada_lookup_simple_minsym (name);
+         symbol_name_match_type match_type = name_match_type_from_name (name);
+         lookup_name_info lookup_name (name, match_type);
 
-         if (msymbol.minsym != NULL)
-           {
-             struct ada_exc_info info
-               = {name, msymbol.value_address ()};
+         symbol_name_matcher_ftype *match_name
+           = ada_get_symbol_name_matcher (lookup_name);
 
-             exceptions->push_back (info);
+         /* Iterate over all objfiles irrespective of scope or linker
+            namespaces so we get all exceptions anywhere in the
+            progspace.  */
+         for (objfile *objfile : current_program_space->objfiles ())
+           {
+             for (minimal_symbol *msymbol : objfile->msymbols ())
+               {
+                 if (match_name (msymbol->linkage_name (), lookup_name,
+                                 nullptr)
+                     && msymbol->type () != mst_solib_trampoline)
+                   {
+                     ada_exc_info info
+                       = {name, msymbol->value_address (objfile)};
+
+                     exceptions->push_back (info);
+                   }
+               }
            }
        }
     }
@@ -13126,6 +13140,8 @@ ada_add_global_exceptions (compiled_regex *preg,
                           SEARCH_GLOBAL_BLOCK | SEARCH_STATIC_BLOCK,
                           VARIABLES_DOMAIN);
 
+  /* Iterate over all objfiles irrespective of scope or linker namespaces
+     so we get all exceptions anywhere in the progspace.  */
   for (objfile *objfile : current_program_space->objfiles ())
     {
       for (compunit_symtab *s : objfile->compunits ())