aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuis Machado <luis.machado@linaro.org>2020-08-13 10:32:52 -0300
committerLuis Machado <luis.machado@linaro.org>2020-08-13 10:32:52 -0300
commita5353ae6cf1716c0ff6f7037dc3c336f0d99ecc1 (patch)
tree855e49a518963e4865728d74a02d433945909918
parentece5bc8ac303ccf03dd066ce7e1cba3a12293e40 (diff)
downloadgdb-a5353ae6cf1716c0ff6f7037dc3c336f0d99ecc1.zip
gdb-a5353ae6cf1716c0ff6f7037dc3c336f0d99ecc1.tar.gz
gdb-a5353ae6cf1716c0ff6f7037dc3c336f0d99ecc1.tar.bz2
[ARM, sim] Fix build failure with -Werror (PR26365)
There is a bit of a situation in the ARM sim with regards to the handling of argv. sim_open () gets a const char **argv, but ARM's sim_open gets clever and decides to modify argv in place via sim_target_parse_command_line. I'm not sure why. In any case, here's a fix that makes the code modify a copy of argv instead. sim/arm/ChangeLog: 2020-08-13 Luis Machado <luis.machado@linaro.org> PR sim/26365 * wrapper.c (sim_target_parse_command_line): Free discarded argv entries. (sim_open): Use a duplicate of argv instead of the original argv.
-rw-r--r--sim/arm/ChangeLog8
-rw-r--r--sim/arm/wrapper.c42
2 files changed, 38 insertions, 12 deletions
diff --git a/sim/arm/ChangeLog b/sim/arm/ChangeLog
index d5f9667..1c8f89a 100644
--- a/sim/arm/ChangeLog
+++ b/sim/arm/ChangeLog
@@ -1,3 +1,11 @@
+2020-08-13 Luis Machado <luis.machado@linaro.org>
+
+ PR sim/26365
+
+ * wrapper.c (sim_target_parse_command_line): Free discarded argv
+ entries.
+ (sim_open): Use a duplicate of argv instead of the original argv.
+
2020-01-17 Christian Biesinger <cbiesinger@google.com>
* iwmmxt.c: Fix spelling error (seperate).
diff --git a/sim/arm/wrapper.c b/sim/arm/wrapper.c
index a5ef415..68f8242 100644
--- a/sim/arm/wrapper.c
+++ b/sim/arm/wrapper.c
@@ -672,7 +672,10 @@ sim_target_parse_command_line (int argc, char ** argv)
{
/* Remove this option from the argv array. */
for (arg = i; arg < argc; arg ++)
- argv[arg] = argv[arg + 1];
+ {
+ free (argv[arg]);
+ argv[arg] = argv[arg + 1];
+ }
argc --;
i --;
trace_funcs = 1;
@@ -683,7 +686,10 @@ sim_target_parse_command_line (int argc, char ** argv)
{
/* Remove this option from the argv array. */
for (arg = i; arg < argc; arg ++)
- argv[arg] = argv[arg + 1];
+ {
+ free (argv[arg]);
+ argv[arg] = argv[arg + 1];
+ }
argc --;
i --;
disas = 1;
@@ -697,7 +703,10 @@ sim_target_parse_command_line (int argc, char ** argv)
{
/* Remove this option from the argv array. */
for (arg = i; arg < argc; arg ++)
- argv[arg] = argv[arg + 1];
+ {
+ free (argv[arg]);
+ argv[arg] = argv[arg + 1];
+ }
argc --;
ptr = argv[i];
@@ -733,7 +742,10 @@ sim_target_parse_command_line (int argc, char ** argv)
/* Remove this option from the argv array. */
for (arg = i; arg < argc; arg ++)
- argv[arg] = argv[arg + 1];
+ {
+ free (argv[arg]);
+ argv[arg] = argv[arg + 1];
+ }
argc --;
i --;
}
@@ -774,6 +786,7 @@ sim_open (SIM_OPEN_KIND kind,
char * const *argv)
{
int i;
+ char **argv_copy;
SIM_DESC sd = sim_state_alloc (kind, cb);
SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
@@ -836,21 +849,24 @@ sim_open (SIM_OPEN_KIND kind,
sim_callback = cb;
- sim_target_parse_arg_array (argv);
+ /* Copy over the argv contents so we can modify them. */
+ argv_copy = dupargv (argv);
- if (argv[1] != NULL)
+ sim_target_parse_arg_array (argv_copy);
+
+ if (argv_copy[1] != NULL)
{
int i;
/* Scan for memory-size switches. */
- for (i = 0; (argv[i] != NULL) && (argv[i][0] != 0); i++)
- if (argv[i][0] == '-' && argv[i][1] == 'm')
+ for (i = 0; (argv_copy[i] != NULL) && (argv_copy[i][0] != 0); i++)
+ if (argv_copy[i][0] == '-' && argv_copy[i][1] == 'm')
{
- if (argv[i][2] != '\0')
- mem_size = atoi (&argv[i][2]);
- else if (argv[i + 1] != NULL)
+ if (argv_copy[i][2] != '\0')
+ mem_size = atoi (&argv_copy[i][2]);
+ else if (argv_copy[i + 1] != NULL)
{
- mem_size = atoi (argv[i + 1]);
+ mem_size = atoi (argv_copy[i + 1]);
i++;
}
else
@@ -862,6 +878,8 @@ sim_open (SIM_OPEN_KIND kind,
}
}
+ freeargv (argv_copy);
+
return sd;
}