On 11 June 2010 14:40, Richard Guenther <richard.guent...@gmail.com> wrote: > On Fri, Jun 11, 2010 at 2:36 PM, Manuel López-Ibáñez > <lopeziba...@gmail.com> wrote: >> 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. > > GCC does not see the whole program if you didn't build all units > you are linking with -flto.
Ah, so the problem is the missing -flto in the second compilation step? I think this is a bug in the compiler for not reporting this somehow. Is there are PR open for this? Manuel.