not really a bug but somewhat odd : checking compiler /usr/local/bin/gcc8 ... no, mpn_lshift_com

Dennis Clarke dclarke at blastwave.org
Sun Jul 28 11:40:38 UTC 2019


On 7/28/19 7:32 AM, Vincent Lefevre wrote:
> On 2019-07-28 12:44:55 +0200, Vincent Lefevre wrote:
>> On 2019-07-28 06:12:06 -0400, Dennis Clarke wrote:
>>> configure:6813: ./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest
>>> Abort trap (core dumped)
>>
>> I don't know in your case, but I fear that this program is buggy.
> [...]
> 
> You can try the attached patch in case this would be the issue.
> This could also solve invisible failures (as occurring inside
> configure) in other cases.
> 

Thank you for that but I suspect the problem lay entirely elsewhere in
an unexpected place :

hydra$ cat foo.c

/* The following is mis-compiled by Intel ia-64 icc version 1.8 under
    "icc -O3",  After several calls, the function writes partial garbage to
    the result vector.  Perhaps relates to the chk.a.nc insn.  This code
needs
    to be run to show the problem, but that's fine, the offending cc is a
    native-only compiler so we don't have to worry about cross
compiling.  */

#if ! defined (__cplusplus)
#include <stdlib.h>

void lshift_com (rp, up, n, cnt)
  unsigned long *rp;
  unsigned long *up;
  long n;
  unsigned cnt;
{
  unsigned long high_limb, low_limb;
  unsigned tnc;
  long i;
  up += n;
  rp += n;
  tnc = 8 * sizeof (unsigned long) - cnt;
  low_limb = *--up;
  high_limb = low_limb << cnt;
  for (i = n - 1; i != 0; i--)
    {
      low_limb = *--up;
      *--rp = ~(high_limb | (low_limb >> tnc));
      high_limb = low_limb << cnt;
    }
  *--rp = ~high_limb;
}

int main () {
  unsigned long *r, *r2;
  unsigned long a[88 + 1];
  long i;
  for (i = 0; i < 88 + 1; i++)
    a[i] = ~0L;
  r = malloc (10000 * sizeof (unsigned long));
  r2 = r;
  for (i = 0; i < 528; i += 23)
    {
      lshift_com (r2, a,
                  i / (8 * sizeof (unsigned long)) + 1,
                  i % (8 * sizeof (unsigned long)));
      r2 += 88 + 1;
    }
  if (r[2048] != 0 || r[2049] != 0 || r[2050] != 0 || r[2051] != 0 ||
      r[2052] != 0 || r[2053] != 0 || r[2054] != 0)
    abort ();
  free (r);
  return 0;
}

#else

int main () {
  return 0;
}

#endif

hydra$


That compiles and runs fine on FreeBSD x86_64 with gcc 8.3.0 however on
 the ppc64 boxen :

hydra$ ls foo
foo
hydra$ gdb ./foo
GNU gdb (GDB) 8.3 [GDB v8.3 for FreeBSD]
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "powerpc64-portbld-freebsd13.0".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./foo...
warning: File
"/opt/bw/build/gmp-6.1.2_FreeBSD_13.0-CURRENT_r350103_ppc64.001/.gdbinit" auto-loading
has been declined by your `auto-load safe-path' set to
"$debugdir:$datadir/auto-load".
To enable execution of this file add
        add-auto-load-safe-path
/opt/bw/build/gmp-6.1.2_FreeBSD_13.0-CURRENT_r350103_ppc64.001/.gdbinit
line to your configuration file "/home/dclarke/.gdbinit".
To completely disable this security protection add
        set auto-load safe-path /
line to your configuration file "/home/dclarke/.gdbinit".
--Type <RET> for more, q to quit, c to continue without paging--c
For more information about this security protection see the
"Auto-loading safe path" section in the GDB manual.  E.g., run from the
shell:
        info "(gdb)Auto-loading safe path"
(gdb) run
Starting program:
/opt/bw/build/gmp-6.1.2_FreeBSD_13.0-CURRENT_r350103_ppc64.001/foo

Program received signal SIGABRT, Aborted.
0x000000081026b898 in .__sys_thr_kill () from /lib/libc.so.7
(gdb) bt
#0  0x000000081026b898 in .__sys_thr_kill () from /lib/libc.so.7
#1  0x000000081026af3c in .__raise () from /lib/libc.so.7
#2  0x00000008101cf41c in abort () from /lib/libc.so.7
#3  0x0000000010000cb4 in main () at foo.c:51
(gdb) quit
A debugging session is active.

        Inferior 1 [process 3361] will be killed.

Quit anyway? (y or n) y
hydra$

Well looks to be in libc.so.7 here.   :-(

Dennis


More information about the gmp-bugs mailing list