This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
PowerPC ELF sections
- From: David Edelsohn <dje at watson dot ibm dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 23 Aug 2002 14:07:07 -0400
- Subject: PowerPC ELF sections
Because the trunk is in Stage 3 development, I reduced the patch
to the minimal changes plus style fixes. I left the inconsistency between
select_section and unique_section for CONSTRUCTOR alone because it does
not appear to have caused any problems. That will get fixed when the
functions are rewritten in terms of the varasm.c defaults.
Built on powerpc64-linux.
David
* config/rs6000/rs6000.c (rs6000_elf_select_section): Treat
DEFAULT_ABI == ABI_AIX like PIC. Test PIC & reloc for readonly
default.
(rs6000_elf_unique_section): Likewise.
Index: rs6000.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.367
diff -c -p -r1.367 rs6000.c
*** rs6000.c 23 Aug 2002 01:18:06 -0000 1.367
--- rs6000.c 23 Aug 2002 16:41:18 -0000
*************** rs6000_elf_select_section (decl, reloc,
*** 12428,12435 ****
unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED;
{
int size = int_size_in_bytes (TREE_TYPE (decl));
! int needs_sdata;
! int readonly;
static void (* const sec_funcs[4]) PARAMS ((void)) = {
&readonly_data_section,
&sdata2_section,
--- 12428,12435 ----
unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED;
{
int size = int_size_in_bytes (TREE_TYPE (decl));
! bool needs_sdata;
! bool readonly;
static void (* const sec_funcs[4]) PARAMS ((void)) = {
&readonly_data_section,
&sdata2_section,
*************** rs6000_elf_select_section (decl, reloc,
*** 12443,12464 ****
&& (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)));
else if (TREE_CODE (decl) == CONSTRUCTOR)
! readonly = (! (flag_pic && reloc)
! && ! TREE_SIDE_EFFECTS (decl)
&& TREE_CONSTANT (decl));
else
! readonly = 1;
if (needs_sdata && rs6000_sdata != SDATA_EABI)
! readonly = 0;
(*sec_funcs[(readonly ? 0 : 2) + (needs_sdata ? 1 : 0)])();
}
--- 12443,12465 ----
&& (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 || DEFAULT_ABI == ABI_AIX) && reloc)
&& TREE_READONLY (decl)
! && !TREE_SIDE_EFFECTS (decl)
&& DECL_INITIAL (decl)
&& DECL_INITIAL (decl) != error_mark_node
&& TREE_CONSTANT (DECL_INITIAL (decl)));
else if (TREE_CODE (decl) == CONSTRUCTOR)
! readonly = (!((flag_pic || DEFAULT_ABI == ABI_AIX) && reloc)
! && !TREE_SIDE_EFFECTS (decl)
&& TREE_CONSTANT (decl));
else
! readonly = !((flag_pic || DEFAULT_ABI == ABI_AIX) && reloc);
!
if (needs_sdata && rs6000_sdata != SDATA_EABI)
! readonly = false;
(*sec_funcs[(readonly ? 0 : 2) + (needs_sdata ? 1 : 0)])();
}
*************** rs6000_elf_unique_section (decl, reloc)
*** 12497,12514 ****
sec = 6;
else
{
! 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
--- 12498,12516 ----
sec = 6;
else
{
! bool readonly;
! bool needs_sdata;
int size;
if (TREE_CODE (decl) == STRING_CST)
! readonly = !flag_writable_strings;
else if (TREE_CODE (decl) == VAR_DECL)
! readonly = (!((flag_pic || DEFAULT_ABI == ABI_AIX) && reloc)
&& TREE_READONLY (decl)
! && !TREE_SIDE_EFFECTS (decl)
&& TREE_CONSTANT (DECL_INITIAL (decl)));
+ else
+ readonly = !((flag_pic || DEFAULT_ABI == ABI_AIX) && reloc);
size = int_size_in_bytes (TREE_TYPE (decl));
needs_sdata = (size > 0
*************** rs6000_elf_unique_section (decl, reloc)
*** 12516,12525 ****
&& 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;
--- 12518,12527 ----
&& rs6000_sdata != SDATA_NONE
&& (rs6000_sdata != SDATA_DATA || TREE_PUBLIC (decl)));
! if (DECL_INITIAL (decl) == NULL
|| DECL_INITIAL (decl) == error_mark_node)
sec = 4;
! else if (!readonly)
sec = 2;
else
sec = 0;