PR 53379 Print backtrace on error termination.
authorJanne Blomqvist <jb@gcc.gnu.org>
Fri, 4 Sep 2015 22:17:11 +0000 (01:17 +0300)
committerJanne Blomqvist <jb@gcc.gnu.org>
Fri, 4 Sep 2015 22:17:11 +0000 (01:17 +0300)
2015-09-05  Janne Blomqvist  <jb@gcc.gnu.org>

PR fortran/53379
* libgfortran.h (exit_error): New prototype.
* runtime/error.c (exit_error): New function.
(os_error): Call exit_error instead of exit.
(runtime_error): Likewise.
(runtime_error_at): Likewise.
(internal_error): Likewise.
(generate_error): Likewise.
(notify_std): Likewise.
* runtime/stop.c (error_stop_string): Likewise.
(error_stop_numeric): Likewise.

From-SVN: r227503

libgfortran/ChangeLog
libgfortran/libgfortran.h
libgfortran/runtime/error.c
libgfortran/runtime/stop.c

index 5da6ea32fd61a4a9e861e2d27b27dd7aec0c47c1..8b4c27cbc95cb10dd5fd8c8ef6e94ba5ef2b2058 100644 (file)
@@ -1,3 +1,17 @@
+2015-09-05  Janne Blomqvist  <jb@gcc.gnu.org>
+
+       PR fortran/53379
+       * libgfortran.h (exit_error): New prototype.
+       * runtime/error.c (exit_error): New function.
+       (os_error): Call exit_error instead of exit.
+       (runtime_error): Likewise.
+       (runtime_error_at): Likewise.
+       (internal_error): Likewise.
+       (generate_error): Likewise.
+       (notify_std): Likewise.
+       * runtime/stop.c (error_stop_string): Likewise.
+       (error_stop_numeric): Likewise.
+
 2015-09-04  Janne Blomqvist  <jb@gcc.gnu.org>
 
        * io/unix.h (delete_file): Remove prototype.
index 3eb0d85fa245bc676c765c0fac8503fe9f2e9c7d..81240e591b8e0fa1a7ad6a4914d8993be5d10c2d 100644 (file)
@@ -675,6 +675,9 @@ internal_proto(show_backtrace);
 extern _Noreturn void sys_abort (void);
 internal_proto(sys_abort);
 
+extern _Noreturn void exit_error (int);
+internal_proto(exit_error);
+
 extern ssize_t estr_write (const char *);
 internal_proto(estr_write);
 
index 4aabe4a4a744d85d4a23d99e8d7393745a02ac3a..d357edb460db398ebe1e8282fc2bce5c70856914 100644 (file)
@@ -74,15 +74,17 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 
    2.3.5 also explains how co-images synchronize during termination.
 
-   In libgfortran we have two ways of ending a program. exit(code) is
-   a normal exit; calling exit() also causes open units to be
-   closed. No backtrace or core dump is needed here. When something
-   goes wrong, we have sys_abort() which tries to print the backtrace
-   if -fbacktrace is enabled, and then dumps core; whether a core file
-   is generated is system dependent. When aborting, we don't flush and
-   close open units, as program memory might be corrupted and we'd
-   rather risk losing dirty data in the buffers rather than corrupting
-   files on disk.
+   In libgfortran we have three ways of ending a program. exit(code)
+   is a normal exit; calling exit() also causes open units to be
+   closed. No backtrace or core dump is needed here.  For error
+   termination, we have exit_error(status), which prints a backtrace
+   if backtracing is enabled, then exits.  Finally, when something
+   goes terribly wrong, we have sys_abort() which tries to print the
+   backtrace if -fbacktrace is enabled, and then dumps core; whether a
+   core file is generated is system dependent. When aborting, we don't
+   flush and close open units, as program memory might be corrupted
+   and we'd rather risk losing dirty data in the buffers rather than
+   corrupting files on disk.
 
 */
 
@@ -181,6 +183,23 @@ sys_abort (void)
 }
 
 
+/* Exit in case of error termination. If backtracing is enabled, print
+   backtrace, then exit.  */
+
+void
+exit_error (int status)
+{
+  if (options.backtrace == 1
+      || (options.backtrace == -1 && compile_options.backtrace == 1))
+    {
+      estr_write ("\nError termination. Backtrace:\n");
+      show_backtrace (false);
+    }
+  exit (status);
+}
+
+
+
 /* gfc_xtoa()-- Integer to hexadecimal conversion.  */
 
 const char *
@@ -326,7 +345,7 @@ os_error (const char *message)
   estr_write ("\n");
   estr_write (message);
   estr_write ("\n");
-  exit (1);
+  exit_error (1);
 }
 iexport(os_error);
 
@@ -345,7 +364,7 @@ runtime_error (const char *message, ...)
   st_vprintf (message, ap);
   va_end (ap);
   estr_write ("\n");
-  exit (2);
+  exit_error (2);
 }
 iexport(runtime_error);
 
@@ -364,7 +383,7 @@ runtime_error_at (const char *where, const char *message, ...)
   st_vprintf (message, ap);
   va_end (ap);
   estr_write ("\n");
-  exit (2);
+  exit_error (2);
 }
 iexport(runtime_error_at);
 
@@ -402,7 +421,7 @@ internal_error (st_parameter_common *cmp, const char *message)
      because hopefully it doesn't happen too often).  */
   stupid_function_name_for_static_linking();
 
 exit (3);
exit_error (3);
 }
 
 
@@ -574,7 +593,7 @@ generate_error (st_parameter_common *cmp, int family, const char *message)
   estr_write ("Fortran runtime error: ");
   estr_write (message);
   estr_write ("\n");
-  exit (2);
+  exit_error (2);
 }
 iexport(generate_error);
 
@@ -636,7 +655,7 @@ notify_std (st_parameter_common *cmp, int std, const char * message)
       estr_write ("Fortran runtime error: ");
       estr_write (message);
       estr_write ("\n");
-      exit (2);
+      exit_error (2);
     }
   else
     {
index 5c5483bd5306095ac3160cfe045c37c4c4eafe27..8b8a41f72742745e5d84f20cd7b78541a19ddcb4 100644 (file)
@@ -145,7 +145,7 @@ error_stop_string (const char *string, GFC_INTEGER_4 len)
   (void) write (STDERR_FILENO, string, len);
   estr_write ("\n");
 
-  exit (1);
+  exit_error (1);
 }
 
 
@@ -159,5 +159,5 @@ error_stop_numeric (GFC_INTEGER_4 code)
 {
   report_exception ();
   st_printf ("ERROR STOP %d\n", (int) code);
-  exit (code);
+  exit_error (code);
 }