remote: Fix indentation in remote_new_objfile.
[deliverable/binutils-gdb.git] / gdb / cp-support.c
index bc9e8d4eda503a6712aa3217b4de1cec8b0ebece..5bd8fd4e9408afe7c6c6c0d47b1c5d865cbec3d7 100644 (file)
@@ -1,5 +1,5 @@
 /* Helper routines for C++ support in GDB.
-   Copyright (C) 2002-2020 Free Software Foundation, Inc.
+   Copyright (C) 2002-2021 Free Software Foundation, Inc.
 
    Contributed by MontaVista Software.
 
@@ -207,11 +207,11 @@ inspect_type (struct demangle_parse_info *info,
 
             If the symbol is typedef and its type name is the same
             as the symbol's name, e.g., "typedef struct foo foo;".  */
-         if (TYPE_NAME (type) != nullptr
-             && strcmp (TYPE_NAME (type), name) == 0)
+         if (type->name () != nullptr
+             && strcmp (type->name (), name) == 0)
            return 0;
 
-         is_anon = (TYPE_NAME (type) == NULL
+         is_anon = (type->name () == NULL
                     && (type->code () == TYPE_CODE_ENUM
                         || type->code () == TYPE_CODE_STRUCT
                         || type->code () == TYPE_CODE_UNION));
@@ -294,6 +294,42 @@ inspect_type (struct demangle_parse_info *info,
   return 0;
 }
 
+/* Helper for replace_typedefs_qualified_name to handle
+   DEMANGLE_COMPONENT_TEMPLATE.  TMPL is the template node.  BUF is
+   the buffer that holds the qualified name being built by
+   replace_typedefs_qualified_name.  REPL is the node that will be
+   rewritten as a DEMANGLE_COMPONENT_NAME node holding the 'template
+   plus template arguments' name with typedefs replaced.  */
+
+static bool
+replace_typedefs_template (struct demangle_parse_info *info,
+                          string_file &buf,
+                          struct demangle_component *tmpl,
+                          struct demangle_component *repl,
+                          canonicalization_ftype *finder,
+                          void *data)
+{
+  demangle_component *tmpl_arglist = d_right (tmpl);
+
+  /* Replace typedefs in the template argument list.  */
+  replace_typedefs (info, tmpl_arglist, finder, data);
+
+  /* Convert 'template + replaced template argument list' to a string
+     and replace the REPL node.  */
+  gdb::unique_xmalloc_ptr<char> tmpl_str = cp_comp_to_string (tmpl, 100);
+  if (tmpl_str == nullptr)
+    {
+      /* If something went astray, abort typedef substitutions.  */
+      return false;
+    }
+  buf.puts (tmpl_str.get ());
+
+  repl->type = DEMANGLE_COMPONENT_NAME;
+  repl->u.s_name.s = obstack_strdup (&info->obstack, buf.string ());
+  repl->u.s_name.len = buf.size ();
+  return true;
+}
+
 /* Replace any typedefs appearing in the qualified name
    (DEMANGLE_COMPONENT_QUAL_NAME) represented in RET_COMP for the name parse
    given in INFO.  */
@@ -314,6 +350,29 @@ replace_typedefs_qualified_name (struct demangle_parse_info *info,
      substituted name.  */
   while (comp->type == DEMANGLE_COMPONENT_QUAL_NAME)
     {
+      if (d_left (comp)->type == DEMANGLE_COMPONENT_TEMPLATE)
+       {
+         /* Convert 'template + replaced template argument list' to a
+            string and replace the top DEMANGLE_COMPONENT_QUAL_NAME
+            node.  */
+         if (!replace_typedefs_template (info, buf,
+                                         d_left (comp), d_left (ret_comp),
+                                         finder, data))
+           return;
+
+         buf.clear ();
+         d_right (ret_comp) = d_right (comp);
+         comp = ret_comp;
+
+         /* Fallback to DEMANGLE_COMPONENT_NAME processing.  We want
+            to call inspect_type for this template, in case we have a
+            template alias, like:
+              template<typename T> using alias = base<int, t>;
+            in which case we want inspect_type to do a replacement like:
+              alias<int> -> base<int, int>
+         */
+       }
+
       if (d_left (comp)->type == DEMANGLE_COMPONENT_NAME)
        {
          struct demangle_component newobj;
@@ -370,11 +429,20 @@ replace_typedefs_qualified_name (struct demangle_parse_info *info,
       comp = d_right (comp);
     }
 
-  /* If the next component is DEMANGLE_COMPONENT_NAME, save the qualified
-     name assembled above and append the name given by COMP.  Then use this
-     reassembled name to check for a typedef.  */
+  /* If the next component is DEMANGLE_COMPONENT_TEMPLATE or
+     DEMANGLE_COMPONENT_NAME, save the qualified name assembled above
+     and append the name given by COMP.  Then use this reassembled
+     name to check for a typedef.  */
 
-  if (comp->type == DEMANGLE_COMPONENT_NAME)
+  if (comp->type == DEMANGLE_COMPONENT_TEMPLATE)
+    {
+      /* Replace the top (DEMANGLE_COMPONENT_QUAL_NAME) node with a
+        DEMANGLE_COMPONENT_NAME node containing the whole name.  */
+      if (!replace_typedefs_template (info, buf, comp, ret_comp, finder, data))
+       return;
+      inspect_type (info, ret_comp, finder, data);
+    }
+  else if (comp->type == DEMANGLE_COMPONENT_NAME)
     {
       buf.write (comp->u.s_name.s, comp->u.s_name.len);
 
@@ -667,8 +735,8 @@ cp_class_name_from_physname (const char *physname)
       case DEMANGLE_COMPONENT_RESTRICT_THIS:
       case DEMANGLE_COMPONENT_VOLATILE_THIS:
       case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
-        ret_comp = d_left (ret_comp);
-        break;
+       ret_comp = d_left (ret_comp);
+       break;
       default:
        done = 1;
        break;
@@ -695,8 +763,8 @@ cp_class_name_from_physname (const char *physname)
       case DEMANGLE_COMPONENT_QUAL_NAME:
       case DEMANGLE_COMPONENT_LOCAL_NAME:
        prev_comp = cur_comp;
-        cur_comp = d_right (cur_comp);
-        break;
+       cur_comp = d_right (cur_comp);
+       break;
       case DEMANGLE_COMPONENT_TEMPLATE:
       case DEMANGLE_COMPONENT_NAME:
       case DEMANGLE_COMPONENT_CTOR:
@@ -743,11 +811,11 @@ unqualified_name_from_comp (struct demangle_component *comp)
       {
       case DEMANGLE_COMPONENT_QUAL_NAME:
       case DEMANGLE_COMPONENT_LOCAL_NAME:
-        ret_comp = d_right (ret_comp);
-        break;
+       ret_comp = d_right (ret_comp);
+       break;
       case DEMANGLE_COMPONENT_TYPED_NAME:
-        ret_comp = d_left (ret_comp);
-        break;
+       ret_comp = d_left (ret_comp);
+       break;
       case DEMANGLE_COMPONENT_TEMPLATE:
        gdb_assert (last_template == NULL);
        last_template = ret_comp;
@@ -760,8 +828,8 @@ unqualified_name_from_comp (struct demangle_component *comp)
       case DEMANGLE_COMPONENT_RESTRICT_THIS:
       case DEMANGLE_COMPONENT_VOLATILE_THIS:
       case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
-        ret_comp = d_left (ret_comp);
-        break;
+       ret_comp = d_left (ret_comp);
+       break;
       case DEMANGLE_COMPONENT_NAME:
       case DEMANGLE_COMPONENT_CTOR:
       case DEMANGLE_COMPONENT_DTOR:
@@ -868,8 +936,8 @@ cp_remove_params_1 (const char *demangled_name, bool require_params)
       case DEMANGLE_COMPONENT_RESTRICT_THIS:
       case DEMANGLE_COMPONENT_VOLATILE_THIS:
       case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
-        ret_comp = d_left (ret_comp);
-        break;
+       ret_comp = d_left (ret_comp);
+       break;
       default:
        done = true;
        break;
@@ -1269,8 +1337,8 @@ add_symbol_overload_list_adl_namespace (struct type *type,
 
   while (type->code () == TYPE_CODE_PTR
         || TYPE_IS_REFERENCE (type)
-         || type->code () == TYPE_CODE_ARRAY
-         || type->code () == TYPE_CODE_TYPEDEF)
+        || type->code () == TYPE_CODE_ARRAY
+        || type->code () == TYPE_CODE_TYPEDEF)
     {
       if (type->code () == TYPE_CODE_TYPEDEF)
        type = check_typedef (type);
@@ -1278,7 +1346,7 @@ add_symbol_overload_list_adl_namespace (struct type *type,
        type = TYPE_TARGET_TYPE (type);
     }
 
-  type_name = TYPE_NAME (type);
+  type_name = type->name ();
 
   if (type_name == NULL)
     return;
@@ -1347,12 +1415,12 @@ add_symbol_overload_list_using (const char *func_name,
        if (current->searched)
          continue;
 
-        /* If this is a namespace alias or imported declaration ignore
+       /* If this is a namespace alias or imported declaration ignore
           it.  */
-        if (current->alias != NULL || current->declaration != NULL)
-          continue;
+       if (current->alias != NULL || current->declaration != NULL)
+         continue;
 
-        if (strcmp (the_namespace, current->import_dest) == 0)
+       if (strcmp (the_namespace, current->import_dest) == 0)
          {
            /* Mark this import as searched so that the recursive call
               does not search it again.  */
@@ -1384,10 +1452,7 @@ add_symbol_overload_list_qualified (const char *func_name,
      matching FUNC_NAME.  Make sure we read that symbol table in.  */
 
   for (objfile *objf : current_program_space->objfiles ())
-    {
-      if (objf->sf)
-       objf->sf->qf->expand_symtabs_for_function (objf, func_name);
-    }
+    objf->expand_symtabs_for_function (func_name);
 
   /* Search upwards from currently selected frame (so that we can
      complete on local vars.  */
@@ -1547,11 +1612,10 @@ gdb_demangle (const char *name, int options)
   int crash_signal = 0;
 
 #ifdef HAVE_WORKING_FORK
-  scoped_restore restore_segv
-    = make_scoped_restore (&thread_local_segv_handler,
-                          catch_demangler_crashes
-                          ? gdb_demangle_signal_handler
-                          : nullptr);
+  scoped_segv_handler_restore restore_segv
+    (catch_demangler_crashes
+     ? gdb_demangle_signal_handler
+     : nullptr);
 
   bool core_dump_allowed = gdb_demangle_attempt_core_dump;
   SIGJMP_BUF jmp_buf;
@@ -1560,7 +1624,7 @@ gdb_demangle (const char *name, int options)
   if (catch_demangler_crashes)
     {
       /* The signal handler may keep the signal blocked when we longjmp out
-         of it.  If we have sigprocmask, we can use it to unblock the signal
+        of it.  If we have sigprocmask, we can use it to unblock the signal
         afterwards and we can avoid the performance overhead of saving the
         signal mask just in case the signal gets triggered.  Otherwise, just
         tell sigsetjmp to save the mask.  */
@@ -1579,7 +1643,7 @@ gdb_demangle (const char *name, int options)
   if (catch_demangler_crashes)
     {
       if (crash_signal != 0)
-        {
+       {
 #ifdef HAVE_SIGPROCMASK
          /* If we got the signal, SIGSEGV may still be blocked; restore it.  */
          sigset_t segv_sig_set;
@@ -1591,15 +1655,15 @@ gdb_demangle (const char *name, int options)
          /* If there was a failure, we can't report it here, because
             we might be in a background thread.  Instead, arrange for
             the reporting to happen on the main thread.  */
-          std::string copy = name;
-          run_on_main_thread ([=] ()
-            {
-              report_failed_demangle (copy.c_str (), core_dump_allowed,
-                                      crash_signal);
-            });
-
-          result = NULL;
-        }
+         std::string copy = name;
+         run_on_main_thread ([=] ()
+           {
+             report_failed_demangle (copy.c_str (), core_dump_allowed,
+                                     crash_signal);
+           });
+
+         result = NULL;
+       }
     }
 #endif
 
@@ -1608,15 +1672,6 @@ gdb_demangle (const char *name, int options)
 
 /* See cp-support.h.  */
 
-int
-gdb_sniff_from_mangled_name (const char *mangled, char **demangled)
-{
-  *demangled = gdb_demangle (mangled, DMGL_PARAMS | DMGL_ANSI);
-  return *demangled != NULL;
-}
-
-/* See cp-support.h.  */
-
 unsigned int
 cp_search_name_hash (const char *search_name)
 {
@@ -2154,13 +2209,12 @@ void _initialize_cp_support ();
 void
 _initialize_cp_support ()
 {
-  add_basic_prefix_cmd ("cplus", class_maintenance,
-                       _("C++ maintenance commands."),
-                       &maint_cplus_cmd_list,
-                       "maintenance cplus ",
-                       0, &maintenancelist);
-  add_alias_cmd ("cp", "cplus",
-                class_maintenance, 1,
+  cmd_list_element *maintenance_cplus
+    = add_basic_prefix_cmd ("cplus", class_maintenance,
+                           _("C++ maintenance commands."),
+                           &maint_cplus_cmd_list,
+                           0, &maintenancelist);
+  add_alias_cmd ("cp", maintenance_cplus, class_maintenance, 1,
                 &maintenancelist);
 
   add_cmd ("first_component",
This page took 0.027491 seconds and 4 git commands to generate.