• Re: GSL function misbehaving on mipsel, possible compiler bug?

    From YunQiang Su@21:1/5 to All on Thu Feb 17 06:20:01 2022
    Ed . <ej_zg@hotmail.com> 于2022年2月16日周三 05:12写道:

    Hi,



    I’m a brand-new Debian-perl packaging person, trying to figure out why PDL (Perl Data Language)’s binding for gsl_linalg_complex_LU_det (only) is behaving weirdly, on mipsel. sebastic (Cc:ed just for his awareness) suggested you when I asked who
    might know about GCC on MIPS.


    Thank you for your feedback. I will try to find the real problem.

    and let's CC debian-mips



    Here is what is seen when having done “apt source pdl” in a chroot on eller, then these commands:

    vi Libtmp/GSL/LINALG/Makefile.PL # remove the paragraph disabling the build on MIPS

    perl Makefile.PL

    make test # it fails with a SIGBUS



    gdb (cd Libtmp/GSL/LINALG; make && gdb perl -ex "run -Mblib t/gsl_linalg.t") shows:

    0x77454b7c in gsl_linalg_complex_LU_det (LU=0xffffffff, signum=0) at luc.c:501



    This is my attempt at a short repro case, which in fact works fine:

    #include <gsl/gsl_linalg.h>

    #include <gsl/gsl_complex_math.h>



    #define MATRIX_SETUP(m, rows, cols, lda, datap) \

    m.size1 = rows; \

    m.size2 = cols; \

    m.tda = lda; \

    m.data = (double *)datap; \

    m.owner = 0;



    int main(char **argv, int argc) {

    gsl_matrix_complex m;



    gsl_complex cmplx_data[] = {

    gsl_complex_rect(0.51, 1e-09),

    gsl_complex_rect(0.13, 1e-09),

    gsl_complex_rect(0.19, 1e-09),

    gsl_complex_rect(0.85, 1e-09),

    gsl_complex_rect(0.352941176470588, 1.26874279123414e-09),

    gsl_complex_rect(0.554117647058823, 4.82122260668974e-10),

    gsl_complex_rect(0.502941176470588, 4.05997693194925e-10),

    gsl_complex_rect(0.66, -4.31372549019608e-10),

    gsl_complex_rect(0.803921568627451, 3.84467512495194e-10),

    gsl_complex_rect(0.244515215852795, 5.0912340119475e-11),

    gsl_complex_rect(0.71427813163482, -1.84892182539146e-12),

    gsl_complex_rect(-0.264713375796178, -5.88439467907196e-11),

    gsl_complex_rect(0.274509803921569, 1.42252979623222e-09),

    gsl_complex_rect(0.476999292285916, 5.60511557577023e-10),

    gsl_complex_rect(0.949126848480345, -2.60410581725936e-11),

    gsl_complex_rect(0.363093705877982, -5.98876404774416e-10)

    };



    MATRIX_SETUP(m, 4, 4, 4, cmplx_data)



    gsl_complex z = gsl_linalg_complex_LU_det(&m, -1);

    printf("ret=%.6g%+.6g\n", GSL_REAL(z), GSL_IMAG(z));

    return 0;

    }



    The previous stack frame, from which gsl_linalg_complex_LU_det is called, shows &m with a sensible value. It behaves the same if I set -O0 rather than the -O2 in the Makefile.



    I’m wondering if you have any insight into what’s happening? The symptoms suggest either a compiler bug or something is smashing the stack. Similar behaviour happens on PPC64 and Sparc64 which is why the disabling code also looks for those. gsl_
    linalg_complex_LU_det is quite an unremarkable function, only about 5 lines with one loop.



    Best regards,

    Ed

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)