aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2001-09-11 18:50:05 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2001-09-11 18:50:05 +0200
commit201556f0e005802b8ebb206a193a6feb55a555af (patch)
tree1e64917dd6eadf802b7c67e6f7384cc9fc03f1ae /gcc/config
parentd21b1cb8741f7dfbeab6a456d67b322312933a8c (diff)
downloadgcc-201556f0e005802b8ebb206a193a6feb55a555af.zip
gcc-201556f0e005802b8ebb206a193a6feb55a555af.tar.gz
gcc-201556f0e005802b8ebb206a193a6feb55a555af.tar.bz2
configure.in: Check whether assembler supports section merging.
* 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. (mergeable_string_section): New. (mergeable_constant_section): New. (default_elf_asm_named_section): Output SECTION_MERGE and SECTION_STRINGS flags plus SECTION_ENTSIZE entity size. * output.h (mergeable_string_section): New. (mergeable_constant_section): New. (SECTION_MERGE, SECTION_STRINGS, SECTION_ENTSIZE): Define. * toplev.c (flag_merge_constants): New. (f_options): Add -fmerge-constants and -fmerge-all-constants options. (toplev_main): Default to -fno-merge-constants if not optimizing. * flags.h (flag_merge_constants): Add extern. * invoke.texi (-fmerge-constants, -fmerge-all-constants): Document. * tm.texi (SELECT_SECTION, SELECT_RTX_SECTION): Document added third argument. * config/elfos.h (ASM_SECTION_START_OP, ASM_OUTPUT_SECTION_START): Define if assembler has working .subsection -1 support. (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/ia64/sysv4.h (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/alpha/elf.h: Likewise. (ASM_SECTION_START_OP, ASM_OUTPUT_SECTION_START): Define if assembler has working .subsection -1 support. * config/nextstep.h: Add third argument to SELECT_RTX_SECTION and SELECT_SECTION. * config/svr3.h: Likewise. * config/darwin.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/aix.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.h: Likewise. * config/pa/pa-linux.h: Likewise. * config/romp/romp.h: Likewise. * config/rs6000/sysv4.h: Likewise. * config/rs6000/xcoff.h: Likewise. * config/s390/linux.h: Likewise. * config/sparc/sparc.h: Likewise. * config/sparc/sysv4.h: Likewise. * config/stormy16/stormy16.h: Likewise. * config/v850/v850.h: Likewise. * config/vax/vms.h: Likewise. * config/arm/arm.c (arm_elf_asm_named_section): Output SECTION_MERGE and SECTION_STRINGS flags plus SECTION_ENTSIZE entity size. * config/sparc/sparc.c (sparc_elf_asm_named_section): Use default_elf_asm_named_section for SHF_MERGE sections. * com.c (ffe_init_options): Default to -fmerge-all-constants if optimizing. From-SVN: r45548
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/alpha/elf.h92
-rw-r--r--gcc/config/arm/aof.h2
-rw-r--r--gcc/config/arm/arm.c12
-rw-r--r--gcc/config/arm/linux-elf.h4
-rw-r--r--gcc/config/avr/avr.h4
-rw-r--r--gcc/config/c4x/c4x.h4
-rw-r--r--gcc/config/d30v/d30v.h4
-rw-r--r--gcc/config/darwin.h4
-rw-r--r--gcc/config/elfos.h34
-rw-r--r--gcc/config/i386/dgux.h4
-rw-r--r--gcc/config/i386/osfrose.h4
-rw-r--r--gcc/config/i386/sco5.h4
-rw-r--r--gcc/config/i386/svr3gas.h4
-rw-r--r--gcc/config/ia64/aix.h4
-rw-r--r--gcc/config/ia64/sysv4.h21
-rw-r--r--gcc/config/m32r/m32r.h3
-rw-r--r--gcc/config/m68k/m68k.h2
-rw-r--r--gcc/config/m88k/dgux.h2
-rw-r--r--gcc/config/m88k/m88k.h2
-rw-r--r--gcc/config/mcore/mcore-pe.h4
-rw-r--r--gcc/config/mips/mips.h6
-rw-r--r--gcc/config/nextstep.h4
-rw-r--r--gcc/config/pa/pa-linux.h2
-rw-r--r--gcc/config/pa/pa.h4
-rw-r--r--gcc/config/romp/romp.h2
-rw-r--r--gcc/config/rs6000/sysv4.h4
-rw-r--r--gcc/config/rs6000/xcoff.h4
-rw-r--r--gcc/config/s390/linux.h2
-rw-r--r--gcc/config/sparc/sparc.c8
-rw-r--r--gcc/config/sparc/sparc.h4
-rw-r--r--gcc/config/sparc/sysv4.h2
-rw-r--r--gcc/config/stormy16/stormy16.h4
-rw-r--r--gcc/config/svr3.h4
-rw-r--r--gcc/config/v850/v850.h4
-rw-r--r--gcc/config/vax/vms.h2
35 files changed, 178 insertions, 92 deletions
diff --git a/gcc/config/alpha/elf.h b/gcc/config/alpha/elf.h
index 3bb51cc..7c2ad23 100644
--- a/gcc/config/alpha/elf.h
+++ b/gcc/config/alpha/elf.h
@@ -1,5 +1,6 @@
/* Definitions of target machine for GNU compiler, for DEC Alpha w/ELF.
- Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+ Free Software Foundation, Inc.
Contributed by Richard Henderson (rth@tamu.edu).
This file is part of GNU CC.
@@ -222,6 +223,16 @@ do { \
#undef FINI_SECTION_ASM_OP
#define FINI_SECTION_ASM_OP "\t.section\t.fini"
+#ifdef HAVE_GAS_SUBSECTION_ORDERING
+
+#define ASM_SECTION_START_OP "\t.subsection\t-1"
+
+/* Output assembly directive to move to the beginning of current section. */
+#define ASM_OUTPUT_SECTION_START(FILE) \
+ fprintf ((FILE), "%s\n", ASM_SECTION_START_OP)
+
+#endif
+
/* A default list of other sections which we might be "in" at any given
time. For targets that use additional sections (e.g. .tdesc) you
should override this definition in the target-specific file which
@@ -240,8 +251,6 @@ do { \
SECTION_FUNCTION_TEMPLATE(sbss_section, in_sbss, SBSS_SECTION_ASM_OP) \
SECTION_FUNCTION_TEMPLATE(sdata_section, in_sdata, SDATA_SECTION_ASM_OP)
-extern void ctors_section PARAMS ((void));
-extern void dtors_section PARAMS ((void));
extern void sbss_section PARAMS ((void));
extern void sdata_section PARAMS ((void));
@@ -300,6 +309,8 @@ void FN () \
{ \
if (flag_writable_strings) \
SECNUM = 2; \
+ else \
+ SECNUM = 0x101; \
} \
else if (TREE_CODE (DECL) == VAR_DECL) \
{ \
@@ -311,6 +322,17 @@ void FN () \
|| TREE_SIDE_EFFECTS (DECL) \
|| ! TREE_CONSTANT (DECL_INITIAL (DECL))) \
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). */ \
+ if (TREE_CODE (DECL_INITIAL (DECL)) == STRING_CST)\
+ SECNUM = 0x201; \
+ else \
+ SECNUM = 0x301; \
+ } \
} \
else if (TREE_CODE (DECL) == CONSTRUCTOR) \
{ \
@@ -322,7 +344,7 @@ void FN () \
} \
\
/* Select small data sections based on size. */ \
- if (SECNUM >= 2) \
+ if ((SECNUM & 0xff) >= 2) \
{ \
int size = int_size_in_bytes (TREE_TYPE (DECL)); \
if (size >= 0 && size <= g_switch_value) \
@@ -332,26 +354,42 @@ void FN () \
while (0)
#undef SELECT_SECTION
-#define SELECT_SECTION(DECL, RELOC) \
- do \
- { \
- 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); \
- \
- (*sec_functions[sec]) (); \
- } \
+#define SELECT_SECTION(DECL, RELOC, ALIGN) \
+ do \
+ { \
+ 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; \
+ } \
+ } \
while (0)
#define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
@@ -380,7 +418,7 @@ void FN () \
STRIP_NAME_ENCODING (name, name); \
nlen = strlen (name); \
\
- prefix = prefixes[sec][DECL_ONE_ONLY(DECL)]; \
+ prefix = prefixes[sec & 0xff][DECL_ONE_ONLY(DECL)]; \
plen = strlen (prefix); \
\
string = alloca (nlen + plen + 1); \
@@ -399,8 +437,8 @@ void FN () \
go into the const section. */
#undef SELECT_RTX_SECTION
-#define SELECT_RTX_SECTION(MODE, RTX) \
- const_section()
+#define SELECT_RTX_SECTION(MODE, RTX, ALIGN) \
+ mergeable_constant_section((MODE), (ALIGN), 0)
/* Define the strings used for the special svr4 .type and .size directives.
These strings generally do not vary from one system running svr4 to
diff --git a/gcc/config/arm/aof.h b/gcc/config/arm/aof.h
index 2721b8b..55b8eef 100644
--- a/gcc/config/arm/aof.h
+++ b/gcc/config/arm/aof.h
@@ -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 ()
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index c3f4e2e..725864c 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -10860,6 +10860,10 @@ arm_elf_asm_named_section (name, flags)
*f++ = 'x';
if (flags & SECTION_SMALL)
*f++ = 's';
+ if (flags & SECTION_MERGE)
+ *f++ = 'M';
+ if (flags & SECTION_STRINGS)
+ *f++ = 'S';
*f = '\0';
if (flags & SECTION_BSS)
@@ -10867,6 +10871,10 @@ arm_elf_asm_named_section (name, flags)
else
type = "progbits";
- fprintf (asm_out_file, "\t.section\t%s,\"%s\",%%%s\n",
- name, flagchars, type);
+ if (flags & SECTION_ENTSIZE)
+ fprintf (asm_out_file, "\t.section\t%s,\"%s\",%%%s,%d\n",
+ name, flagchars, type, flags & SECTION_ENTSIZE);
+ else
+ fprintf (asm_out_file, "\t.section\t%s,\"%s\",%%%s\n",
+ name, flagchars, type);
}
diff --git a/gcc/config/arm/linux-elf.h b/gcc/config/arm/linux-elf.h
index 0651960..cb9014c 100644
--- a/gcc/config/arm/linux-elf.h
+++ b/gcc/config/arm/linux-elf.h
@@ -139,7 +139,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) \
{ \
@@ -204,7 +204,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
diff --git a/gcc/config/avr/avr.h b/gcc/config/avr/avr.h
index 3fd1e56..8ae9302 100644
--- a/gcc/config/avr/avr.h
+++ b/gcc/config/avr/avr.h
@@ -1890,7 +1890,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
@@ -1901,7 +1901,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
diff --git a/gcc/config/c4x/c4x.h b/gcc/config/c4x/c4x.h
index cdc39db..e8052c6 100644
--- a/gcc/config/c4x/c4x.h
+++ b/gcc/config/c4x/c4x.h
@@ -2030,7 +2030,7 @@ const_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) \
{ \
@@ -2075,7 +2075,7 @@ const_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. */
diff --git a/gcc/config/d30v/d30v.h b/gcc/config/d30v/d30v.h
index 82598fd..abf2d47 100644
--- a/gcc/config/d30v/d30v.h
+++ b/gcc/config/d30v/d30v.h
@@ -3698,7 +3698,7 @@ extern const char *d30v_branch_cost_string;
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
@@ -3710,7 +3710,7 @@ extern const char *d30v_branch_cost_string;
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
diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h
index 9124307..5c49d113 100644
--- a/gcc/config/darwin.h
+++ b/gcc/config/darwin.h
@@ -509,7 +509,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) \
@@ -633,7 +633,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) \
diff --git a/gcc/config/elfos.h b/gcc/config/elfos.h
index d813678..d2ae669 100644
--- a/gcc/config/elfos.h
+++ b/gcc/config/elfos.h
@@ -262,6 +262,16 @@ Boston, MA 02111-1307, USA. */
#define INIT_SECTION_ASM_OP "\t.section\t.init"
#define FINI_SECTION_ASM_OP "\t.section\t.fini"
+#ifdef HAVE_GAS_SUBSECTION_ORDERING
+
+#define ASM_SECTION_START_OP "\t.subsection\t-1"
+
+/* Output assembly directive to move to the beginning of current section. */
+#define ASM_OUTPUT_SECTION_START(FILE) \
+ fprintf ((FILE), "%s\n", ASM_SECTION_START_OP)
+
+#endif
+
/* A default list of other sections which we might be "in" at any given
time. For targets that use additional sections (e.g. .tdesc) you
should override this definition in the target-specific file which
@@ -340,11 +350,14 @@ const_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) \
+ mergeable_constant_section ((MODE), (ALIGN), 0)
/* A C statement or statements to switch to the appropriate
section for output of DECL. DECL is either a `VAR_DECL' node
@@ -352,12 +365,12 @@ const_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 (); \
+ mergeable_string_section ((DECL), (ALIGN), 0); \
else \
data_section (); \
} \
@@ -369,8 +382,17 @@ const_section () \
|| (DECL_INITIAL (DECL) != error_mark_node \
&& !TREE_CONSTANT (DECL_INITIAL (DECL)))) \
data_section (); \
- else \
+ 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); \
} \
else if (TREE_CODE (DECL) == CONSTRUCTOR) \
{ \
diff --git a/gcc/config/i386/dgux.h b/gcc/config/i386/dgux.h
index 04a2900..5d7a6aa 100644
--- a/gcc/config/i386/dgux.h
+++ b/gcc/config/i386/dgux.h
@@ -27,7 +27,7 @@ Boston, MA 02111-1307, USA. */
#include "i386/sysv4.h"
#ifndef VERSION_INFO2
-#define VERSION_INFO2 "$Revision: 1.12 $"
+#define VERSION_INFO2 "$Revision: 1.13 $"
#endif
#ifndef VERSION_STRING
@@ -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 (); \
diff --git a/gcc/config/i386/osfrose.h b/gcc/config/i386/osfrose.h
index 7d74f7a..785aa4f 100644
--- a/gcc/config/i386/osfrose.h
+++ b/gcc/config/i386/osfrose.h
@@ -506,7 +506,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)) \
@@ -517,7 +517,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 (); \
diff --git a/gcc/config/i386/sco5.h b/gcc/config/i386/sco5.h
index a818427..56bc287 100644
--- a/gcc/config/i386/sco5.h
+++ b/gcc/config/i386/sco5.h
@@ -371,7 +371,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)) \
@@ -565,7 +565,7 @@ init_section () \
: 0))
#undef SELECT_SECTION
-#define SELECT_SECTION(DECL,RELOC) \
+#define SELECT_SECTION(DECL,RELOC,ALIGN) \
{ \
if (TARGET_ELF && flag_pic && RELOC) \
data_section (); \
diff --git a/gcc/config/i386/svr3gas.h b/gcc/config/i386/svr3gas.h
index 8733ba7..08ada11 100644
--- a/gcc/config/i386/svr3gas.h
+++ b/gcc/config/i386/svr3gas.h
@@ -177,7 +177,7 @@ const_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) \
{ \
@@ -207,4 +207,4 @@ const_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()
diff --git a/gcc/config/ia64/aix.h b/gcc/config/ia64/aix.h
index cf1f4b0..0c63211 100644
--- a/gcc/config/ia64/aix.h
+++ b/gcc/config/ia64/aix.h
@@ -150,7 +150,7 @@ do { \
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) \
{ \
@@ -184,7 +184,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) \
diff --git a/gcc/config/ia64/sysv4.h b/gcc/config/ia64/sysv4.h
index 0abb7e8..54b5167 100644
--- a/gcc/config/ia64/sysv4.h
+++ b/gcc/config/ia64/sysv4.h
@@ -138,12 +138,12 @@ 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) \
{ \
if (! flag_writable_strings) \
- const_section (); \
+ mergeable_string_section ((DECL), (ALIGN), 0); \
else \
data_section (); \
} \
@@ -152,13 +152,20 @@ 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 \
+ /* ??? 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)) \
+ 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 \
- data_section (); \
+ mergeable_constant_section (DECL_MODE (DECL), (ALIGN), 0); \
} \
/* 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. */ \
@@ -172,7 +179,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) \
@@ -180,7 +187,7 @@ extern unsigned int ia64_section_threshold;
else if (flag_pic && symbolic_operand ((RTX), (MODE))) \
data_section (); \
else \
- const_section (); \
+ mergeable_constant_section ((MODE), (ALIGN), 0); \
}
#undef EXTRA_SECTIONS
diff --git a/gcc/config/m32r/m32r.h b/gcc/config/m32r/m32r.h
index 5ef9951..4cb379e 100644
--- a/gcc/config/m32r/m32r.h
+++ b/gcc/config/m32r/m32r.h
@@ -1534,7 +1534,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
diff --git a/gcc/config/m68k/m68k.h b/gcc/config/m68k/m68k.h
index 14bcaa2..9607a92 100644
--- a/gcc/config/m68k/m68k.h
+++ b/gcc/config/m68k/m68k.h
@@ -359,7 +359,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(); \
diff --git a/gcc/config/m88k/dgux.h b/gcc/config/m88k/dgux.h
index ab8e371..1d91168 100644
--- a/gcc/config/m88k/dgux.h
+++ b/gcc/config/m88k/dgux.h
@@ -294,7 +294,7 @@ func_ptr __DTOR_END__[1] = { (func_ptr) (-1) }
/* 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 (); \
diff --git a/gcc/config/m88k/m88k.h b/gcc/config/m88k/m88k.h
index c30c818..881acd8 100644
--- a/gcc/config/m88k/m88k.h
+++ b/gcc/config/m88k/m88k.h
@@ -2480,7 +2480,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) \
{ \
diff --git a/gcc/config/mcore/mcore-pe.h b/gcc/config/mcore/mcore-pe.h
index 2362b52..e08b337 100644
--- a/gcc/config/mcore/mcore-pe.h
+++ b/gcc/config/mcore/mcore-pe.h
@@ -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 \
diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
index 81f675c..fb54bcd 100644
--- a/gcc/config/mips/mips.h
+++ b/gcc/config/mips/mips.h
@@ -4477,10 +4477,12 @@ rdata_section () \
and select that section. */
#undef SELECT_RTX_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)
#undef SELECT_SECTION
-#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
diff --git a/gcc/config/nextstep.h b/gcc/config/nextstep.h
index 7bb9681..956b9e2 100644
--- a/gcc/config/nextstep.h
+++ b/gcc/config/nextstep.h
@@ -445,7 +445,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) \
@@ -563,7 +563,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) \
diff --git a/gcc/config/pa/pa-linux.h b/gcc/config/pa/pa-linux.h
index baa1cf5..f290802 100644
--- a/gcc/config/pa/pa-linux.h
+++ b/gcc/config/pa/pa-linux.h
@@ -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 \
diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h
index 4385914..fa892f1 100644
--- a/gcc/config/pa/pa.h
+++ b/gcc/config/pa/pa.h
@@ -1403,7 +1403,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 \
@@ -1413,7 +1413,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) \
diff --git a/gcc/config/romp/romp.h b/gcc/config/romp/romp.h
index 4f920cc..2e517a1 100644
--- a/gcc/config/romp/romp.h
+++ b/gcc/config/romp/romp.h
@@ -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 ()
/* Output assembler code to FILE to increment profiler label # LABELNO
for profiling a function entry. */
diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h
index b8158cc..1b2051d 100644
--- a/gcc/config/rs6000/sysv4.h
+++ b/gcc/config/rs6000/sysv4.h
@@ -566,7 +566,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
@@ -575,7 +575,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).
diff --git a/gcc/config/rs6000/xcoff.h b/gcc/config/rs6000/xcoff.h
index c120e64..fbb7436 100644
--- a/gcc/config/rs6000/xcoff.h
+++ b/gcc/config/rs6000/xcoff.h
@@ -144,7 +144,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) \
@@ -199,7 +199,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 \
diff --git a/gcc/config/s390/linux.h b/gcc/config/s390/linux.h
index 31b657c..efe1377 100644
--- a/gcc/config/s390/linux.h
+++ b/gcc/config/s390/linux.h
@@ -295,7 +295,7 @@ do { \
*/
#undef SELECT_RTX_SECTION
-#define SELECT_RTX_SECTION(MODE, X)
+#define SELECT_RTX_SECTION(MODE, X, ALIGN)
/* Output code to add DELTA to the first argument, and then jump to FUNCTION.
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
index 9f51d98..91deb49 100644
--- a/gcc/config/sparc/sparc.c
+++ b/gcc/config/sparc/sparc.c
@@ -8765,6 +8765,14 @@ sparc_elf_asm_named_section (name, flags)
const char *name;
unsigned int flags;
{
+ if (flags & SECTION_MERGE)
+ {
+ /* entsize cannot be expressed in this section attributes
+ encoding style. */
+ default_elf_asm_named_section (name, flags);
+ return;
+ }
+
fprintf (asm_out_file, "\t.section\t\"%s\"", name);
if (!(flags & SECTION_DEBUG))
diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h
index 1b7ce27..629286e 100644
--- a/gcc/config/sparc/sparc.h
+++ b/gcc/config/sparc/sparc.h
@@ -912,7 +912,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) \
{ \
@@ -945,7 +945,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))) \
diff --git a/gcc/config/sparc/sysv4.h b/gcc/config/sparc/sysv4.h
index 4cd0b39..d9c0be7 100644
--- a/gcc/config/sparc/sysv4.h
+++ b/gcc/config/sparc/sysv4.h
@@ -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 (); \
diff --git a/gcc/config/stormy16/stormy16.h b/gcc/config/stormy16/stormy16.h
index 8f2ee80..2258819 100644
--- a/gcc/config/stormy16/stormy16.h
+++ b/gcc/config/stormy16/stormy16.h
@@ -3470,7 +3470,7 @@ do { \
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
@@ -3482,7 +3482,7 @@ do { \
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
diff --git a/gcc/config/svr3.h b/gcc/config/svr3.h
index 6f26fde..57f3ee3 100644
--- a/gcc/config/svr3.h
+++ b/gcc/config/svr3.h
@@ -301,7 +301,7 @@ const_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) \
{ \
@@ -331,4 +331,4 @@ const_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()
diff --git a/gcc/config/v850/v850.h b/gcc/config/v850/v850.h
index 5baef15..b077f6d 100644
--- a/gcc/config/v850/v850.h
+++ b/gcc/config/v850/v850.h
@@ -1164,7 +1164,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) \
{ \
@@ -1227,7 +1227,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
diff --git a/gcc/config/vax/vms.h b/gcc/config/vax/vms.h
index 52f4d27..133d1c3 100644
--- a/gcc/config/vax/vms.h
+++ b/gcc/config/vax/vms.h
@@ -218,7 +218,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) \
{ \