Fix SH simulator to handle program exit correctly.
authorJim Wilson <wilson@tuliptree.org>
Sun, 22 Oct 1995 20:22:02 +0000 (20:22 +0000)
committerJim Wilson <wilson@tuliptree.org>
Sun, 22 Oct 1995 20:22:02 +0000 (20:22 +0000)
sim/common/ChangeLog
sim/common/run.c

index 2216dda8e2814eccff103b0cbfe94e61f2fc0423..7d92a22f54e5f83e07f68fe6253c07207d641c0a 100644 (file)
@@ -1,3 +1,12 @@
+Sat Oct 21 12:31:01 1995  Jim Wilson  <wilson@chestnut.cygnus.com>
+
+       * run.c (main): Always return sigrc at end.
+
+Tue Oct 10 12:03:13 1995  J.T. Conklin  <jtc@rtl.cygnus.com>
+
+       * run.c (main): Print error diagnostic and exit if bfd_openr() or
+       bfd_check_format() fails.
+
 Thu Sep 28 15:40:36 1995  steve chamberlain  <sac@slash.cygnus.com>
 
        * run.c, run.1: From sh directory.
index 0bcfd3dac33fda1bb2b990cc898e8ea0ada44b7b..15bd0298ce7d3084509e024fea069d216d22b7a7 100644 (file)
@@ -86,57 +86,65 @@ main (ac, av)
     {
       printf ("run %s\n", name);
     }
+
   abfd = bfd_openr (name, 0);
+  if (!abfd) 
+    {
+      fprintf (stderr, "run: can't open %s: %s\n", 
+             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()));
+      exit (1);
+    }
+
+
   sim_set_callbacks (&default_callback);
   default_callback.init (&default_callback);
+
+  for (s = abfd->sections; s; s = s->next)
   if (abfd)
     {
-      if (bfd_check_format (abfd, bfd_object))
-       {
+      unsigned char *buffer = (unsigned char *)malloc (bfd_section_size (abfd, s));
+      bfd_get_section_contents (abfd,
+                               s,
+                               buffer,
+                               0,
+                               bfd_section_size (abfd, s));
+      sim_write (s->vma, buffer, bfd_section_size (abfd, s));
+    }
+
+  start_address = bfd_get_start_address (abfd);
+  sim_create_inferior (start_address, NULL, NULL);
+
+  target_byte_order = abfd->xvec->byteorder_big_p ? 4321 : 1234;
 
-         for (s = abfd->sections; s; s = s->next)
-           {
-             unsigned char *buffer = (unsigned char *)malloc (bfd_section_size (abfd, s));
-             bfd_get_section_contents (abfd,
-                                       s,
-                                       buffer,
-                                       0,
-                                       bfd_section_size (abfd, s));
-             sim_write (s->vma, buffer, bfd_section_size (abfd, s));
-           }
-
-         start_address = bfd_get_start_address (abfd);
-         sim_create_inferior (start_address, NULL, NULL);
-
-         target_byte_order = abfd->xvec->byteorder_big_p ? 4321 : 1234;
-
-         if (trace)
-           {
-             int done = 0;
-             while (!done)
-               {
-                 done = sim_trace ();
-               }
-           }
-         else
-           {
-             sim_resume (0, 0);
-           }
-         if (verbose)
-           sim_info (0);
-
-         sim_stop_reason (&reason, &sigrc);
-
-         if (sigrc == SIGQUIT)
-           {
-             return sim_get_quit_code();
-           }
-         else
-           return sigrc;
+  if (trace)
+    {
+      int done = 0;
+      while (!done)
+       {
+         done = sim_trace ();
        }
     }
+  else
+    {
+      sim_resume (0, 0);
+    }
+  if (verbose)
+    sim_info (0);
+
+  sim_stop_reason (&reason, &sigrc);
 
-  return 1;
+  /* 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