[flang-commits] [flang] [flang] Build fix (PR #125087)
via flang-commits
flang-commits at lists.llvm.org
Thu Jan 30 08:24:02 PST 2025
https://github.com/vdonaldson created https://github.com/llvm/llvm-project/pull/125087
Reinstate a preprocessor define for a nonstandard exception.
[124978](https://github.com/llvm/llvm-project/issues/124978#event-16113621403)
>From 2658a67ebb8d6df36e50fec60a2ce29292dc75c9 Mon Sep 17 00:00:00 2001
From: V Donaldson <vdonaldson at nvidia.com>
Date: Thu, 30 Jan 2025 08:05:31 -0800
Subject: [PATCH] [flang] Build fix - reinstate a preprocessor define for a
nonstandard exception
---
flang/runtime/exceptions.cpp | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/flang/runtime/exceptions.cpp b/flang/runtime/exceptions.cpp
index b41c7cf438f569..257c71b51edb3d 100644
--- a/flang/runtime/exceptions.cpp
+++ b/flang/runtime/exceptions.cpp
@@ -13,11 +13,14 @@
#include <cfenv>
#if defined(__aarch64__) && !defined(_WIN32)
#include <fpu_control.h>
-#elif defined(__x86_64__)
+#elif defined(__x86_64__) && !defined(_WIN32)
#include <xmmintrin.h>
#endif
-// fenv.h may not define exception macros.
+// File fenv.h usually, but not always, defines standard exceptions as both
+// enumerator values and preprocessor #defines. Some x86 environments also
+// define a nonstandard __FE_DENORM enumerator, but without a corresponding
+// #define, which makes it more difficult to determine if it is present or not.
#ifndef FE_INVALID
#define FE_INVALID 0
#endif
@@ -33,6 +36,12 @@
#ifndef FE_INEXACT
#define FE_INEXACT 0
#endif
+#if FE_INVALID == 1 && FE_DIVBYZERO == 4 && FE_OVERFLOW == 8 && \
+ FE_UNDERFLOW == 16 && FE_INEXACT == 32
+#define __FE_DENORM 2
+#else
+#define __FE_DENORM 0
+#endif
namespace Fortran::runtime {
@@ -44,11 +53,7 @@ uint32_t RTNAME(MapException)(uint32_t excepts) {
Terminator terminator{__FILE__, __LINE__};
static constexpr uint32_t v{FE_INVALID};
-#if __x86_64__
- static constexpr uint32_t s{__FE_DENORM}; // nonstandard, not a #define
-#else
- static constexpr uint32_t s{0};
-#endif
+ static constexpr uint32_t s{__FE_DENORM};
static constexpr uint32_t z{FE_DIVBYZERO};
static constexpr uint32_t o{FE_OVERFLOW};
static constexpr uint32_t u{FE_UNDERFLOW};
More information about the flang-commits
mailing list