From e49a57a1487a71198a5e36242e8cdc8158e79e6a 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] execution_monitor: fix soft float issues
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
Signed-off-by: André Draszik <adraszik@tycoint.com>
---
 include/boost/test/execution_monitor.hpp | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/include/boost/test/execution_monitor.hpp b/include/boost/test/execution_monitor.hpp
index 3a203d1..2396c25 100644
      
        
          
        
        
          
            | 
              a
             | 
            
              b
             | 
            
               enum masks {
               
             | 
          
        
        
          
            | 497 | 497 |     BOOST_FPE_UNDERFLOW = EM_UNDERFLOW|EM_DENORMAL, | 
          
          
            | 498 | 498 |  | 
          
          
            | 499 | 499 |     BOOST_FPE_ALL       = MCW_EM, | 
          
        
        
          
            | 500 |   | #elif defined(BOOST_NO_FENV_H) || defined(BOOST_CLANG) | 
          
          
            |   | 500 | #elif defined(BOOST_NO_FENV_H) || defined(BOOST_CLANG) \ | 
          
          
            |   | 501 |     || (FE_ALL_EXCEPT == 0) | 
          
        
        
          
            | 501 | 502 |     BOOST_FPE_ALL       = 1, | 
          
          
            | 502 | 503 | #else | 
          
        
        
          
            |   | 504 | #if defined(FE_DIVBYZERO) | 
          
        
        
          
            | 503 | 505 |     BOOST_FPE_DIVBYZERO = FE_DIVBYZERO, | 
          
        
        
          
            |   | 506 | #endif | 
          
          
            |   | 507 | #if defined(FE_INEXACT) | 
          
        
        
          
            | 504 | 508 |     BOOST_FPE_INEXACT   = FE_INEXACT, | 
          
        
        
          
            |   | 509 | #endif | 
          
          
            |   | 510 | #if defined(FE_INVALID) | 
          
        
        
          
            | 505 | 511 |     BOOST_FPE_INVALID   = FE_INVALID, | 
          
        
        
          
            |   | 512 | #endif | 
          
          
            |   | 513 | #if defined(FE_OVERFLOW) | 
          
        
        
          
            | 506 | 514 |     BOOST_FPE_OVERFLOW  = FE_OVERFLOW, | 
          
        
        
          
            |   | 515 | #endif | 
          
          
            |   | 516 | #if defined(FE_UNDERFLOW) | 
          
        
        
          
            | 507 | 517 |     BOOST_FPE_UNDERFLOW = FE_UNDERFLOW, | 
          
        
        
          
            |   | 518 | #endif | 
          
        
        
          
            | 508 | 519 |  | 
          
          
            | 509 | 520 |     BOOST_FPE_ALL       = FE_ALL_EXCEPT, | 
          
          
            | 510 | 521 | #endif |