[Bug lto/91287] LTO disables linking with scalar MASS library (Fortran only)
hjl.tools at gmail dot com
gcc-bugzilla@gcc.gnu.org
Wed Jul 31 16:16:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91287
--- Comment #19 from H.J. Lu <hjl.tools at gmail dot com> ---
(In reply to Richard Biener from comment #17)
> (In reply to Richard Biener from comment #16)
> > (In reply to Richard Biener from comment #15)
> > > Honza probably knows where we output the LTO symtab and why we do not put
> > > undefs for builtins there.
> >
> > #include <math.h>
> > double y, z;
> > void foo ();
> > int main()
> > {
> > volatile double x = atan2 (y, z);
> > foo ();
> > }
> >
> > > gcc-8 -c t.c -flto
> > > gcc-nm t.o
> > U foo
> > 00000000 T main
> > 00000000 C y
> > 00000000 C z
> >
> > where's the
> >
> > U atan2
> >
> > ?
>
> For
>
> double atan2 (double x, double y) { return x + y; }
>
> it doesn't appear either, this CU has an empty symbol table...
>
> I do remember quite some "funs" with builtin handling though, so the
> current handling may be the least bad of all choices...
[hjl@gnu-cfl-1 pr91287]$ cat foo1.c
#include <stdlib.h>
float
atan2f (float x, float y)
{
abort ();
return x * y;
}
[hjl@gnu-cfl-1 pr91287]$ cat foo.c
float
atan2f (float x, float y)
{
return x * y;
}
[hjl@gnu-cfl-1 pr91287]$ cat bar.c
#include <math.h>
extern float x, y, z;
void
bar (void)
{
x = atan2f (y, z);
}
[hjl@gnu-cfl-1 pr91287]$ cat main.c
#include <math.h>
extern void bar (void);
float x, y = 1, z =1;
int
main (void)
{
x = atan2f (y, z);
bar ();
return 0;
}
[hjl@gnu-cfl-1 pr91287]$ make
cc -O3 -c -o foo.o foo.c
ar rc libfoo.a foo.o
cc -O3 -fpic -c -o bar.o bar.c
cc -O3 -fpic -c -o foo1.o foo1.c
ld -shared -o libfoo1.so foo1.o # --version-script foo1.v
ld -shared -o libbar.so bar.o libfoo1.so
cc -flto -O3 -o x main.c libfoo.a libbar.so libfoo1.so -Wl,-R,.
cc -O3 -o y main.c libfoo.a libbar.so libfoo1.so -Wl,-R,.
./y
./x
make: *** [Makefile:9: all] Aborted
[hjl@gnu-cfl-1 pr91287]$
Since atan2f isn't referenced in IR, linker doesn't extract atan2f from
libfoo.a. atan2f is resolved to definition in libfoo1.so later.
More information about the Gcc-bugs
mailing list