gdb: add gdb::make_unique function
authorAndrew Burgess <aburgess@redhat.com>
Thu, 10 Aug 2023 16:57:46 +0000 (17:57 +0100)
committerAndrew Burgess <aburgess@redhat.com>
Wed, 23 Aug 2023 08:50:30 +0000 (09:50 +0100)
While GDB is still C++11, lets add a gdb::make_unique template
function that can be used to create std::unique_ptr objects, just like
the C++14 std::make_unique.

If GDB is being compiled with a C++14 compiler then the new
gdb::make_unique function will delegate to the std::make_unique.  I
checked with gcc, and at -O1 and above gdb::make_unique will be
optimised away completely in this case.

If C++14 (or later) becomes our minimum, then it will be easy enough
to go through the code and replace gdb::make_unique with
std::make_unique later on.

I've make use of this function in all the places I think this can
easily be used, though I'm sure I've probably missed some.

Should be no user visible changes after this commit.

Approved-By: Tom Tromey <tom@tromey.com>
15 files changed:
gdb/addrmap.c
gdb/break-catch-load.c
gdb/compile/compile-c-support.c
gdb/cp-name-parser.y
gdb/cp-support.c
gdb/dwarf2/frame.c
gdb/dwarf2/read-debug-names.c
gdb/dwarf2/read-gdb-index.c
gdb/dwarf2/read.c
gdb/gdbtypes.c
gdb/python/py-varobj.c
gdb/ui-out.c
gdb/unittests/parallel-for-selftests.c
gdb/varobj.c
gdbsupport/gdb_unique_ptr.h

index 33dc7762d91cd2fa60ea50c21d710d3f12c2f873..d16775d49d489be921c774905fffdedac78b2f07 100644 (file)
@@ -428,7 +428,7 @@ test_addrmap ()
 
   /* Create mutable addrmap.  */
   auto_obstack temp_obstack;
-  std::unique_ptr<struct addrmap_mutable> map (new addrmap_mutable);
+  auto map = gdb::make_unique<struct addrmap_mutable> ();
   SELF_CHECK (map != nullptr);
 
   /* Check initial state.  */
index 440b42852bbf9ea0aa43dc3feb5f58279b535960..94d8b420d32725cefe28e7aa3c11680a36ad8832 100644 (file)
@@ -230,9 +230,8 @@ add_solib_catchpoint (const char *arg, bool is_load, bool is_temp, bool enabled)
   if (*arg == '\0')
     arg = nullptr;
 
-  std::unique_ptr<solib_catchpoint> c (new solib_catchpoint (gdbarch, is_temp,
-                                                            nullptr,
-                                                            is_load, arg));
+  auto c = gdb::make_unique<solib_catchpoint> (gdbarch, is_temp, nullptr,
+                                              is_load, arg);
 
   c->enable_state = enabled ? bp_enabled : bp_disabled;
 
index f9b32205b7ad1e0f91ff734241c6109b11930115..53b7285b36616797e58767894e3b41352f36351d 100644 (file)
@@ -118,7 +118,7 @@ get_compile_context (const char *fe_libcc, const char *fe_context,
     error (_("The loaded version of GCC does not support the required version "
             "of the API."));
 
-  return std::unique_ptr<compile_instance> (new INSTTYPE (context));
+  return gdb::make_unique<INSTTYPE> (context);
 }
 
 /* A C-language implementation of get_compile_context.  */
index 80188074202f6551b39430aefd580ee3fa2cd721..324166a03ff6d8ef1b925092df1f878e3bf26a8b 100644 (file)
@@ -2038,7 +2038,7 @@ cp_demangled_name_to_comp (const char *demangled_name,
 
   state.demangle_info = allocate_info ();
 
-  std::unique_ptr<demangle_parse_info> result (new demangle_parse_info);
+  auto result = gdb::make_unique<demangle_parse_info> ();
   result->info = state.demangle_info;
 
   if (yyparse (&state))
index 0300727434d93471ccc389b039331178eab8e307..2af0218dba06e4112af5a8abffd21bef8b16ffcf 100644 (file)
@@ -674,7 +674,7 @@ mangled_name_to_comp (const char *mangled_name, int options,
                                              options, memory);
       if (ret)
        {
-         std::unique_ptr<demangle_parse_info> info (new demangle_parse_info);
+         auto info = gdb::make_unique<demangle_parse_info> ();
          info->tree = ret;
          *demangled_p = NULL;
          return info;
index 940a01e9612f84a08373290cd38c953fb7c4d6fa..abc8d6134824cbb06e42cb0b2541d99a78f639dd 100644 (file)
@@ -2126,7 +2126,7 @@ dwarf2_build_frame_info (struct objfile *objfile)
   struct gdbarch *gdbarch = objfile->arch ();
 
   /* Build a minimal decoding of the DWARF2 compilation unit.  */
-  std::unique_ptr<comp_unit> unit (new comp_unit (objfile));
+  auto unit = gdb::make_unique<comp_unit> (objfile);
 
   if (objfile->separate_debug_objfile_backlink == NULL)
     {
index 3d96bf476f809ac66fb9d12f935e61905c3d10e9..2e5067efb3d73ba16997d664b1fb0ebbdf4be36c 100644 (file)
@@ -462,7 +462,7 @@ create_cus_from_debug_names (dwarf2_per_bfd *per_bfd,
 bool
 dwarf2_read_debug_names (dwarf2_per_objfile *per_objfile)
 {
-  std::unique_ptr<mapped_debug_names> map (new mapped_debug_names);
+  auto map = gdb::make_unique<mapped_debug_names> ();
   mapped_debug_names dwz_map;
   struct objfile *objfile = per_objfile->objfile;
   dwarf2_per_bfd *per_bfd = per_objfile->per_bfd;
index 1127643e53ab6d128bd7f1ad20ef68c355952932..9bfc5302b0e87bcf83782b351d25da243e09406d 100644 (file)
@@ -778,7 +778,7 @@ dwarf2_read_gdb_index
   if (main_index_contents.empty ())
     return 0;
 
-  std::unique_ptr<mapped_gdb_index> map (new mapped_gdb_index);
+  auto map = gdb::make_unique<mapped_gdb_index> ();
   if (!read_gdb_index_from_buffer (objfile_name (objfile),
                                   use_deprecated_index_sections,
                                   main_index_contents, map.get (), &cu_list,
index f1d7bfdfdecace69813f512c4541770fdc2880d5..eb4cb9ba72e090391120140bd274e335cad5dace 100644 (file)
@@ -4535,7 +4535,7 @@ allocate_type_unit_groups_table ()
 static std::unique_ptr<type_unit_group>
 create_type_unit_group (struct dwarf2_cu *cu, sect_offset line_offset_struct)
 {
-  std::unique_ptr<type_unit_group> tu_group (new type_unit_group);
+  auto tu_group = gdb::make_unique<type_unit_group> ();
 
   tu_group->hash.dwo_unit = cu->dwo_unit;
   tu_group->hash.line_sect_off = line_offset_struct;
index d7db7beb554b80d71532229d90a2d7e1e73302d3..939fcc23b822cfc92b5d6f78f43615abaf7309be 100644 (file)
@@ -5853,7 +5853,7 @@ static const struct registry<objfile>::key<fixed_point_type_storage>
 void
 allocate_fixed_point_type_info (struct type *type)
 {
-  std::unique_ptr<fixed_point_type_info> up (new fixed_point_type_info);
+  auto up = gdb::make_unique<fixed_point_type_info> ();
   fixed_point_type_info *info;
 
   if (type->is_objfile_owned ())
index 08e790b7e7e62ccd1012767e0e0e2fe39a8e4c29..98603cec00994bd5315e99fa23dee6d082debeed 100644 (file)
@@ -170,7 +170,5 @@ py_varobj_get_iterator (struct varobj *var, PyObject *printer,
       error (_("Could not get children iterator"));
     }
 
-  return std::unique_ptr<varobj_iter> (new py_varobj_iter (var,
-                                                          std::move (iter),
-                                                          opts));
+  return gdb::make_unique<py_varobj_iter> (var, std::move (iter), opts);
 }
index 9380630c320b71b7dd46756d278d363a4f3140e4..b4b8e486cb83f722df149e7c2319cbb568974d8e 100644 (file)
@@ -236,9 +236,9 @@ void ui_out_table::append_header (int width, ui_align alignment,
     internal_error (_("table header must be specified after table_begin and "
                      "before table_body."));
 
-  std::unique_ptr<ui_out_hdr> header (new ui_out_hdr (m_headers.size () + 1,
-                                                       width, alignment,
-                                                       col_name, col_hdr));
+  auto header = gdb::make_unique<ui_out_hdr> (m_headers.size () + 1,
+                                             width, alignment,
+                                             col_name, col_hdr);
 
   m_headers.push_back (std::move (header));
 }
@@ -328,7 +328,7 @@ ui_out::current_level () const
 void
 ui_out::push_level (ui_out_type type)
 {
-  std::unique_ptr<ui_out_level> level (new ui_out_level (type));
+  auto level = gdb::make_unique<ui_out_level> (type);
 
   m_levels.push_back (std::move (level));
 }
index 15a095ae62bdc8f8f1ecc494f6dd5be48cdb8f0f..1ad7eaa701c6db20f8f0dd741060fadfdddfaeb3 100644 (file)
@@ -160,7 +160,7 @@ TEST (int n_threads)
              {
                if (start == end)
                  any_empty_tasks = true;
-               return std::unique_ptr<int> (new int (end - start));
+               return gdb::make_unique<int> (end - start);
              });
   SELF_CHECK (!any_empty_tasks);
   SELF_CHECK (std::all_of (intresults.begin (),
@@ -178,7 +178,7 @@ TEST (int n_threads)
              {
                if (start == end)
                  any_empty_tasks = true;
-               return std::unique_ptr<int> (new int (end - start));
+               return gdb::make_unique<int> (end - start);
              },
            task_size_one);
   SELF_CHECK (!any_empty_tasks);
index 81b8e61f30466a7e565c13a16bbb52dbe391a118..e7323bed1270b14ed3c7dd1dba713c827ff48994 100644 (file)
@@ -261,7 +261,7 @@ varobj_create (const char *objname,
               const char *expression, CORE_ADDR frame, enum varobj_type type)
 {
   /* Fill out a varobj structure for the (root) variable being constructed.  */
-  std::unique_ptr<varobj> var (new varobj (new varobj_root));
+  auto var = gdb::make_unique<varobj> (new varobj_root);
 
   if (expression != NULL)
     {
index a3ab62405d47e68d55aa0e36c543389e6eb2571a..8ff7cec1da92b8225f7e20ccd7fbb3e9a67a3564 100644 (file)
@@ -56,6 +56,19 @@ struct noop_deleter
   void operator() (T *ptr) const { }
 };
 
+/* Create simple std::unique_ptr<T> objects.  */
+
+template<typename T, typename... Arg>
+std::unique_ptr<T>
+make_unique (Arg &&...args)
+{
+#if __cplusplus >= 201402L
+  return std::make_unique<T> (std::forward<Arg> (args)...);
+#else
+  return std::unique_ptr<T> (new T (std::forward<Arg> (args)...));
+#endif /* __cplusplus < 201402L */
+}
+
 } /* namespace gdb */
 
 /* Dup STR and return a unique_xmalloc_ptr for the result.  */