Sevan Janiyan wrote:
> > The first step is to take note of the values of the gl_cv_func_fe*
> > variables in config.cache. (Pass the option '-C' to configure.)
> 
> gl_cv_func_feenableexcept_in_libm=${gl_cv_func_feenableexcept_in_libm=no}
> gl_cv_func_feenableexcept_no_libm=${gl_cv_func_feenableexcept_no_libm=no}
> gl_cv_func_feraiseexcept_no_libm=${gl_cv_func_feraiseexcept_no_libm=yes}
> gl_cv_func_fesettrapenable_in_libm=${gl_cv_func_fesettrapenable_in_libm=no}
> gl_cv_func_fesettrapenable_no_libm=${gl_cv_func_fesettrapenable_no_libm=no}

OK; this means that this platform has the ISO C 99 facilities for keeping
track of floating-point exceptions, but does not have feenableexcept or
equivalent.

> > The second step is to retry the configuration in a way that ignores
> > the relevant functions from libc, and uses the gnulib code instead.
> > It goes like this (after "make distclean", of course):
> > 
> > gl_cv_func_feenableexcept_in_libm=no \
> > gl_cv_func_feenableexcept_no_libm=no \
> > gl_cv_func_fesetenv_in_libm=no \
> > gl_cv_func_fesetenv_no_libm=no \
> > gl_cv_func_fesetround_in_libm=no \
> > gl_cv_func_fesetround_no_libm=no \
> > gl_cv_func_feraiseexcept_in_libm=no \
> > gl_cv_func_feraiseexcept_no_libm=no \
> > gl_cv_func_fesetexcept_in_libm=no \
> > gl_cv_func_fesetexcept_no_libm=no \
> > gl_cv_func_fesetexceptflag_in_libm=no \
> > gl_cv_func_fesetexceptflag_no_libm=no \
> > gl_cv_func_fetestexceptflag_in_libm=no \
> > gl_cv_func_fetestexceptflag_no_libm=no \
> > ./configure
> > 
> > What's the result when you do this?
> 
> test-fenv-except-tracking-1 & test-fenv-except-trapping-1 pass.
> 
> FAIL: test-fenv-except-tracking-2.sh
> ====================================
> 
> Failed: ./test-fenv-except-tracking-2 f
> FAIL test-fenv-except-tracking-2.sh (exit status: 1)
> 
> FAIL: test-fenv-except-tracking-3.sh
> ====================================
> 
> Failed: ./test-fenv-except-tracking-3 FE_INVALID
> FAIL test-fenv-except-tracking-3.sh (exit status: 1)
> 
> FAIL: test-fenv-except-trapping-2.sh
> ====================================
> 
> Failed (got no trap): ./test-fenv-except-trapping-2 1 p f
> Failed (got no trap): ./test-fenv-except-trapping-2 1 p d
> Failed (got no trap): ./test-fenv-except-trapping-2 1 p l
> Failed (got no trap): ./test-fenv-except-trapping-2 1 q f
> Failed (got no trap): ./test-fenv-except-trapping-2 1 q d
> Failed (got no trap): ./test-fenv-except-trapping-2 1 q l
> Failed (got no trap): ./test-fenv-except-trapping-2 1 r f
> Failed (got no trap): ./test-fenv-except-trapping-2 1 r d
> Failed (got no trap): ./test-fenv-except-trapping-2 1 r l
> Failed (got no trap): ./test-fenv-except-trapping-2 2 p f
> Failed (got no trap): ./test-fenv-except-trapping-2 2 p d
> Failed (got no trap): ./test-fenv-except-trapping-2 2 p l
> Failed (got no trap): ./test-fenv-except-trapping-2 2 q f
> Failed (got no trap): ./test-fenv-except-trapping-2 2 q d
> Failed (got no trap): ./test-fenv-except-trapping-2 2 q l
> Failed (got no trap): ./test-fenv-except-trapping-2 2 r f
> Failed (got no trap): ./test-fenv-except-trapping-2 2 r d
> Failed (got no trap): ./test-fenv-except-trapping-2 2 r l
> Failed (got no trap): ./test-fenv-except-trapping-2 3 p f
> Failed (got no trap): ./test-fenv-except-trapping-2 3 p d
> Failed (got no trap): ./test-fenv-except-trapping-2 3 p l
> Failed (got no trap): ./test-fenv-except-trapping-2 3 q f
> Failed (got no trap): ./test-fenv-except-trapping-2 3 q d
> Failed (got no trap): ./test-fenv-except-trapping-2 3 q l
> Failed (got no trap): ./test-fenv-except-trapping-2 3 r f
> Failed (got no trap): ./test-fenv-except-trapping-2 3 r d
> Failed (got no trap): ./test-fenv-except-trapping-2 3 r l
> Failed (got no trap): ./test-fenv-except-trapping-2 4 p f
> Failed (got no trap): ./test-fenv-except-trapping-2 4 p d
> Failed (got no trap): ./test-fenv-except-trapping-2 4 p l
> Failed (got no trap): ./test-fenv-except-trapping-2 4 q f
> Failed (got no trap): ./test-fenv-except-trapping-2 4 q d
> Failed (got no trap): ./test-fenv-except-trapping-2 4 q l
> Failed (got no trap): ./test-fenv-except-trapping-2 4 r f
> Failed (got no trap): ./test-fenv-except-trapping-2 4 r d
> Failed (got no trap): ./test-fenv-except-trapping-2 4 r l
> Failed (got no trap): ./test-fenv-except-trapping-2 5 p f
> Failed (got no trap): ./test-fenv-except-trapping-2 5 p d
> Failed (got no trap): ./test-fenv-except-trapping-2 5 p l
> Failed (got no trap): ./test-fenv-except-trapping-2 5 q f
> Failed (got no trap): ./test-fenv-except-trapping-2 5 q d
> Failed (got no trap): ./test-fenv-except-trapping-2 5 q l
> Failed (got no trap): ./test-fenv-except-trapping-2 5 r f
> Failed (got no trap): ./test-fenv-except-trapping-2 5 r d
> Failed (got no trap): ./test-fenv-except-trapping-2 5 r l
> Failed (got no trap): ./test-fenv-except-trapping-2 6 p f
> Failed (got no trap): ./test-fenv-except-trapping-2 6 p d
> Failed (got no trap): ./test-fenv-except-trapping-2 6 p l
> Failed (got no trap): ./test-fenv-except-trapping-2 6 q f
> Failed (got no trap): ./test-fenv-except-trapping-2 6 q d
> Failed (got no trap): ./test-fenv-except-trapping-2 6 q l
> Failed (got no trap): ./test-fenv-except-trapping-2 6 r f
> Failed (got no trap): ./test-fenv-except-trapping-2 6 r d
> Failed (got no trap): ./test-fenv-except-trapping-2 6 r l
> Failed (got no trap): ./test-fenv-except-trapping-2 7 p f
> Failed (got no trap): ./test-fenv-except-trapping-2 7 p d
> Failed (got no trap): ./test-fenv-except-trapping-2 7 p l
> Failed (got no trap): ./test-fenv-except-trapping-2 7 q f
> Failed (got no trap): ./test-fenv-except-trapping-2 7 q d
> Failed (got no trap): ./test-fenv-except-trapping-2 7 q l
> Failed (got no trap): ./test-fenv-except-trapping-2 7 r f
> Failed (got no trap): ./test-fenv-except-trapping-2 7 r d
> Failed (got no trap): ./test-fenv-except-trapping-2 7 r l
> Failed (got no trap): ./test-fenv-except-trapping-2 8 p f
> Failed (got no trap): ./test-fenv-except-trapping-2 8 p d
> Failed (got no trap): ./test-fenv-except-trapping-2 8 p l
> Failed (got no trap): ./test-fenv-except-trapping-2 8 q f
> Failed (got no trap): ./test-fenv-except-trapping-2 8 q d
> Failed (got no trap): ./test-fenv-except-trapping-2 8 q l
> Failed (got no trap): ./test-fenv-except-trapping-2 8 r f
> Failed (got no trap): ./test-fenv-except-trapping-2 8 r d
> Failed (got no trap): ./test-fenv-except-trapping-2 8 r l
> Failed (got no trap): ./test-fenv-except-trapping-2 9 p f
> Failed (got no trap): ./test-fenv-except-trapping-2 9 p d
> Failed (got no trap): ./test-fenv-except-trapping-2 9 p l
> Failed (got no trap): ./test-fenv-except-trapping-2 9 q f
> Failed (got no trap): ./test-fenv-except-trapping-2 9 q d
> Failed (got no trap): ./test-fenv-except-trapping-2 9 q l
> Failed (got no trap): ./test-fenv-except-trapping-2 9 r f
> Failed (got no trap): ./test-fenv-except-trapping-2 9 r d
> Failed (got no trap): ./test-fenv-except-trapping-2 9 r l
> FAIL test-fenv-except-trapping-2.sh (exit status: 1)

That's the same as without these gl_cv_* overrides. This means,
the system function feraiseexcept is most likely working right,
and the problem is that the Gnulib code does not know how to
enforce traps on floating-point exceptions.

I would guess that the problem is that on PowerPC, enabling these traps
requires OS support (in order to set the bits FE0 and FE1 of the MSR
(= Machine State Register), which can only be done through privileged
instructions), and Mac OS X 10.4 does not provide that support, or
we don't know how to use it.

I see this kernel code in the xnu package:

                        if (ssp->save_srr1 & MASK(SRR1_PRG_FE)) {
                                fpu_save(thread->machine.curctx);
                                UPDATE_PPC_EXCEPTION_STATE;
                                exception = EXC_ARITHMETIC;
                                code = EXC_ARITHMETIC;
                        
                                mp_disable_preemption();
                                subcode = ssp->save_fpscr;
                                mp_enable_preemption();

Can you try to set up a Mach exception handler to catch a floating-point
exception?

Mach exception handlers are a bit special to set up; you find an example
in GNU libsigsegv
https://git.savannah.gnu.org/gitweb/?p=libsigsegv.git;a=blob;f=src/handler-macos.c;h=1929cb366021a05c12447fbc70c7904e86382164;hb=HEAD

Bruno




Reply via email to