diff options
author | Andrew Cagney <cagney@redhat.com> | 1997-03-21 03:56:07 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 1997-03-21 03:56:07 +0000 |
commit | fa21d299e666c3b9862e2e96cf1c4bacc3675c6b (patch) | |
tree | 3b474411e2f92be90709dd93c37f33e698333398 /sim/common/run.c | |
parent | 011fa6712432575d1ea1f9b70c9d2eb3f981476f (diff) | |
download | gdb-fa21d299e666c3b9862e2e96cf1c4bacc3675c6b.zip gdb-fa21d299e666c3b9862e2e96cf1c4bacc3675c6b.tar.gz gdb-fa21d299e666c3b9862e2e96cf1c4bacc3675c6b.tar.bz2 |
Pass GCC -W...
Diffstat (limited to 'sim/common/run.c')
-rw-r--r-- | sim/common/run.c | 216 |
1 files changed, 160 insertions, 56 deletions
diff --git a/sim/common/run.c b/sim/common/run.c index 79484eb..cb9fdab 100644 --- a/sim/common/run.c +++ b/sim/common/run.c @@ -1,5 +1,5 @@ /* run front end support for all the simulators. - Copyright (C) 1992, 1993 1994, 1995 Free Software Foundation, Inc. + Copyright (C) 1992, 1993 1994, 1995, 1996 Free Software Foundation, Inc. GNU CC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -15,21 +15,38 @@ 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. */ +/* Steve Chamberlain sac@cygnus.com, + and others at Cygnus. */ -/* Steve Chamberlain - sac@cygnus.com */ +#include "config.h" +#include "tconfig.h" #include <signal.h> #include <stdio.h> +#ifdef __STDC__ +#include <stdarg.h> +#else #include <varargs.h> +#endif + +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif + +#ifdef HAVE_STRING_H +#include <string.h> +#else +#ifdef HAVE_STRINGS_H +#include <strings.h> +#endif +#endif + +#include "libiberty.h" #include "bfd.h" -#include "remote-sim.h" #include "callback.h" -#ifndef SIGQUIT -#define SIGQUIT SIGTERM -#endif +#include "remote-sim.h" -void usage(); +static void usage PARAMS ((void)); extern int optind; extern char *optarg; @@ -38,6 +55,17 @@ bfd *exec_bfd; int target_byte_order; extern host_callback default_callback; + +static char *myname; + + +/* NOTE: sim_size() and sim_trace() are going away */ +extern void sim_size PARAMS ((int i)); +extern int sim_trace PARAMS ((SIM_DESC sd)); + +extern int getopt (); + + int main (ac, av) int ac; @@ -49,135 +77,211 @@ main (ac, av) int i; int verbose = 0; int trace = 0; - char *name = ""; + char *name; + static char *no_args[2]; + char **sim_argv = &no_args[0]; + char **prog_args; enum sim_stop reason; int sigrc; + SIM_DESC sd; + + myname = av[0] + strlen (av[0]); + while (myname > av[0] && myname[-1] != '/') + --myname; - while ((i = getopt (ac, av, "m:p:s:tv")) != EOF) + /* The first element of sim_open's argv is the program name. */ + no_args[0] = av[0]; + + /* FIXME: This is currently being rewritten to have each simulator + do all argv processing. */ + +#ifdef SIM_H8300 /* FIXME: quick hack */ + while ((i = getopt (ac, av, "a:c:m:p:s:htv")) != EOF) +#else + while ((i = getopt (ac, av, "a:c:m:p:s:tv")) != EOF) +#endif switch (i) { + case 'a': + /* FIXME: Temporary hack. */ + { + int len = strlen (av[0]) + strlen (optarg); + char *argbuf = (char *) alloca (len + 2); + sprintf (argbuf, "%s %s", av[0], optarg); + sim_argv = buildargv (argbuf); + } + break; +#ifdef SIM_HAVE_SIMCACHE + case 'c': + sim_set_simcache_size (atoi (optarg)); + break; +#endif case 'm': + /* FIXME: Rename to sim_set_mem_size. */ sim_size (atoi (optarg)); break; +#ifdef SIM_HAVE_PROFILE case 'p': sim_set_profile (atoi (optarg)); break; case 's': sim_set_profile_size (atoi (optarg)); break; +#endif case 't': trace = 1; + /* FIXME: need to allow specification of what to trace. */ + /* sim_set_trace (1); */ break; case 'v': + /* Things that are printed with -v are the kinds of things that + gcc -v prints. This is not meant to include detailed tracing + or debugging information, just summaries. */ verbose = 1; + /* sim_set_verbose (1); */ break; + /* FIXME: Quick hack, to be replaced by more general facility. */ +#ifdef SIM_H8300 + case 'h': + set_h8300h (1); + break; +#endif default: - usage(); + usage (); } + ac -= optind; av += optind; - if (ac != 1) - usage(); - name = *av; + prog_args = av + 1; if (verbose) { - printf ("run %s\n", name); + printf ("%s %s\n", myname, name); } exec_bfd = abfd = bfd_openr (name, 0); if (!abfd) { - fprintf (stderr, "run: can't open %s: %s\n", - name, bfd_errmsg(bfd_get_error())); + fprintf (stderr, "%s: can't open %s: %s\n", + myname, name, bfd_errmsg (bfd_get_error ())); exit (1); } if (!bfd_check_format (abfd, bfd_object)) { - fprintf (stderr, "run: can't load %s: %s\n", - name, bfd_errmsg(bfd_get_error())); + fprintf (stderr, "%s: can't load %s: %s\n", + myname, name, bfd_errmsg (bfd_get_error ())); exit (1); } - sim_set_callbacks (&default_callback); + /* This must be set before sim_open is called, because gdb assumes that + the simulator endianness is known immediately after the sim_open call. */ + target_byte_order = bfd_big_endian (abfd) ? 4321 : 1234; + + sim_set_callbacks (NULL, &default_callback); default_callback.init (&default_callback); /* Ensure that any run-time initialisation that needs to be performed by the simulator can occur. */ - sim_open(NULL); + sd = sim_open (sim_argv); for (s = abfd->sections; s; s = s->next) - if (abfd && (s->flags & SEC_LOAD)) { - unsigned char *buffer = (unsigned char *)malloc ((size_t)(bfd_section_size (abfd, s))); - if (buffer != NULL) - { - bfd_get_section_contents (abfd, - s, - buffer, - 0, - bfd_section_size (abfd, s)); - sim_write (s->vma, buffer, bfd_section_size (abfd, s)); - } - else - { - fprintf (stderr, "run: failed to allocate section buffer: %s\n", - bfd_errmsg(bfd_get_error())); - exit (1); - } + if (s->flags & SEC_LOAD) + { + unsigned char *buffer = (unsigned char *)malloc ((size_t)(bfd_section_size (abfd, s))); + if (buffer != NULL) + { + bfd_get_section_contents (abfd, + s, + buffer, + 0, + bfd_section_size (abfd, s)); + sim_write (sd, s->vma, buffer, bfd_section_size (abfd, s)); + /* FIXME: How come we don't free buffer? */ + } + else + { + fprintf (stderr, "%s: failed to allocate section buffer: %s\n", + myname, bfd_errmsg (bfd_get_error ())); + exit (1); + } + } } start_address = bfd_get_start_address (abfd); - sim_create_inferior (start_address, NULL, NULL); - - target_byte_order = bfd_big_endian (abfd) ? 4321 : 1234; + sim_create_inferior (sd, start_address, prog_args, NULL); if (trace) { int done = 0; while (!done) { - done = sim_trace (); + done = sim_trace (sd); } } else { - sim_resume (0, 0); + sim_resume (sd, 0, 0); } if (verbose) - sim_info (0); + sim_info (sd, 0); - sim_stop_reason (&reason, &sigrc); + sim_stop_reason (sd, &reason, &sigrc); - sim_close(0); + 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: - fprintf (stderr, "program stopped with signal %d.\n", sigrc); + if (sigrc != 0) + fprintf (stderr, "program stopped with signal %d.\n", sigrc); break; case sim_exited: break; } +#endif - /* 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. */ return sigrc; } -void -usage() +static void +usage () { - fprintf (stderr, "usage: run [-tv][-m size] program\n"); + fprintf (stderr, "Usage: %s [options] program [program args]\n", myname); + fprintf (stderr, "Options:\n"); + fprintf (stderr, "-a args Pass `args' to simulator.\n"); +#ifdef SIM_HAVE_SIMCACHE + fprintf (stderr, "-c size Set simulator cache size to `size'.\n"); +#endif +#ifdef SIM_H8300 + fprintf (stderr, "-h Executable is for h8/300h or h8/300s.\n"); +#endif + fprintf (stderr, "-m size Set memory size of simulator, in bytes.\n"); +#ifdef SIM_HAVE_PROFILE + fprintf (stderr, "-p freq Set profiling frequency.\n"); + fprintf (stderr, "-s size Set profiling size.\n"); +#endif + fprintf (stderr, "-t Perform instruction tracing.\n"); + fprintf (stderr, " Note: Very few simulators support tracing.\n"); + fprintf (stderr, "-v Verbose output.\n"); + fprintf (stderr, "\n"); + fprintf (stderr, "program args Arguments to pass to simulated program.\n"); + fprintf (stderr, " Note: Very few simulators support this.\n"); exit (1); } - - |