This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: rs6000 -fdata-sections
On Thu, Dec 06, 2001 at 07:47:52AM +1030, Alan Modra wrote:
> On Wed, Dec 05, 2001 at 11:24:59AM -0800, Geoff Keating wrote:
> >
> > > From: Alan Modra <amodra@bigpond.net.au>
> > >
> > > I'll take the liberty of interpreting your request regarding "readonly"
> > > loosely. How's this?
> >
> > Not OK; I meant that the word 'readonly' provides important
> > documentation about the meaning of the condition being tested, please
> > don't remove it.
>
> Negating the logic, which is clearer, and using "readwrite" as a
> temporary somehow conveys less information than using "readonly"?
Forgot to attach the revised patch.
Index: gcc/config/rs6000/rs6000.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.251
diff -u -p -r1.251 rs6000.c
--- rs6000.c 2001/12/04 23:23:19 1.251
+++ rs6000.c 2001/12/05 21:23:17
@@ -9451,9 +9451,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;
@@ -9462,40 +9459,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;
-
- 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);
+ {
+ 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;
+
+ 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)];