From b2bcb32d2831ec81ba03baba01c0f29998ee748c Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 8 Aug 2001 15:40:57 +0000 Subject: mips.c (mips_unique_section): New. 2001-08-08 H.J. Lu * 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 --- gcc/config/mips/mips.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) (limited to 'gcc/config/mips/mips.c') 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); +} -- cgit v1.1