re PR middle-end/43391 (make_decl_rtl failure for C++ on AIX and HPUX)
authorJan Hubicka <jh@suse.cz>
Sat, 27 Mar 2010 11:56:30 +0000 (12:56 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sat, 27 Mar 2010 11:56:30 +0000 (11:56 +0000)
PR middle-end/43391
* varasm.c (make_decl_rtl): Deal with COMMON flag to make
notice_global_symbol work.

From-SVN: r157773

gcc/ChangeLog
gcc/varasm.c

index 7fb9e3d6bc7bba0a97067e106fb8d0bbca6084a0..d4f4488e512e1ad1c793666e7006757e2ec54588 100644 (file)
@@ -1,3 +1,9 @@
+2010-03-27  Jan Hubicka  <jh@suse.cz>
+
+       PR middle-end/43391
+       * varasm.c (make_decl_rtl): Deal with COMMON flag to make
+       notice_global_symbol work.
+
 2010-03-27  Jakub Jelinek  <jakub@redhat.com>
 
        * dwarf2out.c (dwarf2_debug_hooks): Use dwarf2out_function_decl
index ba4e61218345178f6ae52516eefde302ceb9966c..af9adffd73d55ac020db7ae2671c50c101363cb6 100644 (file)
@@ -1435,16 +1435,19 @@ 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.  */
-  gcc_assert (!(TREE_CODE (decl) == VAR_DECL
-             && DECL_SECTION_NAME (decl) != NULL_TREE
-             && DECL_INITIAL (decl) == NULL_TREE
-             && DECL_COMMON (decl))
-             || !DECL_COMMON (decl));
+  /* FIXME: In general this code should not be necessary because
+     visibility pass is doing the same work.  But notice_global_symbol
+     is called early and it needs to make DECL_RTL to get the name.
+     we take care of recomputing the DECL_RTL after visibility is changed.  */
+  if (TREE_CODE (decl) == VAR_DECL
+      && DECL_SECTION_NAME (decl) != NULL_TREE
+      && DECL_INITIAL (decl) == NULL_TREE
+      && DECL_COMMON (decl))
+    DECL_COMMON (decl) = 0;
 
   /* Variables can't be both common and weak.  */
-  gcc_assert (TREE_CODE (decl) != VAR_DECL
-             || !DECL_WEAK (decl)
-             || !DECL_COMMON (decl));
+  if (TREE_CODE (decl) == VAR_DECL && DECL_WEAK (decl))
+    DECL_COMMON (decl) = 0;
 
   if (use_object_blocks_p () && use_blocks_for_decl_p (decl))
     x = create_block_symbol (name, get_block_for_decl (decl), -1);