PR29262, memory leak in pr_function_type
[binutils-gdb.git] / gdb / gnu-v3-abi.c
index 80b7eddd87871b867440714ef7b29e3bfd089ce5..953645e7411fca3e86ebdd6fb5f66cbef764aa78 100644 (file)
@@ -1,7 +1,7 @@
 /* Abstraction of GNU v3 abi.
    Contributed by Jim Blandy <jimb@redhat.com>
 
-   Copyright (C) 2001-2021 Free Software Foundation, Inc.
+   Copyright (C) 2001-2022 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -469,7 +469,7 @@ gnuv3_baseclass_offset (struct type *type, int index,
       struct dwarf2_property_baton baton;
       baton.property_type
        = lookup_pointer_type (type->field (index).type ());
-      baton.locexpr = *TYPE_FIELD_DWARF_BLOCK (type, index);
+      baton.locexpr = *type->field (index).loc_dwarf_block ();
 
       struct dynamic_prop prop;
       prop.set_locexpr (&baton);
@@ -483,7 +483,7 @@ gnuv3_baseclass_offset (struct type *type, int index,
 
       CORE_ADDR result;
       if (dwarf2_evaluate_property (&prop, nullptr, &addr_stack, &result,
-                                   true))
+                                   {addr_stack.addr}))
        return (int) (result - addr_stack.addr);
     }
 
@@ -623,7 +623,7 @@ gnuv3_print_method_ptr (const gdb_byte *contents,
   /* Check for NULL.  */
   if (ptr_value == 0 && vbit == 0)
     {
-      fprintf_filtered (stream, "NULL");
+      gdb_printf (stream, "NULL");
       return;
     }
 
@@ -647,26 +647,27 @@ gnuv3_print_method_ptr (const gdb_byte *contents,
          gdb::unique_xmalloc_ptr<char> demangled_name
            = gdb_demangle (physname, DMGL_ANSI | DMGL_PARAMS);
 
-         fprintf_filtered (stream, "&virtual ");
+         gdb_printf (stream, "&virtual ");
          if (demangled_name == NULL)
-           fputs_filtered (physname, stream);
+           gdb_puts (physname, stream);
          else
-           fputs_filtered (demangled_name.get (), stream);
+           gdb_puts (demangled_name.get (), stream);
          return;
        }
     }
   else if (ptr_value != 0)
     {
       /* Found a non-virtual function: print out the type.  */
-      fputs_filtered ("(", stream);
-      c_print_type (type, "", stream, -1, 0, &type_print_raw_options);
-      fputs_filtered (") ", stream);
+      gdb_puts ("(", stream);
+      c_print_type (type, "", stream, -1, 0, current_language->la_language,
+                   &type_print_raw_options);
+      gdb_puts (") ", stream);
     }
 
   /* We didn't find it; print the raw data.  */
   if (vbit)
     {
-      fprintf_filtered (stream, "&virtual table offset ");
+      gdb_printf (stream, "&virtual table offset ");
       print_longest (stream, 'd', 1, ptr_value);
     }
   else
@@ -679,7 +680,7 @@ gnuv3_print_method_ptr (const gdb_byte *contents,
 
   if (adjustment)
     {
-      fprintf_filtered (stream, ", this adjustment ");
+      gdb_printf (stream, ", this adjustment ");
       print_longest (stream, 'd', 1, adjustment);
     }
 }
@@ -907,11 +908,11 @@ print_one_vtable (struct gdbarch *gdbarch, struct value *value,
   vt_addr = value_address (value_field (vtable,
                                        vtable_field_virtual_functions));
 
-  printf_filtered (_("vtable for '%s' @ %s (subobject @ %s):\n"),
-                  TYPE_SAFE_NAME (type),
-                  paddress (gdbarch, vt_addr),
-                  paddress (gdbarch, (value_address (value)
-                                      + value_embedded_offset (value))));
+  gdb_printf (_("vtable for '%s' @ %s (subobject @ %s):\n"),
+             TYPE_SAFE_NAME (type),
+             paddress (gdbarch, vt_addr),
+             paddress (gdbarch, (value_address (value)
+                                 + value_embedded_offset (value))));
 
   for (i = 0; i <= max_voffset; ++i)
     {
@@ -920,7 +921,7 @@ print_one_vtable (struct gdbarch *gdbarch, struct value *value,
       int got_error = 0;
       struct value *vfn;
 
-      printf_filtered ("[%d]: ", i);
+      gdb_printf ("[%d]: ", i);
 
       vfn = value_subscript (value_field (vtable,
                                          vtable_field_virtual_functions),
@@ -942,7 +943,7 @@ print_one_vtable (struct gdbarch *gdbarch, struct value *value,
 
       if (!got_error)
        print_function_pointer_address (opts, gdbarch, addr, gdb_stdout);
-      printf_filtered ("\n");
+      gdb_printf ("\n");
     }
 }
 
@@ -983,7 +984,7 @@ gnuv3_print_vtable (struct value *value)
 
   if (!vtable)
     {
-      printf_filtered (_("This object does not have a virtual function table\n"));
+      gdb_printf (_("This object does not have a virtual function table\n"));
       return;
     }
 
@@ -1002,7 +1003,7 @@ gnuv3_print_vtable (struct value *value)
       if (iter->max_voffset >= 0)
        {
          if (count > 0)
-           printf_filtered ("\n");
+           gdb_printf ("\n");
          print_one_vtable (gdbarch, iter->value, iter->max_voffset, &opts);
          ++count;
        }
@@ -1071,7 +1072,7 @@ gnuv3_get_typeid_type (struct gdbarch *gdbarch)
     typeinfo_type
       = (struct type *) gdbarch_data (gdbarch, std_type_info_gdbarch_data);
   else
-    typeinfo_type = SYMBOL_TYPE (typeinfo);
+    typeinfo_type = typeinfo->type ();
 
   return typeinfo_type;
 }
@@ -1146,7 +1147,7 @@ gnuv3_get_typeid (struct value *value)
       if (minsym.minsym == NULL)
        error (_("could not find typeinfo symbol for '%s'"), name);
 
-      result = value_at_lazy (typeinfo_type, BMSYMBOL_VALUE_ADDRESS (minsym));
+      result = value_at_lazy (typeinfo_type, minsym.value_address ());
     }
 
   return result;
@@ -1235,7 +1236,7 @@ gnuv3_skip_trampoline (struct frame_info *frame, CORE_ADDR stop_pc)
   if (fn_sym.minsym == NULL)
     return 0;
 
-  method_stop_pc = BMSYMBOL_VALUE_ADDRESS (fn_sym);
+  method_stop_pc = fn_sym.value_address ();
 
   /* Some targets have minimal symbols pointing to function descriptors
      (powerpc 64 for example).  Make sure to retrieve the address