Use std::string and unique_xmalloc_ptr in compile/ code
authorTom Tromey <tom@tromey.com>
Mon, 14 Aug 2017 06:03:02 +0000 (00:03 -0600)
committerTom Tromey <tom@tromey.com>
Sun, 3 Sep 2017 19:03:10 +0000 (13:03 -0600)
Change various things in the compile/ code to use std::string or
unique_xmalloc_ptr as appropriate.  This allows the removal of some
cleanups.

ChangeLog
2017-09-03  Tom Tromey  <tom@tromey.com>

* compile/compile.c (compile_register_name_mangled): Return
std::string.
* compile/compile-loc2c.c (pushf_register_address): Update.
(pushf_register): Update.
* compile/compile-c-types.c (convert_array): Update.
* compile/compile-c-symbols.c (generate_vla_size): Update.
(error_symbol_once): Use a gdb::unique_xmalloc_ptr.
(symbol_substitution_name): Return a gdb::unique_xmalloc_ptr.
(convert_one_symbol): Update.
(generate_c_for_for_one_variable): Update.
* compile/compile-c-support.c (c_get_range_decl_name): Return a
std::string.
(generate_register_struct): Update.
* compile/compile-internal.h (c_get_range_decl_name): Return a
std::string.
(compile_register_name_mangled): Return std::string.

gdb/ChangeLog
gdb/compile/compile-c-support.c
gdb/compile/compile-c-symbols.c
gdb/compile/compile-c-types.c
gdb/compile/compile-internal.h
gdb/compile/compile-loc2c.c
gdb/compile/compile.c

index 5b593a678d9423a8cae89c5be99a7059750c18d9..6e4f3940506020a618989089bbb6ac4965446955 100644 (file)
@@ -1,3 +1,22 @@
+2017-09-03  Tom Tromey  <tom@tromey.com>
+
+       * compile/compile.c (compile_register_name_mangled): Return
+       std::string.
+       * compile/compile-loc2c.c (pushf_register_address): Update.
+       (pushf_register): Update.
+       * compile/compile-c-types.c (convert_array): Update.
+       * compile/compile-c-symbols.c (generate_vla_size): Update.
+       (error_symbol_once): Use a gdb::unique_xmalloc_ptr.
+       (symbol_substitution_name): Return a gdb::unique_xmalloc_ptr.
+       (convert_one_symbol): Update.
+       (generate_c_for_for_one_variable): Update.
+       * compile/compile-c-support.c (c_get_range_decl_name): Return a
+       std::string.
+       (generate_register_struct): Update.
+       * compile/compile-internal.h (c_get_range_decl_name): Return a
+       std::string.
+       (compile_register_name_mangled): Return std::string.
+
 2017-09-03  Tom Tromey  <tom@tromey.com>
 
        * utils.c (perror_string): Return a std::string.
index 3bec28c271f3142cdb3d76b2a34bf543babb2efd..6f759abb541ba4b2a8bde0fcbe63e1582db5053b 100644 (file)
@@ -58,10 +58,10 @@ c_get_mode_for_size (int size)
 
 /* See compile-internal.h.  */
 
-char *
+std::string
 c_get_range_decl_name (const struct dynamic_prop *prop)
 {
-  return xstrprintf ("__gdb_prop_%s", host_address_to_string (prop));
+  return string_printf ("__gdb_prop_%s", host_address_to_string (prop));
 }
 
 \f
@@ -263,8 +263,7 @@ generate_register_struct (struct ui_file *stream, struct gdbarch *gdbarch,
        if (registers_used[i])
          {
            struct type *regtype = check_typedef (register_type (gdbarch, i));
-           char *regname = compile_register_name_mangled (gdbarch, i);
-           struct cleanup *cleanups = make_cleanup (xfree, regname);
+           std::string regname = compile_register_name_mangled (gdbarch, i);
 
            seen = 1;
 
@@ -282,7 +281,8 @@ generate_register_struct (struct ui_file *stream, struct gdbarch *gdbarch,
            switch (TYPE_CODE (regtype))
              {
              case TYPE_CODE_PTR:
-               fprintf_filtered (stream, "__gdb_uintptr %s", regname);
+               fprintf_filtered (stream, "__gdb_uintptr %s",
+                                 regname.c_str ());
                break;
 
              case TYPE_CODE_INT:
@@ -297,7 +297,7 @@ generate_register_struct (struct ui_file *stream, struct gdbarch *gdbarch,
                      fprintf_unfiltered (stream,
                                          "int %s"
                                          " __attribute__ ((__mode__(__%s__)))",
-                                         regname,
+                                         regname.c_str (),
                                          mode);
                      break;
                    }
@@ -310,12 +310,10 @@ generate_register_struct (struct ui_file *stream, struct gdbarch *gdbarch,
                                    "  unsigned char %s[%d]"
                                    " __attribute__((__aligned__("
                                    "__BIGGEST_ALIGNMENT__)))",
-                                   regname,
+                                   regname.c_str (),
                                    TYPE_LENGTH (regtype));
              }
            fputs_unfiltered (";\n", stream);
-
-           do_cleanups (cleanups);
          }
       }
 
index 15e1d6de8c484bf51df3901a8de21a9dcd45728f..1cdea852ea37555efb1e95fbb1d678867c826a94 100644 (file)
@@ -107,7 +107,6 @@ error_symbol_once (struct compile_c_instance *context,
 {
   struct symbol_error search;
   struct symbol_error *err;
-  char *message;
 
   if (context->symbol_err_map == NULL)
     return;
@@ -117,10 +116,9 @@ error_symbol_once (struct compile_c_instance *context,
   if (err == NULL || err->message == NULL)
     return;
 
-  message = err->message;
+  gdb::unique_xmalloc_ptr<char> message (err->message);
   err->message = NULL;
-  make_cleanup (xfree, message);
-  error (_("%s"), message);
+  error (_("%s"), message.get ());
 }
 
 \f
@@ -128,10 +126,11 @@ error_symbol_once (struct compile_c_instance *context,
 /* Compute the name of the pointer representing a local symbol's
    address.  */
 
-static char *
+static gdb::unique_xmalloc_ptr<char>
 symbol_substitution_name (struct symbol *sym)
 {
-  return concat ("__", SYMBOL_NATURAL_NAME (sym), "_ptr", (char *) NULL);
+  return gdb::unique_xmalloc_ptr<char>
+    (concat ("__", SYMBOL_NATURAL_NAME (sym), "_ptr", (char *) NULL));
 }
 
 /* Convert a given symbol, SYM, to the compiler's representation.
@@ -170,7 +169,7 @@ convert_one_symbol (struct compile_c_instance *context,
       gcc_decl decl;
       enum gcc_c_symbol_kind kind;
       CORE_ADDR addr = 0;
-      char *symbol_name = NULL;
+      gdb::unique_xmalloc_ptr<char> symbol_name;
 
       switch (SYMBOL_CLASS (sym.symbol))
        {
@@ -290,13 +289,11 @@ convert_one_symbol (struct compile_c_instance *context,
             SYMBOL_NATURAL_NAME (sym.symbol),
             kind,
             sym_type,
-            symbol_name, addr,
+            symbol_name.get (), addr,
             filename, line);
 
          C_CTX (context)->c_ops->bind (C_CTX (context), decl, is_global);
        }
-
-      xfree (symbol_name);
     }
 }
 
@@ -604,13 +601,11 @@ generate_vla_size (struct compile_c_instance *compiler,
            || TYPE_HIGH_BOUND_KIND (type) == PROP_LOCLIST)
          {
            const struct dynamic_prop *prop = &TYPE_RANGE_DATA (type)->high;
-           char *name = c_get_range_decl_name (prop);
-           struct cleanup *cleanup = make_cleanup (xfree, name);
+           std::string name = c_get_range_decl_name (prop);
 
-           dwarf2_compile_property_to_c (stream, name,
+           dwarf2_compile_property_to_c (stream, name.c_str (),
                                          gdbarch, registers_used,
                                          prop, pc, sym);
-           do_cleanups (cleanup);
          }
       }
       break;
@@ -663,8 +658,8 @@ generate_c_for_for_one_variable (struct compile_c_instance *compiler,
 
       if (SYMBOL_COMPUTED_OPS (sym) != NULL)
        {
-         char *generated_name = symbol_substitution_name (sym);
-         struct cleanup *cleanup = make_cleanup (xfree, generated_name);
+         gdb::unique_xmalloc_ptr<char> generated_name
+           = symbol_substitution_name (sym);
          /* We need to emit to a temporary buffer in case an error
             occurs in the middle.  */
          string_file local_file;
@@ -672,10 +667,9 @@ generate_c_for_for_one_variable (struct compile_c_instance *compiler,
          SYMBOL_COMPUTED_OPS (sym)->generate_c_location (sym, local_file,
                                                          gdbarch,
                                                          registers_used,
-                                                         pc, generated_name);
+                                                         pc,
+                                                         generated_name.get ());
          stream.write (local_file.c_str (), local_file.size ());
-
-         do_cleanups (cleanup);
        }
       else
        {
index 22aee78deea010df131020e30622cdad0cfd675d..dc6391c8b5bf006fa7c58712d5b0542c2bb4d057 100644 (file)
@@ -123,18 +123,17 @@ convert_array (struct compile_c_instance *context, struct type *type)
       || TYPE_HIGH_BOUND_KIND (range) == PROP_LOCLIST)
     {
       gcc_type result;
-      char *upper_bound;
 
       if (TYPE_VECTOR (type))
        return C_CTX (context)->c_ops->error (C_CTX (context),
                                              _("variably-sized vector type"
                                                " is not supported"));
 
-      upper_bound = c_get_range_decl_name (&TYPE_RANGE_DATA (range)->high);
+      std::string upper_bound
+       = c_get_range_decl_name (&TYPE_RANGE_DATA (range)->high);
       result = C_CTX (context)->c_ops->build_vla_array_type (C_CTX (context),
                                                             element_type,
-                                                            upper_bound);
-      xfree (upper_bound);
+                                                            upper_bound.c_str ());
       return result;
     }
   else
index 0c53f8c443298bd211674d034ed110a73ac34e33..091e654497fb75bf86839c4fcdbc984b19d9814c 100644 (file)
@@ -95,11 +95,10 @@ struct compile_c_instance
 
 /* Call gdbarch_register_name (GDBARCH, REGNUM) and convert its result
    to a form suitable for the compiler source.  The register names
-   should not clash with inferior defined macros.  Returned pointer is
-   never NULL.  Returned pointer needs to be deallocated by xfree.  */
+   should not clash with inferior defined macros. */
 
-extern char *compile_register_name_mangled (struct gdbarch *gdbarch,
-                                           int regnum);
+extern std::string compile_register_name_mangled (struct gdbarch *gdbarch,
+                                                 int regnum);
 
 /* Convert compiler source register name to register number of
    GDBARCH.  Returned value is always >= 0, function throws an error
@@ -144,13 +143,12 @@ extern unsigned char *generate_c_for_variable_locations
 
 extern const char *c_get_mode_for_size (int size);
 
-/* Given a dynamic property, return an xmallocd name that is used to
-   represent its size.  The result must be freed by the caller.  The
-   contents of the resulting string will be the same each time for
-   each call with the same argument.  */
+/* Given a dynamic property, return a name that is used to represent
+   its size.  The contents of the resulting string will be the same
+   each time for each call with the same argument.  */
 
 struct dynamic_prop;
-extern char *c_get_range_decl_name (const struct dynamic_prop *prop);
+extern std::string c_get_range_decl_name (const struct dynamic_prop *prop);
 
 /* Type used to hold and pass around the source and object file names
    to use for compilation.  */
index ead100324d5596fd9ea3163987a4bbea5137698c..7ec6f67cdf1af2af4927617a4fc27774cfb41f5c 100644 (file)
@@ -515,15 +515,12 @@ pushf_register_address (int indent, string_file &stream,
                        unsigned char *registers_used,
                        struct gdbarch *gdbarch, int regnum)
 {
-  char *regname = compile_register_name_mangled (gdbarch, regnum);
-  struct cleanup *cleanups = make_cleanup (xfree, regname);
+  std::string regname = compile_register_name_mangled (gdbarch, regnum);
 
   registers_used[regnum] = 1;
   pushf (indent, stream,
         "(" GCC_UINTPTR ") &" COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s",
-        regname);
-
-  do_cleanups (cleanups);
+        regname.c_str ());
 }
 
 /* Emit code that pushes a register's value on the stack.
@@ -536,19 +533,16 @@ pushf_register (int indent, string_file &stream,
                unsigned char *registers_used,
                struct gdbarch *gdbarch, int regnum, uint64_t offset)
 {
-  char *regname = compile_register_name_mangled (gdbarch, regnum);
-  struct cleanup *cleanups = make_cleanup (xfree, regname);
+  std::string regname = compile_register_name_mangled (gdbarch, regnum);
 
   registers_used[regnum] = 1;
   if (offset == 0)
     pushf (indent, stream, COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s",
-          regname);
+          regname.c_str ());
   else
     pushf (indent, stream,
           COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s + (" GCC_UINTPTR ") %s",
-          regname, hex_string (offset));
-
-  do_cleanups (cleanups);
+          regname.c_str (), hex_string (offset));
 }
 
 /* Compile a DWARF expression to C code.
index bbb31f11c0deb0e0ee248f780bc57809f2530ce1..e4865d072324b8d56c184957f886ac564170ee3f 100644 (file)
@@ -648,12 +648,12 @@ eval_compile_command (struct command_line *cmd, const char *cmd_string,
 
 /* See compile/compile-internal.h.  */
 
-char *
+std::string
 compile_register_name_mangled (struct gdbarch *gdbarch, int regnum)
 {
   const char *regname = gdbarch_register_name (gdbarch, regnum);
 
-  return xstrprintf ("__%s", regname);
+  return string_printf ("__%s", regname);
 }
 
 /* See compile/compile-internal.h.  */