This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] SHF_MERGE support for gcc
- To: gcc-patches at gcc dot gnu dot org
- Subject: [PATCH] SHF_MERGE support for gcc
- From: Jakub Jelinek <jakub at redhat dot com>
- Date: Fri, 20 Apr 2001 17:48:41 +0200
- Reply-To: Jakub Jelinek <jakub at redhat dot com>
Hi!
This patch below puts string constants (unless they contain embedded '\0's)
and other small constants (like floating point constants) into separate
.rodata.XXX sections with SHF_MERGE flag set (and for strings even
SHF_STRINGS) if the assembler/linker support it (ELF only so far).
Like that linker can merge duplicates.
Unfortunately, SELECT_SECTION/SELECT_RTX_SECTION needs for this decision
know what alignment will be output (and adding the ALIGN argument means
touching many headers :( ).
With this patch (and current CVS gas/ld with the patch I've just posted to
binutils list) gcc bootstrapped on i386-redhat-linux with 2 regressions:
g++.ext/pretty4.C:
void baz ()
{
ptr = __FUNCTION__;
// there should be no string const merging
if (ptr == "baz")
fail = 1;
and
g++.other/string2.C:
int main ()
{
static const char ary[] = "wibble";
void const *ptr = 0;
ptr = ary;
if (ptr == "wibble")
return 1;
Both of these make assumptions that strings are never merged.
Is there something in C++ which mandates this behaviour? Or in C?
The patch below is perhaps too aggressive, it merges e.g. even:
const double d = 2.0;
const double e = 2.0;
into one memory location, is there something wrong about it from the
standards point of view? If yes, the patch can limit itself to non-variables
(ie. just STRING_CSTs which are not constant arrays and constant pool).
2001-04-20 Jakub Jelinek <jakub@redhat.com>
* configure.in: Check whether assembler supports section merging.
* config.in: Rebuilt.
* configure: Rebuilt.
* varasm.c (variable_section, output_constant_pool): Pass alignment
to SELECT_SECTION and SELECT_RTX_SECTION.
* tm.texi (SELECT_SECTION, SELECT_RTX_SECTION): Document added third
argument.
* config/elfos.h (EXTRA_SECTIONS): Added new sections.
(EXTRA_SECTION_FUNCTIONS): Add CONST_STR_SECTION_FUNCTION and
CONST_VAR_SECTION_FUNCTION.
(USE_GAS_SUBSECTION_ORDERING, CONST_STR_SECTION_FUNCTION,
CONST_VAR_SECTION_FUNCTION): Define.
(SELECT_RTX_SECTION, SELECT_SECTION): Add third macro argument.
Put constant into special SHF_MERGE sections if the linker should
attempt to merge duplicates.
* config/nextstep.h: Add third argument to SELECT_RTX_SECTION and
SELECT_SECTION.
* config/svr3.h: Likewise.
* config/darwin.h: Likewise.
* config/alpha/elf.h: Likewise.
* config/arm/aof.h: Likewise.
* config/arm/linux-elf.h: Likewise.
* config/avr/avr.h: Likewise.
* config/c4x/c4x.h: Likewise.
* config/d30v/d30v.h: Likewise.
* config/i386/dgux.h: Likewise.
* config/i386/osfrose.h: Likewise.
* config/i386/sco5.h: Likewise.
* config/i386/svr3gas.h: Likewise.
* config/ia64/sysv4.h: Likewise.
* config/m32r/m32r.h: Likewise.
* config/m68k/m68k.h: Likewise.
* config/m88k/dgux.h: Likewise.
* config/m88k/m88k.h: Likewise.
* config/mcore/mcore-pe.h: Likewise.
* config/mips/mips.h: Likewise.
* config/pa/pa-linux.h: Likewise.
* config/pa/pa.h: Likewise.
* config/romp/romp.h: Likewise.
* config/rs6000/aix.h: Likewise.
* config/rs6000/sysv4.h: Likewise.
* config/sparc/sparc.h: Likewise.
* config/sparc/sysv4.h: Likewise.
* config/v850/v850.h: Likewise.
* config/vax/vms.h: Likewise.
--- gcc/config/elfos.h.jj Wed Apr 18 17:20:56 2001
+++ gcc/config/elfos.h Fri Apr 20 16:23:28 2001
@@ -282,7 +282,15 @@ Boston, MA 02111-1307, USA. */
includes this file. */
#undef EXTRA_SECTIONS
+#ifdef HAVE_GAS_SHF_MERGE
+#define EXTRA_SECTIONS in_const, in_ctors, in_dtors, \
+ in_const_cst1, in_const_cst2, in_const_cst4, \
+ in_const_cst8, in_const_cst16, in_const_str1 = 256, \
+ in_const_str2 = 256 + 32, in_const_str4 = 256 + 2*32, \
+ in_const_str8 = 256 + 3*32
+#else
#define EXTRA_SECTIONS in_const, in_ctors, in_dtors
+#endif
/* A default list of extra section function definitions. For targets
that use additional sections (e.g. .tdesc) you should override this
@@ -292,10 +300,142 @@ Boston, MA 02111-1307, USA. */
#define EXTRA_SECTION_FUNCTIONS \
CONST_SECTION_FUNCTION \
CTORS_SECTION_FUNCTION \
- DTORS_SECTION_FUNCTION
+ DTORS_SECTION_FUNCTION \
+ CONST_STR_SECTION_FUNCTION \
+ CONST_VAR_SECTION_FUNCTION
#define READONLY_DATA_SECTION() const_section ()
+#ifdef HAVE_GAS_SUBSECTION_ORDERING
+#define USE_GAS_SUBSECTION_ORDERING 1
+#else
+#define USE_GAS_SUBSECTION_ORDERING 0
+#endif
+
+#ifdef HAVE_GAS_SHF_MERGE
+#define CONST_STR_SECTION_FUNCTION \
+extern void const_str_section PARAMS ((tree, unsigned HOST_WIDE_INT)); \
+ \
+void \
+const_str_section (decl, align) \
+ tree decl; \
+ unsigned HOST_WIDE_INT align; \
+{ \
+ enum in_section in; \
+ enum machine_mode mode; \
+ const char *str; \
+ int i, j, len, unit; \
+ \
+ if (USE_CONST_SECTION \
+ && TREE_CODE (decl) == STRING_CST \
+ && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE \
+ && align <= 256) \
+ { \
+ mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (decl))); \
+ switch (GET_MODE_BITSIZE (mode)) \
+ { \
+ case 8: in = in_const_str1; break; \
+ case 16: in = in_const_str2; break; \
+ case 32: in = in_const_str4; break; \
+ case 64: in = in_const_str8; break; \
+ default: in = no_section; break; \
+ } \
+ if (align < GET_MODE_BITSIZE (mode)) \
+ align = GET_MODE_BITSIZE (mode); \
+ if (in != no_section) \
+ { \
+ str = TREE_STRING_POINTER (decl); \
+ len = TREE_STRING_LENGTH (decl); \
+ unit = GET_MODE_SIZE (mode); \
+ /* Check for embedded NUL characters. */ \
+ for (i = 0; i < len; i += unit) \
+ { \
+ for (j = 0; j < unit; j++) \
+ if (str [i + j] != '\0') \
+ break; \
+ if (j == unit) \
+ break; \
+ } \
+ if (i == len - unit) \
+ { \
+ unit = GET_MODE_BITSIZE (mode) / 8; \
+ if (!i && GET_MODE_BITSIZE (mode) < align) \
+ { \
+ /* A "" string with requested alignment greater than \
+ character size might cause a problem: \
+ if some other string required even bigger \
+ alignment than "", then linker might think the \
+ "" is just part of padding after some other string \
+ and not put it into the hash table initially. \
+ But this means "" could have smaller alignment \
+ than requested. */ \
+ if (USE_GAS_SUBSECTION_ORDERING) \
+ fprintf (asm_out_file, \
+"\t.section\t.rodata.str%d.%d,\"ams\",@progbits,%d\n\t.subsection\t-1", \
+ unit, align / 8, unit); \
+ else \
+ const_section (); \
+ return; \
+ } \
+ in = (enum in_section) ((int) in + align / 8); \
+ if (in_section != in) \
+ { \
+ fprintf (asm_out_file, \
+"\t.section\t.rodata.str%d.%d,\"ams\",@progbits,%d\n", \
+ unit, align / 8, unit); \
+ in_section = in; \
+ } \
+ return; \
+ } \
+ } \
+ } \
+ const_section (); \
+}
+
+#define CONST_VAR_SECTION_FUNCTION \
+extern void const_var_section \
+ PARAMS ((enum machine_mode, unsigned HOST_WIDE_INT)); \
+ \
+void \
+const_var_section (mode, align) \
+ enum machine_mode mode; \
+ unsigned HOST_WIDE_INT align; \
+{ \
+ if (mode != VOIDmode && mode != BLKmode \
+ && GET_MODE_BITSIZE (mode) <= align) \
+ { \
+ enum in_section in; \
+ \
+ switch (align) \
+ { \
+ case 8: in = in_const_cst1; break; \
+ case 16: in = in_const_cst2; break; \
+ case 32: in = in_const_cst4; break; \
+ case 64: in = in_const_cst8; break; \
+ case 128: in = in_const_cst16; break; \
+ default: in = no_section; break; \
+ } \
+ if (in_section != no_section) \
+ { \
+ if (in_section != in) \
+ { \
+ fprintf (asm_out_file, \
+"\t.section\t.rodata.cst%d,\"am\",@progbits,%d\n", \
+ align / 8, align / 8); \
+ in_section = in; \
+ } \
+ return; \
+ } \
+ } \
+ const_section (); \
+}
+#else
+#define CONST_STR_SECTION_FUNCTION
+#define CONST_VAR_SECTION_FUNCTION
+#define const_str_section(DECL) const_section ()
+#define const_var_section(MODE,ALIGN) const_section ()
+#endif
+
#define CONST_SECTION_FUNCTION \
void \
const_section () \
@@ -468,11 +608,14 @@ dtors_section () \
/* A C statement or statements to switch to the appropriate
section for output of RTX in mode MODE. RTX is some kind
of constant in RTL. The argument MODE is redundant except
- in the case of a `const_int' rtx. Currently, these always
- go into the const section. */
+ in the case of a `const_int' rtx.
+ If assembler supports SHF_MERGE sections, put it into
+ a .rodata.cstN section where N is size of the constant,
+ otherwise into const section. */
#undef SELECT_RTX_SECTION
-#define SELECT_RTX_SECTION(MODE, RTX) const_section ()
+#define SELECT_RTX_SECTION(MODE, RTX, ALIGN) \
+ const_var_section ((MODE), (ALIGN))
/* A C statement or statements to switch to the appropriate
section for output of DECL. DECL is either a `VAR_DECL' node
@@ -480,12 +623,12 @@ dtors_section () \
the initial value of DECL requires link-time relocations. */
#undef SELECT_SECTION
-#define SELECT_SECTION(DECL, RELOC) \
+#define SELECT_SECTION(DECL, RELOC, ALIGN) \
{ \
if (TREE_CODE (DECL) == STRING_CST) \
{ \
if (! flag_writable_strings) \
- const_section (); \
+ const_str_section ((DECL), (ALIGN)); \
else \
data_section (); \
} \
@@ -497,8 +640,10 @@ dtors_section () \
|| (DECL_INITIAL (DECL) != error_mark_node \
&& !TREE_CONSTANT (DECL_INITIAL (DECL)))) \
data_section (); \
+ else if (TREE_CODE (DECL_INITIAL (DECL)) == STRING_CST) \
+ const_str_section (DECL_INITIAL (DECL), (ALIGN)); \
else \
- const_section (); \
+ const_var_section (DECL_MODE (DECL), (ALIGN)); \
} \
else if (TREE_CODE (DECL) == CONSTRUCTOR) \
{ \
--- gcc/config/nextstep.h.jj Wed Apr 18 17:20:57 2001
+++ gcc/config/nextstep.h Fri Apr 20 14:58:28 2001
@@ -455,7 +455,7 @@ objc_section_init () \
#define READONLY_DATA_SECTION const_section
#undef SELECT_SECTION
-#define SELECT_SECTION(exp,reloc) \
+#define SELECT_SECTION(exp,reloc,align) \
do \
{ \
if (TREE_CODE (exp) == STRING_CST) \
@@ -573,7 +573,7 @@ objc_section_init () \
while (0)
#undef SELECT_RTX_SECTION
-#define SELECT_RTX_SECTION(mode, rtx) \
+#define SELECT_RTX_SECTION(mode, rtx, align) \
do \
{ \
if (GET_MODE_SIZE(mode) == 8) \
--- gcc/config/svr3.h.jj Thu Sep 28 10:33:05 2000
+++ gcc/config/svr3.h Fri Apr 20 14:58:28 2001
@@ -341,7 +341,7 @@ dtors_section () \
or a constant of some sort. RELOC indicates whether forming
the initial value of DECL requires link-time relocations. */
-#define SELECT_SECTION(DECL,RELOC) \
+#define SELECT_SECTION(DECL,RELOC,ALIGN) \
{ \
if (TREE_CODE (DECL) == STRING_CST) \
{ \
@@ -371,4 +371,4 @@ dtors_section () \
in the case of a `const_int' rtx. Currently, these always
go into the const section. */
-#define SELECT_RTX_SECTION(MODE,RTX) const_section()
+#define SELECT_RTX_SECTION(MODE,RTX,ALIGN) const_section()
--- gcc/config/darwin.h.jj Thu Apr 12 04:12:59 2001
+++ gcc/config/darwin.h Fri Apr 20 14:58:28 2001
@@ -507,7 +507,7 @@ void alias_section (name, alias) \
#define READONLY_DATA_SECTION const_section
#undef SELECT_SECTION
-#define SELECT_SECTION(exp,reloc) \
+#define SELECT_SECTION(exp,reloc,align) \
do \
{ \
if (TREE_CODE (exp) == STRING_CST) \
@@ -631,7 +631,7 @@ void alias_section (name, alias) \
while (0)
#undef SELECT_RTX_SECTION
-#define SELECT_RTX_SECTION(mode, rtx) \
+#define SELECT_RTX_SECTION(mode, rtx, align) \
do \
{ \
if (GET_MODE_SIZE (mode) == 8) \
--- gcc/config/alpha/elf.h.jj Wed Apr 18 17:20:57 2001
+++ gcc/config/alpha/elf.h Fri Apr 20 14:58:28 2001
@@ -436,7 +436,7 @@ void FN () \
while (0)
#undef SELECT_SECTION
-#define SELECT_SECTION(DECL, RELOC) \
+#define SELECT_SECTION(DECL, RELOC, ALIGN) \
do \
{ \
typedef void (*sec_fn) PARAMS ((void)); \
@@ -503,7 +503,7 @@ void FN () \
go into the const section. */
#undef SELECT_RTX_SECTION
-#define SELECT_RTX_SECTION(MODE, RTX) \
+#define SELECT_RTX_SECTION(MODE, RTX, ALIGN) \
const_section()
/* Define the strings used for the special svr4 .type and .size directives.
--- gcc/config/arm/aof.h.jj Wed Apr 18 17:20:57 2001
+++ gcc/config/arm/aof.h Fri Apr 20 14:58:28 2001
@@ -55,7 +55,7 @@ Boston, MA 02111-1307, USA. */
char *aof_text_section ();
#define TEXT_SECTION_ASM_OP aof_text_section ()
-#define SELECT_RTX_SECTION(MODE,RTX) text_section ();
+#define SELECT_RTX_SECTION(MODE,RTX,ALIGN) text_section ();
char *aof_data_section ();
#define DATA_SECTION_ASM_OP aof_data_section ()
--- gcc/config/arm/linux-elf.h.jj Wed Apr 18 17:20:57 2001
+++ gcc/config/arm/linux-elf.h Fri Apr 20 14:58:28 2001
@@ -150,7 +150,7 @@ const_section () \
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. */
-#define SELECT_SECTION(DECL,RELOC) \
+#define SELECT_SECTION(DECL,RELOC,ALIGN) \
{ \
if (TREE_CODE (DECL) == STRING_CST) \
{ \
@@ -217,7 +217,7 @@ const_section () \
of constant in RTL. The argument MODE is redundant except
in the case of a `const_int' rtx. Currently, these always
go into the const section. */
-#define SELECT_RTX_SECTION(MODE,RTX) const_section ()
+#define SELECT_RTX_SECTION(MODE,RTX,ALIGN) const_section ()
/* On svr4, we *do* have support for the .init and .fini sections, and we
can put stuff in there to be executed before and after `main'. We let
--- gcc/config/avr/avr.h.jj Wed Apr 18 17:21:30 2001
+++ gcc/config/avr/avr.h Fri Apr 20 14:58:28 2001
@@ -2027,7 +2027,7 @@ progmem_section (void) \
If these items should be placed in the text section, this macro
should not be defined. */
-/* `SELECT_SECTION (EXP, RELOC)'
+/* `SELECT_SECTION (EXP, RELOC, ALIGN)'
A C statement or statements to switch to the appropriate section
for output of EXP. You can assume that EXP is either a `VAR_DECL'
node or a constant of some sort. RELOC indicates whether the
@@ -2038,7 +2038,7 @@ progmem_section (void) \
Do not define this macro if you put all read-only variables and
constants in the read-only data section (usually the text section). */
-/* `SELECT_RTX_SECTION (MODE, RTX)'
+/* `SELECT_RTX_SECTION (MODE, RTX, ALIGN)'
A C statement or statements to switch to the appropriate section
for output of RTX in mode MODE. You can assume that RTX is some
kind of constant in RTL. The argument MODE is redundant except in
--- gcc/config/c4x/c4x.h.jj Wed Apr 18 17:20:57 2001
+++ gcc/config/c4x/c4x.h Fri Apr 20 14:58:28 2001
@@ -2118,7 +2118,7 @@ dtors_section () \
or a constant of some sort. RELOC indicates whether forming
the initial value of DECL requires link-time relocations. */
-#define SELECT_SECTION(DECL, RELOC) \
+#define SELECT_SECTION(DECL, RELOC, ALIGN) \
{ \
if (TREE_CODE (DECL) == STRING_CST) \
{ \
@@ -2163,7 +2163,7 @@ dtors_section () \
in the case of a `const_int' rtx. Currently, these always
go into the const section. */
-#define SELECT_RTX_SECTION(MODE, RTX) const_section()
+#define SELECT_RTX_SECTION(MODE, RTX, ALIGN) const_section()
/* Overall Framework of an Assembler File. */
--- gcc/config/d30v/d30v.h.jj Wed Apr 18 17:20:57 2001
+++ gcc/config/d30v/d30v.h Fri Apr 20 14:58:28 2001
@@ -3945,7 +3945,7 @@ extern const char *d30v_branch_cost_stri
the read-only data section (usually the text section).
Defined in svr4.h. */
-/* #define SELECT_SECTION(EXP, RELOC) */
+/* #define SELECT_SECTION(EXP, RELOC, ALIGN) */
/* A C statement or statements to switch to the appropriate section for output
of RTX in mode MODE. You can assume that RTX is some kind of constant in
@@ -3957,7 +3957,7 @@ extern const char *d30v_branch_cost_stri
section.
Defined in svr4.h. */
-/* #define SELECT_RTX_SECTION(MODE, RTX) */
+/* #define SELECT_RTX_SECTION(MODE, RTX, ALIGN) */
/* Define this macro if jump tables (for `tablejump' insns) should be output in
the text section, along with the assembler instructions. Otherwise, the
--- gcc/config/i386/dgux.h.jj Fri Nov 3 10:53:38 2000
+++ gcc/config/i386/dgux.h Fri Apr 20 14:58:28 2001
@@ -232,7 +232,7 @@ Boston, MA 02111-1307, USA. */
/* Must use data section for relocatable constants when pic. */
#undef SELECT_RTX_SECTION
-#define SELECT_RTX_SECTION(MODE,RTX) \
+#define SELECT_RTX_SECTION(MODE,RTX,ALIGN) \
{ \
if (flag_pic && symbolic_operand (RTX, VOIDmode)) \
data_section (); \
--- gcc/config/i386/osfrose.h.jj Wed Apr 18 17:20:58 2001
+++ gcc/config/i386/osfrose.h Fri Apr 20 14:58:28 2001
@@ -571,7 +571,7 @@ while (0)
and select that section. */
#undef SELECT_RTX_SECTION
-#define SELECT_RTX_SECTION(MODE, RTX) \
+#define SELECT_RTX_SECTION(MODE, RTX, ALIGN) \
do \
{ \
if (MODE == Pmode && HALF_PIC_P () && HALF_PIC_ADDRESS_P (RTX)) \
@@ -582,7 +582,7 @@ do \
while (0)
#undef SELECT_SECTION
-#define SELECT_SECTION(DECL, RELOC) \
+#define SELECT_SECTION(DECL, RELOC, ALIGN) \
{ \
if (RELOC && HALF_PIC_P ()) \
data_section (); \
--- gcc/config/i386/sco5.h.jj Wed Apr 18 17:20:58 2001
+++ gcc/config/i386/sco5.h Fri Apr 20 14:58:28 2001
@@ -374,7 +374,7 @@ do { \
/* Must use data section for relocatable constants when pic. */
#undef SELECT_RTX_SECTION
-#define SELECT_RTX_SECTION(MODE,RTX) \
+#define SELECT_RTX_SECTION(MODE,RTX,ALIGN) \
{ \
if (TARGET_ELF) { \
if (flag_pic && symbolic_operand (RTX, VOIDmode)) \
@@ -663,7 +663,7 @@ dtors_section () \
: 0))
#undef SELECT_SECTION
-#define SELECT_SECTION(DECL,RELOC) \
+#define SELECT_SECTION(DECL,RELOC,ALIGN) \
{ \
if (TARGET_ELF && flag_pic && RELOC) \
data_section (); \
--- gcc/config/i386/svr3gas.h.jj Mon Feb 12 10:30:02 2001
+++ gcc/config/i386/svr3gas.h Fri Apr 20 14:58:28 2001
@@ -231,7 +231,7 @@ dtors_section () \
or a constant of some sort. RELOC indicates whether forming
the initial value of DECL requires link-time relocations. */
-#define SELECT_SECTION(DECL,RELOC) \
+#define SELECT_SECTION(DECL,RELOC,ALIGN) \
{ \
if (TREE_CODE (DECL) == STRING_CST) \
{ \
@@ -261,7 +261,7 @@ dtors_section () \
in the case of a `const_int' rtx. Currently, these always
go into the const section. */
-#define SELECT_RTX_SECTION(MODE,RTX) const_section()
+#define SELECT_RTX_SECTION(MODE,RTX,ALIGN) const_section()
/* This is copied from i386/sysv3.h. */
--- gcc/config/ia64/sysv4.h.jj Wed Apr 18 17:20:59 2001
+++ gcc/config/ia64/sysv4.h Fri Apr 20 14:58:28 2001
@@ -182,7 +182,7 @@ do { \
/* We override svr4.h so that we can support the sdata section. */
#undef SELECT_SECTION
-#define SELECT_SECTION(DECL,RELOC) \
+#define SELECT_SECTION(DECL,RELOC,ALIGN) \
{ \
if (TREE_CODE (DECL) == STRING_CST) \
{ \
@@ -216,7 +216,7 @@ do { \
extern unsigned int ia64_section_threshold;
#undef SELECT_RTX_SECTION
-#define SELECT_RTX_SECTION(MODE, RTX) \
+#define SELECT_RTX_SECTION(MODE, RTX, ALIGN) \
{ \
if (GET_MODE_SIZE (MODE) > 0 \
&& GET_MODE_SIZE (MODE) <= ia64_section_threshold) \
--- gcc/config/m32r/m32r.h.jj Fri Jan 26 11:56:14 2001
+++ gcc/config/m32r/m32r.h Fri Apr 20 14:58:28 2001
@@ -1630,7 +1630,8 @@ sbss_section () \
or a constant of some sort. RELOC indicates whether the initial value
of EXP requires link-time relocations. */
#undef SELECT_SECTION
-#define SELECT_SECTION(EXP, RELOC) m32r_select_section ((EXP), (RELOC))
+#define SELECT_SECTION(EXP, RELOC, ALIGN) \
+ m32r_select_section ((EXP), (RELOC))
/* A C statement or statements to switch to the appropriate section for
output of RTX in mode MODE. You can assume that RTX
--- gcc/config/m68k/m68k.h.jj Mon Mar 12 11:45:23 2001
+++ gcc/config/m68k/m68k.h Fri Apr 20 14:58:28 2001
@@ -323,7 +323,7 @@ extern int target_flags;
/* This is how to align an instruction for optimal branching. */
#define LABEL_ALIGN_AFTER_BARRIER(LABEL) (m68k_align_jumps)
-#define SELECT_RTX_SECTION(MODE, X) \
+#define SELECT_RTX_SECTION(MODE, X, ALIGN) \
{ \
if (!flag_pic) \
readonly_data_section(); \
--- gcc/config/m88k/dgux.h.jj Thu Dec 7 10:57:34 2000
+++ gcc/config/m88k/dgux.h Fri Apr 20 14:58:28 2001
@@ -294,7 +294,7 @@ func_ptr __DTOR_END__[1] = { (func_ptr)
/* Must use data section for relocatable constants when pic. */
#undef SELECT_RTX_SECTION
-#define SELECT_RTX_SECTION(MODE,RTX) \
+#define SELECT_RTX_SECTION(MODE,RTX,ALIGN) \
{ \
if (flag_pic && symbolic_operand (RTX)) \
data_section (); \
--- gcc/config/m88k/m88k.h.jj Sun Nov 12 22:32:52 2000
+++ gcc/config/m88k/m88k.h Fri Apr 20 14:58:29 2001
@@ -2528,7 +2528,7 @@ sdata_section () \
For strings, the section is selected before the segment info is encoded. */
#undef SELECT_SECTION
-#define SELECT_SECTION(DECL,RELOC) \
+#define SELECT_SECTION(DECL,RELOC,ALIGN) \
{ \
if (TREE_CODE (DECL) == STRING_CST) \
{ \
--- gcc/config/mcore/mcore-pe.h.jj Thu Sep 28 10:33:09 2000
+++ gcc/config/mcore/mcore-pe.h Fri Apr 20 14:58:29 2001
@@ -81,7 +81,7 @@ rdata_section () \
or a constant of some sort. RELOC indicates whether forming
the initial value of DECL requires link-time relocations. */
#undef SELECT_SECTION
-#define SELECT_SECTION(DECL, RELOC) \
+#define SELECT_SECTION(DECL, RELOC, ALIGN) \
{ \
if (TREE_CODE (DECL) == STRING_CST) \
{ \
@@ -111,7 +111,7 @@ rdata_section () \
in the case of a `const_int' rtx. Currently, these always
go into the const section. */
#undef SELECT_RTX_SECTION
-#define SELECT_RTX_SECTION(MODE, RTX) rdata_section ()
+#define SELECT_RTX_SECTION(MODE, RTX, ALIGN) rdata_section ()
#define MCORE_EXPORT_NAME(STREAM, NAME) \
do \
--- gcc/config/mips/mips.h.jj Tue Mar 20 13:44:54 2001
+++ gcc/config/mips/mips.h Fri Apr 20 14:58:29 2001
@@ -4510,9 +4510,10 @@ rdata_section () \
/* Given a decl node or constant node, choose the section to output it in
and select that section. */
-#define SELECT_RTX_SECTION(MODE,RTX) mips_select_rtx_section (MODE, RTX)
+#define SELECT_RTX_SECTION(MODE,RTX,ALIGN) \
+ mips_select_rtx_section (MODE, RTX)
-#define SELECT_SECTION(DECL, RELOC) mips_select_section (DECL, RELOC)
+#define SELECT_SECTION(DECL, RELOC, ALIGN) mips_select_section (DECL, RELOC)
/* Store in OUTPUT a string (made with alloca) containing
--- gcc/config/pa/pa-linux.h.jj Wed Apr 18 17:21:00 2001
+++ gcc/config/pa/pa-linux.h Fri Apr 20 14:58:29 2001
@@ -55,7 +55,7 @@ Boston, MA 02111-1307, USA. */
/* Put plabels into the data section so we can relocate them. */
#undef SELECT_RTX_SECTION
-#define SELECT_RTX_SECTION(MODE,RTX) \
+#define SELECT_RTX_SECTION(MODE,RTX,ALIGN) \
if (flag_pic && function_label_operand (RTX, MODE)) \
data_section (); \
else \
--- gcc/config/pa/pa.h.jj Wed Apr 18 17:21:00 2001
+++ gcc/config/pa/pa.h Fri Apr 20 14:58:29 2001
@@ -1440,7 +1440,7 @@ do { \
library. Since we can't know at compile time if a symbol will be
satisfied by a shared library or main program we put any symbolic
constant into the normal data section. */
-#define SELECT_RTX_SECTION(MODE,RTX) \
+#define SELECT_RTX_SECTION(MODE,RTX,ALIGN) \
if (symbolic_operand (RTX, MODE)) \
data_section (); \
else \
@@ -1450,7 +1450,7 @@ do { \
in the read-only data section to a symbol defined in a shared
library. Therefore, expressions that might require a reloc can
not be placed in the read-only data section. */
-#define SELECT_SECTION(EXP,RELOC) \
+#define SELECT_SECTION(EXP,RELOC,ALIGN) \
if (TREE_CODE (EXP) == VAR_DECL \
&& TREE_READONLY (EXP) \
&& !TREE_THIS_VOLATILE (EXP) \
--- gcc/config/romp/romp.h.jj Sun Jan 7 12:30:35 2001
+++ gcc/config/romp/romp.h Fri Apr 20 14:58:29 2001
@@ -717,7 +717,7 @@ struct rt_cargs {int gregs, fregs; };
On ROMP, all constants are in the data area. */
-#define SELECT_RTX_SECTION(MODE, X) data_section ()
+#define SELECT_RTX_SECTION(MODE, X, ALIGN) data_section ()
/* This macro generates the assembly code for function entry.
FILE is a stdio stream to output the code to.
--- gcc/config/rs6000/aix.h.jj Wed Apr 18 17:21:01 2001
+++ gcc/config/rs6000/aix.h Fri Apr 20 14:58:29 2001
@@ -219,7 +219,7 @@ toc_section () \
On the RS/6000, we have a special section for all variables except those
that are static. */
-#define SELECT_SECTION(EXP,RELOC) \
+#define SELECT_SECTION(EXP,RELOC,ALIGN) \
{ \
if ((TREE_CODE (EXP) == STRING_CST \
&& ! flag_writable_strings) \
@@ -274,7 +274,7 @@ toc_section () \
However, if this is being placed in the TOC it must be output as a
toc entry. */
-#define SELECT_RTX_SECTION(MODE, X) \
+#define SELECT_RTX_SECTION(MODE, X, ALIGN) \
{ if (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (X, MODE)) \
toc_section (); \
else \
--- gcc/config/rs6000/sysv4.h.jj Mon Mar 12 11:45:28 2001
+++ gcc/config/rs6000/sysv4.h Fri Apr 20 14:58:29 2001
@@ -573,7 +573,7 @@ fini_section () \
/* Override elfos.h definition. */
#undef SELECT_RTX_SECTION
-#define SELECT_RTX_SECTION(MODE, X) rs6000_select_rtx_section (MODE, X)
+#define SELECT_RTX_SECTION(MODE, X, ALIGN) rs6000_select_rtx_section (MODE, X)
/* A C statement or statements to switch to the appropriate
section for output of DECL. DECL is either a `VAR_DECL' node
@@ -582,7 +582,7 @@ fini_section () \
/* Override elfos.h definition. */
#undef SELECT_SECTION
-#define SELECT_SECTION(DECL, RELOC) rs6000_select_section (DECL, RELOC)
+#define SELECT_SECTION(DECL, RELOC, ALIGN) rs6000_select_section (DECL, RELOC)
/* A C statement to build up a unique section name, expressed as a
STRING_CST node, and assign it to DECL_SECTION_NAME (decl).
--- gcc/config/sparc/sparc.h.jj Wed Apr 18 17:21:02 2001
+++ gcc/config/sparc/sparc.h Fri Apr 20 14:58:29 2001
@@ -911,7 +911,7 @@ if (TARGET_ARCH64 \
#endif
/* This is defined differently for v9 in a cover file. */
-#define SELECT_SECTION(T,RELOC) \
+#define SELECT_SECTION(T,RELOC,ALIGN) \
{ \
if (TREE_CODE (T) == VAR_DECL) \
{ \
@@ -944,7 +944,7 @@ if (TARGET_ARCH64 \
/* Use text section for a constant
unless we need more alignment than that offers. */
/* This is defined differently for v9 in a cover file. */
-#define SELECT_RTX_SECTION(MODE, X) \
+#define SELECT_RTX_SECTION(MODE, X, ALIGN) \
{ \
if (GET_MODE_BITSIZE (MODE) <= MAX_TEXT_ALIGN \
&& ! (flag_pic && (symbolic_operand ((X), (MODE)) || SUNOS4_SHARED_LIBRARIES))) \
--- gcc/config/sparc/sysv4.h.jj Thu Dec 7 10:57:35 2000
+++ gcc/config/sparc/sysv4.h Fri Apr 20 14:58:29 2001
@@ -79,7 +79,7 @@ Boston, MA 02111-1307, USA. */
/* Must use data section for relocatable constants when pic. */
#undef SELECT_RTX_SECTION
-#define SELECT_RTX_SECTION(MODE,RTX) \
+#define SELECT_RTX_SECTION(MODE,RTX,ALIGN) \
{ \
if (flag_pic && symbolic_operand ((RTX), (MODE))) \
data_section (); \
--- gcc/config/v850/v850.h.jj Fri Jan 12 11:35:45 2001
+++ gcc/config/v850/v850.h Fri Apr 20 14:58:29 2001
@@ -1181,7 +1181,7 @@ zbss_section () \
Do not define this macro if you put all read-only variables and
constants in the read-only data section (usually the text section). */
#undef SELECT_SECTION
-#define SELECT_SECTION(EXP, RELOC) \
+#define SELECT_SECTION(EXP, RELOC, ALIGN) \
do { \
if (TREE_CODE (EXP) == VAR_DECL) \
{ \
@@ -1244,7 +1244,7 @@ do { \
Do not define this macro if you put all constants in the read-only
data section. */
-/* #define SELECT_RTX_SECTION(MODE, RTX) */
+/* #define SELECT_RTX_SECTION(MODE, RTX, ALIGN) */
/* Output at beginning/end of assembler file. */
#undef ASM_FILE_START
--- gcc/config/vax/vms.h.jj Fri Apr 20 00:57:40 2001
+++ gcc/config/vax/vms.h Fri Apr 20 14:58:29 2001
@@ -249,7 +249,7 @@ const_section () \
Since this macro is used in a number of places, we must also be able
to decide where to place string constants. */
-#define SELECT_SECTION(T,RELOC) \
+#define SELECT_SECTION(T,RELOC,ALIGN) \
{ \
if (TREE_CODE (T) == VAR_DECL) \
{ \
--- gcc/configure.in.jj Wed Apr 18 17:20:25 2001
+++ gcc/configure.in Fri Apr 20 14:58:28 2001
@@ -1343,6 +1343,26 @@ if test x"$gcc_cv_as_leb128" = xyes; the
fi
AC_MSG_RESULT($gcc_cv_as_leb128)
+AC_MSG_CHECKING(assembler section merging support)
+gcc_cv_as_shf_merge=no
+if test x$gcc_cv_gas_major_version != x -a x$gcc_cv_gas_minor_version != x; then
+ if test "$gcc_cv_gas_major_version" -eq 2 -a "$gcc_cv_gas_minor_version" -ge 12 -o "$gcc_cv_gas_major_version" -gt 2 && grep 'obj_format = elf' ../gas/Makefile > /dev/null; then
+ gcc_cv_as_subsections="working SHF_MERGE support"
+ fi
+elif test x$gcc_cv_as != x; then
+ # Check if we support SHF_MERGE sections
+ echo '.section .rodata.str, "ams", @progbits, 1' > conftest.s
+ if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then
+ gcc_cv_as_shf_merge=yes
+ fi
+ rm -f conftest.s conftest.o
+fi
+if test x"$gcc_cv_as_shf_merge" = xyes; then
+ AC_DEFINE(HAVE_GAS_SHF_MERGE, 1,
+[Define if your assembler supports marking sections with SHF_MERGE flag.])
+fi
+AC_MSG_RESULT($gcc_cv_as_shf_merge)
+
case "$target" in
sparc*-*-*)
AC_CACHE_CHECK([assembler .register pseudo-op support],
--- gcc/config.in.jj Wed Apr 18 17:20:25 2001
+++ gcc/config.in Fri Apr 20 14:58:29 2001
@@ -454,6 +454,9 @@
/* Define if your assembler supports .uleb128. */
#undef HAVE_AS_LEB128
+/* Define if your assembler supports marking sections with SHF_MERGE flag. */
+#undef HAVE_GAS_SHF_MERGE
+
/* Define if your assembler supports .register. */
#undef HAVE_AS_REGISTER_PSEUDO_OP
--- gcc/configure.jj Wed Apr 18 17:20:25 2001
+++ gcc/configure Fri Apr 20 14:58:29 2001
@@ -6564,6 +6564,29 @@ EOF
fi
echo "$ac_t""$gcc_cv_as_leb128" 1>&6
+echo $ac_n "checking assembler section merging support""... $ac_c" 1>&6
+echo "configure:6569: checking assembler section merging support" >&5
+gcc_cv_as_shf_merge=no
+if test x$gcc_cv_gas_major_version != x -a x$gcc_cv_gas_minor_version != x; then
+ if test "$gcc_cv_gas_major_version" -eq 2 -a "$gcc_cv_gas_minor_version" -ge 12 -o "$gcc_cv_gas_major_version" -gt 2 && grep 'obj_format = elf' ../gas/Makefile > /dev/null; then
+ gcc_cv_as_subsections="working SHF_MERGE support"
+ fi
+elif test x$gcc_cv_as != x; then
+ # Check if we support SHF_MERGE sections
+ echo '.section .rodata.str, "ams", @progbits, 1' > conftest.s
+ if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1; then
+ gcc_cv_as_shf_merge=yes
+ fi
+ rm -f conftest.s conftest.o
+fi
+if test x"$gcc_cv_as_shf_merge" = xyes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_GAS_SHF_MERGE 1
+EOF
+
+fi
+echo "$ac_t""$gcc_cv_as_shf_merge" 1>&6
+
case "$target" in
sparc*-*-*)
echo $ac_n "checking assembler .register pseudo-op support""... $ac_c" 1>&6
--- gcc/varasm.c.jj Wed Apr 18 17:20:56 2001
+++ gcc/varasm.c Fri Apr 20 14:58:29 2001
@@ -452,7 +452,7 @@ variable_section (decl, reloc)
for them. */
#ifdef SELECT_SECTION
- SELECT_SECTION (decl, reloc);
+ SELECT_SECTION (decl, reloc, DECL_ALIGN (decl));
#else
if (DECL_READONLY_SECTION (decl, reloc))
readonly_data_section ();
@@ -3214,13 +3214,19 @@ output_constant_def_contents (exp, reloc
{
int align;
+ /* Align the location counter as required by EXP's data type. */
+ align = TYPE_ALIGN (TREE_TYPE (exp));
+#ifdef CONSTANT_ALIGNMENT
+ align = CONSTANT_ALIGNMENT (exp, align);
+#endif
+
if (IN_NAMED_SECTION (exp))
named_section (exp, NULL, reloc);
else
{
/* First switch to text section, except for writable strings. */
#ifdef SELECT_SECTION
- SELECT_SECTION (exp, reloc);
+ SELECT_SECTION (exp, reloc, align);
#else
if (((TREE_CODE (exp) == STRING_CST) && flag_writable_strings)
|| (flag_pic && reloc))
@@ -3230,12 +3236,6 @@ output_constant_def_contents (exp, reloc
#endif
}
- /* Align the location counter as required by EXP's data type. */
- align = TYPE_ALIGN (TREE_TYPE (exp));
-#ifdef CONSTANT_ALIGNMENT
- align = CONSTANT_ALIGNMENT (exp, align);
-#endif
-
if (align > BITS_PER_UNIT)
ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
@@ -3783,7 +3783,7 @@ output_constant_pool (fnname, fndecl)
/* First switch to correct section. */
#ifdef SELECT_RTX_SECTION
- SELECT_RTX_SECTION (pool->mode, x);
+ SELECT_RTX_SECTION (pool->mode, x, pool->align * BITS_PER_UNIT);
#else
readonly_data_section ();
#endif
--- gcc/tm.texi.jj Wed Apr 18 17:20:56 2001
+++ gcc/tm.texi Fri Apr 20 14:58:29 2001
@@ -5348,25 +5348,26 @@ If these items should be placed in the t
not be defined.
@findex SELECT_SECTION
-@item SELECT_SECTION (@var{exp}, @var{reloc})
+@item SELECT_SECTION (@var{exp}, @var{reloc}, @var{align})
A C statement or statements to switch to the appropriate section for
output of @var{exp}. You can assume that @var{exp} is either a
@code{VAR_DECL} node or a constant of some sort. @var{reloc}
indicates whether the initial value of @var{exp} requires link-time
relocations. Select the section by calling @code{text_section} or one
-of the alternatives for other sections.
+of the alternatives for other sections. @var{align} is the constant
+alignment in bits.
Do not define this macro if you put all read-only variables and
constants in the read-only data section (usually the text section).
@findex SELECT_RTX_SECTION
-@item SELECT_RTX_SECTION (@var{mode}, @var{rtx})
+@item SELECT_RTX_SECTION (@var{mode}, @var{rtx}, @var{align})
A C statement or statements to switch to the appropriate section for
output of @var{rtx} in mode @var{mode}. You can assume that @var{rtx}
is some kind of constant in RTL. The argument @var{mode} is redundant
except in the case of a @code{const_int} rtx. Select the section by
calling @code{text_section} or one of the alternatives for other
-sections.
+sections. @var{align} is the constant alignment in bits.
Do not define this macro if you put all constants in the read-only
data section.
Jakub