* config/rs6000/rs6000.c (IN_NAMED_SECTION): New macro.
authordje <dje@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 23 Nov 2013 15:25:09 +0000 (15:25 +0000)
committerdje <dje@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 23 Nov 2013 15:25:09 +0000 (15:25 +0000)
(rs6000_xcoff_select_section): Place decls with stricter alignment
into named sections.
(rs6000_xcoff_unique_section): Allow unique sections for
uninitialized data with strict alignment.

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

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index d1f7f6e..c4f56ba 100644 (file)
@@ -1,3 +1,11 @@
+2013-11-23  David Edelsohn  <dje.gcc@gmail.com>
+
+       * config/rs6000/rs6000.c (IN_NAMED_SECTION): New macro.
+       (rs6000_xcoff_select_section): Place decls with stricter alignment
+       into named sections.
+       (rs6000_xcoff_unique_section): Allow unique sections for
+       uninitialized data with strict alignment.
+
 2013-11-23  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/59154
index 98f771b..7ada5d2 100644 (file)
@@ -28588,10 +28588,23 @@ rs6000_xcoff_asm_named_section (const char *name, unsigned int flags,
           name, suffix[smclass], flags & SECTION_ENTSIZE);
 }
 
+#define IN_NAMED_SECTION(DECL) \
+  ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \
+   && DECL_SECTION_NAME (DECL) != NULL_TREE)
+
 static section *
 rs6000_xcoff_select_section (tree decl, int reloc,
-                            unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
+                            unsigned HOST_WIDE_INT align)
 {
+  /* Place variables with alignment stricter than BIGGEST_ALIGNMENT into
+     named section.  */
+  if (align > BIGGEST_ALIGNMENT)
+    {
+      resolve_unique_section (decl, reloc, true);
+      if (IN_NAMED_SECTION (decl))
+       return get_named_section (decl, NULL, reloc);
+    }
+
   if (decl_readonly_section (decl, reloc))
     {
       if (TREE_PUBLIC (decl))
@@ -28629,10 +28642,12 @@ rs6000_xcoff_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED)
 {
   const char *name;
 
-  /* Use select_section for private and uninitialized data.  */
+  /* Use select_section for private data and uninitialized data with
+     alignment <= BIGGEST_ALIGNMENT.  */
   if (!TREE_PUBLIC (decl)
       || DECL_COMMON (decl)
-      || DECL_INITIAL (decl) == NULL_TREE
+      || (DECL_INITIAL (decl) == NULL_TREE
+         && DECL_ALIGN (decl) <= BIGGEST_ALIGNMENT)
       || DECL_INITIAL (decl) == error_mark_node
       || (flag_zero_initialized_in_bss
          && initializer_zerop (DECL_INITIAL (decl))))