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.