-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[libc][fenv] Add missing FE_* definitions for some environment. #91519
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-libc Author: None (lntue) ChangesFull diff: https://github.com/llvm/llvm-project/pull/91519.diff 1 Files Affected:
diff --git a/libc/hdr/fenv_macros.h b/libc/hdr/fenv_macros.h
index 041fca5f224b3..2ebff4caba90d 100644
--- a/libc/hdr/fenv_macros.h
+++ b/libc/hdr/fenv_macros.h
@@ -17,10 +17,34 @@
#include <fenv.h>
+// In some environment, FE_ALL_EXCEPT is set to 0 and the remaining exceptions
+// FE_* are missing.
+#if (FE_ALL_EXCEPT == 0)
+#ifndef FE_DIVBYZERO
+#define FE_DIVBYZERO 0
+#endif // FE_DIVBYZERO
+
+#ifndef FE_INEXACT
+#define FE_INEXACT 0
+#endif // FE_INEXACT
+
+#ifndef FE_INVALID
+#define FE_INVALID 0
+#endif // FE_INVALID
+
+#ifndef FE_OVERFLOW
+#define FE_OVERFLOW 0
+#endif // FE_OVERFLOW
+
+#ifndef FE_UNDERFLOW
+#define FE_UNDERFLOW 0
+#endif // FE_UNDERFLOW
+#else
// If this is not provided by the system, define it for use internally.
#ifndef __FE_DENORM
#define __FE_DENORM (1 << 6)
#endif
+#endif
#endif // LLVM_LIBC_FULL_BUILD
|
"some environment" ? Got any more details? |
@@ -17,10 +17,51 @@ | |||
|
|||
#include <fenv.h> | |||
|
|||
// In some environment, FE_ALL_EXCEPT is set to 0 and the remaining exceptions | |||
// FE_* are missing. | |||
#if (FE_ALL_EXCEPT == 0) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is not a valid preprocessor constant expression. On z/OS this caused hard error as the following:
cat t.C && clang++ -c t.C
#define FE_ALL_EXCEPT ((unsigned int) 0x000000F8)
#if (FE_ALL_EXCEPT == 0)
#ifndef FE_DIVBYZERO
#define FE_DIVBYZERO 0
#endif // FE_DIVBYZERO
#endif
t.C:3:6: error: token is not a valid binary operator in a preprocessor subexpression
3 | #if (FE_ALL_EXCEPT == 0)
| ^~~~~~~~~~~~~
t.C:1:36: note: expanded from macro 'FE_ALL_EXCEPT'
1 | #define FE_ALL_EXCEPT ((unsigned int) 0x000000F8)
| ~~~~~~~~ ^
1 error generated.
We are currently using #ifndef FE_ALL_EXCEPT
as hack.
Will you be able to provide a proper fix?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we can remove the outer #if (FE_ALL_EXCEPT == 0)
entirely, just directly check for exception macros individually and set them to 0 if not defined, WDYT ? @nickdesaulniers
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, seems like we can just remove this outer conditional.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No description provided.