]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - libgfortran/runtime/stop.c
Use vectored writes when reporting errors and warnings.
[thirdparty/gcc.git] / libgfortran / runtime / stop.c
index 1e6dd8c28d0acabc3bc2597e40e2dfac12c3235c..4833e7b414aa5cc3eb28d01ea0073601f1d1a3a2 100644 (file)
@@ -29,6 +29,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #include <unistd.h>
 #endif
 
+#include <string.h>
 
 /* Fortran 2008 demands: If any exception (14) is signaling on that image, the
    processor shall issue a warning indicating which exceptions are signaling;
@@ -40,7 +41,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 static void
 report_exception (void)
 {
-  int set_excepts;
+  struct iovec iov[8];
+  int set_excepts, iovcnt = 1;
 
   if (!compile_options.fpe_summary)
     return;
@@ -49,33 +51,62 @@ report_exception (void)
   if ((set_excepts & compile_options.fpe_summary) == 0)
     return;
 
-  estr_write ("Note: The following floating-point exceptions are signalling:");
+  iov[0].iov_base = (char*) "Note: The following floating-point exceptions are signalling:";
+  iov[0].iov_len = strlen (iov[0].iov_base);
 
   if ((compile_options.fpe_summary & GFC_FPE_INVALID)
       && (set_excepts & GFC_FPE_INVALID))
-    estr_write (" IEEE_INVALID_FLAG");
+    {
+      iov[iovcnt].iov_base = (char*) " IEEE_INVALID_FLAG";
+      iov[iovcnt].iov_len = strlen (iov[iovcnt].iov_base);
+      iovcnt++;
+    }
 
   if ((compile_options.fpe_summary & GFC_FPE_ZERO)
       && (set_excepts & GFC_FPE_ZERO))
-    estr_write (" IEEE_DIVIDE_BY_ZERO");
+    {
+      iov[iovcnt].iov_base = (char*) " IEEE_DIVIDE_BY_ZERO";
+      iov[iovcnt].iov_len = strlen (iov[iovcnt].iov_base);
+      iovcnt++;
+    }
 
   if ((compile_options.fpe_summary & GFC_FPE_OVERFLOW)
       && (set_excepts & GFC_FPE_OVERFLOW))
-    estr_write (" IEEE_OVERFLOW_FLAG");
+    {
+      iov[iovcnt].iov_base = (char*) " IEEE_OVERFLOW_FLAG";
+      iov[iovcnt].iov_len = strlen (iov[iovcnt].iov_base);
+      iovcnt++;
+    }
 
   if ((compile_options.fpe_summary & GFC_FPE_UNDERFLOW)
       && (set_excepts & GFC_FPE_UNDERFLOW))
-    estr_write (" IEEE_UNDERFLOW_FLAG");
+    {
+      iov[iovcnt].iov_base = (char*) " IEEE_UNDERFLOW_FLAG";
+      iov[iovcnt].iov_len = strlen (iov[iovcnt].iov_base);
+      iovcnt++;
+    }
 
   if ((compile_options.fpe_summary & GFC_FPE_DENORMAL)
       && (set_excepts & GFC_FPE_DENORMAL))
-    estr_write (" IEEE_DENORMAL");
+    {
+      iov[iovcnt].iov_base = (char*) " IEEE_DENORMAL";
+      iov[iovcnt].iov_len = strlen (iov[iovcnt].iov_base);
+      iovcnt++;
+    }
 
   if ((compile_options.fpe_summary & GFC_FPE_INEXACT)
       && (set_excepts & GFC_FPE_INEXACT))
-    estr_write (" IEEE_INEXACT_FLAG");
+    {
+      iov[iovcnt].iov_base = (char*) " IEEE_INEXACT_FLAG";
+      iov[iovcnt].iov_len = strlen (iov[iovcnt].iov_base);
+      iovcnt++;
+    }
+
+  iov[iovcnt].iov_base = (char*) "\n";
+  iov[iovcnt].iov_len = 1;
+  iovcnt++;
 
-  estr_write ("\n");
+  estr_writev (iov, iovcnt);
 }
 
 
@@ -106,9 +137,14 @@ stop_string (const char *string, size_t len, bool quiet)
       report_exception ();
       if (string)
        {
-         estr_write ("STOP ");
-         (void) write (STDERR_FILENO, string, len);
-         estr_write ("\n");
+         struct iovec iov[3];
+         iov[0].iov_base = (char*) "STOP ";
+         iov[0].iov_len = strlen (iov[0].iov_base);
+         iov[1].iov_base = (char*) string;
+         iov[1].iov_len = len;
+         iov[2].iov_base = (char*) "\n";
+         iov[2].iov_len = 1;
+         estr_writev (iov, 3);
        }
     }
   exit (0);
@@ -128,10 +164,15 @@ error_stop_string (const char *string, size_t len, bool quiet)
 {
   if (!quiet)
     {
+      struct iovec iov[3];
       report_exception ();
-      estr_write ("ERROR STOP ");
-      (void) write (STDERR_FILENO, string, len);
-      estr_write ("\n");
+      iov[0].iov_base = (char*) "ERROR STOP ";
+      iov[0].iov_len = strlen (iov[0].iov_base);
+      iov[1].iov_base = (char*) string;
+      iov[1].iov_len = len;
+      iov[2].iov_base = (char*) "\n";
+      iov[2].iov_len = 1;
+      estr_writev (iov, 3);
     }
   exit_error (1);
 }