This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: rs6000 -fdata-sections
Alan Modra <amodra@bigpond.net.au> writes:
> 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.
That's much better. This patch is OK (with suitable ChangeLog, and
don't forget to say where you tested it).
> 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)];
--
- Geoffrey Keating <geoffk@geoffk.org> <geoffk@redhat.com>