1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
From 5c349a1c391c9ce171a1c80f5164fae764f27dba Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Draszik?= <adraszik@tycoint.com>
Date: Wed, 24 Aug 2016 20:58:59 +0100
Subject: [PATCH 2/4] boost/test/execution_monitor.hpp: fix mips soft float
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
gcc.compile.c++ <builddir>/boost/bin.v2/libs/test/build/gcc-4.3.1/release/threading-multi/execution_monitor.o
"mipsel-poky-linux-musl-g++" "-mel" "-mabi=32" "-msoft-float" "-march=mips32r2" "-mips16" "-minterlink-compressed" "-mtune=24kec" "-mdsp" "-Wl,-O1" "-Wl,--as-needed" "-fstack-protector-strong" "-Wl,-z,relro,-z,now" "--sysroot=<sysroot>" -ftemplate-depth-128 -O2 -pipe -g -feliminate-unused-debug-types -fdebug-prefix-map=<srcdir>=/usr/src/debug/boost/1.61.0-r0 -fdebug-prefix-map=<sysroot_host>= -fdebug-prefix-map=<sysroot>= -fstack-protector-strong -pie -fpie -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security -fvisibility-inlines-hidden -O3 -finline-functions -Wno-inline -Wall -pedantic -pthread -fPIC -Wno-variadic-macros -DBOOST_ALL_NO_LIB=1 -DBOOST_CHRONO_DYN_LINK=1 -DBOOST_SYSTEM_DYN_LINK=1 -DBOOST_SYSTEM_NO_DEPRECATED -DBOOST_TEST_DYN_LINK=1 -DBOOST_TIMER_DYN_LINK=1 -DNDEBUG -I"." -c -o "<builddir>/boost/bin.v2/libs/test/build/gcc-4.3.1/release/threading-multi/execution_monitor.o" "libs/test/src/execution_monitor.cpp"
In file included from ./boost/test/impl/execution_monitor.ipp:31:0,
from libs/test/src/execution_monitor.cpp:16:
./boost/test/execution_monitor.hpp:491:27: error: 'FE_DIVBYZERO' was not declared in this scope
BOOST_FPE_DIVBYZERO = FE_DIVBYZERO,
^~~~~~~~~~~~
./boost/test/execution_monitor.hpp:492:27: error: 'FE_INEXACT' was not declared in this scope
BOOST_FPE_INEXACT = FE_INEXACT,
^~~~~~~~~~
./boost/test/execution_monitor.hpp:493:27: error: 'FE_INVALID' was not declared in this scope
BOOST_FPE_INVALID = FE_INVALID,
^~~~~~~~~~
./boost/test/execution_monitor.hpp:494:27: error: 'FE_OVERFLOW' was not declared in this scope
BOOST_FPE_OVERFLOW = FE_OVERFLOW,
^~~~~~~~~~~
./boost/test/execution_monitor.hpp:495:27: error: 'FE_UNDERFLOW' was not declared in this scope
BOOST_FPE_UNDERFLOW = FE_UNDERFLOW,
^~~~~~~~~~~~
The reason is that some (notably FPU-less) architectures,
including mips*-nf, don't define/implement some of the
floating point constants, even though fenv.h is
available.
The key point is:
A fully standards conforming fenv.h does not have to
define any FE_* macros, and if it does define them,
then it defines macros only for the FP exceptions it
actually supports.
So correct usage requires a triple check:
1) Check BOOST_NO_FENV_H to see if the header is supported.
2) Include the header and then check FE_ALL_EXCEPT to see
if any FP exceptions are supported.
3) Before using the individual FE_* macros, you need to
check for their existence too as not all may be
supported.
https://svn.boost.org/trac/boost/ticket/11756
Other projects have similar issues, e.g. pixman, and
apply similar work-arounds:
https://lists.freedesktop.org/archives/pixman/2014-February/003172.html
Architectures are notably also allowed to define FE_ALL_EXCEPT to 0!
Keeping this in mind, and knowing that the compiler will eliminate
code that can't be executed, we can change BOOST_FPE_ALL to be 0 for
the case of compiling using Clang and/or fenv.h being unavailable
as well, which allows simplification of the #ifdef's in
execution_monitor.ipp a bit.
Signed-off-by: André Draszik <adraszik@tycoint.com>
---
Upstream-Status: Submitted https://svn.boost.org/trac/boost/ticket/11756
boost/test/execution_monitor.hpp | 26 +++++++++++++++++++++++++-
boost/test/impl/execution_monitor.ipp | 10 ++++++++--
2 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/boost/test/execution_monitor.hpp b/boost/test/execution_monitor.hpp
index 0eee497..44fe59d 100644
--- a/boost/test/execution_monitor.hpp
+++ b/boost/test/execution_monitor.hpp
@@ -486,15 +486,39 @@ enum masks {
BOOST_FPE_ALL = MCW_EM,
#elif defined(BOOST_NO_FENV_H) || defined(BOOST_CLANG) \
|| defined(__ARM_PCS)
- BOOST_FPE_ALL = 1,
+ BOOST_FPE_ALL = 0,
#else
+#if defined(FE_DIVBYZERO)
BOOST_FPE_DIVBYZERO = FE_DIVBYZERO,
+#else
+ BOOST_FPE_DIVBYZERO = 0,
+#endif
+#if defined(FE_INEXACT)
BOOST_FPE_INEXACT = FE_INEXACT,
+#else
+ BOOST_FPE_INEXACT = 0,
+#endif
+#if defined(FE_INVALID)
BOOST_FPE_INVALID = FE_INVALID,
+#else
+ BOOST_FPE_INVALID = 0,
+#endif
+#if defined(FE_OVERFLOW)
BOOST_FPE_OVERFLOW = FE_OVERFLOW,
+#else
+ BOOST_FPE_OVERFLOW = 0,
+#endif
+#if defined(FE_UNDERFLOW)
BOOST_FPE_UNDERFLOW = FE_UNDERFLOW,
+#else
+ BOOST_FPE_UNDERFLOW = 0,
+#endif
+#if defined(FE_ALL_EXCEPT)
BOOST_FPE_ALL = FE_ALL_EXCEPT,
+#else
+ BOOST_FPE_ALL = 0,
+#endif
#endif
BOOST_FPE_INV = BOOST_FPE_ALL+1
};
diff --git a/boost/test/impl/execution_monitor.ipp b/boost/test/impl/execution_monitor.ipp
index f7fc8ea..d1088b9 100644
--- a/boost/test/impl/execution_monitor.ipp
+++ b/boost/test/impl/execution_monitor.ipp
@@ -1381,7 +1381,10 @@ enable( unsigned mask )
#endif
return ~old_cw & BOOST_FPE_ALL;
-#elif defined(__GLIBC__) && defined(__USE_GNU) && !defined(BOOST_CLANG) && !defined(BOOST_NO_FENV_H)
+#elif defined(__GLIBC__) && defined(__USE_GNU)
+ if (BOOST_FPE_ALL == 0)
+ /* Not Implemented */
+ return 0;
feclearexcept(BOOST_FPE_ALL);
int res = feenableexcept( mask );
return res == -1 ? (unsigned)BOOST_FPE_INV : (unsigned)res;
@@ -1418,7 +1421,10 @@ disable( unsigned mask )
#endif
return ~old_cw & BOOST_FPE_ALL;
-#elif defined(__GLIBC__) && defined(__USE_GNU) && !defined(BOOST_CLANG) && !defined(BOOST_NO_FENV_H)
+#elif defined(__GLIBC__) && defined(__USE_GNU)
+ if (BOOST_FPE_ALL == 0)
+ /* Not Implemented */
+ return BOOST_FPE_INV;
feclearexcept(BOOST_FPE_ALL);
int res = fedisableexcept( mask );
return res == -1 ? (unsigned)BOOST_FPE_INV : (unsigned)res;
--
2.9.3
|