public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 1/6] sim: keep track of program environment strings
@ 2021-11-16  8:36 Mike Frysinger
  2021-11-16  8:36 ` [PATCH 2/6] sim: callback: expose argv & environ Mike Frysinger
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Mike Frysinger @ 2021-11-16  8:36 UTC (permalink / raw)
  To: gdb-patches

We've been passing the environment strings to sim_create_inferior,
but most ports don't do anything with them.  A few will use ad-hoc
logic to stuff the stack for user-mode programs, but that's it.

Let's formalize this across the board by storing the strings in the
normal sim state.  This will allow (in future commits) supporting
more functionality in the run interface, and to unify some of the
libgloss syscalls.
---
 sim/aarch64/interp.c         |  6 ++++++
 sim/bfin/interp.c            |  6 ++++++
 sim/bpf/sim-if.c             |  8 +++++++-
 sim/common/sim-base.h        |  4 ++++
 sim/common/sim-utils.c       |  1 +
 sim/cris/sim-if.c            | 10 ++++++++--
 sim/example-synacor/interp.c |  6 ++++++
 sim/frv/sim-if.c             |  8 +++++++-
 sim/ft32/interp.c            |  7 +++++++
 sim/iq2000/sim-if.c          |  8 +++++++-
 sim/lm32/sim-if.c            |  8 +++++++-
 sim/m32r/sim-if.c            |  8 +++++++-
 sim/pru/interp.c             |  6 ++++++
 sim/riscv/interp.c           |  6 ++++++
 14 files changed, 85 insertions(+), 7 deletions(-)

diff --git a/sim/aarch64/interp.c b/sim/aarch64/interp.c
index 999b949ed88b..4d7f42174560 100644
--- a/sim/aarch64/interp.c
+++ b/sim/aarch64/interp.c
@@ -144,6 +144,12 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
       STATE_PROG_ARGV (sd) = dupargv (argv);
     }
 
+  if (STATE_PROG_ENVP (sd) != env)
+    {
+      freeargv (STATE_PROG_ENVP (sd));
+      STATE_PROG_ENVP (sd) = dupargv (env);
+    }
+
   if (trace_load_symbols (sd))
     {
       STATE_PROG_SYMS_COUNT (sd) =
diff --git a/sim/bfin/interp.c b/sim/bfin/interp.c
index 088b55937878..9d0e737cc33c 100644
--- a/sim/bfin/interp.c
+++ b/sim/bfin/interp.c
@@ -1170,6 +1170,12 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
       STATE_PROG_ARGV (sd) = dupargv (argv);
     }
 
+  if (STATE_PROG_ENVP (sd) != env)
+    {
+      freeargv (STATE_PROG_ENVP (sd));
+      STATE_PROG_ENVP (sd) = dupargv (env);
+    }
+
   switch (STATE_ENVIRONMENT (sd))
     {
     case USER_ENVIRONMENT:
diff --git a/sim/bpf/sim-if.c b/sim/bpf/sim-if.c
index a8d944115671..7503a302ca34 100644
--- a/sim/bpf/sim-if.c
+++ b/sim/bpf/sim-if.c
@@ -190,7 +190,7 @@ sim_open (SIM_OPEN_KIND kind,
 
 SIM_RC
 sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
-		     char *const *argv, char *const *envp)
+		     char *const *argv, char *const *env)
 {
   SIM_CPU *current_cpu = STATE_CPU (sd, 0);
   SIM_ADDR addr;
@@ -213,5 +213,11 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
       STATE_PROG_ARGV (sd) = dupargv (argv);
     }
 
+  if (STATE_PROG_ENVP (sd) != env)
+    {
+      freeargv (STATE_PROG_ENVP (sd));
+      STATE_PROG_ENVP (sd) = dupargv (env);
+    }
+
   return SIM_RC_OK;
 }
diff --git a/sim/common/sim-base.h b/sim/common/sim-base.h
index c34f6f66a913..50def1e02b7d 100644
--- a/sim/common/sim-base.h
+++ b/sim/common/sim-base.h
@@ -165,6 +165,10 @@ struct sim_state {
   char *prog_argv0;
 #define STATE_PROG_ARGV0(sd) ((sd)->prog_argv0)
 
+  /* The program's environment.  */
+  char **prog_envp;
+#define STATE_PROG_ENVP(sd) ((sd)->prog_envp)
+
   /* The program's bfd.  */
   struct bfd *prog_bfd;
 #define STATE_PROG_BFD(sd) ((sd)->prog_bfd)
diff --git a/sim/common/sim-utils.c b/sim/common/sim-utils.c
index 6f147b2d703b..ff6234b1c984 100644
--- a/sim/common/sim-utils.c
+++ b/sim/common/sim-utils.c
@@ -99,6 +99,7 @@ sim_state_free (SIM_DESC sd)
 
   free (STATE_PROG_FILE (sd));
   free (STATE_PROG_ARGV0 (sd));
+  freeargv (STATE_PROG_ENVP (sd));
   free (sd);
 }
 
diff --git a/sim/cris/sim-if.c b/sim/cris/sim-if.c
index 500941a27d7b..d29ccc59f351 100644
--- a/sim/cris/sim-if.c
+++ b/sim/cris/sim-if.c
@@ -951,8 +951,8 @@ sim_open (SIM_OPEN_KIND kind, host_callback *callback, struct bfd *abfd,
 \f
 SIM_RC
 sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
-		     char * const *argv ATTRIBUTE_UNUSED,
-		     char * const *envp ATTRIBUTE_UNUSED)
+		     char * const *argv,
+		     char * const *env)
 {
   SIM_CPU *current_cpu = STATE_CPU (sd, 0);
   SIM_ADDR addr;
@@ -977,6 +977,12 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
       STATE_PROG_ARGV (sd) = dupargv (argv);
     }
 
+  if (STATE_PROG_ENVP (sd) != env)
+    {
+      freeargv (STATE_PROG_ENVP (sd));
+      STATE_PROG_ENVP (sd) = dupargv (env);
+    }
+
   return SIM_RC_OK;
 }
 \f
diff --git a/sim/example-synacor/interp.c b/sim/example-synacor/interp.c
index d1a82e509d18..93aea7b0a860 100644
--- a/sim/example-synacor/interp.c
+++ b/sim/example-synacor/interp.c
@@ -174,5 +174,11 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
       STATE_PROG_ARGV (sd) = dupargv (argv);
     }
 
+  if (STATE_PROG_ENVP (sd) != env)
+    {
+      freeargv (STATE_PROG_ENVP (sd));
+      STATE_PROG_ENVP (sd) = dupargv (env);
+    }
+
   return SIM_RC_OK;
 }
diff --git a/sim/frv/sim-if.c b/sim/frv/sim-if.c
index d0361537c61a..7b0913dad014 100644
--- a/sim/frv/sim-if.c
+++ b/sim/frv/sim-if.c
@@ -175,7 +175,7 @@ frv_sim_close (SIM_DESC sd, int quitting)
 \f
 SIM_RC
 sim_create_inferior (SIM_DESC sd, bfd *abfd, char * const *argv,
-		     char * const *envp)
+		     char * const *env)
 {
   SIM_CPU *current_cpu = STATE_CPU (sd, 0);
   SIM_ADDR addr;
@@ -196,5 +196,11 @@ sim_create_inferior (SIM_DESC sd, bfd *abfd, char * const *argv,
       STATE_PROG_ARGV (sd) = dupargv (argv);
     }
 
+  if (STATE_PROG_ENVP (sd) != env)
+    {
+      freeargv (STATE_PROG_ENVP (sd));
+      STATE_PROG_ENVP (sd) = dupargv (env);
+    }
+
   return SIM_RC_OK;
 }
diff --git a/sim/ft32/interp.c b/sim/ft32/interp.c
index a1cc9abe9117..2838395dd029 100644
--- a/sim/ft32/interp.c
+++ b/sim/ft32/interp.c
@@ -900,6 +900,13 @@ sim_create_inferior (SIM_DESC sd,
       freeargv (STATE_PROG_ARGV (sd));
       STATE_PROG_ARGV (sd) = dupargv (argv);
     }
+
+  if (STATE_PROG_ENVP (sd) != env)
+    {
+      freeargv (STATE_PROG_ENVP (sd));
+      STATE_PROG_ENVP (sd) = dupargv (env);
+    }
+
   cpu->state.regs[FT32_HARD_SP] = addr;
   cpu->state.num_i = 0;
   cpu->state.cycles = 0;
diff --git a/sim/iq2000/sim-if.c b/sim/iq2000/sim-if.c
index 21ed8217bb07..05b348efe90e 100644
--- a/sim/iq2000/sim-if.c
+++ b/sim/iq2000/sim-if.c
@@ -131,7 +131,7 @@ sim_open (SIM_OPEN_KIND kind, host_callback *callback, struct bfd *abfd,
 \f
 SIM_RC
 sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
-		     char * const *envp)
+		     char * const *env)
 {
   SIM_CPU *current_cpu = STATE_CPU (sd, 0);
   SIM_ADDR addr;
@@ -152,5 +152,11 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
       STATE_PROG_ARGV (sd) = dupargv (argv);
     }
 
+  if (STATE_PROG_ENVP (sd) != env)
+    {
+      freeargv (STATE_PROG_ENVP (sd));
+      STATE_PROG_ENVP (sd) = dupargv (env);
+    }
+
   return SIM_RC_OK;
 }
diff --git a/sim/lm32/sim-if.c b/sim/lm32/sim-if.c
index ce9ab5ac9676..e7bffbdf3f6e 100644
--- a/sim/lm32/sim-if.c
+++ b/sim/lm32/sim-if.c
@@ -192,7 +192,7 @@ sim_open (SIM_OPEN_KIND kind, host_callback *callback, struct bfd *abfd,
 \f
 SIM_RC
 sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
-		     char * const *envp)
+		     char * const *env)
 {
   SIM_CPU *current_cpu = STATE_CPU (sd, 0);
   SIM_ADDR addr;
@@ -213,5 +213,11 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
       STATE_PROG_ARGV (sd) = dupargv (argv);
     }
 
+  if (STATE_PROG_ENVP (sd) != env)
+    {
+      freeargv (STATE_PROG_ENVP (sd));
+      STATE_PROG_ENVP (sd) = dupargv (env);
+    }
+
   return SIM_RC_OK;
 }
diff --git a/sim/m32r/sim-if.c b/sim/m32r/sim-if.c
index b2f7b4636e0d..0cb49a1e4e19 100644
--- a/sim/m32r/sim-if.c
+++ b/sim/m32r/sim-if.c
@@ -145,7 +145,7 @@ sim_open (SIM_OPEN_KIND kind, host_callback *callback, struct bfd *abfd,
 \f
 SIM_RC
 sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
-		     char * const *envp)
+		     char * const *env)
 {
   SIM_CPU *current_cpu = STATE_CPU (sd, 0);
   SIM_ADDR addr;
@@ -174,6 +174,12 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
       STATE_PROG_ARGV (sd) = dupargv (argv);
     }
 
+  if (STATE_PROG_ENVP (sd) != env)
+    {
+      freeargv (STATE_PROG_ENVP (sd));
+      STATE_PROG_ENVP (sd) = dupargv (env);
+    }
+
   return SIM_RC_OK;
 }
 
diff --git a/sim/pru/interp.c b/sim/pru/interp.c
index ca640f440bcd..f243df9426d3 100644
--- a/sim/pru/interp.c
+++ b/sim/pru/interp.c
@@ -848,5 +848,11 @@ sim_create_inferior (SIM_DESC sd, struct bfd *prog_bfd,
       STATE_PROG_ARGV (sd) = dupargv (argv);
     }
 
+  if (STATE_PROG_ENVP (sd) != env)
+    {
+      freeargv (STATE_PROG_ENVP (sd));
+      STATE_PROG_ENVP (sd) = dupargv (env);
+    }
+
   return SIM_RC_OK;
 }
diff --git a/sim/riscv/interp.c b/sim/riscv/interp.c
index f94a8428d690..7ecdd55141c1 100644
--- a/sim/riscv/interp.c
+++ b/sim/riscv/interp.c
@@ -153,6 +153,12 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
       STATE_PROG_ARGV (sd) = dupargv (argv);
     }
 
+  if (STATE_PROG_ENVP (sd) != env)
+    {
+      freeargv (STATE_PROG_ENVP (sd));
+      STATE_PROG_ENVP (sd) = dupargv (env);
+    }
+
   initialize_env (sd, (void *)argv, (void *)env);
 
   return SIM_RC_OK;
-- 
2.33.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 2/6] sim: callback: expose argv & environ
  2021-11-16  8:36 [PATCH 1/6] sim: keep track of program environment strings Mike Frysinger
@ 2021-11-16  8:36 ` Mike Frysinger
  2021-11-16  8:36 ` [PATCH 3/6] sim: syscall: fix argvlen & argv implementation Mike Frysinger
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Mike Frysinger @ 2021-11-16  8:36 UTC (permalink / raw)
  To: gdb-patches

Pass the existing strings data to the callbacks so that common
libgloss syscalls can be implemented (which we'll do shortly).
---
 include/sim/callback.h       |  6 ++++++
 sim/aarch64/interp.c         |  4 ++++
 sim/bfin/interp.c            |  4 ++++
 sim/bpf/sim-if.c             |  5 +++++
 sim/common/callback.c        |  2 ++
 sim/cris/sim-if.c            | 16 ++++++++++++----
 sim/example-synacor/interp.c |  5 +++++
 sim/frv/sim-if.c             |  9 ++++++++-
 sim/ft32/interp.c            |  4 ++++
 sim/iq2000/sim-if.c          |  5 +++++
 sim/lm32/sim-if.c            |  9 +++++++--
 sim/m32r/sim-if.c            | 11 ++++++++---
 sim/pru/interp.c             |  4 ++++
 sim/riscv/interp.c           |  5 +++++
 14 files changed, 79 insertions(+), 10 deletions(-)

diff --git a/include/sim/callback.h b/include/sim/callback.h
index 06aa2d4be790..a51c4de9c3aa 100644
--- a/include/sim/callback.h
+++ b/include/sim/callback.h
@@ -178,6 +178,12 @@ struct host_callback_struct
 
   enum bfd_endian target_endian;
 
+  /* Program command line options.  */
+  char **argv;
+
+  /* Program environment.  */
+  char **envp;
+
   /* Size of an "int" on the target (for syscalls whose ABI uses "int").
      This must include padding, and only padding-at-higher-address is
      supported.  For example, a 64-bit target with 32-bit int:s which
diff --git a/sim/aarch64/interp.c b/sim/aarch64/interp.c
index 4d7f42174560..328995358b0d 100644
--- a/sim/aarch64/interp.c
+++ b/sim/aarch64/interp.c
@@ -126,6 +126,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
 		     char * const *argv, char * const *env)
 {
   sim_cpu *cpu = STATE_CPU (sd, 0);
+  host_callback *cb = STATE_CALLBACK (sd);
   bfd_vma addr = 0;
 
   if (abfd != NULL)
@@ -150,6 +151,9 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
       STATE_PROG_ENVP (sd) = dupargv (env);
     }
 
+  cb->argv = STATE_PROG_ARGV (sd);
+  cb->envp = STATE_PROG_ENVP (sd);
+
   if (trace_load_symbols (sd))
     {
       STATE_PROG_SYMS_COUNT (sd) =
diff --git a/sim/bfin/interp.c b/sim/bfin/interp.c
index 9d0e737cc33c..88ddbd071b3d 100644
--- a/sim/bfin/interp.c
+++ b/sim/bfin/interp.c
@@ -1151,6 +1151,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
 		     char * const *argv, char * const *env)
 {
   SIM_CPU *cpu = STATE_CPU (sd, 0);
+  host_callback *cb = STATE_CALLBACK (sd);
   SIM_ADDR addr;
 
   /* Set the PC.  */
@@ -1176,6 +1177,9 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
       STATE_PROG_ENVP (sd) = dupargv (env);
     }
 
+  cb->argv = STATE_PROG_ARGV (sd);
+  cb->envp = STATE_PROG_ENVP (sd);
+
   switch (STATE_ENVIRONMENT (sd))
     {
     case USER_ENVIRONMENT:
diff --git a/sim/bpf/sim-if.c b/sim/bpf/sim-if.c
index 7503a302ca34..6d2f67295a1e 100644
--- a/sim/bpf/sim-if.c
+++ b/sim/bpf/sim-if.c
@@ -21,6 +21,7 @@
 
 #include <stdlib.h>
 
+#include "sim/callback.h"
 #include "sim-main.h"
 #include "sim-options.h"
 #include "libiberty.h"
@@ -193,6 +194,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
 		     char *const *argv, char *const *env)
 {
   SIM_CPU *current_cpu = STATE_CPU (sd, 0);
+  host_callback *cb = STATE_CALLBACK (sd);
   SIM_ADDR addr;
 
   /* Determine the start address.
@@ -219,5 +221,8 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
       STATE_PROG_ENVP (sd) = dupargv (env);
     }
 
+  cb->argv = STATE_PROG_ARGV (sd);
+  cb->envp = STATE_PROG_ENVP (sd);
+
   return SIM_RC_OK;
 }
diff --git a/sim/common/callback.c b/sim/common/callback.c
index 941f4302b6e4..a5f0fbe43558 100644
--- a/sim/common/callback.c
+++ b/sim/common/callback.c
@@ -770,6 +770,8 @@ host_callback default_callback =
 
   /* Defaults expected to be overridden at initialization, where needed.  */
   BFD_ENDIAN_UNKNOWN, /* target_endian */
+  NULL, /* argv */
+  NULL, /* envp */
   4, /* target_sizeof_int */
 
   HOST_CALLBACK_MAGIC,
diff --git a/sim/cris/sim-if.c b/sim/cris/sim-if.c
index d29ccc59f351..8bfb624b7866 100644
--- a/sim/cris/sim-if.c
+++ b/sim/cris/sim-if.c
@@ -23,14 +23,16 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 /* This must come before any other includes.  */
 #include "defs.h"
 
+#include <stdlib.h>
+#include <errno.h>
+#include <unistd.h>
+
 #include "libiberty.h"
 #include "bfd.h"
 #include "elf-bfd.h"
 
+#include "sim/callback.h"
 #include "sim-main.h"
-#include <stdlib.h>
-#include <errno.h>
-#include <unistd.h>
 #include "sim-options.h"
 #include "sim-hw.h"
 #include "dis-asm.h"
@@ -741,7 +743,9 @@ sim_open (SIM_OPEN_KIND kind, host_callback *callback, struct bfd *abfd,
 
   /* Find out how much room is needed for the environment and argv, create
      that memory and fill it.  Only do this when there's a program
-     specified.  */
+     specified.
+
+     TODO: Move this to sim_create_inferior and use STATE_PROG_ENVP.  */
   if (abfd != NULL && !cris_bare_iron)
     {
       const char *name = bfd_get_filename (abfd);
@@ -955,6 +959,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
 		     char * const *env)
 {
   SIM_CPU *current_cpu = STATE_CPU (sd, 0);
+  host_callback *cb = STATE_CALLBACK (sd);
   SIM_ADDR addr;
 
   if (sd != NULL)
@@ -983,6 +988,9 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
       STATE_PROG_ENVP (sd) = dupargv (env);
     }
 
+  cb->argv = STATE_PROG_ARGV (sd);
+  cb->envp = STATE_PROG_ENVP (sd);
+
   return SIM_RC_OK;
 }
 \f
diff --git a/sim/example-synacor/interp.c b/sim/example-synacor/interp.c
index 93aea7b0a860..6b6999465e37 100644
--- a/sim/example-synacor/interp.c
+++ b/sim/example-synacor/interp.c
@@ -28,6 +28,7 @@
 /* This must come before any other includes.  */
 #include "defs.h"
 
+#include "sim/callback.h"
 #include "sim-main.h"
 #include "sim-options.h"
 \f
@@ -155,6 +156,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
 		     char * const *argv, char * const *env)
 {
   SIM_CPU *cpu = STATE_CPU (sd, 0);
+  host_callback *cb = STATE_CALLBACK (sd);
   sim_cia addr;
 
   /* Set the PC.  */
@@ -180,5 +182,8 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
       STATE_PROG_ENVP (sd) = dupargv (env);
     }
 
+  cb->argv = STATE_PROG_ARGV (sd);
+  cb->envp = STATE_PROG_ENVP (sd);
+
   return SIM_RC_OK;
 }
diff --git a/sim/frv/sim-if.c b/sim/frv/sim-if.c
index 7b0913dad014..c6340770f8ee 100644
--- a/sim/frv/sim-if.c
+++ b/sim/frv/sim-if.c
@@ -20,10 +20,13 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 /* This must come before any other includes.  */
 #include "defs.h"
 
+#include <stdlib.h>
+
+#include "sim/callback.h"
+
 #define WANT_CPU
 #define WANT_CPU_FRVBF
 #include "sim-main.h"
-#include <stdlib.h>
 #include "sim-options.h"
 #include "libiberty.h"
 #include "bfd.h"
@@ -178,6 +181,7 @@ sim_create_inferior (SIM_DESC sd, bfd *abfd, char * const *argv,
 		     char * const *env)
 {
   SIM_CPU *current_cpu = STATE_CPU (sd, 0);
+  host_callback *cb = STATE_CALLBACK (sd);
   SIM_ADDR addr;
 
   if (abfd != NULL)
@@ -202,5 +206,8 @@ sim_create_inferior (SIM_DESC sd, bfd *abfd, char * const *argv,
       STATE_PROG_ENVP (sd) = dupargv (env);
     }
 
+  cb->argv = STATE_PROG_ARGV (sd);
+  cb->envp = STATE_PROG_ENVP (sd);
+
   return SIM_RC_OK;
 }
diff --git a/sim/ft32/interp.c b/sim/ft32/interp.c
index 2838395dd029..3514f75b6a57 100644
--- a/sim/ft32/interp.c
+++ b/sim/ft32/interp.c
@@ -884,6 +884,7 @@ sim_create_inferior (SIM_DESC sd,
 {
   uint32_t addr;
   sim_cpu *cpu = STATE_CPU (sd, 0);
+  host_callback *cb = STATE_CALLBACK (sd);
 
   /* Set the PC.  */
   if (abfd != NULL)
@@ -907,6 +908,9 @@ sim_create_inferior (SIM_DESC sd,
       STATE_PROG_ENVP (sd) = dupargv (env);
     }
 
+  cb->argv = STATE_PROG_ARGV (sd);
+  cb->envp = STATE_PROG_ENVP (sd);
+
   cpu->state.regs[FT32_HARD_SP] = addr;
   cpu->state.num_i = 0;
   cpu->state.cycles = 0;
diff --git a/sim/iq2000/sim-if.c b/sim/iq2000/sim-if.c
index 05b348efe90e..6c75b0ef5518 100644
--- a/sim/iq2000/sim-if.c
+++ b/sim/iq2000/sim-if.c
@@ -24,6 +24,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include <stdlib.h>
 
+#include "sim/callback.h"
 #include "sim-options.h"
 #include "libiberty.h"
 #include "bfd.h"
@@ -134,6 +135,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
 		     char * const *env)
 {
   SIM_CPU *current_cpu = STATE_CPU (sd, 0);
+  host_callback *cb = STATE_CALLBACK (sd);
   SIM_ADDR addr;
 
   if (abfd != NULL)
@@ -158,5 +160,8 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
       STATE_PROG_ENVP (sd) = dupargv (env);
     }
 
+  cb->argv = STATE_PROG_ARGV (sd);
+  cb->envp = STATE_PROG_ENVP (sd);
+
   return SIM_RC_OK;
 }
diff --git a/sim/lm32/sim-if.c b/sim/lm32/sim-if.c
index e7bffbdf3f6e..8bbd83d6dcd2 100644
--- a/sim/lm32/sim-if.c
+++ b/sim/lm32/sim-if.c
@@ -21,12 +21,13 @@
 /* This must come before any other includes.  */
 #include "defs.h"
 
+#include <stdlib.h>
+
+#include "sim/callback.h"
 #include "sim-main.h"
 #include "sim-options.h"
 #include "libiberty.h"
 #include "bfd.h"
-
-#include <stdlib.h>
 \f
 /* Cover function of sim_state_free to free the cpu buffers as well.  */
 
@@ -195,6 +196,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
 		     char * const *env)
 {
   SIM_CPU *current_cpu = STATE_CPU (sd, 0);
+  host_callback *cb = STATE_CALLBACK (sd);
   SIM_ADDR addr;
 
   if (abfd != NULL)
@@ -219,5 +221,8 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
       STATE_PROG_ENVP (sd) = dupargv (env);
     }
 
+  cb->argv = STATE_PROG_ARGV (sd);
+  cb->envp = STATE_PROG_ENVP (sd);
+
   return SIM_RC_OK;
 }
diff --git a/sim/m32r/sim-if.c b/sim/m32r/sim-if.c
index 0cb49a1e4e19..084ed5a0d4b2 100644
--- a/sim/m32r/sim-if.c
+++ b/sim/m32r/sim-if.c
@@ -20,14 +20,15 @@
 /* This must come before any other includes.  */
 #include "defs.h"
 
+#include <string.h>
+#include <stdlib.h>
+
+#include "sim/callback.h"
 #include "sim-main.h"
 #include "sim-options.h"
 #include "libiberty.h"
 #include "bfd.h"
 
-#include <string.h>
-#include <stdlib.h>
-
 #include "dv-m32r_uart.h"
 
 #define M32R_DEFAULT_MEM_SIZE 0x2000000 /* 32M */
@@ -148,6 +149,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
 		     char * const *env)
 {
   SIM_CPU *current_cpu = STATE_CPU (sd, 0);
+  host_callback *cb = STATE_CALLBACK (sd);
   SIM_ADDR addr;
 
   if (abfd != NULL)
@@ -180,6 +182,9 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
       STATE_PROG_ENVP (sd) = dupargv (env);
     }
 
+  cb->argv = STATE_PROG_ARGV (sd);
+  cb->envp = STATE_PROG_ENVP (sd);
+
   return SIM_RC_OK;
 }
 
diff --git a/sim/pru/interp.c b/sim/pru/interp.c
index f243df9426d3..af72a21d7428 100644
--- a/sim/pru/interp.c
+++ b/sim/pru/interp.c
@@ -831,6 +831,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *prog_bfd,
 		     char * const *argv, char * const *env)
 {
   SIM_CPU *cpu = STATE_CPU (sd, 0);
+  host_callback *cb = STATE_CALLBACK (sd);
   SIM_ADDR addr;
 
   addr = bfd_get_start_address (prog_bfd);
@@ -854,5 +855,8 @@ sim_create_inferior (SIM_DESC sd, struct bfd *prog_bfd,
       STATE_PROG_ENVP (sd) = dupargv (env);
     }
 
+  cb->argv = STATE_PROG_ARGV (sd);
+  cb->envp = STATE_PROG_ENVP (sd);
+
   return SIM_RC_OK;
 }
diff --git a/sim/riscv/interp.c b/sim/riscv/interp.c
index 7ecdd55141c1..efa4b5669cb3 100644
--- a/sim/riscv/interp.c
+++ b/sim/riscv/interp.c
@@ -21,6 +21,7 @@
 /* This must come before any other includes.  */
 #include "defs.h"
 
+#include "sim/callback.h"
 #include "sim-main.h"
 #include "sim-options.h"
 \f
@@ -134,6 +135,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
 		     char * const *argv, char * const *env)
 {
   SIM_CPU *cpu = STATE_CPU (sd, 0);
+  host_callback *cb = STATE_CALLBACK (sd);
   SIM_ADDR addr;
 
   /* Set the PC.  */
@@ -159,6 +161,9 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
       STATE_PROG_ENVP (sd) = dupargv (env);
     }
 
+  cb->argv = STATE_PROG_ARGV (sd);
+  cb->envp = STATE_PROG_ENVP (sd);
+
   initialize_env (sd, (void *)argv, (void *)env);
 
   return SIM_RC_OK;
-- 
2.33.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 3/6] sim: syscall: fix argvlen & argv implementation
  2021-11-16  8:36 [PATCH 1/6] sim: keep track of program environment strings Mike Frysinger
  2021-11-16  8:36 ` [PATCH 2/6] sim: callback: expose argv & environ Mike Frysinger
@ 2021-11-16  8:36 ` Mike Frysinger
  2021-11-16  8:36 ` [PATCH 4/6] sim: syscall: hoist argc/argn/argnlen to common code Mike Frysinger
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Mike Frysinger @ 2021-11-16  8:36 UTC (permalink / raw)
  To: gdb-patches

Now that we have access to the argv & envp strings, finish implementing
these syscalls.  Delete unused variables, fix tbuf by incrementing the
pointer instead of setting to the length, and make sure we don't write
more data than the bufsize says is available.
---
 sim/common/syscall.c | 92 ++++++++++++++++++++++++--------------------
 1 file changed, 50 insertions(+), 42 deletions(-)

diff --git a/sim/common/syscall.c b/sim/common/syscall.c
index e353d862504a..bad3b3b6214d 100644
--- a/sim/common/syscall.c
+++ b/sim/common/syscall.c
@@ -141,16 +141,14 @@ cb_syscall (host_callback *cb, CB_SYSCALL *sc)
 
   switch (cb_target_to_host_syscall (cb, sc->func))
     {
-#if 0 /* FIXME: wip */
     case CB_SYS_argvlen :
       {
 	/* Compute how much space is required to store the argv,envp
 	   strings so that the program can allocate the space and then
 	   call SYS_argv to fetch the values.  */
-	int addr_size = cb->addr_size;
-	int argc,envc,arglen,envlen;
-	const char **argv = cb->init_argv;
-	const char **envp = cb->init_envp;
+	int argc, envc, arglen, envlen;
+	char **argv = cb->argv;
+	char **envp = cb->envp;
 
 	argc = arglen = 0;
 	if (argv)
@@ -164,7 +162,7 @@ cb_syscall (host_callback *cb, CB_SYSCALL *sc)
 	    for ( ; envp[envc]; ++envc)
 	      envlen += strlen (envp[envc]) + 1;
 	  }
-	result = arglen + envlen;
+	result = arglen + 1 + envlen + 1;
 	break;
       }
 
@@ -174,63 +172,73 @@ cb_syscall (host_callback *cb, CB_SYSCALL *sc)
 	TADDR tbuf = sc->arg1;
 	/* Buffer size.  */
 	int bufsize = sc->arg2;
+	int written = 0;
 	/* Q is the target address of where all the strings go.  */
 	TADDR q;
-	int word_size = cb->word_size;
-	int i,argc,envc,len;
-	const char **argv = cb->init_argv;
-	const char **envp = cb->init_envp;
+	int i, argc, envc, len, ret;
+	char **argv = cb->argv;
+	char **envp = cb->envp;
+
+	result = -1;
 
 	argc = 0;
 	if (argv)
 	  {
 	    for ( ; argv[argc]; ++argc)
 	      {
-		int len = strlen (argv[argc]);
-		int written = (*sc->write_mem) (cb, sc, tbuf, argv[argc], len + 1);
-		if (written != len)
-		  {
-		    result = -1;
-		    errcode = EINVAL;
-		    goto FinishSyscall;
-		  }
-		tbuf = len + 1;
+		len = strlen (argv[argc]) + 1;
+		if (written + len > bufsize)
+		  goto efault;
+
+		ret = (*sc->write_mem) (cb, sc, tbuf + written, argv[argc],
+					len);
+		if (ret != len)
+		  goto einval;
+
+		written += ret;
 	      }
 	  }
-	if ((*sc->write_mem) (cb, sc, tbuf, "", 1) != 1)
-	  {
-	    result = -1;
-	    errcode = EINVAL;
-	    goto FinishSyscall;
-	  }
-	tbuf++;
+	/* Double NUL bytes indicates end of strings.  */
+	if (written >= bufsize)
+	  goto efault;
+	if ((*sc->write_mem) (cb, sc, tbuf + written, "", 1) != 1)
+	  goto einval;
+	++written;
+
 	envc = 0;
 	if (envp)
 	  {
 	    for ( ; envp[envc]; ++envc)
 	      {
-		int len = strlen (envp[envc]);
-		int written = (*sc->write_mem) (cb, sc, tbuf, envp[envc], len + 1);
-		if (written != len)
-		  {
-		    result = -1;
-		    errcode = EINVAL;
-		    goto FinishSyscall;
-		  }
-		tbuf = len + 1;
+		len = strlen (envp[envc]) + 1;
+		if (written + len > bufsize)
+		  goto efault;
+
+		ret = (*sc->write_mem) (cb, sc, tbuf + written, envp[envc],
+					len);
+		if (ret != len)
+		  goto einval;
+		written += ret;
 	      }
 	  }
-	if ((*sc->write_mem) (cb, sc, tbuf, "", 1) != 1)
-	  {
-	    result = -1;
-	    errcode = EINVAL;
-	    goto FinishSyscall;
-	  }
+	/* Double NUL bytes indicates end of strings.  */
+	if (written >= bufsize)
+	  goto efault;
+	if ((*sc->write_mem) (cb, sc, tbuf + written, "", 1) != 1)
+	  goto einval;
+
 	result = argc;
 	sc->result2 = envc;
 	break;
+
+ efault:
+	errcode = EFAULT;
+	goto FinishSyscall;
+
+ einval:
+	errcode = EINVAL;
+	goto FinishSyscall;
       }
-#endif /* wip */
 
     case CB_SYS_exit :
       /* Caller must catch and handle; see sim_syscall as an example.  */
-- 
2.33.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 4/6] sim: syscall: hoist argc/argn/argnlen to common code
  2021-11-16  8:36 [PATCH 1/6] sim: keep track of program environment strings Mike Frysinger
  2021-11-16  8:36 ` [PATCH 2/6] sim: callback: expose argv & environ Mike Frysinger
  2021-11-16  8:36 ` [PATCH 3/6] sim: syscall: fix argvlen & argv implementation Mike Frysinger
@ 2021-11-16  8:36 ` Mike Frysinger
  2021-11-16  8:36 ` [PATCH 5/6] sim: nrun: add --env-{set, unset, clear} command line options Mike Frysinger
  2021-11-16  8:36 ` [PATCH 6/6] sim: run: support concise env var settings Mike Frysinger
  4 siblings, 0 replies; 6+ messages in thread
From: Mike Frysinger @ 2021-11-16  8:36 UTC (permalink / raw)
  To: gdb-patches

Now that the callback framework supports argv & envp, we can move
the Blackfin implementation of these syscalls to the common code.
---
 sim/bfin/interp.c    | 33 ---------------------------------
 sim/common/syscall.c | 40 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 40 insertions(+), 33 deletions(-)

diff --git a/sim/bfin/interp.c b/sim/bfin/interp.c
index 88ddbd071b3d..f41e9b1bd7bb 100644
--- a/sim/bfin/interp.c
+++ b/sim/bfin/interp.c
@@ -144,39 +144,6 @@ bfin_syscall (SIM_CPU *cpu)
       tbuf += sprintf (tbuf, "exit(%i)", args[0]);
       sim_engine_halt (sd, cpu, NULL, PCREG, sim_exited, sc.arg1);
 
-#ifdef CB_SYS_argc
-    case CB_SYS_argc:
-      tbuf += sprintf (tbuf, "argc()");
-      sc.result = countargv ((char **)argv);
-      break;
-    case CB_SYS_argnlen:
-      {
-      tbuf += sprintf (tbuf, "argnlen(%u)", args[0]);
-	if (sc.arg1 < countargv ((char **)argv))
-	  sc.result = strlen (argv[sc.arg1]);
-	else
-	  sc.result = -1;
-      }
-      break;
-    case CB_SYS_argn:
-      {
-	tbuf += sprintf (tbuf, "argn(%u)", args[0]);
-	if (sc.arg1 < countargv ((char **)argv))
-	  {
-	    const char *argn = argv[sc.arg1];
-	    int len = strlen (argn);
-	    int written = sc.write_mem (cb, &sc, sc.arg2, argn, len + 1);
-	    if (written == len + 1)
-	      sc.result = sc.arg2;
-	    else
-	      sc.result = -1;
-	  }
-	else
-	  sc.result = -1;
-      }
-      break;
-#endif
-
     case CB_SYS_gettimeofday:
       {
 	struct timeval _tv, *tv = &_tv;
diff --git a/sim/common/syscall.c b/sim/common/syscall.c
index bad3b3b6214d..df9dd92e6dac 100644
--- a/sim/common/syscall.c
+++ b/sim/common/syscall.c
@@ -141,6 +141,46 @@ cb_syscall (host_callback *cb, CB_SYSCALL *sc)
 
   switch (cb_target_to_host_syscall (cb, sc->func))
     {
+    case CB_SYS_argc:
+      result = countargv (cb->argv);
+      break;
+
+    case CB_SYS_argnlen:
+      {
+	if (sc->arg1 >= 0 && sc->arg1 < countargv (cb->argv))
+	  result = strlen (cb->argv[sc->arg1]);
+	else
+	  {
+	    result = -1;
+	    errcode = EINVAL;
+	  }
+      }
+      break;
+
+    case CB_SYS_argn:
+      {
+	if (sc->arg1 >= 0 && sc->arg1 < countargv (cb->argv))
+	  {
+	    const char *argn = cb->argv[sc->arg1];
+	    int len = strlen (argn);
+	    int written = sc->write_mem (cb, sc, sc->arg2, argn, len + 1);
+
+	    if (written == len + 1)
+	      result = sc->arg2;
+	    else
+	      {
+		result = -1;
+		errcode = EINVAL;
+	      }
+	  }
+	else
+	  {
+	    result = -1;
+	    errcode = EINVAL;
+	  }
+      }
+      break;
+
     case CB_SYS_argvlen :
       {
 	/* Compute how much space is required to store the argv,envp
-- 
2.33.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 5/6] sim: nrun: add --env-{set, unset, clear} command line options
  2021-11-16  8:36 [PATCH 1/6] sim: keep track of program environment strings Mike Frysinger
                   ` (2 preceding siblings ...)
  2021-11-16  8:36 ` [PATCH 4/6] sim: syscall: hoist argc/argn/argnlen to common code Mike Frysinger
@ 2021-11-16  8:36 ` Mike Frysinger
  2021-11-16  8:36 ` [PATCH 6/6] sim: run: support concise env var settings Mike Frysinger
  4 siblings, 0 replies; 6+ messages in thread
From: Mike Frysinger @ 2021-11-16  8:36 UTC (permalink / raw)
  To: gdb-patches

Provide explicit control over the program's environment with the
basic set/unset/clear options.  These are a bit clunky to use,
but they're functional.

The env set operation is split out into a separate function as it'll
be used in the next commit.

With these in place, we can adjust the custom cris testsuite to use
the now standard options and not its one-off hack.
---
 sim/common/nrun.c                |  4 +-
 sim/common/sim-options.c         | 99 ++++++++++++++++++++++++++++++++
 sim/testsuite/cris/c/c.exp       |  3 +-
 sim/testsuite/cris/c/readlink7.c |  5 +-
 sim/testsuite/cris/c/readlink8.c |  6 +-
 5 files changed, 107 insertions(+), 10 deletions(-)

diff --git a/sim/common/nrun.c b/sim/common/nrun.c
index b3e48e214ed3..320380e91d59 100644
--- a/sim/common/nrun.c
+++ b/sim/common/nrun.c
@@ -62,6 +62,7 @@ main (int argc, char **argv)
 {
   const char *name;
   char **prog_argv = NULL;
+  char **prog_envp = NULL;
   struct bfd *prog_bfd;
   enum sim_stop reason;
   int sigrc = 0;
@@ -99,6 +100,7 @@ main (int argc, char **argv)
 
   /* Was there a program to run?  */
   prog_argv = STATE_PROG_ARGV (sd);
+  prog_envp = STATE_PROG_ENVP (sd) ? : environ;
   prog_bfd = STATE_PROG_BFD (sd);
   if (prog_argv == NULL || *prog_argv == NULL)
     usage ();
@@ -131,7 +133,7 @@ main (int argc, char **argv)
     exit (1);
 
   /* Prepare the program for execution.  */
-  sim_create_inferior (sd, prog_bfd, prog_argv, environ);
+  sim_create_inferior (sd, prog_bfd, prog_argv, prog_envp);
 
   /* To accommodate relative file paths, chdir to sysroot now.  We
      mustn't do this until BFD has opened the program, else we wouldn't
diff --git a/sim/common/sim-options.c b/sim/common/sim-options.c
index 17e550e55577..f94b814a6cb3 100644
--- a/sim/common/sim-options.c
+++ b/sim/common/sim-options.c
@@ -25,10 +25,12 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 #include <stdlib.h>
 #include <ctype.h>
 #include <stdio.h>
+#include <unistd.h>
 #include "libiberty.h"
 #include "sim-options.h"
 #include "sim-io.h"
 #include "sim-assert.h"
+#include "environ.h"
 #include "version.h"
 #include "hashtab.h"
 
@@ -106,6 +108,9 @@ typedef enum {
   OPTION_LOAD_VMA,
   OPTION_SYSROOT,
   OPTION_ARGV0,
+  OPTION_ENV_SET,
+  OPTION_ENV_UNSET,
+  OPTION_ENV_CLEAR,
 } STANDARD_OPTIONS;
 
 static const OPTION standard_options[] =
@@ -184,9 +189,63 @@ static const OPTION standard_options[] =
       '\0', "ARGV0", "Set argv[0] to the specified string",
       standard_option_handler, NULL },
 
+  { {"env-set", required_argument, NULL, OPTION_ENV_SET},
+      '\0', "VAR=VAL", "Set the variable in the program's environment",
+      standard_option_handler, NULL },
+  { {"env-unset", required_argument, NULL, OPTION_ENV_UNSET},
+      '\0', "VAR", "Unset the variable in the program's environment",
+      standard_option_handler, NULL },
+  { {"env-clear", no_argument, NULL, OPTION_ENV_CLEAR},
+      '\0', NULL, "Clear the program's environment",
+      standard_option_handler, NULL },
+
   { {NULL, no_argument, NULL, 0}, '\0', NULL, NULL, NULL, NULL }
 };
 
+static SIM_RC
+env_set (SIM_DESC sd, const char *arg)
+{
+  int i, varlen;
+  char *eq;
+  char **envp;
+
+  if (STATE_PROG_ENVP (sd) == NULL)
+    STATE_PROG_ENVP (sd) = dupargv (environ);
+
+  eq = strchr (arg, '=');
+  if (eq == NULL)
+    {
+      sim_io_eprintf (sd, "invalid syntax when setting env var `%s'"
+		      ": missing value", arg);
+      return SIM_RC_FAIL;
+    }
+  /* Include the = in the comparison below.  */
+  varlen = eq - arg + 1;
+
+  /* If we can find an existing variable, replace it.  */
+  envp = STATE_PROG_ENVP (sd);
+  for (i = 0; envp[i]; ++i)
+    {
+      if (strncmp (envp[i], arg, varlen) == 0)
+	{
+	  free (envp[i]);
+	  envp[i] = xstrdup (arg);
+	  break;
+	}
+    }
+
+  /* If we didn't find the var, add it.  */
+  if (envp[i] == NULL)
+    {
+      envp = xrealloc (envp, (i + 2) * sizeof (char *));
+      envp[i] = xstrdup (arg);
+      envp[i + 1] = NULL;
+      STATE_PROG_ENVP (sd) = envp;
+  }
+
+  return SIM_RC_OK;
+}
+
 static SIM_RC
 standard_option_handler (SIM_DESC sd, sim_cpu *cpu, int opt,
 			 char *arg, int is_command)
@@ -430,6 +489,46 @@ standard_option_handler (SIM_DESC sd, sim_cpu *cpu, int opt,
       free (STATE_PROG_ARGV0 (sd));
       STATE_PROG_ARGV0 (sd) = xstrdup (arg);
       break;
+
+    case OPTION_ENV_SET:
+      return env_set (sd, arg);
+
+    case OPTION_ENV_UNSET:
+      {
+	int i, varlen;
+	char **envp;
+
+	if (STATE_PROG_ENVP (sd) == NULL)
+	  STATE_PROG_ENVP (sd) = dupargv (environ);
+
+	varlen = strlen (arg);
+
+	/* If we can find an existing variable, replace it.  */
+	envp = STATE_PROG_ENVP (sd);
+	for (i = 0; envp[i]; ++i)
+	  {
+	    char *env = envp[i];
+
+	    if (strncmp (env, arg, varlen) == 0
+		&& (env[varlen] == '\0' || env[varlen] == '='))
+	      {
+		free (envp[i]);
+		break;
+	      }
+	  }
+
+	/* If we clear the var, shift the array down.  */
+	for (; envp[i]; ++i)
+	  envp[i] = envp[i + 1];
+
+	break;
+      }
+
+    case OPTION_ENV_CLEAR:
+      freeargv (STATE_PROG_ENVP (sd));
+      STATE_PROG_ENVP (sd) = xmalloc (sizeof (char *));
+      STATE_PROG_ENVP (sd)[0] = NULL;
+      break;
     }
 
   return SIM_RC_OK;
diff --git a/sim/testsuite/cris/c/c.exp b/sim/testsuite/cris/c/c.exp
index ec89c5c1de20..506f68ab0865 100644
--- a/sim/testsuite/cris/c/c.exp
+++ b/sim/testsuite/cris/c/c.exp
@@ -101,7 +101,6 @@ foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.c]] {
     set opts(timeout) ""
     set opts(mach) ""
     set opts(xerror) "no"
-    set opts(simenv) ""
     set opts(kfail) ""
     set opts(xfail) ""
     set opts(target) ""
@@ -211,7 +210,7 @@ foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.c]] {
     }
 
     set result [sim_run "$testname.x" "$opts(sim,$mach)" "$opts(progoptions)" \
-	"" "$opts(simenv)"]
+	"" ""]
     set return_code [lindex $result 0]
     set output [lindex $result 1]
 
diff --git a/sim/testsuite/cris/c/readlink7.c b/sim/testsuite/cris/c/readlink7.c
index 9c2b3b732c8c..52c0733ca8a4 100644
--- a/sim/testsuite/cris/c/readlink7.c
+++ b/sim/testsuite/cris/c/readlink7.c
@@ -1,6 +1,5 @@
 /* Check that rare readlink calls don't cause the simulator to abort.
 #notarget: cris*-*-elf
-#simenv: env(-u\ PWD\ foo)=bar
-   FIXME: Need to unset PWD, but right now I won't bother tweaking the
-   generic parts of the testsuite machinery and instead abuse a flaw.  */
+#sim: --env-unset PWD
+ */
 #include "readlink2.c"
diff --git a/sim/testsuite/cris/c/readlink8.c b/sim/testsuite/cris/c/readlink8.c
index 55f6fe8541f2..98319fb4e344 100644
--- a/sim/testsuite/cris/c/readlink8.c
+++ b/sim/testsuite/cris/c/readlink8.c
@@ -1,8 +1,6 @@
 /* Check that rare readlink calls don't cause the simulator to abort.
 #notarget: cris*-*-elf
-#sim: --sysroot=@exedir@
-#simenv: env(-u\ PWD\ foo)=bar
-   FIXME: Need to unset PWD, but right now I won't bother tweaking the
-   generic parts of the testsuite machinery and instead abuse a flaw.  */
+#sim: --sysroot=@exedir@ --env-unset PWD
+ */
 #define SYSROOTED 1
 #include "readlink2.c"
-- 
2.33.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 6/6] sim: run: support concise env var settings
  2021-11-16  8:36 [PATCH 1/6] sim: keep track of program environment strings Mike Frysinger
                   ` (3 preceding siblings ...)
  2021-11-16  8:36 ` [PATCH 5/6] sim: nrun: add --env-{set, unset, clear} command line options Mike Frysinger
@ 2021-11-16  8:36 ` Mike Frysinger
  4 siblings, 0 replies; 6+ messages in thread
From: Mike Frysinger @ 2021-11-16  8:36 UTC (permalink / raw)
  To: gdb-patches

Support the same syntax as other common utilities where env vars can
be specified before the program to be run without an explicit option.

This behavior can be suppressed by using the -- marker.
---
 sim/common/nrun.c        |  3 ++-
 sim/common/sim-options.c | 22 +++++++++++++++++++++-
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/sim/common/nrun.c b/sim/common/nrun.c
index 320380e91d59..557a060e5691 100644
--- a/sim/common/nrun.c
+++ b/sim/common/nrun.c
@@ -229,7 +229,8 @@ main (int argc, char **argv)
 static void
 usage (void)
 {
-  fprintf (stderr, "Usage: %s [options] [--] program [program args]\n", myname);
+  fprintf (stderr, "Usage: %s [options] [VAR=VAL|--] program [program args]\n",
+	   myname);
   fprintf (stderr, "Run `%s --help' for full list of options.\n", myname);
   exit (1);
 }
diff --git a/sim/common/sim-options.c b/sim/common/sim-options.c
index f94b814a6cb3..8c9b7cfec370 100644
--- a/sim/common/sim-options.c
+++ b/sim/common/sim-options.c
@@ -719,6 +719,22 @@ sim_parse_args (SIM_DESC sd, char * const *argv)
 	      free (STATE_PROG_FILE (sd));
 	      STATE_PROG_FILE (sd) = NULL;
 
+	      /* Handle any inline variables if -- wasn't used.  */
+	      if (argv[optind] != NULL && optind > 0
+		  && strcmp (argv[optind - 1], "--") != 0)
+		{
+		  while (1)
+		    {
+		      const char *arg = argv[optind];
+
+		      if (strchr (arg, '=') == NULL)
+			break;
+
+		      env_set (sd, arg);
+		      ++optind;
+		    }
+		}
+
 	      new_argv = dupargv (argv + optind);
 	      freeargv (STATE_PROG_ARGV (sd));
 	      STATE_PROG_ARGV (sd) = new_argv;
@@ -914,7 +930,8 @@ void
 sim_print_help (SIM_DESC sd, int is_command)
 {
   if (STATE_OPEN_KIND (sd) == SIM_OPEN_STANDALONE)
-    sim_io_printf (sd, "Usage: %s [options] [--] program [program args]\n",
+    sim_io_printf (sd,
+		   "Usage: %s [options] [VAR=VAL|--] program [program args]\n",
 		   STATE_MY_NAME (sd));
 
   /* Initialize duplicate argument checker.  */
@@ -950,6 +967,9 @@ sim_print_help (SIM_DESC sd, int is_command)
   if (STATE_OPEN_KIND (sd) == SIM_OPEN_STANDALONE)
     {
       sim_io_printf (sd, "\n");
+      sim_io_printf (sd,
+		     "VAR=VAL         Environment variables to set.  "
+		     "Ignored if -- is used.\n");
       sim_io_printf (sd, "program args    Arguments to pass to simulated program.\n");
       sim_io_printf (sd, "                Note: Very few simulators support this.\n");
     }
-- 
2.33.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-11-16  8:36 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-16  8:36 [PATCH 1/6] sim: keep track of program environment strings Mike Frysinger
2021-11-16  8:36 ` [PATCH 2/6] sim: callback: expose argv & environ Mike Frysinger
2021-11-16  8:36 ` [PATCH 3/6] sim: syscall: fix argvlen & argv implementation Mike Frysinger
2021-11-16  8:36 ` [PATCH 4/6] sim: syscall: hoist argc/argn/argnlen to common code Mike Frysinger
2021-11-16  8:36 ` [PATCH 5/6] sim: nrun: add --env-{set, unset, clear} command line options Mike Frysinger
2021-11-16  8:36 ` [PATCH 6/6] sim: run: support concise env var settings Mike Frysinger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).