summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSlava Zakharin <szakharin@nvidia.com>2024-04-08 08:32:03 -0700
committerGitHub <noreply@github.com>2024-04-08 08:32:03 -0700
commited1b24bf8b76871ab00f365d8dc066b3f7f76202 (patch)
tree3c5c5811e4fe20daf058eab52b3d835e8f4c12df
parent312b9297bb9284bddb36980f64661c24c876eef0 (diff)
[flang][runtime] Added simplified std::toupper implementation. (#87850)
-rw-r--r--flang/include/flang/Runtime/freestanding-tools.h19
-rw-r--r--flang/lib/Decimal/decimal-to-binary.cpp16
2 files changed, 27 insertions, 8 deletions
diff --git a/flang/include/flang/Runtime/freestanding-tools.h b/flang/include/flang/Runtime/freestanding-tools.h
index 7f8d37d87e0e..e94cb0a6c938 100644
--- a/flang/include/flang/Runtime/freestanding-tools.h
+++ b/flang/include/flang/Runtime/freestanding-tools.h
@@ -12,6 +12,7 @@
#include "flang/Common/api-attrs.h"
#include "flang/Runtime/c-or-cpp.h"
#include <algorithm>
+#include <cctype>
#include <cstring>
// The file defines a set of utilities/classes that might be
@@ -57,6 +58,11 @@
#define STD_STRCMP_UNSUPPORTED 1
#endif
+#if !defined(STD_TOUPPER_UNSUPPORTED) && \
+ (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__)
+#define STD_TOUPPER_UNSUPPORTED 1
+#endif
+
namespace Fortran::runtime {
#if STD_FILL_N_UNSUPPORTED
@@ -195,5 +201,18 @@ static inline RT_API_ATTRS int strcmp(const char *lhs, const char *rhs) {
using std::strcmp;
#endif // !STD_STRCMP_UNSUPPORTED
+#if STD_TOUPPER_UNSUPPORTED
+// Provides alternative implementation for std::toupper(), if
+// it is not supported.
+static inline RT_API_ATTRS int toupper(int ch) {
+ if (ch >= 'a' && ch <= 'z') {
+ return ch - 'a' + 'A';
+ }
+ return ch;
+}
+#else // !STD_TOUPPER_UNSUPPORTED
+using std::toupper;
+#endif // !STD_TOUPPER_UNSUPPORTED
+
} // namespace Fortran::runtime
#endif // FORTRAN_RUNTIME_FREESTANDING_TOOLS_H_
diff --git a/flang/lib/Decimal/decimal-to-binary.cpp b/flang/lib/Decimal/decimal-to-binary.cpp
index dc4aa82ac6fe..eebd0736b67a 100644
--- a/flang/lib/Decimal/decimal-to-binary.cpp
+++ b/flang/lib/Decimal/decimal-to-binary.cpp
@@ -11,9 +11,9 @@
#include "flang/Common/leading-zero-bit-count.h"
#include "flang/Decimal/binary-floating-point.h"
#include "flang/Decimal/decimal.h"
+#include "flang/Runtime/freestanding-tools.h"
#include <cinttypes>
#include <cstring>
-#include <ctype.h>
#include <utility>
namespace Fortran::decimal {
@@ -468,8 +468,8 @@ BigRadixFloatingPointNumber<PREC, LOG10RADIX>::ConvertToBinary(
++q;
}
}
- if ((!limit || limit >= q + 3) && toupper(q[0]) == 'N' &&
- toupper(q[1]) == 'A' && toupper(q[2]) == 'N') {
+ if ((!limit || limit >= q + 3) && runtime::toupper(q[0]) == 'N' &&
+ runtime::toupper(q[1]) == 'A' && runtime::toupper(q[2]) == 'N') {
// NaN
p = q + 3;
bool isQuiet{true};
@@ -493,11 +493,11 @@ BigRadixFloatingPointNumber<PREC, LOG10RADIX>::ConvertToBinary(
}
return {Real{NaN(isQuiet)}};
} else { // Inf?
- if ((!limit || limit >= q + 3) && toupper(q[0]) == 'I' &&
- toupper(q[1]) == 'N' && toupper(q[2]) == 'F') {
- if ((!limit || limit >= q + 8) && toupper(q[3]) == 'I' &&
- toupper(q[4]) == 'N' && toupper(q[5]) == 'I' &&
- toupper(q[6]) == 'T' && toupper(q[7]) == 'Y') {
+ if ((!limit || limit >= q + 3) && runtime::toupper(q[0]) == 'I' &&
+ runtime::toupper(q[1]) == 'N' && runtime::toupper(q[2]) == 'F') {
+ if ((!limit || limit >= q + 8) && runtime::toupper(q[3]) == 'I' &&
+ runtime::toupper(q[4]) == 'N' && runtime::toupper(q[5]) == 'I' &&
+ runtime::toupper(q[6]) == 'T' && runtime::toupper(q[7]) == 'Y') {
p = q + 8;
} else {
p = q + 3;