Revise 'libgfortran/runtime/minimal.c' to better conform to the original sources
authorThomas Schwinge <thomas@codesourcery.com>
Tue, 8 Oct 2019 10:20:31 +0000 (12:20 +0200)
committerThomas Schwinge <tschwinge@gcc.gnu.org>
Tue, 8 Oct 2019 10:20:31 +0000 (12:20 +0200)
libgfortran/
* runtime/minimal.c: Revise.

From-SVN: r276690

libgfortran/ChangeLog
libgfortran/runtime/minimal.c

index 7736e5d..9e3b1f8 100644 (file)
@@ -1,3 +1,7 @@
+2019-10-08  Thomas Schwinge  <thomas@codesourcery.com>
+
+       * runtime/minimal.c: Revise.
+
 2019-10-05  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/91926
index c1993b9..a633bc1 100644 (file)
@@ -23,13 +23,38 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 <http://www.gnu.org/licenses/>.  */
 
 #include "libgfortran.h"
-#include <string.h>
 
+#include <string.h>
 
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
 
+
+#if __nvptx__
+/* Map "exit" to "abort"; see PR85463 '[nvptx] "exit" in offloaded region
+   doesn't terminate process'.  */
+# undef exit
+# define exit(status) do { (void) (status); abort (); } while (0)
+#endif
+
+
+#if __nvptx__
+/* 'printf' is all we have.  */
+# undef estr_vprintf
+# define estr_vprintf vprintf
+#else
+# error TODO
+#endif
+
+
+/* runtime/environ.c */
+
+options_t options;
+
+
+/* runtime/main.c */
+
 /* Stupid function to be sure the constructor is always linked in, even
    in the case of static linking.  See PR libfortran/22298 for details.  */
 void
@@ -38,11 +63,126 @@ stupid_function_name_for_static_linking (void)
   return;
 }
 
-options_t options;
 
 static int argc_save;
 static char **argv_save;
 
+
+/* Set the saved values of the command line arguments.  */
+
+void
+set_args (int argc, char **argv)
+{
+  argc_save = argc;
+  argv_save = argv;
+}
+iexport(set_args);
+
+
+/* Retrieve the saved values of the command line arguments.  */
+
+void
+get_args (int *argc, char ***argv)
+{
+  *argc = argc_save;
+  *argv = argv_save;
+}
+
+
+/* runtime/error.c */
+
+/* Write a null-terminated C string to standard error. This function
+   is async-signal-safe.  */
+
+ssize_t
+estr_write (const char *str)
+{
+  return write (STDERR_FILENO, str, strlen (str));
+}
+
+
+/* printf() like function for for printing to stderr.  Uses a stack
+   allocated buffer and doesn't lock stderr, so it should be safe to
+   use from within a signal handler.  */
+
+int
+st_printf (const char * format, ...)
+{
+  int written;
+  va_list ap;
+  va_start (ap, format);
+  written = estr_vprintf (format, ap);
+  va_end (ap);
+  return written;
+}
+
+
+/* sys_abort()-- Terminate the program showing backtrace and dumping
+   core.  */
+
+void
+sys_abort (void)
+{
+  /* If backtracing is enabled, print backtrace and disable signal
+     handler for ABRT.  */
+  if (options.backtrace == 1
+      || (options.backtrace == -1 && compile_options.backtrace == 1))
+    {
+      estr_write ("\nProgram aborted.\n");
+    }
+
+  abort();
+}
+
+
+/* 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.\n");
+    }
+  exit (status);
+}
+
+
+/* show_locus()-- Print a line number and filename describing where
+ * something went wrong */
+
+void
+show_locus (st_parameter_common *cmp)
+{
+  char *filename;
+
+  if (!options.locus || cmp == NULL || cmp->filename == NULL)
+    return;
+  
+  if (cmp->unit > 0)
+    {
+      filename = /* TODO filename_from_unit (cmp->unit) */ NULL;
+
+      if (filename != NULL)
+       {
+         st_printf ("At line %d of file %s (unit = %d, file = '%s')\n",
+                  (int) cmp->line, cmp->filename, (int) cmp->unit, filename);
+         free (filename);
+       }
+      else
+       {
+         st_printf ("At line %d of file %s (unit = %d)\n",
+                  (int) cmp->line, cmp->filename, (int) cmp->unit);
+       }
+      return;
+    }
+
+  st_printf ("At line %d of file %s\n", (int) cmp->line, cmp->filename);
+}
+
+
 /* recursion_check()-- It's possible for additional errors to occur
  * during fatal error processing.  We detect this condition here and
  * exit with code 4 immediately. */
@@ -70,9 +210,10 @@ void
 os_error (const char *message)
 {
   recursion_check ();
-  printf ("Operating system error: ");
-  printf ("%s\n", message);
-  exit (1);
+  estr_write ("Operating system error: ");
+  estr_write (message);
+  estr_write ("\n");
+  exit_error (1);
 }
 iexport(os_error);
 
@@ -86,12 +227,12 @@ runtime_error (const char *message, ...)
   va_list ap;
 
   recursion_check ();
-  printf ("Fortran runtime error: ");
+  estr_write ("Fortran runtime error: ");
   va_start (ap, message);
-  vprintf (message, ap);
+  estr_vprintf (message, ap);
   va_end (ap);
-  printf ("\n");
-  exit (2);
+  estr_write ("\n");
+  exit_error (2);
 }
 iexport(runtime_error);
 
@@ -104,13 +245,13 @@ runtime_error_at (const char *where, const char *message, ...)
   va_list ap;
 
   recursion_check ();
-  printf ("%s", where);
-  printf ("\nFortran runtime error: ");
+  estr_write (where);
+  estr_write ("\nFortran runtime error: ");
   va_start (ap, message);
-  vprintf (message, ap);
+  estr_vprintf (message, ap);
   va_end (ap);
-  printf ("\n");
-  exit (2);
+  estr_write ("\n");
+  exit_error (2);
 }
 iexport(runtime_error_at);
 
@@ -120,12 +261,12 @@ runtime_warning_at (const char *where, const char *message, ...)
 {
   va_list ap;
 
-  printf ("%s", where);
-  printf ("\nFortran runtime warning: ");
+  estr_write (where);
+  estr_write ("\nFortran runtime warning: ");
   va_start (ap, message);
-  vprintf (message, ap);
+  estr_vprintf (message, ap);
   va_end (ap);
-  printf ("\n");
+  estr_write ("\n");
 }
 iexport(runtime_warning_at);
 
@@ -137,9 +278,10 @@ void
 internal_error (st_parameter_common *cmp, const char *message)
 {
   recursion_check ();
-  printf ("Internal Error: ");
-  printf ("%s", message);
-  printf ("\n");
+  show_locus (cmp);
+  estr_write ("Internal Error: ");
+  estr_write (message);
+  estr_write ("\n");
 
   /* This function call is here to get the main.o object file included
      when linking statically. This works because error.o is supposed to
@@ -147,45 +289,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);
-}
-
-
-/* Set the saved values of the command line arguments.  */
-
-void
-set_args (int argc, char **argv)
-{
-  argc_save = argc;
-  argv_save = argv;
-}
-iexport(set_args);
-
-
-/* Retrieve the saved values of the command line arguments.  */
-
-void
-get_args (int *argc, char ***argv)
-{
-  *argc = argc_save;
-  *argv = argv_save;
-}
-
-/* sys_abort()-- Terminate the program showing backtrace and dumping
-   core.  */
-
-void
-sys_abort (void)
-{
-  /* If backtracing is enabled, print backtrace and disable signal
-     handler for ABRT.  */
-  if (options.backtrace == 1
-      || (options.backtrace == -1 && compile_options.backtrace == 1))
-    {
-      printf ("\nProgram aborted.\n");
-    }
-
-  abort();
+  exit_error (3);
 }
 
 
@@ -193,18 +297,7 @@ sys_abort (void)
 
 #undef report_exception
 #define report_exception() do {} while (0)
-#undef st_printf
-#define st_printf printf
-#undef estr_write
-#define estr_write(X) write(STDERR_FILENO, (X), strlen (X))
-#if __nvptx__
-/* Map "exit" to "abort"; see PR85463 '[nvptx] "exit" in offloaded region
-   doesn't terminate process'.  */
-#undef exit
-#define exit(...) do { abort (); } while (0)
-#endif
-#undef exit_error
-#define exit_error(...) do { abort (); } while (0)
+
 
 /* A numeric STOP statement.  */