diff options
| author | H.J. Lu <hjl@gnu.org> | 2001-08-08 15:40:57 +0000 |
|---|---|---|
| committer | H.J. Lu <hjl@gcc.gnu.org> | 2001-08-08 08:40:57 -0700 |
| commit | b2bcb32d2831ec81ba03baba01c0f29998ee748c (patch) | |
| tree | 90c84bf177629043c2093e12abfc569d7a8d4003 /gcc/config/mips/mips.c | |
| parent | 917004442036172e64e70b1d0a4a7392069af9cd (diff) | |
| download | gcc-b2bcb32d2831ec81ba03baba01c0f29998ee748c.zip gcc-b2bcb32d2831ec81ba03baba01c0f29998ee748c.tar.gz gcc-b2bcb32d2831ec81ba03baba01c0f29998ee748c.tar.bz2 | |
mips.c (mips_unique_section): New.
2001-08-08 H.J. Lu <hjl@gnu.org>
* config/mips/mips.c (mips_unique_section): New. Copied from
config/mips/elf.h.
* config/mips/mips-protos.h (mips_unique_section): New
prototype.
* config/mips/elf.h (UNIQUE_SECTION): Use mips_unique_section.
* config/mips/little.h: New. Generic little endian mips
targets. Only mips*-*-linux* is converted to use it so far.
* config/mips/linux.h: Include "gofast.h" and "mips/mips.h".
(WCHAR_TYPE): Defined
(WCHAR_TYPE_SIZE): Likewise.
(INIT_SUBTARGET_OPTABS): Likewise.
(BSS_SECTION_ASM_OP): Likewise.
(SBSS_SECTION_ASM_OP): Likewise.
(ASM_OUTPUT_ALIGNED_BSS): Likewise.
(ASM_DECLARE_OBJECT_NAME): Likewise.
(UNIQUE_SECTION): Likewise.
(EXTRA_SECTIONS): Likewise.
(ASM_OUTPUT_CONSTRUCTOR): Likewise.
(ASM_OUTPUT_DESTRUCTOR): Likewise.
(ASM_OUTPUT_DEF): Likewise.
(HANDLE_SYSV_PRAGMA): Removed.
(NO_IMPLICIT_EXTERN_C): Likewise.
(TARGET_MEM_FUNCTIONS): Likewise.
(STARTFILE_SPEC): Likewise.
(ENDFILE_SPEC): Likewise.
(LIB_SPEC): Likewise.
(INVOKE__main): Likewise.
(CTOR_LIST_BEGIN): Likewise.
(CTOR_LIST_END): Likewise.
(DTOR_LIST_BEGIN): Likewise.
(DTOR_LIST_END): Likewise.
(SET_ASM_OP): Likewise.
(ASM_OUTPUT_SOURCE_LINE): Likewise.
(ASM_OUTPUT_DEF): Likewise.
(ASM_OUTPUT_IDENT): Likewise.
* config/mips/mips.h (ASM_SPEC): Undefine before define.
(CPLUSPLUS_CPP_SPEC): Likewise.
(ASM_APP_ON) Redefine only if not defined.
(ASM_APP_OFF): Likewise.
(ASM_OUTPUT_SOURCE_LINE): Likewise.
(ASM_OUTPUT_IDENT): Likewise.
* config.gcc: Update tm_file for Linux/mips.
From-SVN: r44718
Diffstat (limited to 'gcc/config/mips/mips.c')
| -rw-r--r-- | gcc/config/mips/mips.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index 9614c95..7a2d962 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -9848,3 +9848,75 @@ iris6_asm_named_section (name, flags, align) fprintf (asm_out_file, "\t.section %s,%u,%u,%u,%u\n", name, sh_type, sh_flags, sh_entsize, align); } + +/* Cover function for UNIQUE_SECTION. */ + +void +mips_unique_section (decl, reloc) + tree decl; + int reloc; +{ + int len, size, sec; + char *name, *string, *prefix; + static char *prefixes[4][2] = { + { ".text.", ".gnu.linkonce.t." }, + { ".rodata.", ".gnu.linkonce.r." }, + { ".data.", ".gnu.linkonce.d." }, + { ".sdata.", ".gnu.linkonce.s." } + }; + + name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); + size = int_size_in_bytes (TREE_TYPE (decl)); + + /* Determine the base section we are interested in: + 0=text, 1=rodata, 2=data, 3=sdata, [4=bss]. */ + if (TREE_CODE (decl) == FUNCTION_DECL) + sec = 0; + else if (DECL_INITIAL (decl) == 0 + || DECL_INITIAL (decl) == error_mark_node) + sec = 2; + else if ((TARGET_EMBEDDED_PIC || TARGET_MIPS16) + && TREE_CODE (decl) == STRING_CST + && !flag_writable_strings) + { + /* For embedded position independent code, put constant + strings in the text section, because the data section + is limited to 64K in size. For mips16 code, put + strings in the text section so that a PC relative load + instruction can be used to get their address. */ + sec = 0; + } + else if (TARGET_EMBEDDED_DATA) + { + /* For embedded applications, always put an object in + read-only data if possible, in order to reduce RAM + usage. */ + + if (DECL_READONLY_SECTION (decl, reloc)) + sec = 1; + else if (size > 0 && size <= mips_section_threshold) + sec = 3; + else + sec = 2; + } + else + { + /* For hosted applications, always put an object in + small data if possible, as this gives the best + performance. */ + + if (size > 0 && size <= mips_section_threshold) + sec = 3; + else if (DECL_READONLY_SECTION (decl, reloc)) + sec = 1; + else + sec = 2; + } + + prefix = prefixes[sec][DECL_ONE_ONLY (decl)]; + len = strlen (name) + strlen (prefix); + string = alloca (len + 1); + sprintf (string, "%s%s", prefix, name); + + DECL_SECTION_NAME (decl) = build_string (len, string); +} |
