rs6000.c (rs6000_unique_section): Simplify and correct code selecting section.
authorAlan Modra <amodra@bigpond.net.au>
Thu, 6 Dec 2001 11:56:34 +0000 (11:56 +0000)
committerAlan Modra <amodra@gcc.gnu.org>
Thu, 6 Dec 2001 11:56:34 +0000 (22:26 +1030)
* config/rs6000/rs6000.c (rs6000_unique_section): Simplify and
correct code selecting section.

From-SVN: r47714

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

index 3dde901f9e654067dcf4ed05b318505a7b027122..92c1c1c77413d665cfe04687c34224a2de58a95d 100644 (file)
@@ -1,3 +1,8 @@
+2001-12-06  Alan Modra  <amodra@bigpond.net.au>
+
+       * config/rs6000/rs6000.c (rs6000_unique_section): Simplify and
+       correct code selecting section.
+
 Thu Dec  6 12:45:33 CET 2001  Jan Hubicka  <jh@suse.cz>
 
        * final.c (count_basic_block, add_bb, add_bb_string):
index fe358c07fe1e3bd7692528beb24d178695af128f..74d23ca0ef7906969dbef981c853ff4f668f47ce 100644 (file)
@@ -9746,9 +9746,6 @@ rs6000_unique_section (decl, reloc)
      tree decl;
      int reloc;
 {
-  int size = int_size_in_bytes (TREE_TYPE (decl));
-  int needs_sdata;
-  int readonly;
   int len;
   int sec;
   const char *name;
@@ -9757,40 +9754,54 @@ rs6000_unique_section (decl, reloc)
 
   static const char *const prefixes[7][2] =
   {
-    { ".text.",   ".gnu.linkonce.t." },
     { ".rodata.", ".gnu.linkonce.r." },
     { ".sdata2.", ".gnu.linkonce.s2." },
     { ".data.",   ".gnu.linkonce.d." },
     { ".sdata.",  ".gnu.linkonce.s." },
     { ".bss.",    ".gnu.linkonce.b." },
-    { ".sbss.",   ".gnu.linkonce.sb." }
+    { ".sbss.",   ".gnu.linkonce.sb." },
+    { ".text.",   ".gnu.linkonce.t." }
   };
-  
-  needs_sdata = (TREE_CODE (decl) != FUNCTION_DECL
-                && size > 0 
-                && size <= g_switch_value
-                && rs6000_sdata != SDATA_NONE
-                && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)));
 
-  if (TREE_CODE (decl) == STRING_CST)
-    readonly = ! flag_writable_strings;
-  else if (TREE_CODE (decl) == VAR_DECL)
-    readonly = (! (flag_pic && reloc)
-               && TREE_READONLY (decl)
-               && ! TREE_SIDE_EFFECTS (decl)
-               && DECL_INITIAL (decl)
-               && DECL_INITIAL (decl) != error_mark_node
-               && TREE_CONSTANT (DECL_INITIAL (decl)));
+  if (TREE_CODE (decl) == FUNCTION_DECL)
+    sec = 6;
   else
-    readonly = 1;
-  if (needs_sdata && rs6000_sdata != SDATA_EABI)
-    readonly = 0;
+    {
+      int readonly;
+      int needs_sdata;
+      int size;
+
+      readonly = 1;
+      if (TREE_CODE (decl) == STRING_CST)
+       readonly = ! flag_writable_strings;
+      else if (TREE_CODE (decl) == VAR_DECL)
+       readonly = (! (flag_pic && reloc)
+                   && TREE_READONLY (decl)
+                   && ! TREE_SIDE_EFFECTS (decl)
+                   && TREE_CONSTANT (DECL_INITIAL (decl)));
+
+      size = int_size_in_bytes (TREE_TYPE (decl));
+      needs_sdata = (size > 0 
+                    && size <= g_switch_value
+                    && rs6000_sdata != SDATA_NONE
+                    && (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)));
+
+      if (DECL_INITIAL (decl) == 0
+         || DECL_INITIAL (decl) == error_mark_node)
+       sec = 4;
+      else if (! readonly)
+       sec = 2;
+      else
+       sec = 0;
 
-  sec = ((TREE_CODE (decl) == FUNCTION_DECL ? 0 : 1)
-        + (readonly ? 0 : 2) 
-        + (needs_sdata ? 1 : 0)
-        + (DECL_INITIAL (decl) == 0
-           || DECL_INITIAL (decl) == error_mark_node) ? 4 : 0);
+      if (needs_sdata)
+       {
+         /* .sdata2 is only for EABI.  */
+         if (sec == 0 && rs6000_sdata != SDATA_EABI)
+           sec = 2;
+         sec += 1;
+       }
+    }
 
   STRIP_NAME_ENCODING (name, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
   prefix = prefixes[sec][DECL_ONE_ONLY (decl)];