Avoid manual memory management of argv arrays in gdb/compile
This changes gdb/compile to use gdb_argv directly, rather than manually managing the arrays itself. A few new helpers are added to gdb_argv. gdb/ChangeLog 2020-09-23 Tom Tromey <tom@tromey.com> * utils.h (class gdb_argv): Add move operators. <append>: New methods. * compile/compile.c (build_argc_argv): Remove. (compile_args_argc): Remove. (compile_args_argv): Change type. (set_compile_args): Simplify. (append_args): Remove. (filter_args): Remove argcp parameter. (get_args): Return gdb_argv. Simplify. (compile_to_object): Update.
This commit is contained in:
parent
92677124d9
commit
bac51ab78d
3 changed files with 73 additions and 58 deletions
|
@ -1,3 +1,16 @@
|
||||||
|
2020-09-23 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
|
* utils.h (class gdb_argv): Add move operators.
|
||||||
|
<append>: New methods.
|
||||||
|
* compile/compile.c (build_argc_argv): Remove.
|
||||||
|
(compile_args_argc): Remove.
|
||||||
|
(compile_args_argv): Change type.
|
||||||
|
(set_compile_args): Simplify.
|
||||||
|
(append_args): Remove.
|
||||||
|
(filter_args): Remove argcp parameter.
|
||||||
|
(get_args): Return gdb_argv. Simplify.
|
||||||
|
(compile_to_object): Update.
|
||||||
|
|
||||||
2020-09-23 Tom Tromey <tom@tromey.com>
|
2020-09-23 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
* compile/compile-object-run.c (do_module_cleanup)
|
* compile/compile-object-run.c (do_module_cleanup)
|
||||||
|
|
|
@ -493,33 +493,18 @@ get_expr_block_and_pc (CORE_ADDR *pc)
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Call buildargv (via gdb_argv), set its result for S into *ARGVP but
|
|
||||||
calculate also the number of parsed arguments into *ARGCP. If
|
|
||||||
buildargv has returned NULL then *ARGCP is set to zero. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
build_argc_argv (const char *s, int *argcp, char ***argvp)
|
|
||||||
{
|
|
||||||
gdb_argv args (s);
|
|
||||||
|
|
||||||
*argcp = args.count ();
|
|
||||||
*argvp = args.release ();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* String for 'set compile-args' and 'show compile-args'. */
|
/* String for 'set compile-args' and 'show compile-args'. */
|
||||||
static char *compile_args;
|
static char *compile_args;
|
||||||
|
|
||||||
/* Parsed form of COMPILE_ARGS. COMPILE_ARGS_ARGV is NULL terminated. */
|
/* Parsed form of COMPILE_ARGS. */
|
||||||
static int compile_args_argc;
|
static gdb_argv compile_args_argv;
|
||||||
static char **compile_args_argv;
|
|
||||||
|
|
||||||
/* Implement 'set compile-args'. */
|
/* Implement 'set compile-args'. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_compile_args (const char *args, int from_tty, struct cmd_list_element *c)
|
set_compile_args (const char *args, int from_tty, struct cmd_list_element *c)
|
||||||
{
|
{
|
||||||
freeargv (compile_args_argv);
|
compile_args_argv = gdb_argv (compile_args);
|
||||||
build_argc_argv (compile_args, &compile_args_argc, &compile_args_argv);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Implement 'show compile-args'. */
|
/* Implement 'show compile-args'. */
|
||||||
|
@ -533,21 +518,6 @@ show_compile_args (struct ui_file *file, int from_tty,
|
||||||
value);
|
value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Append ARGC and ARGV (as parsed by build_argc_argv) to *ARGCP and *ARGVP.
|
|
||||||
ARGCP+ARGVP can be zero+NULL and also ARGC+ARGV can be zero+NULL. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
append_args (int *argcp, char ***argvp, int argc, char **argv)
|
|
||||||
{
|
|
||||||
int argi;
|
|
||||||
|
|
||||||
*argvp = XRESIZEVEC (char *, *argvp, (*argcp + argc + 1));
|
|
||||||
|
|
||||||
for (argi = 0; argi < argc; argi++)
|
|
||||||
(*argvp)[(*argcp)++] = xstrdup (argv[argi]);
|
|
||||||
(*argvp)[(*argcp)] = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* String for 'set compile-gcc' and 'show compile-gcc'. */
|
/* String for 'set compile-gcc' and 'show compile-gcc'. */
|
||||||
static char *compile_gcc;
|
static char *compile_gcc;
|
||||||
|
|
||||||
|
@ -586,10 +556,10 @@ get_selected_pc_producer_options (void)
|
||||||
return cs;
|
return cs;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Filter out unwanted options from *ARGCP and ARGV. */
|
/* Filter out unwanted options from ARGV. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
filter_args (int *argcp, char **argv)
|
filter_args (char **argv)
|
||||||
{
|
{
|
||||||
char **destv;
|
char **destv;
|
||||||
|
|
||||||
|
@ -599,7 +569,6 @@ filter_args (int *argcp, char **argv)
|
||||||
if (strcmp (*argv, "-fpreprocessed") == 0)
|
if (strcmp (*argv, "-fpreprocessed") == 0)
|
||||||
{
|
{
|
||||||
xfree (*argv);
|
xfree (*argv);
|
||||||
(*argcp)--;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
*destv++ = *argv;
|
*destv++ = *argv;
|
||||||
|
@ -627,35 +596,26 @@ filter_args (int *argcp, char **argv)
|
||||||
appended last so as to override any of the arguments automatically
|
appended last so as to override any of the arguments automatically
|
||||||
generated above. */
|
generated above. */
|
||||||
|
|
||||||
static void
|
static gdb_argv
|
||||||
get_args (const compile_instance *compiler, struct gdbarch *gdbarch,
|
get_args (const compile_instance *compiler, struct gdbarch *gdbarch)
|
||||||
int *argcp, char ***argvp)
|
|
||||||
{
|
{
|
||||||
const char *cs_producer_options;
|
const char *cs_producer_options;
|
||||||
int argc_compiler;
|
|
||||||
char **argv_compiler;
|
|
||||||
|
|
||||||
build_argc_argv (gdbarch_gcc_target_options (gdbarch).c_str (),
|
gdb_argv result (gdbarch_gcc_target_options (gdbarch).c_str ());
|
||||||
argcp, argvp);
|
|
||||||
|
|
||||||
cs_producer_options = get_selected_pc_producer_options ();
|
cs_producer_options = get_selected_pc_producer_options ();
|
||||||
if (cs_producer_options != NULL)
|
if (cs_producer_options != NULL)
|
||||||
{
|
{
|
||||||
int argc_producer;
|
gdb_argv argv_producer (cs_producer_options);
|
||||||
char **argv_producer;
|
filter_args (argv_producer.get ());
|
||||||
|
|
||||||
build_argc_argv (cs_producer_options, &argc_producer, &argv_producer);
|
result.append (std::move (argv_producer));
|
||||||
filter_args (&argc_producer, argv_producer);
|
|
||||||
append_args (argcp, argvp, argc_producer, argv_producer);
|
|
||||||
freeargv (argv_producer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
build_argc_argv (compiler->gcc_target_options ().c_str (),
|
result.append (gdb_argv (compiler->gcc_target_options ().c_str ()));
|
||||||
&argc_compiler, &argv_compiler);
|
result.append (compile_args_argv);
|
||||||
append_args (argcp, argvp, argc_compiler, argv_compiler);
|
|
||||||
freeargv (argv_compiler);
|
|
||||||
|
|
||||||
append_args (argcp, argvp, compile_args_argc, compile_args_argv);
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A helper function suitable for use as the "print_callback" in the
|
/* A helper function suitable for use as the "print_callback" in the
|
||||||
|
@ -677,8 +637,6 @@ compile_to_object (struct command_line *cmd, const char *cmd_string,
|
||||||
{
|
{
|
||||||
const struct block *expr_block;
|
const struct block *expr_block;
|
||||||
CORE_ADDR trash_pc, expr_pc;
|
CORE_ADDR trash_pc, expr_pc;
|
||||||
int argc;
|
|
||||||
char **argv;
|
|
||||||
int ok;
|
int ok;
|
||||||
struct gdbarch *gdbarch = get_current_arch ();
|
struct gdbarch *gdbarch = get_current_arch ();
|
||||||
std::string triplet_rx;
|
std::string triplet_rx;
|
||||||
|
@ -750,8 +708,9 @@ compile_to_object (struct command_line *cmd, const char *cmd_string,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set compiler command-line arguments. */
|
/* Set compiler command-line arguments. */
|
||||||
get_args (compiler.get (), gdbarch, &argc, &argv);
|
gdb_argv argv_holder = get_args (compiler.get (), gdbarch);
|
||||||
gdb_argv argv_holder (argv);
|
int argc = argv_holder.count ();
|
||||||
|
char **argv = argv_holder.get ();
|
||||||
|
|
||||||
gdb::unique_xmalloc_ptr<char> error_message;
|
gdb::unique_xmalloc_ptr<char> error_message;
|
||||||
error_message.reset (compiler->set_arguments (argc, argv,
|
error_message.reset (compiler->set_arguments (argc, argv,
|
||||||
|
|
43
gdb/utils.h
43
gdb/utils.h
|
@ -165,6 +165,20 @@ public:
|
||||||
gdb_argv (const gdb_argv &) = delete;
|
gdb_argv (const gdb_argv &) = delete;
|
||||||
gdb_argv &operator= (const gdb_argv &) = delete;
|
gdb_argv &operator= (const gdb_argv &) = delete;
|
||||||
|
|
||||||
|
gdb_argv &operator= (gdb_argv &&other)
|
||||||
|
{
|
||||||
|
freeargv (m_argv);
|
||||||
|
m_argv = other.m_argv;
|
||||||
|
other.m_argv = nullptr;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
gdb_argv (gdb_argv &&other)
|
||||||
|
{
|
||||||
|
m_argv = other.m_argv;
|
||||||
|
other.m_argv = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
~gdb_argv ()
|
~gdb_argv ()
|
||||||
{
|
{
|
||||||
freeargv (m_argv);
|
freeargv (m_argv);
|
||||||
|
@ -218,6 +232,35 @@ public:
|
||||||
return gdb::array_view<char *> (this->get (), this->count ());
|
return gdb::array_view<char *> (this->get (), this->count ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Append arguments to this array. */
|
||||||
|
void append (gdb_argv &&other)
|
||||||
|
{
|
||||||
|
int size = count ();
|
||||||
|
int argc = other.count ();
|
||||||
|
m_argv = XRESIZEVEC (char *, m_argv, (size + argc + 1));
|
||||||
|
|
||||||
|
for (int argi = 0; argi < argc; argi++)
|
||||||
|
{
|
||||||
|
/* Transfer ownership of the string. */
|
||||||
|
m_argv[size++] = other.m_argv[argi];
|
||||||
|
/* Ensure that destruction of OTHER works correctly. */
|
||||||
|
other.m_argv[argi] = nullptr;
|
||||||
|
}
|
||||||
|
m_argv[size] = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Append arguments to this array. */
|
||||||
|
void append (const gdb_argv &other)
|
||||||
|
{
|
||||||
|
int size = count ();
|
||||||
|
int argc = other.count ();
|
||||||
|
m_argv = XRESIZEVEC (char *, m_argv, (size + argc + 1));
|
||||||
|
|
||||||
|
for (int argi = 0; argi < argc; argi++)
|
||||||
|
m_argv[size++] = xstrdup (other.m_argv[argi]);
|
||||||
|
m_argv[size] = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
/* The iterator type. */
|
/* The iterator type. */
|
||||||
|
|
||||||
typedef char **iterator;
|
typedef char **iterator;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue