re PR middle-end/31490 (Compile error section type conflict)
authorDinar Temirbulatov <dtemirbulatov@gmail.com>
Wed, 17 Nov 2010 22:54:05 +0000 (01:54 +0300)
committerSteve Ellcey <sje@gcc.gnu.org>
Wed, 17 Nov 2010 22:54:05 +0000 (22:54 +0000)
2010-11-17  Dinar Temirbulatov <dtemirbulatov@gmail.com>
    Steve Ellcey  <sje@cup.hp.com>

PR middle-end/31490
* varasm.c (categorize_decl_for_section): Ignore reloc_rw_mask
if section attribute used.

Co-Authored-By: Steve Ellcey <sje@cup.hp.com>
From-SVN: r166887

gcc/ChangeLog
gcc/varasm.c

index d21e2e9..162295b 100644 (file)
@@ -1,3 +1,10 @@
+2010-11-17  Dinar Temirbulatov <dtemirbulatov@gmail.com>
+           Steve Ellcey  <sje@cup.hp.com>
+
+       PR middle-end/31490
+       * varasm.c (categorize_decl_for_section): Ignore reloc_rw_mask
+       if section attribute used.
+
 2010-11-17  Jan Hubicka  <jh@suse.cz>
 
        * builtins.c (expand_builtin_mathfn_2, expand_builtin_mathfn): Do not
index 215e0ed..6171e30 100644 (file)
@@ -6102,13 +6102,17 @@ categorize_decl_for_section (const_tree decl, int reloc)
          /* Here the reloc_rw_mask is not testing whether the section should
             be read-only or not, but whether the dynamic link will have to
             do something.  If so, we wish to segregate the data in order to
-            minimize cache misses inside the dynamic linker.  */
-         if (reloc & targetm.asm_out.reloc_rw_mask ())
+            minimize cache misses inside the dynamic linker.  If the data
+            has a section attribute, ignore reloc_rw_mask() so that all data
+             in a given named section is catagorized in the same way.  */
+         if (reloc & targetm.asm_out.reloc_rw_mask ()
+             && !lookup_attribute ("section", DECL_ATTRIBUTES (decl)))
            ret = reloc == 1 ? SECCAT_DATA_REL_LOCAL : SECCAT_DATA_REL;
          else
            ret = SECCAT_DATA;
        }
-      else if (reloc & targetm.asm_out.reloc_rw_mask ())
+      else if (reloc & targetm.asm_out.reloc_rw_mask ()
+              && !lookup_attribute ("section", DECL_ATTRIBUTES (decl)))
        ret = reloc == 1 ? SECCAT_DATA_REL_RO_LOCAL : SECCAT_DATA_REL_RO;
       else if (reloc || flag_merge_constants < 2)
        /* C and C++ don't allow different variables to share the same