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.

Reply via email to