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. 

Cheers,
Bingfeng


Reply via email to