aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-support/boost/boost/0002-boost-test-execution_monitor.hpp-fix-mips-soft-float.patch
blob: 569c987336f2389d5bfa39726f7bc506523faef7 (plain)
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