This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH, LTO] add externally_visible attribute when necessary with -fwhole-program and resolution file.
- From: "Bingfeng Mei" <bmei at broadcom dot com>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Cc: "Richard Guenther" <richard dot guenther at gmail dot com>
- Date: Wed, 9 Jun 2010 07:46:49 -0700
- Subject: [PATCH, LTO] add externally_visible attribute when necessary with -fwhole-program and resolution file.
Hi,
This patch addresses issue discussed in
http://gcc.gnu.org/ml/gcc/2010-05/msg00560.html
http://gcc.gnu.org/ml/gcc/2010-06/msg00317.html
With the patch, any declaration which is resolved as LDPR_PREVAILING_DEF
and compiled with -fwhole-program is annotated with
attribute "externally_visible" if it doesn't exist already.
This eliminates the error-prone process of manual annotation
of the attribute when compiling mixed LTO/non-LTO applications.
For the following test files:
a.c
#include <string.h>
#include <stdio.h>
extern int foo(int);
/* Called by b.c, should not be optimized by -fwhole-program */
void bar()
{
printf("bar\n");
}
/* Not used by others, should be optimized out by -fwhole-program*/
void bar2()
{
printf("bar2\n");
}
extern int src[], dst[];
int vvvvvv;
int main()
{
int ret;
vvvvvv = 12;
ret = foo(20);
bar2();
memcpy(dst, src, 100);
return ret + 3;
}
b.c
#include <stdio.h>
int src[100];
int dst[100];
extern int vvvvvv;
extern void bar();
int foo(int c)
{
printf("Hello world: %d\n", c);
bar();
return 1000 + vvvvvv;
}
~/work/install-x86/bin/gcc a.c -O2 -c -flto
~/work/install-x86/bin/gcc b.c -O2 -c
ar cru libb.a b.o
~/work/install-x86/bin/gcc -flto a.o -L. -lb -O2 -fuse-linker-plugin -o f -fwhole-program
The code is compiled and linked correctly. bar & vvvvvv don't become static function
and cause link errors, whereas bar2 is inlined as expected.
Bootstrapped and tested on x86_64-unknown-linux-gnu.
Cheers,
Bingfeng Mei
2010-06-09 Bingfeng Mei <bmei@broadcom.com>
* lto-symbtab.c (lto_symtab_resolve_symbols): Add externally_visible
attribute for declaration of LDPR_PREVAILING_DEF when compiling with
-fwhole-program
Index: lto-symtab.c
===================================================================
--- lto-symtab.c (revision 160463)
+++ lto-symtab.c (working copy)
@@ -476,7 +476,19 @@
/* If the chain is already resolved there is nothing else to do. */
if (e->resolution != LDPR_UNKNOWN)
- return;
+ {
+ /* Add externally_visible attribute for declaration of LDPR_PREVAILING_DEF */
+ if (e->resolution == LDPR_PREVAILING_DEF && flag_whole_program)
+ {
+ if (!lookup_attribute ("externally_visible", DECL_ATTRIBUTES (e->decl)))
+ {
+ DECL_ATTRIBUTES (e->decl)
+ = tree_cons (get_identifier ("externally_visible"), NULL_TREE,
+ DECL_ATTRIBUTES (e->decl));
+ }
+ }
+ return;
+ }
/* Find the single non-replaceable prevailing symbol and
diagnose ODR violations. */