[flang][device] Enable Stop functions on device build (#133803)

Update `StopStatement` and `StopStatementText` to be build for the
device.
This commit is contained in:
Valentin Clement (バレンタイン クレメン)
2025-04-01 10:06:45 -07:00
committed by GitHub
parent 75242a8a1d
commit 01889de8e9
3 changed files with 55 additions and 5 deletions

View File

@@ -57,6 +57,7 @@ set(supported_sources
pseudo-unit.cpp
ragged.cpp
stat.cpp
stop.cpp
sum.cpp
support.cpp
terminator.cpp

View File

@@ -65,8 +65,33 @@ static void CloseAllExternalUnits(const char *why) {
Fortran::runtime::io::ExternalFileUnit::CloseAll(handler);
}
[[noreturn]] void RTNAME(StopStatement)(
[[noreturn]] RT_API_ATTRS void RTNAME(StopStatement)(
int code, bool isErrorStop, bool quiet) {
#if defined(RT_DEVICE_COMPILATION)
if (Fortran::runtime::executionEnvironment.noStopMessage && code == 0) {
quiet = true;
}
if (!quiet) {
if (isErrorStop) {
std::printf("Fortran ERROR STOP");
} else {
std::printf("Fortran STOP");
}
if (code != EXIT_SUCCESS) {
std::printf(": code %d\n", code);
}
std::printf('\n');
}
#if defined(__CUDACC__)
// NVCC supports __trap().
__trap();
#elif defined(__clang__)
// Clang supports __builtin_trap().
__builtin_trap();
#else
#error "unsupported compiler"
#endif
#else
CloseAllExternalUnits("STOP statement");
if (Fortran::runtime::executionEnvironment.noStopMessage && code == 0) {
quiet = true;
@@ -80,10 +105,32 @@ static void CloseAllExternalUnits(const char *why) {
DescribeIEEESignaledExceptions();
}
std::exit(code);
#endif
}
[[noreturn]] void RTNAME(StopStatementText)(
[[noreturn]] RT_API_ATTRS void RTNAME(StopStatementText)(
const char *code, std::size_t length, bool isErrorStop, bool quiet) {
#if defined(RT_DEVICE_COMPILATION)
if (!quiet) {
if (Fortran::runtime::executionEnvironment.noStopMessage && !isErrorStop) {
std::printf("%s\n", code);
} else {
std::printf(
"Fortran %s: %s\n", isErrorStop ? "ERROR STOP" : "STOP", code);
}
}
if (isErrorStop) {
#if defined(__CUDACC__)
// NVCC supports __trap().
__trap();
#elif defined(__clang__)
// Clang supports __builtin_trap().
__builtin_trap();
#else
#error "unsupported compiler"
#endif
}
#else
CloseAllExternalUnits("STOP statement");
if (!quiet) {
if (Fortran::runtime::executionEnvironment.noStopMessage && !isErrorStop) {
@@ -99,6 +146,7 @@ static void CloseAllExternalUnits(const char *why) {
} else {
std::exit(EXIT_SUCCESS);
}
#endif
}
static bool StartPause() {

View File

@@ -17,9 +17,10 @@
FORTRAN_EXTERN_C_BEGIN
// Program-initiated image stop
NORETURN void RTNAME(StopStatement)(int code DEFAULT_VALUE(EXIT_SUCCESS),
bool isErrorStop DEFAULT_VALUE(false), bool quiet DEFAULT_VALUE(false));
NORETURN void RTNAME(StopStatementText)(const char *, size_t,
NORETURN RT_API_ATTRS void RTNAME(StopStatement)(
int code DEFAULT_VALUE(EXIT_SUCCESS), bool isErrorStop DEFAULT_VALUE(false),
bool quiet DEFAULT_VALUE(false));
NORETURN RT_API_ATTRS void RTNAME(StopStatementText)(const char *, size_t,
bool isErrorStop DEFAULT_VALUE(false), bool quiet DEFAULT_VALUE(false));
void RTNAME(PauseStatement)(NO_ARGUMENTS);
void RTNAME(PauseStatementInt)(int);