On Fri, 22 Jul 2011, Ulrich Weigand wrote:

> Richard Guenther wrote:
> 
> > + /* { dg-lto-do run } */
> > + /* { dg-lto-options { { -O0 -flto } } } */
> > + /* { dg-extra-ld-options "-O2 -ffast-math -fuse-linker-plugin" } */
> > + /* { dg-require-linker-plugin "" } */
> > + 
> > + /* We require a linker plugin because otherwise we'd need to link
> > +    against libm which we are not sure here has cabs on all targets.
> > +    This is because collect2 invokes ld on the -O0 object code
> > +    which does not have folded cabs.  */
> > + 
> > + double cabs(_Complex double);
> > + double __attribute__((used))
> > + foo (_Complex double x, int b)
> > + {
> > +   if (b)
> > +     x = 0;
> > +   return cabs(x);
> > + }
> > + int main() { return 0; }
> 
> Now that we have the linker plugin, this fails on spu-elf with:
> 
> /tmp/cce6KuRb.ltrans0.ltrans.o: In function `foo':
> cce6KuRb.ltrans0.o:(.text+0x28): undefined reference to `sqrt'
> 
> because nothing links against libm.  I'm a bit confused by the comment
> above: even with the linker plugin, where should libm be pulled in?
> Don't we need to use -lm on the linker line anyway?

Well, the testcase was for an ICE which required that cabs is folded
to sqrt(real**2 + imag**2), it requires "late" folding, thus
-O0 during the compile step (it's a trick to use LTO here, to delay
folding until after IPA opts).  Not linking with -lm and relying
on a HW sqrt instruction makes sure we do that late folding
which we want to happen.

So, if you can in any way retain all of the above features with
fixing non-HW sqrt targets fine - otherwise I suggest you skip spu-elf.

Richard.

Reply via email to