summaryrefslogtreecommitdiff
path: root/gcc/config/ia64/sysv4.h
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2001-09-11 16:50:05 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2001-09-11 16:50:05 +0000
commitbb2821c04b6546dd5f014b99ab45d6ef5c55f874 (patch)
tree1e64917dd6eadf802b7c67e6f7384cc9fc03f1ae /gcc/config/ia64/sysv4.h
parent1be91cc480957c46afcce1ceca0f0678af0a28ce (diff)
downloadgcc-bb2821c04b6546dd5f014b99ab45d6ef5c55f874.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45548 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/ia64/sysv4.h')
-rw-r--r--gcc/config/ia64/sysv4.h21
1 files changed, 14 insertions, 7 deletions
diff --git a/gcc/config/ia64/sysv4.h b/gcc/config/ia64/sysv4.h
index 0abb7e8cd7e..54b5167363e 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