OSDN Git Service

PR c/43288
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 10 Mar 2010 19:33:37 +0000 (19:33 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 10 Mar 2010 19:33:37 +0000 (19:33 +0000)
* ipa.c (function_and_variable_visibility) Normalize COMMON bits.
* varasm.c (get_variable_section): Don't do that here...
(make_decl_rtl): ... and here.
(do_assemble_alias): Produce decl RTL.
(assemble_alias): Likewise.

* gcc.dg/compile/pr43288.c: New test.

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

gcc/ChangeLog
gcc/ipa.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr43288.c [new file with mode: 0644]
gcc/varasm.c

index 3ee158e..12fb626 100644 (file)
@@ -1,3 +1,12 @@
+2010-03-10  Jan Hubicka  <jh@suse.cz>
+
+       PR c/43288
+       * ipa.c (function_and_variable_visibility) Normalize COMMON bits.
+       * varasm.c (get_variable_section): Don't do that here...
+       (make_decl_rtl): ... and here.
+       (do_assemble_alias): Produce decl RTL.
+       (assemble_alias): Likewise.
+
 2010-03-10  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/43290
index 63de1d9..f81d41a 100644 (file)
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -407,12 +407,38 @@ function_and_variable_visibility (bool whole_program)
                           && !DECL_EXTERNAL (node->decl)
                           && !node->local.externally_visible);
     }
+  for (vnode = varpool_nodes; vnode; vnode = vnode->next)
+    {
+      /* weak flag makes no sense on local variables.  */
+      gcc_assert (!DECL_WEAK (vnode->decl)
+                 || TREE_PUBLIC (vnode->decl) || DECL_EXTERNAL (vnode->decl));
+      /* In several cases declarations can not be common:
+
+        - when declaration has initializer
+        - when it is in weak
+        - when it has specific section
+        - when it resides in non-generic address space.
+        - if declaration is local, it will get into .local common section
+          so common flag is not needed.  Frontends still produce these in
+          certain cases, such as for:
+
+            static int a __attribute__ ((common))
+
+        Canonicalize things here and clear the redundant flag.  */
+      if (DECL_COMMON (vnode->decl)
+         && (!(TREE_PUBLIC (vnode->decl) || DECL_EXTERNAL (vnode->decl))
+             || (DECL_INITIAL (vnode->decl)
+                 && DECL_INITIAL (vnode->decl) != error_mark_node)
+             || DECL_WEAK (vnode->decl)
+             || DECL_SECTION_NAME (vnode->decl) != NULL
+             || ! (ADDR_SPACE_GENERIC_P
+                   (TYPE_ADDR_SPACE (TREE_TYPE (vnode->decl))))))
+       DECL_COMMON (vnode->decl) = 0;
+    }
   for (vnode = varpool_nodes_queue; vnode; vnode = vnode->next_needed)
     {
       if (!vnode->finalized)
         continue;
-      gcc_assert ((!DECL_WEAK (vnode->decl) && !DECL_COMMON (vnode->decl))
-                 || TREE_PUBLIC (vnode->decl) || DECL_EXTERNAL (vnode->decl));
       if (vnode->needed
          && (DECL_COMDAT (vnode->decl) || TREE_PUBLIC (vnode->decl))
          && (!whole_program
index 7c29203..ebabe97 100644 (file)
@@ -1,3 +1,7 @@
+2010-03-10  Jan Hubicka   <jh@suse.cz>
+
+       * gcc.dg/compile/pr43288.c: New test.
+
 2010-03-10  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * g++.old-deja/g++.pt/asm1.C: Don't detect pic via looking for the
@@ -6,7 +10,7 @@
        * gcc.c-torture/compile/20000804-1.c: Likewise.
        * gcc.target/i386/clobbers.c: Likewise.
 
-2010-03-10  Tobias Burnus  <burnus@net-b.de
+2010-03-10  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/43303
        * gfortran.dg/c_assoc_3.f90: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr43288.c b/gcc/testsuite/gcc.c-torture/compile/pr43288.c
new file mode 100644 (file)
index 0000000..73af0d9
--- /dev/null
@@ -0,0 +1 @@
+static int a __attribute__ ((common));
index 310647e..6b8222f 100644 (file)
@@ -1174,12 +1174,13 @@ get_variable_section (tree decl, bool prefer_noswitch_p)
   if (TREE_TYPE (decl) != error_mark_node)
     as = TYPE_ADDR_SPACE (TREE_TYPE (decl));
 
-  /* If the decl has been given an explicit section name, or it resides
-     in a non-generic address space, then it isn't common, and shouldn't
-     be handled as such.  */
-  if (DECL_COMMON (decl) && DECL_SECTION_NAME (decl) == NULL
-      && ADDR_SPACE_GENERIC_P (as))
+  if (DECL_COMMON (decl))
     {
+      /* If the decl has been given an explicit section name, or it resides
+        in a non-generic address space, then it isn't common, and shouldn't
+        be handled as such.  */
+      gcc_assert (DECL_SECTION_NAME (decl) == NULL
+                 && ADDR_SPACE_GENERIC_P (as));
       if (DECL_THREAD_LOCAL_P (decl))
        return tls_comm_section;
       /* This cannot be common bss for an emulated TLS object without
@@ -1434,15 +1435,16 @@ make_decl_rtl (tree decl)
 
   /* Specifying a section attribute on a variable forces it into a
      non-.bss section, and thus it cannot be common.  */
-  if (TREE_CODE (decl) == VAR_DECL
-      && DECL_SECTION_NAME (decl) != NULL_TREE
-      && DECL_INITIAL (decl) == NULL_TREE
-      && DECL_COMMON (decl))
-    DECL_COMMON (decl) = 0;
+  gcc_assert (!(TREE_CODE (decl) == VAR_DECL
+             && DECL_SECTION_NAME (decl) != NULL_TREE
+             && DECL_INITIAL (decl) == NULL_TREE
+             && DECL_COMMON (decl))
+             || !DECL_COMMON (decl));
 
   /* Variables can't be both common and weak.  */
-  if (TREE_CODE (decl) == VAR_DECL && DECL_WEAK (decl))
-    DECL_COMMON (decl) = 0;
+  gcc_assert (TREE_CODE (decl) != VAR_DECL
+             || !DECL_WEAK (decl)
+             || !DECL_COMMON (decl));
 
   if (use_object_blocks_p () && use_blocks_for_decl_p (decl))
     x = create_block_symbol (name, get_block_for_decl (decl), -1);
@@ -5507,6 +5509,10 @@ do_assemble_alias (tree decl, tree target)
   if (TREE_ASM_WRITTEN (decl))
     return;
 
+  /* We must force creation of DECL_RTL for debug info generation, even though
+     we don't use it here.  */
+  make_decl_rtl (decl);
+
   TREE_ASM_WRITTEN (decl) = 1;
   TREE_ASM_WRITTEN (DECL_ASSEMBLER_NAME (decl)) = 1;
 
@@ -5724,10 +5730,6 @@ assemble_alias (tree decl, tree target)
 # endif
 #endif
     }
-
-  /* We must force creation of DECL_RTL for debug info generation, even though
-     we don't use it here.  */
-  make_decl_rtl (decl);
   TREE_USED (decl) = 1;
 
   /* A quirk of the initial implementation of aliases required that the user