From dea827fc5c3349dc0308d0e22ab2d6791282cf8b Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Sat, 2 Jan 2016 02:34:05 -0500 Subject: [PATCH] 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. --- sim/ppc/ChangeLog | 15 +++++++++++++++ sim/ppc/main.c | 4 ++-- sim/ppc/psim.c | 44 +++++++++++++++++++++++++++----------------- sim/ppc/psim.h | 6 ++++-- sim/ppc/sim_calls.c | 3 ++- 5 files changed, 50 insertions(+), 22 deletions(-) diff --git a/sim/ppc/ChangeLog b/sim/ppc/ChangeLog index 7ce9a47..82fd50b 100644 --- a/sim/ppc/ChangeLog +++ b/sim/ppc/ChangeLog @@ -1,3 +1,18 @@ +2016-01-02 Mike Frysinger + + * 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 * emul_netbsd.c (fd_closed): New static array. diff --git a/sim/ppc/main.c b/sim/ppc/main.c index fad6973..667c02f 100644 --- a/sim/ppc/main.c +++ b/sim/ppc/main.c @@ -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]; diff --git a/sim/ppc/psim.c b/sim/ppc/psim.c index 183b9f2..3e322e3 100644 --- a/sim/ppc/psim.c +++ b/sim/ppc/psim.c @@ -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 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 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; } diff --git a/sim/ppc/psim.h b/sim/ppc/psim.h index 60fd9b9..07852c2 100644 --- a/sim/ppc/psim.h +++ b/sim/ppc/psim.h @@ -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 */ diff --git a/sim/ppc/sim_calls.c b/sim/ppc/sim_calls.c index 4e61335..d25b46c 100644 --- a/sim/ppc/sim_calls.c +++ b/sim/ppc/sim_calls.c @@ -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 (); -- 2.7.4