Return unique_ptr from language_defn::get_compile_context
authorTom Tromey <tom@tromey.com>
Fri, 5 Feb 2021 14:17:11 +0000 (07:17 -0700)
committerTom Tromey <tom@tromey.com>
Fri, 5 Feb 2021 14:17:12 +0000 (07:17 -0700)
This changes language_defn::get_compile_context to return a
unique_ptr.  This makes the ownership transfer clear.

gdb/ChangeLog
2021-02-05  Tom Tromey  <tom@tromey.com>

* compile/compile-c-support.c (get_compile_context)
(c_get_compile_context, cplus_get_compile_context): Change return
type.
* language.c (language_defn::get_compile_instance): New method.
* language.h (language_defn::get_compile_instance): Change return
type.  No longer inline.
* c-lang.c (c_language::get_compile_instance): Change return type.
(cplus_language::get_compile_instance): Change return type.
* c-lang.h (c_get_compile_context, cplus_get_compile_context):
Change return type.
* compile/compile.c (compile_to_object): Update.

gdb/ChangeLog
gdb/c-lang.c
gdb/c-lang.h
gdb/compile/compile-c-support.c
gdb/compile/compile.c
gdb/language.c
gdb/language.h

index 553b5f03056a879dd485c303189918a824f4bb6d..c6ad0bb8a5353ec271fa3c3b95cc24be8cddf965 100644 (file)
@@ -1,3 +1,17 @@
+2021-02-05  Tom Tromey  <tom@tromey.com>
+
+       * compile/compile-c-support.c (get_compile_context)
+       (c_get_compile_context, cplus_get_compile_context): Change return
+       type.
+       * language.c (language_defn::get_compile_instance): New method.
+       * language.h (language_defn::get_compile_instance): Change return
+       type.  No longer inline.
+       * c-lang.c (c_language::get_compile_instance): Change return type.
+       (cplus_language::get_compile_instance): Change return type.
+       * c-lang.h (c_get_compile_context, cplus_get_compile_context):
+       Change return type.
+       * compile/compile.c (compile_to_object): Update.
+
 2021-02-05  Tom Tromey  <tom@tromey.com>
 
        * parser-defs.h (write_exp_symbol_reference): Declare.
index 626dbc49a8a43829da764d9cee71254e784173ba..16ff3c7378a91461ebae259a6049855d9a61c37e 100644 (file)
@@ -36,8 +36,7 @@
 #include <ctype.h>
 #include "gdbcore.h"
 #include "gdbarch.h"
-
-class compile_instance;
+#include "compile/compile-internal.h"
 
 /* Given a C string type, STR_TYPE, return the corresponding target
    character set name.  */
@@ -888,7 +887,7 @@ public:
   }
 
   /* See language.h.  */
-  compile_instance *get_compile_instance () const override
+  std::unique_ptr<compile_instance> get_compile_instance () const override
   {
     return c_get_compile_context ();
   }
@@ -1021,7 +1020,7 @@ public:
   }
 
   /* See language.h.  */
-  compile_instance *get_compile_instance () const override
+  std::unique_ptr<compile_instance> get_compile_instance () const override
   {
     return cplus_get_compile_context ();
   }
index 5dfd73123f84608354f2f485daf2c164ae3d5638..a488c04c5695d916a1eeda0f9a1f5c9106bbfee6 100644 (file)
@@ -147,21 +147,19 @@ extern bool c_is_string_type_p (struct type *type);
 
 extern int c_textual_element_type (struct type *, char);
 
-/* Create a new instance of the C compiler and return it.  The new
-   compiler is owned by the caller and must be freed using the destroy
-   method.  This function never returns NULL, but rather throws an
-   exception on failure.  This is suitable for use as the
+/* Create a new instance of the C compiler and return it.  This
+   function never returns NULL, but rather throws an exception on
+   failure.  This is suitable for use as the
    language_defn::get_compile_instance method.  */
 
-extern compile_instance *c_get_compile_context (void);
+extern std::unique_ptr<compile_instance> c_get_compile_context ();
 
-/* Create a new instance of the C++ compiler and return it.  The new
-   compiler is owned by the caller and must be freed using the destroy
-   method.  This function never returns NULL, but rather throws an
-   exception on failure.  This is suitable for use as the
+/* Create a new instance of the C++ compiler and return it.  This
+   function never returns NULL, but rather throws an exception on
+   failure.  This is suitable for use as the
    language_defn::get_compile_instance method.  */
 
-extern compile_instance *cplus_get_compile_context ();
+extern std::unique_ptr<compile_instance> cplus_get_compile_context ();
 
 /* This takes the user-supplied text and returns a new bit of code to
    compile.
index 5f49a0a74f0428bffb745433fd28c9c1aace0275..65f186763f7d4975e462c30139a0f8edf20e2eb0 100644 (file)
@@ -99,7 +99,7 @@ load_libcompile (const char *fe_libcc, const char *fe_context)
 
 template <typename INSTTYPE, typename FUNCTYPE, typename CTXTYPE,
          typename BASE_VERSION_TYPE, typename API_VERSION_TYPE>
-compile_instance *
+std::unique_ptr<compile_instance>
 get_compile_context (const char *fe_libcc, const char *fe_context,
                     BASE_VERSION_TYPE base_version,
                     API_VERSION_TYPE api_version)
@@ -118,12 +118,12 @@ 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 new INSTTYPE (context);
+  return std::unique_ptr<compile_instance> (new INSTTYPE (context));
 }
 
 /* A C-language implementation of get_compile_context.  */
 
-compile_instance *
+std::unique_ptr<compile_instance>
 c_get_compile_context ()
 {
   return get_compile_context
@@ -135,7 +135,7 @@ c_get_compile_context ()
 
 /* A C++-language implementation of get_compile_context.  */
 
-compile_instance *
+std::unique_ptr<compile_instance>
 cplus_get_compile_context ()
 {
   return get_compile_context
index 4e72adc943deb237de53a94d1be4fdd26b608170..d9c99bf432830b646a4d96cb7ce628fb3b511a75 100644 (file)
@@ -649,8 +649,8 @@ compile_to_object (struct command_line *cmd, const char *cmd_string,
   expr_pc = get_frame_address_in_block (get_selected_frame (NULL));
 
   /* Set up instance and context for the compiler.  */
-  std::unique_ptr <compile_instance> compiler
-                       (current_language->get_compile_instance ());
+  std::unique_ptr<compile_instance> compiler
+    = current_language->get_compile_instance ();
   if (compiler == nullptr)
     error (_("No compiler support for language %s."),
           current_language->name ());
index 8dde5046264019f4795ceb957e79620b0ee3d3eb..c23f29169aeb608ec25e3e7190eefb87894bf8ad 100644 (file)
@@ -46,6 +46,7 @@
 #include "c-lang.h"
 #include <algorithm>
 #include "gdbarch.h"
+#include "compile/compile-internal.h"
 
 static void set_range_case (void);
 
@@ -704,6 +705,14 @@ language_defn::is_string_type_p (struct type *type) const
   return c_is_string_type_p (type);
 }
 
+/* See language.h.  */
+
+std::unique_ptr<compile_instance>
+language_defn::get_compile_instance () const
+{
+  return {};
+}
+
 /* The default implementation of the get_symbol_name_matcher_inner method
    from the language_defn class.  Matches with strncmp_iw.  */
 
index 44dbf3b8e6fd2313dee69a1f1ab06802e54052b4..4df09d8aa85dab474bb26ee76b2f372e6f93b055 100644 (file)
@@ -374,18 +374,14 @@ struct language_defn
   symbol_name_matcher_ftype *get_symbol_name_matcher
        (const lookup_name_info &lookup_name) const;
 
-  /* If this language allows compilation from the gdb command line, then
-     this method will return an instance of struct gcc_context appropriate
-     to the language.  If compilation for this language is generally
-     supported, but something goes wrong then an exception is thrown.  The
-     returned compiler instance is owned by its caller and must be
-     deallocated by the caller.  If compilation is not supported for this
-     language then this method returns NULL.  */
-
-  virtual compile_instance *get_compile_instance () const
-  {
-    return nullptr;
-  }
+  /* If this language allows compilation from the gdb command line,
+     then this method will return an instance of struct gcc_context
+     appropriate to the language.  If compilation for this language is
+     generally supported, but something goes wrong then an exception
+     is thrown.  If compilation is not supported for this language
+     then this method returns NULL.  */
+
+  virtual std::unique_ptr<compile_instance> get_compile_instance () const;
 
   /* This method must be overridden if 'get_compile_instance' is
      overridden.