Skip to content

Conversation

@llvmbot
Copy link
Member

@llvmbot llvmbot commented Jan 31, 2025

Backport 7fa1257

Requested by: @brad0

@llvmbot llvmbot added this to the LLVM 20.X Release milestone Jan 31, 2025
@llvmbot
Copy link
Member Author

llvmbot commented Jan 31, 2025

@jeanPerier What do you think about merging this PR to the release branch?

@llvmbot llvmbot requested a review from jeanPerier January 31, 2025 12:10
@llvmbot llvmbot mentioned this pull request Jan 31, 2025
@llvmbot llvmbot added flang:runtime flang Flang issues not falling into any other category labels Jan 31, 2025
@llvmbot
Copy link
Member Author

llvmbot commented Jan 31, 2025

@llvm/pr-subscribers-flang-runtime

Author: None (llvmbot)

Changes

Backport 7fa1257

Requested by: @brad0


Full diff: https://github.com/llvm/llvm-project/pull/125213.diff

1 Files Affected:

  • (modified) flang/runtime/exceptions.cpp (+12-7)
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};

@github-actions
Copy link

⚠️ We detected that you are using a GitHub private e-mail address to contribute to the repo.
Please turn off Keep my email addresses private setting in your account.
See LLVM Discourse for more information.

Copy link
Contributor

@jeanPerier jeanPerier left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@h-vetinari
Copy link
Contributor

This will fix #125152

Reinstate a preprocessor define for a nonstandard exception.

[124978](llvm#124978 (comment))

(cherry picked from commit 7fa1257)
@tstellar tstellar merged commit d5333f2 into llvm:release/20.x Feb 1, 2025
8 of 10 checks passed
@github-actions
Copy link

github-actions bot commented Feb 1, 2025

@brad0 (or anyone else). If you would like to add a note about this fix in the release notes (completely optional). Please reply to this comment with a one or two sentence description of the fix. When you are done, please add the release:note label to this PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

flang:runtime flang Flang issues not falling into any other category

Projects

Development

Successfully merging this pull request may close these issues.

5 participants