glibc 2.28 autopkgtest failures
Michael Hudson-Doyle
michael.hudson at canonical.com
Tue Sep 4 04:15:57 UTC 2018
On Tue, 4 Sep 2018 at 13:26, Michael Hudson-Doyle <
michael.hudson at canonical.com> wrote:
> tl;dr we should force things through :)
>
> There are at the time of writing two autopkgtest failures preventing glibc
> from migrating: r-cran-rgenoud and python-cffi
>
> The r-cran-genoud failure is mystifying in that I have no idea how the
> glibc version is affecting the package (it doesn't call many libc or libm
> functions!). I've spent far too long trying on this but as the package has
> no rdeps we should probably just remove it and whoever brings it back can
> try to understand why it changes behaviour with new libc. (The test also
> looks a bit fragile, it is asserting that optimizing a particular function
> with the rng seeded a particular way finds a different maxima to seeding
> the rng a different way, afaict).
>
> The python-cffi is exposing a bug that exists already. A minimal failing
> example is this:
>
[...]
> The bug is that when you lie to cffi about the return type of a variable,
> in particular when you say a function returning a float does not return a
> float, the x87 stack is not wiped to the extent required by the calling
> convention. glibc 2.28 rewrote the cos function in a way that apparently
> now cares about this (or I guess gcc now compiles the function in a way
> that cares about this) but make no mistake, it only ever worked by chance
> before. So I think the test_sin_no_return_value test should be skipped on
> i386.
>
Unfortunately, python-cffi is now failing to build on ppc64el. Code like
this (where "source" is a double and target is a valid pointer):
float r = (float)source;
memcpy(target, &r, sizeof(float));
is getting compiled into code which doesn't call frsp (round to single
precision), which seems very wrong to me. It works if you compile it with
gcc-7 or with gcc-8 and no optimization. I've managed to reproduce it like
this:
(cosmic-ppc64el)root at diamond:/# cat u.c
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char buf[4];
void write(double x) {
float y = (float)x;
memcpy(buf, &y, 4);
}
float read(void) {
float r;
memcpy(&r, buf, 4);
return r;
}
int main(int argc, char**argv) {
double x;
x = strtod(argv[1], NULL);
write(x);
printf("%g\n", (double)read());
return 0;
}
(cosmic-ppc64el)root at diamond:/# gcc -fno-inline -O1 -o u u.c
(cosmic-ppc64el)root at diamond:/# ./u 1e200
2.19181e+07
and unless someone can see something wrong in my C code, this looks like a
compiler bug :(
Cheers,
mwh
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ubuntu.com/archives/ubuntu-devel/attachments/20180904/67353b29/attachment.html>
More information about the ubuntu-devel
mailing list