OSDN Git Service

PR middle-end/46674
authorjiez <jiez@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 2 Dec 2010 04:09:58 +0000 (04:09 +0000)
committerjiez <jiez@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 2 Dec 2010 04:09:58 +0000 (04:09 +0000)
* varasm.c (compute_visible_aliases): Handle user set
assembler name.

testsuite/
PR middle-end/46674
* gcc.dg/pr46674.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@167365 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr46674.c [new file with mode: 0644]
gcc/varasm.c

index 1f051c0..f4302dc 100644 (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
 2010-12-01  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        * config/rs6000/rs6000.c (rs6000_option_override_internal): Fix
index 51b34fc..d70e0b1 100644 (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.
 2010-12-02  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        * 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 (file)
index 0000000..cf6dfc7
--- /dev/null
@@ -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" } } */
index 5f79ece..921ee2e 100644 (file)
@@ -5525,12 +5525,21 @@ compute_visible_aliases (void)
        {
          struct cgraph_node *fnode = NULL;
          struct varpool_node *vnode = NULL;
        {
          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))
          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;
        }
     }
            changed = true;
        }
     }