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
This commit is contained in:
Jie Zhang 2010-12-02 04:09:58 +00:00 committed by Jie Zhang
parent d0f7899abb
commit bd632dbdf8
4 changed files with 32 additions and 1 deletions

View file

@ -1,3 +1,9 @@
2010-12-02 Jie Zhang <jie@codesourcery.com>
PR middle-end/46674
* varasm.c (compute_visible_aliases): Handle user set
assembler name.
2010-12-01 Michael Meissner <meissner@linux.vnet.ibm.com>
* config/rs6000/rs6000.c (rs6000_option_override_internal): Fix

View file

@ -1,3 +1,8 @@
2010-12-02 Jie Zhang <jie@codesourcery.com>
PR middle-end/46674
* gcc.dg/pr46674.c: New test.
2010-12-02 Nicola Pero <nicola.pero@meta-innovation.com>
* objc.dg/exceptions-6.m: New.

View file

@ -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" } } */

View file

@ -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;
}
}