sysv4.h (DO_SELECT_SECTION): Factored out of SELECT_SECTION.

* config/ia64/sysv4.h (DO_SELECT_SECTION): Factored out of
	SELECT_SECTION.
	(UNIQUE_SECTION): Define to get small data correctly.

From-SVN: r53450
This commit is contained in:
Andreas Schwab 2002-05-14 08:39:27 +00:00 committed by Andreas Schwab
parent 1b18fc2c4e
commit c1ae3eb440
2 changed files with 125 additions and 32 deletions

View File

@ -1,4 +1,8 @@
2002-05-13 Andreas Schwab <schwab@suse.de>
2002-05-14 Andreas Schwab <schwab@suse.de>
* config/ia64/sysv4.h (DO_SELECT_SECTION): Factored out of
SELECT_SECTION.
(UNIQUE_SECTION): Define to get small data correctly.
* varasm.c (resolve_unique_section): Add third parameter
flag_function_or_data_sections and use it instead of

View File

@ -140,45 +140,134 @@ do { \
emit_safe_across_calls (STREAM); \
} while (0)
/* A C statement or statements to switch to the appropriate
section for output of DECL. DECL is either a `VAR_DECL' node
or a constant of some sort. RELOC indicates whether forming
the initial value of DECL requires link-time relocations.
Set SECNUM to:
0 .text
1 .rodata
2 .data
3 .sdata
4 .bss
5 .sbss
*/
#define DO_SELECT_SECTION(SECNUM, DECL, RELOC) \
do \
{ \
if (TREE_CODE (DECL) == STRING_CST) \
{ \
if (! flag_writable_strings) \
SECNUM = 0x101; \
else \
SECNUM = 2; \
} \
else if (TREE_CODE (DECL) == VAR_DECL) \
{ \
if (XSTR (XEXP (DECL_RTL (DECL), 0), 0)[0] \
== SDATA_NAME_FLAG_CHAR) \
SECNUM = 3; \
/* ??? We need the extra RELOC check, because the default \
is to only check RELOC if flag_pic is set, and we don't \
set flag_pic (yet?). */ \
else if (!DECL_READONLY_SECTION (DECL, RELOC) || (RELOC)) \
SECNUM = 2; \
else if (flag_merge_constants < 2) \
/* C and C++ don't allow different variables to share \
the same location. -fmerge-all-constants allows \
even that (at the expense of not conforming). */ \
SECNUM = 1; \
else if (TREE_CODE (DECL_INITIAL (DECL)) == STRING_CST) \
SECNUM = 0x201; \
else \
SECNUM = 0x301; \
} \
/* This could be a CONSTRUCTOR containing ADDR_EXPR of a VAR_DECL, \
in which case we can't put it in a shared library rodata. */ \
else if (flag_pic && (RELOC)) \
SECNUM = 3; \
else \
SECNUM = 2; \
} \
while (0)
/* We override svr4.h so that we can support the sdata section. */
#undef SELECT_SECTION
#define SELECT_SECTION(DECL,RELOC,ALIGN) \
{ \
if (TREE_CODE (DECL) == STRING_CST) \
do \
{ \
if (! flag_writable_strings) \
mergeable_string_section ((DECL), (ALIGN), 0); \
else \
data_section (); \
typedef void (*sec_fn) PARAMS ((void)); \
static sec_fn const sec_functions[6] = \
{ \
text_section, \
const_section, \
data_section, \
sdata_section, \
bss_section, \
sbss_section \
}; \
\
int sec; \
\
DO_SELECT_SECTION (sec, DECL, RELOC); \
\
switch (sec) \
{ \
case 0x101: \
mergeable_string_section (DECL, ALIGN, 0); \
break; \
case 0x201: \
mergeable_string_section (DECL_INITIAL (DECL), \
ALIGN, 0); \
break; \
case 0x301: \
mergeable_constant_section (DECL_MODE (DECL), \
ALIGN, 0); \
break; \
default: \
(*sec_functions[sec]) (); \
break; \
} \
} \
else if (TREE_CODE (DECL) == VAR_DECL) \
while (0)
#undef UNIQUE_SECTION
#define UNIQUE_SECTION(DECL, RELOC) \
do \
{ \
if (XSTR (XEXP (DECL_RTL (DECL), 0), 0)[0] \
== SDATA_NAME_FLAG_CHAR) \
sdata_section (); \
/* ??? We need the extra RELOC check, because the default is to \
only check RELOC if flag_pic is set, and we don't set flag_pic \
(yet?). */ \
else if (!DECL_READONLY_SECTION (DECL, RELOC) || (RELOC)) \
data_section (); \
else if (flag_merge_constants < 2) \
/* C and C++ don't allow different variables to share \
the same location. -fmerge-all-constants allows \
even that (at the expense of not conforming). */ \
const_section (); \
else if (TREE_CODE (DECL_INITIAL (DECL)) == STRING_CST) \
mergeable_string_section (DECL_INITIAL (DECL), (ALIGN), 0); \
else \
mergeable_constant_section (DECL_MODE (DECL), (ALIGN), 0); \
static const char * const prefixes[6][2] = \
{ \
{ ".text.", ".gnu.linkonce.t." }, \
{ ".rodata.", ".gnu.linkonce.r." }, \
{ ".data.", ".gnu.linkonce.d." }, \
{ ".sdata.", ".gnu.linkonce.s." }, \
{ ".bss.", ".gnu.linkonce.b." }, \
{ ".sbss.", ".gnu.linkonce.sb." } \
}; \
\
int nlen, plen, sec; \
const char *name, *prefix; \
char *string; \
\
DO_SELECT_SECTION (sec, DECL, RELOC); \
\
name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (DECL)); \
STRIP_NAME_ENCODING (name, name); \
nlen = strlen (name); \
\
prefix = prefixes[sec & 0xff][DECL_ONE_ONLY(DECL)]; \
plen = strlen (prefix); \
\
string = alloca (nlen + plen + 1); \
\
memcpy (string, prefix, plen); \
memcpy (string + plen, name, nlen + 1); \
\
DECL_SECTION_NAME (DECL) = build_string (nlen + plen, string); \
} \
/* This could be a CONSTRUCTOR containing ADDR_EXPR of a VAR_DECL, \
in which case we can't put it in a shared library rodata. */ \
else if (flag_pic && (RELOC)) \
data_section (); \
else \
const_section (); \
}
while (0)
/* Similarly for constant pool data. */