]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Remove TYPE_FN_FIELD_STUB
authorTom Tromey <tom@tromey.com>
Sun, 8 Feb 2026 23:22:10 +0000 (16:22 -0700)
committerTom Tromey <tom@tromey.com>
Mon, 9 Feb 2026 06:33:08 +0000 (23:33 -0700)
Nothing sets TYPE_FN_FIELD_STUB any more -- I suspect it was a stabs
thing, but didn't look.

This patch removes this macro and supporting code.

Regression tested on x86-64 Fedora 40.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
gdb/c-typeprint.c
gdb/gdbtypes.c
gdb/gdbtypes.h
gdb/gnu-v3-abi.c
gdb/linespec.c
gdb/valops.c

index 683517a21768cf325dde7e1c2acbfdf39f026829..cfacf48fe2dc860a7c0a1ab51d3548e908038f23 100644 (file)
@@ -1105,7 +1105,6 @@ c_type_print_base_struct_union (struct type *type, struct ui_file *stream,
 
          for (j = 0; j < len2; j++)
            {
-             const char *mangled_name;
              gdb::unique_xmalloc_ptr<char> mangled_name_holder;
              const char *physname = TYPE_FN_FIELD_PHYSNAME (f, j);
              int is_full_physname_constructor =
@@ -1151,14 +1150,8 @@ c_type_print_base_struct_union (struct type *type, struct ui_file *stream,
 
                  gdb_puts (" ", stream);
                }
-             if (TYPE_FN_FIELD_STUB (f, j))
-               {
-                 /* Build something we can demangle.  */
-                 mangled_name_holder.reset (gdb_mangle_name (type, i, j));
-                 mangled_name = mangled_name_holder.get ();
-               }
-             else
-               mangled_name = TYPE_FN_FIELD_PHYSNAME (f, j);
+
+             const char *mangled_name = TYPE_FN_FIELD_PHYSNAME (f, j);
 
              gdb::unique_xmalloc_ptr<char> demangled_name
                = gdb_demangle (mangled_name,
@@ -1170,22 +1163,15 @@ c_type_print_base_struct_union (struct type *type, struct ui_file *stream,
                     arguments, the demangling will fail.
                     Let's try to reconstruct the function
                     signature from the symbol information.  */
-                 if (!TYPE_FN_FIELD_STUB (f, j))
-                   {
-                     int staticp = TYPE_FN_FIELD_STATIC_P (f, j);
-                     struct type *mtype = TYPE_FN_FIELD_TYPE (f, j);
-
-                     cp_type_print_method_args (mtype,
-                                                "",
-                                                method_name,
-                                                staticp,
-                                                stream, language,
-                                                &local_flags);
-                   }
-                 else
-                   fprintf_styled (stream, metadata_style.style (),
-                                   _("<badly mangled name '%s'>"),
-                                   mangled_name);
+                 int staticp = TYPE_FN_FIELD_STATIC_P (f, j);
+                 struct type *mtype = TYPE_FN_FIELD_TYPE (f, j);
+
+                 cp_type_print_method_args (mtype,
+                                            "",
+                                            method_name,
+                                            staticp,
+                                            stream, language,
+                                            &local_flags);
                }
              else
                {
index 848c5f6153a31ff36b46460579d1c81da9e867f5..f0729bece596389718a0bb225917892fc1d7826e 100644 (file)
@@ -3145,171 +3145,6 @@ check_typedef (struct type *type)
   return type;
 }
 
-/* Parse a type expression in the string [P..P+LENGTH).  If an error
-   occurs, silently return a void type.  */
-
-static struct type *
-safe_parse_type (struct gdbarch *gdbarch, const char *p, int length)
-{
-  struct type *type = NULL; /* Initialize to keep gcc happy.  */
-
-  /* Suppress error messages.  */
-  scoped_restore saved_gdb_stderr = make_scoped_restore (&gdb_stderr,
-                                                        &null_stream);
-
-  /* Call parse_and_eval_type() without fear of longjmp()s.  */
-  try
-    {
-      type = parse_and_eval_type (p, length);
-    }
-  catch (const gdb_exception_error &except)
-    {
-      type = builtin_type (gdbarch)->builtin_void;
-    }
-
-  return type;
-}
-
-/* Ugly hack to convert method stubs into method types.
-
-   He ain't kiddin'.  This demangles the name of the method into a
-   string including argument types, parses out each argument type,
-   generates a string casting a zero to that type, evaluates the
-   string, and stuffs the resulting type into an argtype vector!!!
-   Then it knows the type of the whole function (including argument
-   types for overloading), which info used to be in the stab's but was
-   removed to hack back the space required for them.  */
-
-static void
-check_stub_method (struct type *type, int method_id, int signature_id)
-{
-  struct gdbarch *gdbarch = type->arch ();
-  struct fn_field *f;
-  char *mangled_name = gdb_mangle_name (type, method_id, signature_id);
-  gdb::unique_xmalloc_ptr<char> demangled_name
-    = gdb_demangle (mangled_name, DMGL_PARAMS | DMGL_ANSI);
-  char *argtypetext, *p;
-  int depth = 0, argcount = 1;
-  struct field *argtypes;
-  struct type *mtype;
-
-  /* Make sure we got back a function string that we can use.  */
-  if (demangled_name)
-    p = strchr (demangled_name.get (), '(');
-  else
-    p = NULL;
-
-  if (demangled_name == NULL || p == NULL)
-    error (_("Internal: Cannot demangle mangled name `%s'."),
-          mangled_name);
-
-  /* Now, read in the parameters that define this type.  */
-  p += 1;
-  argtypetext = p;
-  while (*p)
-    {
-      if (*p == '(' || *p == '<')
-       {
-         depth += 1;
-       }
-      else if (*p == ')' || *p == '>')
-       {
-         depth -= 1;
-       }
-      else if (*p == ',' && depth == 0)
-       {
-         argcount += 1;
-       }
-
-      p += 1;
-    }
-
-  /* If we read one argument and it was ``void'', don't count it.  */
-  if (startswith (argtypetext, "(void)"))
-    argcount -= 1;
-
-  /* We need one extra slot, for the THIS pointer.  */
-
-  argtypes = (struct field *)
-    TYPE_ZALLOC (type, (argcount + 1) * sizeof (struct field));
-  p = argtypetext;
-
-  /* Add THIS pointer for non-static methods.  */
-  f = TYPE_FN_FIELDLIST1 (type, method_id);
-  if (TYPE_FN_FIELD_STATIC_P (f, signature_id))
-    argcount = 0;
-  else
-    {
-      argtypes[0].set_type (lookup_pointer_type (type));
-      argcount = 1;
-    }
-
-  if (*p != ')')               /* () means no args, skip while.  */
-    {
-      depth = 0;
-      while (*p)
-       {
-         if (depth <= 0 && (*p == ',' || *p == ')'))
-           {
-             /* Avoid parsing of ellipsis, they will be handled below.
-                Also avoid ``void'' as above.  */
-             if (strncmp (argtypetext, "...", p - argtypetext) != 0
-                 && strncmp (argtypetext, "void", p - argtypetext) != 0)
-               {
-                 argtypes[argcount].set_type
-                   (safe_parse_type (gdbarch, argtypetext, p - argtypetext));
-                 argcount += 1;
-               }
-             argtypetext = p + 1;
-           }
-
-         if (*p == '(' || *p == '<')
-           {
-             depth += 1;
-           }
-         else if (*p == ')' || *p == '>')
-           {
-             depth -= 1;
-           }
-
-         p += 1;
-       }
-    }
-
-  TYPE_FN_FIELD_PHYSNAME (f, signature_id) = mangled_name;
-
-  /* Now update the old "stub" type into a real type.  */
-  mtype = TYPE_FN_FIELD_TYPE (f, signature_id);
-  /* MTYPE may currently be a function (TYPE_CODE_FUNC).
-     We want a method (TYPE_CODE_METHOD).  */
-  smash_to_method_type (mtype, type, mtype->target_type (),
-                       gdb::make_array_view (argtypes, argcount),
-                       p[-2] == '.');
-  mtype->set_is_stub (false);
-  TYPE_FN_FIELD_STUB (f, signature_id) = 0;
-}
-
-/* This is the external interface to check_stub_method, above.  This
-   function unstubs all of the signatures for TYPE's METHOD_ID method
-   name.  After calling this function TYPE_FN_FIELD_STUB will be
-   cleared for each signature and TYPE_FN_FIELDLIST_NAME will be
-   correct.
-
-   This function unfortunately can not die until stabs do.  */
-
-void
-check_stub_method_group (struct type *type, int method_id)
-{
-  int len = TYPE_FN_FIELDLIST_LENGTH (type, method_id);
-  struct fn_field *f = TYPE_FN_FIELDLIST1 (type, method_id);
-
-  for (int j = 0; j < len; j++)
-    {
-      if (TYPE_FN_FIELD_STUB (f, j))
-       check_stub_method (type, method_id, j);
-    }
-}
-
 /* Ensure it is in .rodata (if available) by working around GCC PR 44690.  */
 const struct cplus_struct_type cplus_struct_default = { };
 
@@ -4992,8 +4827,6 @@ dump_fn_fieldlists (struct type *type, int spaces)
                      TYPE_FN_FIELD_PRIVATE (f, overload_idx));
          gdb_printf ("%*sis_protected %d\n", spaces + 8, "",
                      TYPE_FN_FIELD_PROTECTED (f, overload_idx));
-         gdb_printf ("%*sis_stub %d\n", spaces + 8, "",
-                     TYPE_FN_FIELD_STUB (f, overload_idx));
          gdb_printf ("%*sdefaulted %d\n", spaces + 8, "",
                      TYPE_FN_FIELD_DEFAULTED (f, overload_idx));
          gdb_printf ("%*sis_deleted %d\n", spaces + 8, "",
index 8ba314eb663979a8f390a9a1f83592d9a53e52a9..2d1f9937b4e8cbbb92575a12ad1ee9fd9b749448 100644 (file)
@@ -1624,15 +1624,9 @@ struct fn_fieldlist
 
 struct fn_field
 {
-  /* * If is_stub is clear, this is the mangled name which we can look
-     up to find the address of the method (FIXME: it would be cleaner
-     to have a pointer to the struct symbol here instead).
-
-     If is_stub is set, this is the portion of the mangled name which
-     specifies the arguments.  For example, "ii", if there are two int
-     arguments, or "" if there are no arguments.  See gdb_mangle_name
-     for the conversion from this format to the one used if is_stub is
-     clear.  */
+  /* * This is the mangled name which we can look up to find the
+     address of the method (FIXME: it would be cleaner to have a
+     pointer to the struct symbol here instead).   */
 
   const char *physname;
 
@@ -1655,11 +1649,6 @@ struct fn_field
   unsigned int is_volatile:1;
   unsigned int is_artificial:1;
 
-  /* * A stub method only has some fields valid (but they are enough
-     to reconstruct the rest of the fields).  */
-
-  unsigned int is_stub:1;
-
   /* * True if this function is a constructor, false otherwise.  */
 
   unsigned int is_constructor : 1;
@@ -2005,7 +1994,6 @@ extern void set_type_vptr_basetype (struct type *, struct type *);
 #define TYPE_FN_FIELD_PROTECTED(thisfn, n) \
   ((thisfn)[n].accessibility == accessibility::PROTECTED)
 #define TYPE_FN_FIELD_ARTIFICIAL(thisfn, n) ((thisfn)[n].is_artificial)
-#define TYPE_FN_FIELD_STUB(thisfn, n) ((thisfn)[n].is_stub)
 #define TYPE_FN_FIELD_CONSTRUCTOR(thisfn, n) ((thisfn)[n].is_constructor)
 #define TYPE_FN_FIELD_FCONTEXT(thisfn, n) ((thisfn)[n].fcontext)
 #define TYPE_FN_FIELD_VOFFSET(thisfn, n) ((thisfn)[n].voffset-2)
@@ -2693,8 +2681,6 @@ extern void apply_bit_offset_to_field (struct field &field,
 
 extern struct type *check_typedef (struct type *);
 
-extern void check_stub_method_group (struct type *, int);
-
 extern char *gdb_mangle_name (struct type *, int, int);
 
 /* Lookup a typedef or primitive type named NAME, visible in lexical block
index 3d519eaa971f613e2bf2cff88b9dbd5fc9f2fa8b..1ea9d29c0b9b6ac107e65a7a2446565a5bfb059e 100644 (file)
@@ -544,7 +544,6 @@ gnuv3_find_method_in (struct type *domain, CORE_ADDR voffset,
          f = TYPE_FN_FIELDLIST1 (domain, i);
          len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
 
-         check_stub_method_group (domain, i);
          for (j = 0; j < len2; j++)
            if (TYPE_FN_FIELD_VOFFSET (f, j) == voffset)
              return TYPE_FN_FIELD_PHYSNAME (f, j);
index edd5f917f3a26509d0136165fa87c4b08af1d043..4376a769e4944f698273c252c17db683a0801c25 100644 (file)
@@ -1252,8 +1252,6 @@ find_methods (struct type *t, enum language t_lang, const char *name,
                  const char *phys_name;
 
                  f = TYPE_FN_FIELDLIST1 (t, method_counter);
-                 if (TYPE_FN_FIELD_STUB (f, field_counter))
-                   continue;
                  phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter);
                  result_names->push_back (phys_name);
                }
index 568f8f84a9e72a76edc31761004d7ca96db72530..c89e5c4adc89c577c0c50bcc1848e6e8d63d69df 100644 (file)
@@ -2209,7 +2209,6 @@ search_struct_method (const char *name, struct value **arg1p,
          struct fn_field *f = TYPE_FN_FIELDLIST1 (type, i);
 
          name_matched = 1;
-         check_stub_method_group (type, i);
          if (j > 0 && !args.has_value ())
            error (_("cannot resolve overloaded method "
                     "`%s': no arguments supplied"), name);
@@ -2510,9 +2509,6 @@ find_method_list (struct value **argp, const char *method,
              *basetype = type;
              *boffset = offset;
 
-             /* Resolve any stub methods.  */
-             check_stub_method_group (type, i);
-
              break;
            }
        }
@@ -3649,8 +3645,6 @@ value_struct_elt_for_reference (struct type *domain, int offset,
          int len = TYPE_FN_FIELDLIST_LENGTH (t, i);
          struct fn_field *f = TYPE_FN_FIELDLIST1 (t, i);
 
-         check_stub_method_group (t, i);
-
          if (intype)
            {
              for (j = 0; j < len; ++j)