sim: keep track of program environment strings
authorMike Frysinger <vapier@gentoo.org>
Tue, 16 Nov 2021 04:00:04 +0000 (23:00 -0500)
committerMike Frysinger <vapier@gentoo.org>
Tue, 16 Nov 2021 05:58:41 +0000 (00:58 -0500)
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.

14 files changed:
sim/aarch64/interp.c
sim/bfin/interp.c
sim/bpf/sim-if.c
sim/common/sim-base.h
sim/common/sim-utils.c
sim/cris/sim-if.c
sim/example-synacor/interp.c
sim/frv/sim-if.c
sim/ft32/interp.c
sim/iq2000/sim-if.c
sim/lm32/sim-if.c
sim/m32r/sim-if.c
sim/pru/interp.c
sim/riscv/interp.c

index 999b949ed88b0eb8c59fefd98be1771c7230fd3a..4d7f4217456023a53a9cd2d6a219c3ddbb18f440 100644 (file)
@@ -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) =
index 088b55937878942c44a5d205a9194f5ace466494..9d0e737cc33c592d00384925cc3aa9b0ac6c6268 100644 (file)
@@ -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:
index a8d944115671db42a936f6faefb3b580e03952d9..7503a302ca34e302a287aefe0461cec26cbcf567 100644 (file)
@@ -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;
 }
index c34f6f66a913eae1030f70b67dd0d91568867a20..50def1e02b7d93da1ea3dddc020812bd577ce98a 100644 (file)
@@ -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)
index 6f147b2d703b5d0958fd9f158bb894f85f200813..ff6234b1c9848c291c622edadb5d39ec37135918 100644 (file)
@@ -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);
 }
 
index 500941a27d7b21342debe3390be9d38abe3614c3..d29ccc59f351f3144d5a93352d03e54d3aa3b416 100644 (file)
@@ -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
index d1a82e509d183786f3f6e37a825235f346166a9f..93aea7b0a860f1560701a104416d6a16685581a9 100644 (file)
@@ -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;
 }
index d0361537c61af43a656c119a4f3695b6c6b83500..7b0913dad014389f60450326f2e962a86ed6f97f 100644 (file)
@@ -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;
 }
index a1cc9abe91179c26f75ac972ca99fa44c851a057..2838395dd029b3a80510445df4e8964dea100722 100644 (file)
@@ -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;
index 21ed8217bb07d1887ec96cff8fa17afac8884204..05b348efe90ef2988609237f3f93ab0e531ab4e6 100644 (file)
@@ -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;
 }
index ce9ab5ac96763ef6871666d63215080ed65afb27..e7bffbdf3f6ea3ffe6dbbe67ac9fc223a71ffbc7 100644 (file)
@@ -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;
 }
index b2f7b4636e0de8130dab35d851fae2038da1b4d8..0cb49a1e4e1987469340ae644aac607f41f68dbb 100644 (file)
@@ -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;
 }
 
index ca640f440bcd26fce0123f1f6e29520ca73dda49..f243df9426d393842abaa0d0ecf41056845f5fa3 100644 (file)
@@ -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;
 }
index f94a8428d6903ff4992dd0fd87874e4909a9749d..7ecdd55141c1114b7265379baac2083cca84925c 100644 (file)
@@ -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;