diff options
Diffstat (limited to 'sim/common/nrun.c')
-rw-r--r-- | sim/common/nrun.c | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/sim/common/nrun.c b/sim/common/nrun.c new file mode 100644 index 00000000000..17fdfcc4bac --- /dev/null +++ b/sim/common/nrun.c @@ -0,0 +1,119 @@ +/* New version of run front end support for simulators. + Copyright (C) 1997 Free Software Foundation, Inc. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include "sim-main.h" + +#ifdef HAVE_ENVIRON +extern char **environ; +#endif + +static void usage PARAMS ((void)); + +extern host_callback default_callback; + +static char *myname; + +int +main (argc, argv) + int argc; + char **argv; +{ + char *name; + char **prog_argv = NULL; + enum sim_stop reason; + int sigrc; + SIM_DESC sd; + + myname = argv[0] + strlen (argv[0]); + while (myname > argv[0] && myname[-1] != '/') + --myname; + + sim_set_callbacks (NULL, &default_callback); + default_callback.init (&default_callback); + + /* Create an instance of the simulator. */ + sd = sim_open (SIM_OPEN_STANDALONE, argv); + if (sd == 0) + exit (1); + + /* Was there a program to run? */ + prog_argv = STATE_PROG_ARGV (sd); + if (prog_argv == NULL || *prog_argv == NULL) + usage (); + + name = *prog_argv; + + if (STATE_VERBOSE_P (sd)) + printf ("%s %s\n", myname, name); + + /* Load the program into the simulator. */ + if (sim_load (sd, name, NULL, 0) == SIM_RC_FAIL) + exit (1); + + /* Prepare the program for execution. */ +#ifdef HAVE_ENVIRON + sim_create_inferior (sd, prog_argv, environ); +#else + sim_create_inferior (sd, prog_argv, NULL); +#endif + + /* Run the program. */ + sim_resume (sd, 0, 0); + + /* Print any stats the simulator collected. */ + sim_info (sd, 0); + + /* Find out why the program exited. */ + sim_stop_reason (sd, &reason, &sigrc); + + /* Shutdown the simulator. */ + sim_close (sd, 0); + + /* If reason is sim_exited, then sigrc holds the exit code which we want + to return. If reason is sim_stopped or sim_signalled, then sigrc holds + the signal that the simulator received; we want to return that to + indicate failure. */ + +#ifdef SIM_H8300 /* FIXME: Ugh. grep for SLEEP in compile.c */ + if (sigrc == SIGILL) + abort (); + sigrc = 0; +#else + /* Why did we stop? */ + switch (reason) + { + case sim_signalled: + case sim_stopped: + if (sigrc != 0) + fprintf (stderr, "program stopped with signal %d.\n", sigrc); + break; + + case sim_exited: + break; + } +#endif + + return sigrc; +} + +static void +usage () +{ + fprintf (stderr, "Usage: %s [options] program [program args]\n", myname); + fprintf (stderr, "Run `%s --help' for full list of options.\n", myname); + exit (1); +} |