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