Skip to content

Commit 3261aef

Browse files
committed
[flang] Extend runtime API for PAUSE to allow a stop code
Support integer and default character stop codes on PAUSE statements. Add length argument to STOP statement with a character stop code. Differential revision: https://reviews.llvm.org/D88692
1 parent a94d943 commit 3261aef

File tree

2 files changed

+39
-10
lines changed

2 files changed

+39
-10
lines changed

flang/runtime/stop.cpp

+36-9
Original file line numberDiff line numberDiff line change
@@ -64,26 +64,53 @@ static void CloseAllExternalUnits(const char *why) {
6464
}
6565

6666
[[noreturn]] void RTNAME(StopStatementText)(
67-
const char *code, bool isErrorStop, bool quiet) {
67+
const char *code, std::size_t length, bool isErrorStop, bool quiet) {
6868
CloseAllExternalUnits("STOP statement");
6969
if (!quiet) {
70-
std::fprintf(
71-
stderr, "Fortran %s: %s\n", isErrorStop ? "ERROR STOP" : "STOP", code);
70+
std::fprintf(stderr, "Fortran %s: %.*s\n",
71+
isErrorStop ? "ERROR STOP" : "STOP", static_cast<int>(length), code);
7272
DescribeIEEESignaledExceptions();
7373
}
7474
std::exit(EXIT_FAILURE);
7575
}
7676

77-
void RTNAME(PauseStatement)() {
77+
static bool StartPause() {
7878
if (Fortran::runtime::io::IsATerminal(0)) {
7979
Fortran::runtime::io::IoErrorHandler handler{"PAUSE statement"};
8080
Fortran::runtime::io::ExternalFileUnit::FlushAll(handler);
81+
return true;
82+
}
83+
return false;
84+
}
85+
86+
static void EndPause() {
87+
std::fflush(nullptr);
88+
if (std::fgetc(stdin) == EOF) {
89+
CloseAllExternalUnits("PAUSE statement");
90+
std::exit(EXIT_SUCCESS);
91+
}
92+
}
93+
94+
void RTNAME(PauseStatement)() {
95+
if (StartPause()) {
8196
std::fputs("Fortran PAUSE: hit RETURN to continue:", stderr);
82-
std::fflush(nullptr);
83-
if (std::fgetc(stdin) == EOF) {
84-
CloseAllExternalUnits("PAUSE statement");
85-
std::exit(EXIT_SUCCESS);
86-
}
97+
EndPause();
98+
}
99+
}
100+
101+
void RTNAME(PauseStatementInt)(int code) {
102+
if (StartPause()) {
103+
std::fprintf(stderr, "Fortran PAUSE %d: hit RETURN to continue:", code);
104+
EndPause();
105+
}
106+
}
107+
108+
void RTNAME(PauseStatementText)(const char *code, std::size_t length) {
109+
if (StartPause()) {
110+
std::fprintf(stderr,
111+
"Fortran PAUSE %.*s: hit RETURN to continue:", static_cast<int>(length),
112+
code);
113+
EndPause();
87114
}
88115
}
89116

flang/runtime/stop.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ FORTRAN_EXTERN_C_BEGIN
1818
// Program-initiated image stop
1919
NORETURN void RTNAME(StopStatement)(int code DEFAULT_VALUE(EXIT_SUCCESS),
2020
bool isErrorStop DEFAULT_VALUE(false), bool quiet DEFAULT_VALUE(false));
21-
NORETURN void RTNAME(StopStatementText)(const char *,
21+
NORETURN void RTNAME(StopStatementText)(const char *, size_t,
2222
bool isErrorStop DEFAULT_VALUE(false), bool quiet DEFAULT_VALUE(false));
2323
void RTNAME(PauseStatement)(NO_ARGUMENTS);
24+
void RTNAME(PauseStatementInt)(int);
25+
void RTNAME(PauseStatementText)(const char *, size_t);
2426
NORETURN void RTNAME(FailImageStatement)(NO_ARGUMENTS);
2527
NORETURN void RTNAME(ProgramEndStatement)(NO_ARGUMENTS);
2628

0 commit comments

Comments
 (0)