Change gcc_target_options to return std::string
authorTom Tromey <tromey@adacore.com>
Tue, 15 Oct 2019 16:57:40 +0000 (10:57 -0600)
committerTom Tromey <tromey@adacore.com>
Tue, 15 Oct 2019 17:03:57 +0000 (11:03 -0600)
This patch was inspired by a recent review that recommended using
std::string in a new implementation of the gcc_target_options gdbarch
function.  It changes this function to return std::string rather than
an ordinary xmalloc'd string.

I believe this caught a latent memory leak in compile.c:get_args.

Tested on x86-64 Fedora 29.

gdb/ChangeLog
2019-10-15  Tom Tromey  <tromey@adacore.com>

* gdbarch.h, gdbarch.c: Rebuild.
* gdbarch.sh (gcc_target_options): Change return type to
std::string.
* compile/compile.c (get_args): Update.
* nios2-tdep.c (nios2_gcc_target_options): Return std::string.
* arm-linux-tdep.c (arm_linux_gcc_target_options): Return
std::string.
* aarch64-linux-tdep.c (aarch64_linux_gcc_target_options): Return
std::string.
* arch-utils.c (default_gcc_target_options): Return std::string.
* arch-utils.h (default_gcc_target_options): Return std::string.
* s390-tdep.c (s390_gcc_target_options): Return std::string.

Change-Id: I51f61703426a323089e646da8f22320a2cafbc1f

gdb/ChangeLog
gdb/aarch64-linux-tdep.c
gdb/arch-utils.c
gdb/arch-utils.h
gdb/arm-linux-tdep.c
gdb/compile/compile.c
gdb/gdbarch.c
gdb/gdbarch.h
gdb/gdbarch.sh
gdb/nios2-tdep.c
gdb/s390-tdep.c

index 9d3ec1fae5f90421814504206d73232e53e40839..e52ec3f307c791c0437a4a699274c9b9f35c62fd 100644 (file)
@@ -1,3 +1,18 @@
+2019-10-15  Tom Tromey  <tromey@adacore.com>
+
+       * gdbarch.h, gdbarch.c: Rebuild.
+       * gdbarch.sh (gcc_target_options): Change return type to
+       std::string.
+       * compile/compile.c (get_args): Update.
+       * nios2-tdep.c (nios2_gcc_target_options): Return std::string.
+       * arm-linux-tdep.c (arm_linux_gcc_target_options): Return
+       std::string.
+       * aarch64-linux-tdep.c (aarch64_linux_gcc_target_options): Return
+       std::string.
+       * arch-utils.c (default_gcc_target_options): Return std::string.
+       * arch-utils.h (default_gcc_target_options): Return std::string.
+       * s390-tdep.c (s390_gcc_target_options): Return std::string.
+
 2019-10-15  Christian Biesinger  <cbiesinger@google.com>
 
        * breakpoint.c (breakpoint_chain): Make static.
index a375c3b137d657faf22bf9c041e84e3f07ba404f..3ec08d1c76e655c0113ee6b951af6d1b1abc62a6 100644 (file)
@@ -1429,11 +1429,11 @@ aarch64_linux_syscall_record (struct regcache *regcache,
 
 /* Implement the "gcc_target_options" gdbarch method.  */
 
-static char *
+static std::string
 aarch64_linux_gcc_target_options (struct gdbarch *gdbarch)
 {
   /* GCC doesn't know "-m64".  */
-  return NULL;
+  return {};
 }
 
 static void
index c61fa6f051917ea6ddff431184c1692fc7886d9a..571646e4c8de1586ee3621412c654779c5bf1368 100644 (file)
@@ -903,11 +903,12 @@ default_infcall_munmap (CORE_ADDR addr, CORE_ADDR size)
 /* -mcmodel=large is used so that no GOT (Global Offset Table) is needed to be
    created in inferior memory by GDB (normally it is set by ld.so).  */
 
-char *
+std::string
 default_gcc_target_options (struct gdbarch *gdbarch)
 {
-  return xstrprintf ("-m%d%s", gdbarch_ptr_bit (gdbarch),
-                    gdbarch_ptr_bit (gdbarch) == 64 ? " -mcmodel=large" : "");
+  return string_printf ("-m%d%s", gdbarch_ptr_bit (gdbarch),
+                       (gdbarch_ptr_bit (gdbarch) == 64
+                        ? " -mcmodel=large" : ""));
 }
 
 /* gdbarch gnu_triplet_regexp method.  */
index e5bbcd1f9515c0653175bbca034997cc3bfa1042..48ff3bb9a1636db39700534ee2483ffc7db084ac 100644 (file)
@@ -247,7 +247,7 @@ extern void default_skip_permanent_breakpoint (struct regcache *regcache);
 
 extern CORE_ADDR default_infcall_mmap (CORE_ADDR size, unsigned prot);
 extern void default_infcall_munmap (CORE_ADDR addr, CORE_ADDR size);
-extern char *default_gcc_target_options (struct gdbarch *gdbarch);
+extern std::string default_gcc_target_options (struct gdbarch *gdbarch);
 extern const char *default_gnu_triplet_regexp (struct gdbarch *gdbarch);
 extern int default_addressable_memory_unit_size (struct gdbarch *gdbarch);
 
index 54ea8511cbada9239be8ab73caac1a86846ad406..32c1ef3a770002547ae548bb5b1b03c7f3734221 100644 (file)
@@ -1710,11 +1710,11 @@ arm_linux_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 
 /* Implement the gcc_target_options gdbarch method.  */
 
-static char *
+static std::string
 arm_linux_gcc_target_options (struct gdbarch *gdbarch)
 {
   /* GCC doesn't know "-m32".  */
-  return NULL;
+  return {};
 }
 
 static void
index 5c3400ffec89d1b30ca4663fcb91819d3e1a8034..94942db10e10c6beb9063498edb24ce26f4a3d8e 100644 (file)
@@ -635,7 +635,7 @@ get_args (const compile_instance *compiler, struct gdbarch *gdbarch,
   int argc_compiler;
   char **argv_compiler;
 
-  build_argc_argv (gdbarch_gcc_target_options (gdbarch),
+  build_argc_argv (gdbarch_gcc_target_options (gdbarch).c_str (),
                   argcp, argvp);
 
   cs_producer_options = get_selected_pc_producer_options ();
index 7b93d003a7293a4273c58b6ff31e4932a8cd42f5..fa6be50730b4aac73a73754f769453456927ba1e 100644 (file)
@@ -5043,7 +5043,7 @@ set_gdbarch_infcall_munmap (struct gdbarch *gdbarch,
   gdbarch->infcall_munmap = infcall_munmap;
 }
 
-char *
+std::string
 gdbarch_gcc_target_options (struct gdbarch *gdbarch)
 {
   gdb_assert (gdbarch != NULL);
index 3c6efae895f4b0620769d39ddd23235553966680..01b5aef8f80323bf8b73c0cb458279f90a24cce3 100644 (file)
@@ -1596,10 +1596,10 @@ extern void set_gdbarch_infcall_munmap (struct gdbarch *gdbarch, gdbarch_infcall
 /* Return string (caller has to use xfree for it) with options for GCC
    to produce code for this target, typically "-m64", "-m32" or "-m31".
    These options are put before CU's DW_AT_producer compilation options so that
-   they can override it.  Method may also return NULL. */
+   they can override it. */
 
-typedef char * (gdbarch_gcc_target_options_ftype) (struct gdbarch *gdbarch);
-extern char * gdbarch_gcc_target_options (struct gdbarch *gdbarch);
+typedef std::string (gdbarch_gcc_target_options_ftype) (struct gdbarch *gdbarch);
+extern std::string gdbarch_gcc_target_options (struct gdbarch *gdbarch);
 extern void set_gdbarch_gcc_target_options (struct gdbarch *gdbarch, gdbarch_gcc_target_options_ftype *gcc_target_options);
 
 /* Return a regular expression that matches names used by this
index d589b2c49a07089a4eacc0b096a973562ab76341..62f68dc8add682233d4f0dbd17e9437c3dc2fde6 100755 (executable)
@@ -1184,8 +1184,8 @@ f;void;infcall_munmap;CORE_ADDR addr, CORE_ADDR size;addr, size;;default_infcall
 # Return string (caller has to use xfree for it) with options for GCC
 # to produce code for this target, typically "-m64", "-m32" or "-m31".
 # These options are put before CU's DW_AT_producer compilation options so that
-# they can override it.  Method may also return NULL.
-m;char *;gcc_target_options;void;;;default_gcc_target_options;;0
+# they can override it.
+m;std::string;gcc_target_options;void;;;default_gcc_target_options;;0
 
 # Return a regular expression that matches names used by this
 # architecture in GNU configury triplets.  The result is statically
index cb17e4f3750be302b66d6dcef0806f2758ecfef9..c2683b5e3a79fd2110a535258ecc44c683a2cb70 100644 (file)
@@ -2260,11 +2260,11 @@ nios2_type_align (struct gdbarch *gdbarch, struct type *type)
 }
 
 /* Implement the gcc_target_options gdbarch method.  */
-static char *
+static std::string
 nios2_gcc_target_options (struct gdbarch *gdbarch)
 {
   /* GCC doesn't know "-m32".  */
-  return NULL;
+  return {};
 }
 
 /* Initialize the Nios II gdbarch.  */
index 6bd0528cf44584b01af9cabd4f47e69b08b41e63..329a1223963ee182c0033c04931cb6d85da71ba7 100644 (file)
@@ -6779,10 +6779,10 @@ UNKNOWN_OP:
 /* Implement gdbarch_gcc_target_options.  GCC does not know "-m32" or
    "-mcmodel=large".  */
 
-static char *
+static std::string
 s390_gcc_target_options (struct gdbarch *gdbarch)
 {
-  return xstrdup (gdbarch_ptr_bit (gdbarch) == 64 ? "-m64" : "-m31");
+  return gdbarch_ptr_bit (gdbarch) == 64 ? "-m64" : "-m31";
 }
 
 /* Implement gdbarch_gnu_triplet_regexp.  Target triplets are "s390-*"