It appears that the VFP unit on the Raspberry Pi does not generate FPU exceptions. Therefore, no SIGFPE is generated and cannot be handled by ECL. This causes numerous 'make check' test failures. I am working on a patch. I am not very familiar with the ECL C environment so I am sure the patch will need some help. The approach is as follows:
1. There is no value in registering a SIGFPE handler. For the ARM I will just not register the handler at all. 2. I will created an arch/fpe_arm.c file. I will re-define the macro to read the FPSCR register and check for exception bits being set. If any are I will call a C function that will disambiguate which exception to map to a condition and signal the condition. 3. I was planning on creating a static inline function for this purpose right inside fpe_arm.c but if it should go somewhere else I'd be happy to put it there. The inline thing is just an excuse for sticking in the fpe_arm.c file. In reality it's probably better to make a C function call to do the heavy lifting rather than making each FPE check pay for it.
Dave
Hey Dave,
Dave Richards writes:
It appears that the VFP unit on the Raspberry Pi does not generate FPU exceptions. Therefore, no SIGFPE is generated and cannot be handled by ECL. This causes numerous 'make check' test failures. I am working on a patch. I am not very familiar with the ECL C environment so I am sure the patch will need some help. The approach is as follows:
- There is no value in registering a SIGFPE handler. For the ARM I will
just not register the handler at all.
If you are interested in how handler works please take a look at file src/c/unixint.d (most notably install_fpe_handler). That said the option you look for is ECL_OPT_TRAP_SIGFPE (src/c/main.d). That said there is no harm with leaving it at its default value, if sigfpe is not signaled then the handler will simply not be called.
- I will created an arch/fpe_arm.c file. I will re-define the macro to
read the FPSCR register and check for exception bits being set. If any are I will call a C function that will disambiguate which exception to map to a condition and signal the condition.
please see files: - c/arch/fpe_*.c for software ecl_detect_fpe() definitions - c/number.d for a definition of DO_DETECT_FPE()
calls to floating point operations are always detected in the float number constructors (if software fpe handling is used). They are signalled with ecl_deliver_fpe.
- I was planning on creating a static inline function for this purpose
right inside fpe_arm.c but if it should go somewhere else I'd be happy to put it there. The inline thing is just an excuse for sticking in the fpe_arm.c file. In reality it's probably better to make a C function call to do the heavy lifting rather than making each FPE check pay for it.
If you need a file then fpe_/arch/.c is the right place to put it. Preferably this file is self-contained (static function definition).
Dave
Best regards, Daniel
-- Daniel Kochmański ;; aka jackdaniel | Przemyśl, Poland TurtleWare - Daniel Kochmański | www.turtleware.eu
"Be the change that you wish to see in the world." - Mahatma Gandhi