This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Issue with LTO/-fwhole-program
- From: "Bingfeng Mei" <bmei at broadcom dot com>
- To: "gcc at gcc dot gnu dot org" <gcc at gcc dot gnu dot org>
- Cc: "Richard Guenther" <richard dot guenther at gmail dot com>, "Jan Hubicka" <hubicka at ucw dot cz>
- Date: Fri, 11 Jun 2010 05:04:42 -0700
- Subject: Issue with LTO/-fwhole-program
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