From bd632dbdf823bf17aecf95d52f0df5e732e9901a Mon Sep 17 00:00:00 2001 From: Jie Zhang Date: Thu, 2 Dec 2010 04:09:58 +0000 Subject: [PATCH] re PR middle-end/46674 (Weak alias is mistakenly optimized away) PR middle-end/46674 * varasm.c (compute_visible_aliases): Handle user set assembler name. testsuite/ PR middle-end/46674 * gcc.dg/pr46674.c: New test. From-SVN: r167365 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr46674.c | 11 +++++++++++ gcc/varasm.c | 11 ++++++++++- 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr46674.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1f051c0ef20..f4302dc8b75 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-12-02 Jie Zhang + + PR middle-end/46674 + * varasm.c (compute_visible_aliases): Handle user set + assembler name. + 2010-12-01 Michael Meissner * config/rs6000/rs6000.c (rs6000_option_override_internal): Fix diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 51b34fcbbe5..d70e0b19953 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-12-02 Jie Zhang + + PR middle-end/46674 + * gcc.dg/pr46674.c: New test. + 2010-12-02 Nicola Pero * objc.dg/exceptions-6.m: New. diff --git a/gcc/testsuite/gcc.dg/pr46674.c b/gcc/testsuite/gcc.dg/pr46674.c new file mode 100644 index 00000000000..cf6dfc77fb5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr46674.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-require-alias "" } */ +/* { dg-options "-O2" } */ + +int yum; +void dessert (void) { ++yum; } +extern void jelly (void) __asm__ ("jelly2") __attribute__ ((alias ("dessert"), weak)); +extern void wobbly (void) __attribute__ ((alias ("jelly2"), weak)); + +/* { dg-final { scan-assembler "wobbly" } } */ +/* { dg-final { scan-assembler "jelly2" } } */ diff --git a/gcc/varasm.c b/gcc/varasm.c index 5f79ece7001..921ee2e1d29 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -5525,12 +5525,21 @@ compute_visible_aliases (void) { struct cgraph_node *fnode = NULL; struct varpool_node *vnode = NULL; + tree asmname = DECL_ASSEMBLER_NAME (p->decl); + const char *str = IDENTIFIER_POINTER (asmname); + + if (str[0] == '*') + { + str ++; + asmname = get_identifier (str); + } + fnode = cgraph_node_for_asm (p->target); vnode = (fnode == NULL) ? varpool_node_for_asm (p->target) : NULL; if ((fnode || vnode || pointer_set_contains (visible, p->target)) - && !pointer_set_insert (visible, DECL_ASSEMBLER_NAME (p->decl))) + && !pointer_set_insert (visible, asmname)) changed = true; } }