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

Message ID 1451723969-22174-1-git-send-email-vapier@gentoo.org
State Committed
Headers

Commit Message

Mike Frysinger Jan. 2, 2016, 8:39 a.m. UTC
  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(-)
  

Patch

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  <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.
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 <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;
       }
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 ();