sim: ppc: do not exit when parsing args w/gdb

When connecting to the simulator in gdb, we don't want it to exit on
us when we pass down unknown/invalid/help/etc... options.  Plumb down
the kind argument so we can handle both gdb & psim interfaces.
This commit is contained in:
Mike Frysinger 2016-01-02 02:34:05 -05:00
parent 4a2abdc468
commit dea827fc5c
5 changed files with 50 additions and 22 deletions

View file

@ -1,3 +1,18 @@
2016-01-02 Mike Frysinger <vapier@gentoo.org>
* main.c (main): Pass SIM_OPEN_STANDALONE to psim_options and
psim_usage.
* psim.c (psim_usage): Add new kind arg. Only show bug URL and
exit when kind is SIM_OPEN_STANDALONE.
(psim_options): Add new kind arg. Pass kind down to all psim_usage
calls. Replace error/break calls after psim_usage with return NULL.
Only exit with version case when kind is SIM_OPEN_STANDALONE.
* psim.h: Include gdb/remote-sim.h.
(psim_options): Add new kind arg.
(psim_usage): Likewise.
* sim_calls.c (sim_open): Pass kind to psim_options. Return NULL
when it returns NULL.
2015-12-29 Kevin Buettner <kevinb@redhat.com>
* emul_netbsd.c (fd_closed): New static array.

View file

@ -270,13 +270,13 @@ main(int argc, char **argv)
device *root = psim_tree();
/* parse the arguments */
argv = psim_options(root, argv + 1);
argv = psim_options (root, argv + 1, SIM_OPEN_STANDALONE);
if (argv[0] == NULL) {
if (ppc_trace[trace_opts]) {
print_options ();
return 0;
} else {
psim_usage(0, 0);
psim_usage (0, 0, SIM_OPEN_STANDALONE);
}
}
name_of_file = argv[0];

View file

@ -118,7 +118,7 @@ find_arg(char *err_msg,
INLINE_PSIM\
(void)
psim_usage(int verbose, int help)
psim_usage (int verbose, int help, SIM_OPEN_KIND kind)
{
printf_filtered("Usage:\n");
printf_filtered("\n");
@ -217,9 +217,12 @@ psim_usage(int verbose, int help)
print_options();
}
if (REPORT_BUGS_TO[0])
printf ("Report bugs to %s\n", REPORT_BUGS_TO);
exit (help ? 0 : 1);
if (kind == SIM_OPEN_STANDALONE)
{
if (REPORT_BUGS_TO[0])
printf ("Report bugs to %s\n", REPORT_BUGS_TO);
exit (help ? 0 : 1);
}
}
/* Test "string" for containing a string of digits that form a number
@ -247,7 +250,8 @@ int is_num( char *string, int min, int max, int err)
INLINE_PSIM\
(char **)
psim_options(device *root,
char **argv)
char **argv,
SIM_OPEN_KIND kind)
{
device *current = root;
int argp;
@ -261,9 +265,8 @@ psim_options(device *root,
switch (*p) {
default:
printf_filtered ("Invalid Option: %s\n", argv[argp]);
psim_usage(0, 0);
error ("");
break;
psim_usage (0, 0, kind);
return NULL;
case 'c':
param = find_arg("Missing <count> option for -c (max-iterations)\n", &argp, argv);
tree_parse(root, "/openprom/options/max-iterations %s", param);
@ -282,7 +285,8 @@ psim_options(device *root,
else
{
printf_filtered ("Invalid <endian> option for -E (target-endian)\n");
psim_usage (0, 0);
psim_usage (0, 0, kind);
return NULL;
}
break;
case 'f':
@ -291,11 +295,11 @@ psim_options(device *root,
break;
case 'h':
case '?':
psim_usage(1, 1);
break;
psim_usage (1, 1, kind);
return NULL;
case 'H':
psim_usage(2, 1);
break;
psim_usage (2, 1, kind);
return NULL;
case 'i':
if (isdigit(p[1])) {
tree_parse(root, "/openprom/trace/print-info %c", p[1]);
@ -356,7 +360,10 @@ psim_options(device *root,
printf_filtered("Warning - architecture parameter ignored\n");
}
else if (strcmp (argv[argp], "--help") == 0)
psim_usage (0, 1);
{
psim_usage (0, 1, kind);
return NULL;
}
else if (strncmp (argv[argp], "--sysroot=",
sizeof ("--sysroot=") - 1) == 0)
/* Ignore this option. */
@ -365,13 +372,16 @@ psim_options(device *root,
{
extern const char version[];
printf ("GNU simulator %s%s\n", PKGVERSION, version);
exit (0);
if (kind == SIM_OPEN_STANDALONE)
exit (0);
else
return NULL;
}
else
{
printf_filtered ("Invalid option: %s\n", argv[argp]);
psim_usage (0, 0);
error ("");
psim_usage (0, 0, kind);
return NULL;
}
break;
}

View file

@ -23,6 +23,7 @@
#include "basics.h"
#include "gdb/remote-sim.h"
/* the system object */
/* typedef struct _psim psim; */
@ -48,7 +49,8 @@ extern device *psim_tree
extern char **psim_options
(device *root,
char **argv);
char **argv,
SIM_OPEN_KIND kind);
extern void psim_command
(device *root,
@ -60,7 +62,7 @@ extern void psim_merge_device_file
const char *file_name);
extern void psim_usage
(int verbose, int help);
(int verbose, int help, SIM_OPEN_KIND kind);
/* create a new simulator from the device tree */

View file

@ -77,7 +77,8 @@ sim_open (SIM_OPEN_KIND kind,
root_device = psim_tree();
simulator = NULL;
psim_options(root_device, argv + 1);
if (psim_options (root_device, argv + 1, kind) == NULL)
return NULL;
if (ppc_trace[trace_opts])
print_options ();