[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