diff options
author | Jan Hubicka <jh@suse.cz> | 2010-12-15 00:22:23 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2010-12-14 23:22:23 +0000 |
commit | 5ba58d4f041bce790343516de7d4a17378f19856 (patch) | |
tree | 658d27be9a44303ba3ea4bbda914b7bb68be102b | |
parent | 42cbb8c17846290b82fd09ea79cab3e91454ba8d (diff) | |
download | gcc-5ba58d4f041bce790343516de7d4a17378f19856.zip gcc-5ba58d4f041bce790343516de7d4a17378f19856.tar.gz gcc-5ba58d4f041bce790343516de7d4a17378f19856.tar.bz2 |
re PR lto/46940 (asm aliases with linker plugin segfaults)
PR lto/46940
PR lto/44463
* lto-symtab.c (lto_symtab_merge_cgraph_nodes_1): Construct nodes
for aliases when they are used.
* gcc.dg/lto/pr46940_0.c: New testcase.
* gcc.dg/lto/pr46940_1.c: New testcase.
From-SVN: r167822
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/lto-symtab.c | 21 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/lto/pr46940_0.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/lto/pr46940_1.c | 5 |
5 files changed, 48 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 91b9b22..f2c7b5c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-12-14 Jan Hubicka <jh@suse.cz> + + PR lto/46940 + PR lto/44463 + * lto-symtab.c (lto_symtab_merge_cgraph_nodes_1): Construct nodes + for aliases when they are used. + 2010-12-14 Joseph Myers <joseph@codesourcery.com> * config.gcc (sparc-*-elf*, sparc-*-rtems*, sparc-*-linux*, diff --git a/gcc/lto-symtab.c b/gcc/lto-symtab.c index f18b322..b331d5c 100644 --- a/gcc/lto-symtab.c +++ b/gcc/lto-symtab.c @@ -795,9 +795,26 @@ lto_symtab_merge_cgraph_nodes_1 (void **slot, void *data ATTRIBUTE_UNUSED) for (e = prevailing->next; e; e = e->next) { if (e->node != NULL) - lto_cgraph_replace_node (e->node, prevailing->node); + { + /* In case we prevail funcion by an alias, we can run into case + that the alias has no cgraph node attached, since it was + previously unused. Create the node. */ + if (!prevailing->node) + { + prevailing->node = cgraph_node (prevailing->decl); + prevailing->node->alias = true; + } + lto_cgraph_replace_node (e->node, prevailing->node); + } if (e->vnode != NULL) - lto_varpool_replace_node (e->vnode, prevailing->vnode); + { + if (!prevailing->vnode) + { + prevailing->vnode = varpool_node (prevailing->decl); + prevailing->vnode->alias = true; + } + lto_varpool_replace_node (e->vnode, prevailing->vnode); + } } /* Drop all but the prevailing decl from the symtab. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 99c8103..f321051 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2010-12-14 Jan Hubicka <jh@suse.cz> + + PR lto/46940 + PR lto/44463 + * gcc.dg/lto/pr46940_0.c: New testcase. + * gcc.dg/lto/pr46940_1.c: New testcase. + 2010-12-14 Nathan Froyd <froydnj@codesourcery.com> PR c++/45330 diff --git a/gcc/testsuite/gcc.dg/lto/pr46940_0.c b/gcc/testsuite/gcc.dg/lto/pr46940_0.c new file mode 100644 index 0000000..e9f6dc8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/pr46940_0.c @@ -0,0 +1,10 @@ +* { dg-require-linker-plugin "" } */ +* { dg-extra-ld-options "-fuse-linker-plugin" } */ + +extern __attribute__((visibility("hidden"))) void _moz_foo (void); +extern __typeof (_moz_foo) _moz_foo __asm__ ("" "INT__foo") __attribute__((__visibility__("hidden"))) ; +void _moz_foo(void) +{ + printf ("blah\n"); +} +extern __typeof (_moz_foo) EXT__foo __asm__("" "_moz_foo") __attribute__((__alias__("" "INT__foo"))); diff --git a/gcc/testsuite/gcc.dg/lto/pr46940_1.c b/gcc/testsuite/gcc.dg/lto/pr46940_1.c new file mode 100644 index 0000000..0a8dab5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/pr46940_1.c @@ -0,0 +1,5 @@ +extern void _moz_foo (void); +main() +{ + _moz_foo (); +} |