2005-11-04 Andrew Stubbs <andrew.stubbs@st.com>
authorAndrew Stubbs <andrew.stubbs@st.com>
Fri, 4 Nov 2005 11:49:12 +0000 (11:49 +0000)
committerAndrew Stubbs <andrew.stubbs@st.com>
Fri, 4 Nov 2005 11:49:12 +0000 (11:49 +0000)
* infrun.c (print_stop_reason): Set return_child_result_value on exit.
* main.c (return_child_result): New variable.
(return_child_result_value): Likewise.
(captured_main): Add option --return-child-result.
Replace call to target_detach and exit (in batch mode) with quit_force.
(print_gdb_help): Add option --return-child-result.
* top.c (quit_force): Return child result if appropriate.

docs/
* gdb.texinfo (Choosing modes): Add --return-child-result.

gdb/ChangeLog
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/infrun.c
gdb/main.c
gdb/top.c

index 9be144f6e9fbeb996c1f324681f59eec44e37dbf..67c8f016b8265ac2519e2cf2dc569bd057688eff 100644 (file)
@@ -1,3 +1,13 @@
+2005-11-04  Andrew Stubbs  <andrew.stubbs@st.com>
+
+       * infrun.c (print_stop_reason): Set return_child_result_value on exit.
+       * main.c (return_child_result): New variable.
+       (return_child_result_value): Likewise.
+       (captured_main): Add option --return-child-result.
+       Replace call to target_detach and exit (in batch mode) with quit_force.
+       (print_gdb_help): Add option --return-child-result.
+       * top.c (quit_force): Return child result if appropriate.
+
 2005-11-03  Wu Zhou  <woodzltc@cn.ibm.com>
 
         Checked in by Elena Zannoni  <ezannoni@redhat.com>
index f62c31230cf923d0089799c1b43d01efd6a77afc..9f4234fdb1624c33ee741e01873f8cc95c03c591 100644 (file)
@@ -1,3 +1,8 @@
+2005-11-04  Andrew Stubbs  <andrew.stubbs@st.com>
+
+       * gdb.texinfo (Choosing modes): Add --return-child-result.
+
+
 2005-11-01  Andrew Stubbs  <andrew.stubbs@st.com>
 
        * gdb.texinfo (Choosing modes): Add --batch-silent.
index 75ae4ef7f07df0925acd947fed481eaacea2f2eb..5402d6a697aa8efe41b1dfd80797d1198fb3ead4 100644 (file)
@@ -1007,6 +1007,27 @@ messages, for example.
 Note that targets that give their output via @value{GDBN}, as opposed to
 writing directly to @code{stdout}, will also be made silent.
 
+@item -return-child-result
+@cindex @code{--return-child-result}
+The return code from @value{GDBN} will be the return code from the child
+process (the process being debugged), with the following exceptions:
+
+@itemize @bullet
+@item
+@value{GDBN} exits abnormally.  E.g., due to an incorrect argument or an
+internal error.  In this case the exit code is the same as it would have been
+without @samp{-return-child-result}.
+@item
+The user quits with an explicit value.  E.g., @samp{quit 1}.
+@item
+The child process never runs, or is not allowed to terminate, in which case
+the exit code will be -1.
+@end itemize
+
+This option is useful in conjunction with @samp{-batch} or @samp{-batch-silent},
+when @value{GDBN} is being used as a remote program loader or simulator
+interface.
+
 @item -nowindows
 @itemx -nw
 @cindex @code{--nowindows}
index 4c2a78d2dbc33cbefd374edae41d8478809eb586..f1ebc3e19e15a394e3dcc53c552a4d2ce2b1a7f3 100644 (file)
@@ -2931,6 +2931,11 @@ print_stop_reason (enum inferior_stop_reason stop_reason, int stop_info)
               async_reason_lookup (EXEC_ASYNC_EXITED_NORMALLY));
          ui_out_text (uiout, "\nProgram exited normally.\n");
        }
+      {
+       /* Support the --return-child-result option.  */
+       extern int return_child_result_value;
+       return_child_result_value = stop_info;
+      }
       break;
     case SIGNAL_RECEIVED:
       /* Signal received. The signal table tells us to print about
index 5e912953da3bdb6cf1771d3a0d7cd1a933d0c23d..486b0ac5782ba122f56c8828703d461d64e9a946 100644 (file)
@@ -76,6 +76,12 @@ struct ui_file *gdb_stdtargerr;
 /* Support for the --batch-silent option.  */
 int batch_silent = 0;
 
+/* Support for --return-child-result option.
+   Set the default to -1 to return error in the case
+   that the program does not run or does not complete.  */
+int return_child_result = 0;
+int return_child_result_value = -1;
+
 /* Whether to enable writing into executable and core files */
 extern int write_files;
 
@@ -303,6 +309,7 @@ captured_main (void *data)
       {"write", no_argument, &write_files, 1},
       {"args", no_argument, &set_args, 1},
      {"l", required_argument, 0, 'l'},
+      {"return-child-result", no_argument, &return_child_result, 1},
       {0, no_argument, 0, 0}
     };
 
@@ -730,15 +737,8 @@ extern int gdbtk_test (char *);
 
   if (batch)
     {
-      if (attach_flag)
-       /* Either there was a problem executing the command in the
-          batch file aborted early, or the batch file forgot to do an
-          explicit detach.  Explicitly detach the inferior ensuring
-          that there are no zombies.  */
-       target_detach (NULL, 0);
-      
       /* We have hit the end of the batch file.  */
-      exit (0);
+      quit_force (NULL, 0);
     }
 
   /* Do any host- or target-specific hacks.  This is used for i960 targets
@@ -838,6 +838,8 @@ Options:\n\n\
   -b BAUDRATE        Set serial port baud rate used for remote debugging.\n\
   --batch            Exit after processing options.\n\
   --batch-silent     As for --batch, but suppress all gdb stdout output.\n\
+  --return-child-result\n\
+                     GDB exit code will be the child's exit code.\n\
   --cd=DIR           Change current directory to DIR.\n\
   --command=FILE     Execute GDB commands from FILE.\n\
   --core=COREFILE    Analyze the core dump COREFILE.\n\
index 98ad51b7f8ec1c4be604cf8a9efc40639050c7b5..a8bba83a3564b572059909ecf1ec7781bb773e82 100644 (file)
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -1177,6 +1177,7 @@ quit_force (char *args, int from_tty)
 {
   int exit_code = 0;
   struct qt_args qt;
+  extern int return_child_result, return_child_result_value;
 
   /* An optional expression may be used to cause gdb to terminate with the 
      value of that expression. */
@@ -1186,6 +1187,8 @@ quit_force (char *args, int from_tty)
 
       exit_code = (int) value_as_long (val);
     }
+  else if (return_child_result)
+    exit_code = return_child_result_value;
 
   qt.args = args;
   qt.from_tty = from_tty;