@@ -65,8 +65,33 @@ static void CloseAllExternalUnits(const char *why) {
65
65
Fortran::runtime::io::ExternalFileUnit::CloseAll (handler);
66
66
}
67
67
68
- [[noreturn]] void RTNAME (StopStatement)(
68
+ [[noreturn]] RT_API_ATTRS void RTNAME (StopStatement)(
69
69
int code, bool isErrorStop, bool quiet) {
70
+ #if defined(RT_DEVICE_COMPILATION)
71
+ if (Fortran::runtime::executionEnvironment.noStopMessage && code == 0 ) {
72
+ quiet = true ;
73
+ }
74
+ if (!quiet) {
75
+ if (isErrorStop) {
76
+ std::printf (" Fortran ERROR STOP" );
77
+ } else {
78
+ std::printf (" Fortran STOP" );
79
+ }
80
+ if (code != EXIT_SUCCESS) {
81
+ std::printf (" : code %d\n " , code);
82
+ }
83
+ std::printf (' \n ' );
84
+ }
85
+ #if defined(__CUDACC__)
86
+ // NVCC supports __trap().
87
+ __trap ();
88
+ #elif defined(__clang__)
89
+ // Clang supports __builtin_trap().
90
+ __builtin_trap ();
91
+ #else
92
+ #error "unsupported compiler"
93
+ #endif
94
+ #else
70
95
CloseAllExternalUnits (" STOP statement" );
71
96
if (Fortran::runtime::executionEnvironment.noStopMessage && code == 0 ) {
72
97
quiet = true ;
@@ -80,10 +105,32 @@ static void CloseAllExternalUnits(const char *why) {
80
105
DescribeIEEESignaledExceptions ();
81
106
}
82
107
std::exit (code);
108
+ #endif
83
109
}
84
110
85
- [[noreturn]] void RTNAME (StopStatementText)(
111
+ [[noreturn]] RT_API_ATTRS void RTNAME (StopStatementText)(
86
112
const char *code, std::size_t length, bool isErrorStop, bool quiet) {
113
+ #if defined(RT_DEVICE_COMPILATION)
114
+ if (!quiet) {
115
+ if (Fortran::runtime::executionEnvironment.noStopMessage && !isErrorStop) {
116
+ std::printf (" %s\n " , code);
117
+ } else {
118
+ std::printf (
119
+ " Fortran %s: %s\n " , isErrorStop ? " ERROR STOP" : " STOP" , code);
120
+ }
121
+ }
122
+ if (isErrorStop) {
123
+ #if defined(__CUDACC__)
124
+ // NVCC supports __trap().
125
+ __trap ();
126
+ #elif defined(__clang__)
127
+ // Clang supports __builtin_trap().
128
+ __builtin_trap ();
129
+ #else
130
+ #error "unsupported compiler"
131
+ #endif
132
+ }
133
+ #else
87
134
CloseAllExternalUnits (" STOP statement" );
88
135
if (!quiet) {
89
136
if (Fortran::runtime::executionEnvironment.noStopMessage && !isErrorStop) {
@@ -99,6 +146,7 @@ static void CloseAllExternalUnits(const char *why) {
99
146
} else {
100
147
std::exit (EXIT_SUCCESS);
101
148
}
149
+ #endif
102
150
}
103
151
104
152
static bool StartPause () {
0 commit comments