This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[RFC] PowerPC select_section / unique_section
- From: David Edelsohn <dje at watson dot ibm dot com>
- To: Geoff Keating <geoffk at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Wed, 21 Aug 2002 13:20:18 -0400
- Subject: [RFC] PowerPC select_section / unique_section
While investigating a problem with PowerPC ELF section decisions,
I realized that the functions need to treat PPC64 as if flag_pic were set.
I also noticed a discrepancy between the PowerPC definition and the
default definition in varasm.c: rs6000_elf_select_section should not
default to readonly when reloc is defined.
My remaining concern is that the readonly algorithm in
rs6000_elf_unique_section does not match the algorithm in
rs6000_elf_select_section: the handling of decl CONSTRUCTOR and the
handling of default readonly. Should the definitions match?
Thanks, 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): Treat DEFAULT_ABI == ABI_AIX like
PIC.
(rs6000_xcoff_select_section): Update to recent readonly
algorithm.
Index: rs6000.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.364
diff -c -p -r1.364 rs6000.c
*** rs6000.c 19 Aug 2002 16:32:53 -0000 1.364
--- rs6000.c 21 Aug 2002 16:42:25 -0000
*************** rs6000_elf_select_section (decl, reloc,
*** 12432,12439 ****
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,
--- 12462,12469 ----
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,
*** 12447,12468 ****
&& (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)])();
}
--- 12477,12499 ----
&& (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)
*** 12501,12517 ****
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));
--- 12532,12547 ----
sec = 6;
else
{
! bool readonly = true;
! 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)));
size = int_size_in_bytes (TREE_TYPE (decl));
*************** rs6000_elf_unique_section (decl, reloc)
*** 12523,12529 ****
if (DECL_INITIAL (decl) == 0
|| DECL_INITIAL (decl) == error_mark_node)
sec = 4;
! else if (! readonly)
sec = 2;
else
sec = 0;
--- 12553,12559 ----
if (DECL_INITIAL (decl) == 0
|| DECL_INITIAL (decl) == error_mark_node)
sec = 4;
! else if (!readonly)
sec = 2;
else
sec = 0;
*************** xcoff_asm_named_section (name, flags)
*** 13104,13131 ****
}
static void
! rs6000_xcoff_select_section (exp, reloc, align)
! tree exp;
int reloc;
unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED;
{
! if ((TREE_CODE (exp) == STRING_CST
! && ! flag_writable_strings)
! || (TREE_CODE_CLASS (TREE_CODE (exp)) == 'd'
! && TREE_READONLY (exp) && ! TREE_THIS_VOLATILE (exp)
! && DECL_INITIAL (exp)
! && (DECL_INITIAL (exp) == error_mark_node
! || TREE_CONSTANT (DECL_INITIAL (exp)))
! && ! (reloc)))
{
! if (TREE_PUBLIC (exp))
read_only_data_section ();
else
read_only_private_data_section ();
}
else
{
! if (TREE_PUBLIC (exp))
data_section ();
else
private_data_section ();
--- 13134,13172 ----
}
static void
! rs6000_xcoff_select_section (decl, reloc, align)
! tree decl;
int reloc;
unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED;
{
! bool readonly = false;
!
! if (TREE_CODE (decl) == STRING_CST)
! readonly = !flag_writable_strings;
! else if (TREE_CODE (decl) == VAR_DECL)
! readonly = (!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 = (!reloc
! && !TREE_SIDE_EFFECTS (decl)
! && TREE_CONSTANT (decl));
! else
! readonly = !reloc;
!
! if (readonly)
{
! if (TREE_PUBLIC (decl))
read_only_data_section ();
else
read_only_private_data_section ();
}
else
{
! if (TREE_PUBLIC (decl))
data_section ();
else
private_data_section ();