On 11 June 2010 14:23, Richard Guenther <richard.guent...@gmail.com> wrote: > On Fri, Jun 11, 2010 at 2:22 PM, Manuel López-Ibáñez > <lopeziba...@gmail.com> wrote: >> On 11 June 2010 14:07, Richard Guenther <richard.guent...@gmail.com> wrote: >>> On Fri, Jun 11, 2010 at 2:04 PM, Bingfeng Mei <b...@broadcom.com> wrote: >>>> Hi, >>>> >>>> I am still puzzled by the effect of LTO/-fwhole-program. >>>> For the following simple tests: >>>> >>>> a.c: >>>> >>>> #include <stdio.h> >>>> int v; >>>> >>>> extern void bar(); >>>> int main() >>>> { >>>> v = 5; >>>> bar(); >>>> >>>> printf("v = %d\n", v); >>>> return 0; >>>> } >>>> >>>> b.c: >>>> int v; >>>> void bar() >>>> { >>>> v = 4; >>>> } >>>> >>>> If I just compile plainly, the output is: >>>> v = 4 >>>> >>>> If I compile as: >>>> ~/work/install-x86/bin/gcc a.c -O2 -c -save-temps -flto >>>> ~/work/install-x86/bin/gcc b.c -O2 -c -save-temps >>>> ~/work/install-x86/bin/gcc a.o b.o -O2 -fuse-linker-plugin -o f -flto >>>> -fwhole-program >>>> >>>> The output is: >>>> v = 5 >>>> >>>> We get two copies of v here. One is converted to static by whole-program >>>> optimizer, >>>> and the other is global. I know I can add externally_visible in a.c to >>>> solve >>>> the issue. But since compiler is not able to give any warning here, it >>>> could make >>>> program very tricky to debug. >>>> >>>> What is the value to convert variables to static ones? I know unreferenced >>>> ones can >>>> be optimized out, but this can be achieved by -fdata-sections & >>>> -gc-collection as >>>> well, I believe. >>> >>> You make inter-procedural/file data-flow operations possible. >> >> But this is a bug, isn't it? > > No, you lied to the compiler by specifying -fwhole-file.
I don't understand. The final link was the whole program. Manuel.