mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-21 02:24:17 +08:00
sim: keep track of program environment strings
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.
This commit is contained in:
@ -144,6 +144,12 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
|
|||||||
STATE_PROG_ARGV (sd) = dupargv (argv);
|
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))
|
if (trace_load_symbols (sd))
|
||||||
{
|
{
|
||||||
STATE_PROG_SYMS_COUNT (sd) =
|
STATE_PROG_SYMS_COUNT (sd) =
|
||||||
|
@ -1170,6 +1170,12 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
|
|||||||
STATE_PROG_ARGV (sd) = dupargv (argv);
|
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))
|
switch (STATE_ENVIRONMENT (sd))
|
||||||
{
|
{
|
||||||
case USER_ENVIRONMENT:
|
case USER_ENVIRONMENT:
|
||||||
|
@ -190,7 +190,7 @@ sim_open (SIM_OPEN_KIND kind,
|
|||||||
|
|
||||||
SIM_RC
|
SIM_RC
|
||||||
sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
|
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_CPU *current_cpu = STATE_CPU (sd, 0);
|
||||||
SIM_ADDR addr;
|
SIM_ADDR addr;
|
||||||
@ -213,5 +213,11 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
|
|||||||
STATE_PROG_ARGV (sd) = dupargv (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;
|
return SIM_RC_OK;
|
||||||
}
|
}
|
||||||
|
@ -165,6 +165,10 @@ struct sim_state {
|
|||||||
char *prog_argv0;
|
char *prog_argv0;
|
||||||
#define STATE_PROG_ARGV0(sd) ((sd)->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. */
|
/* The program's bfd. */
|
||||||
struct bfd *prog_bfd;
|
struct bfd *prog_bfd;
|
||||||
#define STATE_PROG_BFD(sd) ((sd)->prog_bfd)
|
#define STATE_PROG_BFD(sd) ((sd)->prog_bfd)
|
||||||
|
@ -99,6 +99,7 @@ sim_state_free (SIM_DESC sd)
|
|||||||
|
|
||||||
free (STATE_PROG_FILE (sd));
|
free (STATE_PROG_FILE (sd));
|
||||||
free (STATE_PROG_ARGV0 (sd));
|
free (STATE_PROG_ARGV0 (sd));
|
||||||
|
freeargv (STATE_PROG_ENVP (sd));
|
||||||
free (sd);
|
free (sd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -951,8 +951,8 @@ sim_open (SIM_OPEN_KIND kind, host_callback *callback, struct bfd *abfd,
|
|||||||
|
|
||||||
SIM_RC
|
SIM_RC
|
||||||
sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
|
sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
|
||||||
char * const *argv ATTRIBUTE_UNUSED,
|
char * const *argv,
|
||||||
char * const *envp ATTRIBUTE_UNUSED)
|
char * const *env)
|
||||||
{
|
{
|
||||||
SIM_CPU *current_cpu = STATE_CPU (sd, 0);
|
SIM_CPU *current_cpu = STATE_CPU (sd, 0);
|
||||||
SIM_ADDR addr;
|
SIM_ADDR addr;
|
||||||
@ -977,6 +977,12 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
|
|||||||
STATE_PROG_ARGV (sd) = dupargv (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;
|
return SIM_RC_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,5 +174,11 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
|
|||||||
STATE_PROG_ARGV (sd) = dupargv (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;
|
return SIM_RC_OK;
|
||||||
}
|
}
|
||||||
|
@ -175,7 +175,7 @@ frv_sim_close (SIM_DESC sd, int quitting)
|
|||||||
|
|
||||||
SIM_RC
|
SIM_RC
|
||||||
sim_create_inferior (SIM_DESC sd, bfd *abfd, char * const *argv,
|
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_CPU *current_cpu = STATE_CPU (sd, 0);
|
||||||
SIM_ADDR addr;
|
SIM_ADDR addr;
|
||||||
@ -196,5 +196,11 @@ sim_create_inferior (SIM_DESC sd, bfd *abfd, char * const *argv,
|
|||||||
STATE_PROG_ARGV (sd) = dupargv (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;
|
return SIM_RC_OK;
|
||||||
}
|
}
|
||||||
|
@ -900,6 +900,13 @@ sim_create_inferior (SIM_DESC sd,
|
|||||||
freeargv (STATE_PROG_ARGV (sd));
|
freeargv (STATE_PROG_ARGV (sd));
|
||||||
STATE_PROG_ARGV (sd) = dupargv (argv);
|
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.regs[FT32_HARD_SP] = addr;
|
||||||
cpu->state.num_i = 0;
|
cpu->state.num_i = 0;
|
||||||
cpu->state.cycles = 0;
|
cpu->state.cycles = 0;
|
||||||
|
@ -131,7 +131,7 @@ sim_open (SIM_OPEN_KIND kind, host_callback *callback, struct bfd *abfd,
|
|||||||
|
|
||||||
SIM_RC
|
SIM_RC
|
||||||
sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
|
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_CPU *current_cpu = STATE_CPU (sd, 0);
|
||||||
SIM_ADDR addr;
|
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);
|
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;
|
return SIM_RC_OK;
|
||||||
}
|
}
|
||||||
|
@ -192,7 +192,7 @@ sim_open (SIM_OPEN_KIND kind, host_callback *callback, struct bfd *abfd,
|
|||||||
|
|
||||||
SIM_RC
|
SIM_RC
|
||||||
sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
|
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_CPU *current_cpu = STATE_CPU (sd, 0);
|
||||||
SIM_ADDR addr;
|
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);
|
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;
|
return SIM_RC_OK;
|
||||||
}
|
}
|
||||||
|
@ -145,7 +145,7 @@ sim_open (SIM_OPEN_KIND kind, host_callback *callback, struct bfd *abfd,
|
|||||||
|
|
||||||
SIM_RC
|
SIM_RC
|
||||||
sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
|
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_CPU *current_cpu = STATE_CPU (sd, 0);
|
||||||
SIM_ADDR addr;
|
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);
|
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;
|
return SIM_RC_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -848,5 +848,11 @@ sim_create_inferior (SIM_DESC sd, struct bfd *prog_bfd,
|
|||||||
STATE_PROG_ARGV (sd) = dupargv (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;
|
return SIM_RC_OK;
|
||||||
}
|
}
|
||||||
|
@ -153,6 +153,12 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
|
|||||||
STATE_PROG_ARGV (sd) = dupargv (argv);
|
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);
|
initialize_env (sd, (void *)argv, (void *)env);
|
||||||
|
|
||||||
return SIM_RC_OK;
|
return SIM_RC_OK;
|
||||||
|
Reference in New Issue
Block a user