[flang-commits] [flang] 7796d81 - [flang] Skip `Fortran STOP:` before message when NO_STOP_MESSAGE is set

Jean Perier via flang-commits flang-commits at lists.llvm.org
Thu Nov 18 09:08:36 PST 2021


Author: Jean Perier
Date: 2021-11-18T18:08:06+01:00
New Revision: 7796d81ae8204289c6ea07f19e538cf287d3213f

URL: https://github.com/llvm/llvm-project/commit/7796d81ae8204289c6ea07f19e538cf287d3213f
DIFF: https://github.com/llvm/llvm-project/commit/7796d81ae8204289c6ea07f19e538cf287d3213f.diff

LOG: [flang] Skip `Fortran STOP:` before message when NO_STOP_MESSAGE is set

In 'STOP bye bye', do not print 'Fortran STOP:` before 'bye bye' when
NO_STOP_MESSAGE environment variable is set at runtime.

Also only exit with code 1 in StopStatementText if this is an ERROR STOP.
This matches other compiler behaviors.

Move STOP related unit tests in their own test file and add new tests to
cover this change.

Differential Revision: https://reviews.llvm.org/D114152

Added: 
    flang/unittests/Runtime/Stop.cpp

Modified: 
    flang/runtime/stop.cpp
    flang/unittests/Runtime/CMakeLists.txt
    flang/unittests/Runtime/RuntimeCrashTest.cpp

Removed: 
    


################################################################################
diff  --git a/flang/runtime/stop.cpp b/flang/runtime/stop.cpp
index 765c4019fa5b4..c7dbe7e4619f8 100644
--- a/flang/runtime/stop.cpp
+++ b/flang/runtime/stop.cpp
@@ -71,11 +71,19 @@ static void CloseAllExternalUnits(const char *why) {
     const char *code, std::size_t length, bool isErrorStop, bool quiet) {
   CloseAllExternalUnits("STOP statement");
   if (!quiet) {
-    std::fprintf(stderr, "Fortran %s: %.*s\n",
-        isErrorStop ? "ERROR STOP" : "STOP", static_cast<int>(length), code);
+    if (Fortran::runtime::executionEnvironment.noStopMessage && !isErrorStop) {
+      std::fprintf(stderr, "%.*s\n", static_cast<int>(length), code);
+    } else {
+      std::fprintf(stderr, "Fortran %s: %.*s\n",
+          isErrorStop ? "ERROR STOP" : "STOP", static_cast<int>(length), code);
+    }
     DescribeIEEESignaledExceptions();
   }
-  std::exit(EXIT_FAILURE);
+  if (isErrorStop) {
+    std::exit(EXIT_FAILURE);
+  } else {
+    std::exit(EXIT_SUCCESS);
+  }
 }
 
 static bool StartPause() {

diff  --git a/flang/unittests/Runtime/CMakeLists.txt b/flang/unittests/Runtime/CMakeLists.txt
index 33f1bd086ded0..1067348ec31dc 100644
--- a/flang/unittests/Runtime/CMakeLists.txt
+++ b/flang/unittests/Runtime/CMakeLists.txt
@@ -14,6 +14,7 @@ add_flang_unittest(FlangRuntimeTests
   Random.cpp
   Reduction.cpp
   RuntimeCrashTest.cpp
+  Stop.cpp
   Time.cpp
   Transformational.cpp
 )

diff  --git a/flang/unittests/Runtime/RuntimeCrashTest.cpp b/flang/unittests/Runtime/RuntimeCrashTest.cpp
index c6f43582b4c89..8dd7abae4a69c 100644
--- a/flang/unittests/Runtime/RuntimeCrashTest.cpp
+++ b/flang/unittests/Runtime/RuntimeCrashTest.cpp
@@ -13,7 +13,6 @@
 #include "CrashHandlerFixture.h"
 #include "../../runtime/terminator.h"
 #include "flang/Runtime/io-api.h"
-#include "flang/Runtime/stop.h"
 #include <gtest/gtest.h>
 
 using namespace Fortran::runtime;
@@ -156,21 +155,3 @@ TEST(TestIOCrash, OverwriteBufferIntegerTest) {
   ASSERT_DEATH(IONAME(OutputInteger64)(cookie, 0xdeadbeef),
       "Internal write overran available records");
 }
-
-TEST(TestIOCrash, StopTest) {
-  EXPECT_EXIT(RTNAME(StopStatement)(), testing::ExitedWithCode(EXIT_SUCCESS),
-      "Fortran STOP");
-}
-
-TEST(TestIOCrash, FailImageTest) {
-  EXPECT_EXIT(
-      RTNAME(FailImageStatement)(), testing::ExitedWithCode(EXIT_FAILURE), "");
-}
-
-TEST(TestIOCrash, ExitTest) {
-  EXPECT_EXIT(RTNAME(Exit)(), testing::ExitedWithCode(EXIT_SUCCESS), "");
-  EXPECT_EXIT(
-      RTNAME(Exit)(EXIT_FAILURE), testing::ExitedWithCode(EXIT_FAILURE), "");
-}
-
-TEST(TestIOCrash, AbortTest) { EXPECT_DEATH(RTNAME(Abort)(), ""); }

diff  --git a/flang/unittests/Runtime/Stop.cpp b/flang/unittests/Runtime/Stop.cpp
new file mode 100644
index 0000000000000..4160a1dcf4269
--- /dev/null
+++ b/flang/unittests/Runtime/Stop.cpp
@@ -0,0 +1,85 @@
+//===-- flang/unittests/Runtime/Stop.cpp ----------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+/// Test runtime API for STOP statement and runtime API to kill the program.
+//
+//===----------------------------------------------------------------------===//
+#include "flang/Runtime/stop.h"
+#include "CrashHandlerFixture.h"
+#include "../../runtime/environment.h"
+#include <cstdlib>
+#include <gtest/gtest.h>
+
+using namespace Fortran::runtime;
+
+struct TestProgramEnd : CrashHandlerFixture {};
+
+TEST(TestProgramEnd, StopTest) {
+  EXPECT_EXIT(RTNAME(StopStatement)(), testing::ExitedWithCode(EXIT_SUCCESS),
+      "Fortran STOP");
+}
+
+TEST(TestProgramEnd, StopTestNoStopMessage) {
+  putenv(const_cast<char *>("NO_STOP_MESSAGE=1"));
+  Fortran::runtime::executionEnvironment.Configure(0, nullptr, nullptr);
+  EXPECT_EXIT(
+      RTNAME(StopStatement)(), testing::ExitedWithCode(EXIT_SUCCESS), "");
+}
+
+TEST(TestProgramEnd, StopMessageTest) {
+  static const char *message{"bye bye"};
+  EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message),
+                  /*isErrorStop=*/false, /*quiet=*/false),
+      testing::ExitedWithCode(EXIT_SUCCESS), "Fortran STOP: bye bye");
+
+  EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message),
+                  /*isErrorStop=*/false, /*quiet=*/true),
+      testing::ExitedWithCode(EXIT_SUCCESS), "");
+
+  EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message),
+                  /*isErrorStop=*/true, /*quiet=*/false),
+      testing::ExitedWithCode(EXIT_FAILURE), "Fortran ERROR STOP: bye bye");
+
+  EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message),
+                  /*isErrorStop=*/true, /*quiet=*/true),
+      testing::ExitedWithCode(EXIT_FAILURE), "");
+}
+
+TEST(TestProgramEnd, NoStopMessageTest) {
+  putenv(const_cast<char *>("NO_STOP_MESSAGE=1"));
+  Fortran::runtime::executionEnvironment.Configure(0, nullptr, nullptr);
+  static const char *message{"bye bye"};
+  EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message),
+                  /*isErrorStop=*/false, /*quiet=*/false),
+      testing::ExitedWithCode(EXIT_SUCCESS), "bye bye");
+
+  EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message),
+                  /*isErrorStop=*/false, /*quiet=*/true),
+      testing::ExitedWithCode(EXIT_SUCCESS), "");
+
+  EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message),
+                  /*isErrorStop=*/true, /*quiet=*/false),
+      testing::ExitedWithCode(EXIT_FAILURE), "Fortran ERROR STOP: bye bye");
+
+  EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message),
+                  /*isErrorStop=*/true, /*quiet=*/true),
+      testing::ExitedWithCode(EXIT_FAILURE), "");
+}
+
+TEST(TestProgramEnd, FailImageTest) {
+  EXPECT_EXIT(
+      RTNAME(FailImageStatement)(), testing::ExitedWithCode(EXIT_FAILURE), "");
+}
+
+TEST(TestProgramEnd, ExitTest) {
+  EXPECT_EXIT(RTNAME(Exit)(), testing::ExitedWithCode(EXIT_SUCCESS), "");
+  EXPECT_EXIT(
+      RTNAME(Exit)(EXIT_FAILURE), testing::ExitedWithCode(EXIT_FAILURE), "");
+}
+
+TEST(TestProgramEnd, AbortTest) { EXPECT_DEATH(RTNAME(Abort)(), ""); }


        


More information about the flang-commits mailing list