[flang][device] Enable Stop functions on device build (#133803)
Update `StopStatement` and `StopStatementText` to be build for the device.
This commit is contained in:
committed by
GitHub
parent
75242a8a1d
commit
01889de8e9
@@ -57,6 +57,7 @@ set(supported_sources
|
||||
pseudo-unit.cpp
|
||||
ragged.cpp
|
||||
stat.cpp
|
||||
stop.cpp
|
||||
sum.cpp
|
||||
support.cpp
|
||||
terminator.cpp
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user