externally_visible and resoultion file
Bingfeng Mei
bmei@broadcom.com
Tue Jun 8 14:22:00 GMT 2010
Thanks. But why "vvvvv" is linked correctly here? Shouldn't it
be treated as static with -fwhole-program?
Bingfeng
> -----Original Message-----
> From: Richard Guenther [mailto:richard.guenther@gmail.com]
> Sent: 08 June 2010 14:10
> To: Bingfeng Mei
> Cc: Jan Hubicka; gcc@gcc.gnu.org; Cary Coutant
> Subject: Re: externally_visible and resoultion file
>
> On Tue, Jun 8, 2010 at 3:01 PM, Bingfeng Mei <bmei@broadcom.com> wrote:
> > Hi,
> > Sorry for coming back to this issue after a while. I am still puzzled
> > by this. The following are two test files:
> >
> > a.c
> >
> > #include <string.h>
> > #include <stdio.h>
> > extern int foo(int);
> > void bar()
> > {
> > printf("bar\n");
> > }
> > extern int src[], dst[];
> > int vvvvvv;
> > int main()
> > {
> > int ret;
> > vvvvvv = 12;
> > ret = foo(20);
> > memcpy(dst, src, 100);
> > return ret + 3;
> > }
> >
> > b.c
> > #include <stdio.h>
> > int src[100];
> > int dst[100];
> > extern int vvvvvv;
> > extern void bar();
> > int foo(int c)
> > {
> > printf("Hello world: %d\n", c);
> > bar();
> > return 1000 + vvvvvv;
> > }
> >
> > I compiled with following steps
> > ~/work/install-x86/bin/gcc -flto a.c -O2 -c
> > ~/work/install-x86/bin/gcc b.c -O2 -c
> > ar cru libb.a b.o
> > ~/work/install-x86/bin/gcc -flto a.o -L. -lb -O2 -fuse-linker-plugin
> -o f -fwhole-program -save-temps
> >
> > Since you both mentioned that resolution file is not used to replace
> externally_visible attribute yet,
> > I expect there will be link errors regarding both vvvvvv and bar.
> Somehow, GCC doesn't complain at all.
> > However, looking at generated assembly code, GCC produces wrong code
> for calling bar, and vvvvvv is
> > linked correctly though.
> >
> > 0000000000400510 <foo>:
> > 400510: 48 83 ec 08 sub $0x8,%rsp
> > 400514: 89 fe mov %edi,%esi
> > 400516: 31 c0 xor %eax,%eax
> > 400518: bf 1c 06 40 00 mov $0x40061c,%edi
> > 40051d: e8 56 01 00 00 callq 400678 <printf@plt>
> > 400522: 31 c0 xor %eax,%eax
> > 400524: e8 d7 fa bf ff callq 0
> <__fini_array_end> <-------- should call bar.
> > 400529: 8b 05 a1 17 00
> 00 mov 0x17a1(%rip),%eax # 401cd0 <vvvvvv>
> > 40052f: 48 83 c4 08 add $0x8,%rsp
> > 400533: 05 e8 03 00 00 add $0x3e8,%eax
> > 400538: c3 retq
> > 400539: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
> >
> > Is this a bug? GCC should issue warning/error here. Why is vvvvvv
> linked correctly?
> > Shouldn't it be treated as static with -fwhile-program and without
> externally_visible?
>
> bar should be indeed eliminated which is what I see with not
> using the linker plugin.
>
> If you use the linker-plugin I see in the .optimized dump that
> the were eliminated. But it seems that gold picks them up
> from the original objects which seem to be retained somehow.
>
> I guess this is a bug in the linker-plugin.
>
> Richard.
>
> > My trunk is 160104 by the way.
More information about the Gcc
mailing list