PowerPC-sysV/eabi, harmonization of section attribute and small data optimization
Thierry Moreau
Thierry.Moreau@Connotech.com
Tue Feb 18 17:11:00 GMT 2003
The previous patch was incomplete (a fix is also required in sysv4.h).
-----------------------------------------------------------
ChangeLog entry:
2003-02-18 Thierry Moreau <thierry.moreau@connotech.com>
* config/rs6000/rs6000.c and config/rs6000/sysv4.h: PowerPC- sysV/eabi,
harmonization of section attribute and small data optimization
-----------------------------------------------------------
--
- Thierry Moreau
CONNOTECH Experts-conseils inc.
9130 Place de Montgolfier
Montreal, Qc
H2M 2A1
Tel.: (514)385-5691
Fax: (514)385-5900
e-mail: thierry.moreau@connotech.com
-------------- next part --------------
*** ../../../../gcc-3.2.2-orig/gcc/config/rs6000/sysv4.h Thu Jan 30 09:03:42 2003
--- sysv4.h Tue Feb 18 08:25:46 2003
*************** do { \
*** 873,879 ****
#define ASM_OUTPUT_LABELREF(FILE,NAME) \
do { \
const char *_name = NAME; \
! if (*_name == '@') \
_name++; \
\
if (*_name == '*') \
--- 873,879 ----
#define ASM_OUTPUT_LABELREF(FILE,NAME) \
do { \
const char *_name = NAME; \
! while (*_name == '@') \
_name++; \
\
if (*_name == '*') \
-------------- next part --------------
*** ../../../../gcc-3.2.2-orig/gcc/config/rs6000/rs6000.c Thu Jan 23 17:19:42 2003
--- rs6000.c Mon Feb 17 08:55:31 2003
*************** small_data_operand (op, mode)
*** 1679,1691 ****
rtx sum = XEXP (op, 0);
HOST_WIDE_INT summand;
- /* We have to be careful here, because it is the referenced address
- that must be 32k from _SDA_BASE_, not just the symbol. */
summand = INTVAL (XEXP (sum, 1));
! if (summand < 0 || summand > g_switch_value)
return 0;
sym_ref = XEXP (sum, 0);
}
if (*XSTR (sym_ref, 0) != '@')
--- 1679,1697 ----
rtx sum = XEXP (op, 0);
HOST_WIDE_INT summand;
summand = INTVAL (XEXP (sum, 1));
! if (summand < 0)
return 0;
sym_ref = XEXP (sum, 0);
+ /* We have to be careful here, because it is the referenced address
+ that must be 32k from _SDA_BASE_, not just the symbol,
+ e.g. as in int x[4]; x[25000-x]; -- the instruction referenced
+ address is x+100000.
+ Do not apply this test to objects explicitly allocated to a small section,
+ the g_switch _value does not apply to them. */
+ if ( XSTR (sym_ref, 0)[1] != '@' && summand > g_switch_value )
+ return 0;
}
if (*XSTR (sym_ref, 0) != '@')
*************** rs6000_encode_section_info (decl)
*** 11033,11060 ****
abort ();
}
! if ((size > 0 && size <= g_switch_value)
! || (name
! && ((len == sizeof (".sdata") - 1
&& strcmp (name, ".sdata") == 0)
! || (len == sizeof (".sdata2") - 1
&& strcmp (name, ".sdata2") == 0)
! || (len == sizeof (".sbss") - 1
&& strcmp (name, ".sbss") == 0)
! || (len == sizeof (".sbss2") - 1
&& strcmp (name, ".sbss2") == 0)
! || (len == sizeof (".PPC.EMB.sdata0") - 1
&& strcmp (name, ".PPC.EMB.sdata0") == 0)
! || (len == sizeof (".PPC.EMB.sbss0") - 1
! && strcmp (name, ".PPC.EMB.sbss0") == 0))))
{
rtx sym_ref = XEXP (DECL_RTL (decl), 0);
size_t len = strlen (XSTR (sym_ref, 0));
! char *str = alloca (len + 2);
str[0] = '@';
! memcpy (str + 1, XSTR (sym_ref, 0), len + 1);
! XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1);
}
}
}
--- 11039,11068 ----
abort ();
}
! if (name?
! ((len == sizeof (".sdata")
&& strcmp (name, ".sdata") == 0)
! || (len == sizeof (".sdata2")
&& strcmp (name, ".sdata2") == 0)
! || (len == sizeof (".sbss")
&& strcmp (name, ".sbss") == 0)
! || (len == sizeof (".sbss2")
&& strcmp (name, ".sbss2") == 0)
! || (len == sizeof (".PPC.EMB.sdata0")
&& strcmp (name, ".PPC.EMB.sdata0") == 0)
! || (len == sizeof (".PPC.EMB.sbss0")
! && strcmp (name, ".PPC.EMB.sbss0") == 0))
! :(size > 0 && size <= g_switch_value))
{
rtx sym_ref = XEXP (DECL_RTL (decl), 0);
size_t len = strlen (XSTR (sym_ref, 0));
! char *str = alloca (len + 3);
str[0] = '@';
! if (name)
! str[1] = '@';
! memcpy (str + 1 +(name!=NULL), XSTR (sym_ref, 0), len + 1);
! XSTR (sym_ref, 0) = ggc_alloc_string (str, len + 1 +(name!=NULL));
}
}
}
More information about the Gcc-patches
mailing list