aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2010-12-15 00:22:23 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2010-12-14 23:22:23 +0000
commit5ba58d4f041bce790343516de7d4a17378f19856 (patch)
tree658d27be9a44303ba3ea4bbda914b7bb68be102b
parent42cbb8c17846290b82fd09ea79cab3e91454ba8d (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/lto-symtab.c21
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr46940_0.c10
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr46940_1.c5
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 ();
+}