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
This commit is contained in:
parent
9170044420
commit
b2bcb32d28
@ -1,3 +1,54 @@
|
||||
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.
|
||||
|
||||
2001-08-08 Bernd Schmidt <bernds@redhat.com>
|
||||
|
||||
* cselib.c (cselib_record_sets): If insn is predicated, turn
|
||||
|
@ -2200,9 +2200,9 @@ mipsel-*-netbsd* | mips-dec-netbsd*) # Decstation running NetBSD
|
||||
;;
|
||||
mips*-*-linux*) # Linux MIPS, either endian.
|
||||
xmake_file=x-linux
|
||||
tm_file="linux.h mips/linux.h"
|
||||
case $machine in
|
||||
mips*el-*) tm_file="elfos.h mips/elfl.h mips/linux.h" ;;
|
||||
*) tm_file="elfos.h mips/elf.h mips/linux.h" ;;
|
||||
mips*el-*) tm_file="mips/little.h $tm_file" ;;
|
||||
esac
|
||||
tmake_file="t-slibgcc-elf-ver t-linux"
|
||||
extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
|
||||
|
@ -197,70 +197,8 @@ do { \
|
||||
|
||||
#define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
|
||||
#undef UNIQUE_SECTION
|
||||
#define UNIQUE_SECTION(DECL,RELOC) \
|
||||
do { \
|
||||
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); \
|
||||
} while (0)
|
||||
#define UNIQUE_SECTION(DECL,RELOC) \
|
||||
mips_unique_section ((DECL), (RELOC))
|
||||
|
||||
/* Support the ctors/dtors and other sections. */
|
||||
|
||||
|
@ -18,6 +18,128 @@ along with GNU CC; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "gofast.h"
|
||||
|
||||
/* US Software GOFAST library support. */
|
||||
#define INIT_SUBTARGET_OPTABS INIT_GOFAST_OPTABS
|
||||
|
||||
#include "mips/mips.h"
|
||||
|
||||
#undef WCHAR_TYPE
|
||||
#define WCHAR_TYPE "int"
|
||||
|
||||
#undef WCHAR_TYPE_SIZE
|
||||
#define WCHAR_TYPE_SIZE 32
|
||||
|
||||
/* If defined, a C expression whose value is a string containing the
|
||||
assembler operation to identify the following data as
|
||||
uninitialized global data. If not defined, and neither
|
||||
`ASM_OUTPUT_BSS' nor `ASM_OUTPUT_ALIGNED_BSS' are defined,
|
||||
uninitialized global data will be output in the data section if
|
||||
`-fno-common' is passed, otherwise `ASM_OUTPUT_COMMON' will be
|
||||
used. */
|
||||
#define BSS_SECTION_ASM_OP "\t.section\t.bss"
|
||||
|
||||
#define SBSS_SECTION_ASM_OP "\t.section .sbss"
|
||||
|
||||
/* Like `ASM_OUTPUT_BSS' except takes the required alignment as a
|
||||
separate, explicit argument. If you define this macro, it is used
|
||||
in place of `ASM_OUTPUT_BSS', and gives you more flexibility in
|
||||
handling the required alignment of the variable. The alignment is
|
||||
specified as the number of bits.
|
||||
|
||||
Try to use function `asm_output_aligned_bss' defined in file
|
||||
`varasm.c' when defining this macro. */
|
||||
#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
|
||||
do { \
|
||||
ASM_GLOBALIZE_LABEL (FILE, NAME); \
|
||||
if (SIZE > 0 && SIZE <= mips_section_threshold) \
|
||||
sbss_section (); \
|
||||
else \
|
||||
bss_section (); \
|
||||
ASM_OUTPUT_ALIGN (FILE, floor_log2 (ALIGN / BITS_PER_UNIT)); \
|
||||
last_assemble_variable_decl = DECL; \
|
||||
ASM_DECLARE_OBJECT_NAME (FILE, NAME, DECL); \
|
||||
ASM_OUTPUT_SKIP (FILE, SIZE ? SIZE : 1); \
|
||||
} while (0)
|
||||
|
||||
/* These macros generate the special .type and .size directives which
|
||||
are used to set the corresponding fields of the linker symbol table
|
||||
entries in an ELF object file under SVR4. These macros also output
|
||||
the starting labels for the relevant functions/objects. */
|
||||
|
||||
/* Write the extra assembler code needed to declare an object properly. */
|
||||
|
||||
#undef ASM_DECLARE_OBJECT_NAME
|
||||
#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
|
||||
do { \
|
||||
fprintf (FILE, "%s", TYPE_ASM_OP); \
|
||||
assemble_name (FILE, NAME); \
|
||||
putc (',', FILE); \
|
||||
fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
|
||||
putc ('\n', FILE); \
|
||||
size_directive_output = 0; \
|
||||
if (!flag_inhibit_size_directive && DECL_SIZE (DECL)) \
|
||||
{ \
|
||||
size_directive_output = 1; \
|
||||
fprintf (FILE, "%s", SIZE_ASM_OP); \
|
||||
assemble_name (FILE, NAME); \
|
||||
fprintf (FILE, ",%d\n", \
|
||||
int_size_in_bytes (TREE_TYPE (DECL))); \
|
||||
} \
|
||||
mips_declare_object (FILE, NAME, "", ":\n", 0); \
|
||||
} while (0)
|
||||
|
||||
#undef UNIQUE_SECTION
|
||||
#define UNIQUE_SECTION(DECL,RELOC) \
|
||||
mips_unique_section ((DECL), (RELOC))
|
||||
|
||||
/* A list of other sections which the compiler might be "in" at any
|
||||
given time. */
|
||||
#undef EXTRA_SECTIONS
|
||||
#define EXTRA_SECTIONS in_sdata, in_sbss, in_rdata, in_ctors, in_dtors
|
||||
|
||||
#undef EXTRA_SECTION_FUNCTIONS
|
||||
#define EXTRA_SECTION_FUNCTIONS \
|
||||
SECTION_FUNCTION_TEMPLATE(sdata_section, in_sdata, SDATA_SECTION_ASM_OP) \
|
||||
SECTION_FUNCTION_TEMPLATE(sbss_section, in_sbss, SBSS_SECTION_ASM_OP) \
|
||||
SECTION_FUNCTION_TEMPLATE(rdata_section, in_rdata, RDATA_SECTION_ASM_OP) \
|
||||
SECTION_FUNCTION_TEMPLATE(ctors_section, in_ctors, CTORS_SECTION_ASM_OP) \
|
||||
SECTION_FUNCTION_TEMPLATE(dtors_section, in_dtors, DTORS_SECTION_ASM_OP)
|
||||
|
||||
#define SECTION_FUNCTION_TEMPLATE(FN, ENUM, OP) \
|
||||
void FN () \
|
||||
{ \
|
||||
if (in_section != ENUM) \
|
||||
{ \
|
||||
fprintf (asm_out_file, "%s\n", OP); \
|
||||
in_section = ENUM; \
|
||||
} \
|
||||
}
|
||||
|
||||
/* A C statement (sans semicolon) to output an element in the table of
|
||||
global constructors. */
|
||||
#undef ASM_OUTPUT_CONSTRUCTOR
|
||||
#define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
|
||||
do { \
|
||||
ctors_section (); \
|
||||
fprintf (FILE, "\t%s\t", TARGET_LONG64 ? ".dword" : ".word"); \
|
||||
assemble_name (FILE, NAME); \
|
||||
fprintf (FILE, "\n"); \
|
||||
} while (0)
|
||||
|
||||
|
||||
/* A C statement (sans semicolon) to output an element in the table of
|
||||
global destructors. */
|
||||
#undef ASM_OUTPUT_DESTRUCTOR
|
||||
#define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
|
||||
do { \
|
||||
dtors_section (); \
|
||||
fprintf (FILE, "\t%s\t", TARGET_LONG64 ? ".dword" : ".word"); \
|
||||
assemble_name (FILE, NAME); \
|
||||
fprintf (FILE, "\n"); \
|
||||
} while (0)
|
||||
|
||||
#undef TARGET_VERSION
|
||||
#if TARGET_ENDIAN_DEFAULT == 0
|
||||
#define TARGET_VERSION fprintf (stderr, " (MIPSel GNU/Linux with ELF)");
|
||||
@ -35,17 +157,6 @@ Boston, MA 02111-1307, USA. */
|
||||
#undef TARGET_DEFAULT
|
||||
#define TARGET_DEFAULT (MASK_ABICALLS|MASK_GAS)
|
||||
|
||||
|
||||
/* Handle #pragma weak and #pragma pack. */
|
||||
#undef HANDLE_SYSV_PRAGMA
|
||||
#define HANDLE_SYSV_PRAGMA 1
|
||||
|
||||
/* Don't assume anything about the header files. */
|
||||
#define NO_IMPLICIT_EXTERN_C
|
||||
|
||||
/* Generate calls to memcpy, etc., not bcopy, etc. */
|
||||
#define TARGET_MEM_FUNCTIONS
|
||||
|
||||
/* Specify predefined symbols in preprocessor. */
|
||||
#undef CPP_PREDEFINES
|
||||
#if TARGET_ENDIAN_DEFAULT == 0
|
||||
@ -112,40 +223,12 @@ Boston, MA 02111-1307, USA. */
|
||||
-D_GNU_SOURCE %(cpp) \
|
||||
"
|
||||
|
||||
/* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add
|
||||
the GNU/Linux magical crtbegin.o file (see crtstuff.c) which
|
||||
provides part of the support for getting C++ file-scope static
|
||||
object constructed before entering `main'. */
|
||||
|
||||
#undef STARTFILE_SPEC
|
||||
#define STARTFILE_SPEC \
|
||||
"%{!shared: \
|
||||
%{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}\
|
||||
crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
|
||||
|
||||
/* Provide a ENDFILE_SPEC appropriate for GNU/Linux. Here we tack on
|
||||
the GNU/Linux magical crtend.o file (see crtstuff.c) which
|
||||
provides part of the support for getting C++ file-scope static
|
||||
object constructed before entering `main', followed by a normal
|
||||
GNU/Linux "finalizer" file, `crtn.o'. */
|
||||
|
||||
#undef ENDFILE_SPEC
|
||||
#define ENDFILE_SPEC \
|
||||
"%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s"
|
||||
|
||||
/* From iris5.h */
|
||||
/* -G is incompatible with -KPIC which is the default, so only allow objects
|
||||
in the small data section if the user explicitly asks for it. */
|
||||
#undef MIPS_DEFAULT_GVALUE
|
||||
#define MIPS_DEFAULT_GVALUE 0
|
||||
|
||||
#undef LIB_SPEC
|
||||
/* Taken from sparc/linux.h. */
|
||||
#define LIB_SPEC \
|
||||
"%{shared: -lc} \
|
||||
%{!shared: %{mieee-fp:-lieee} %{pthread:-lpthread} \
|
||||
%{profile:-lc_p} %{!profile: -lc}}"
|
||||
|
||||
/* Borrowed from sparc/linux.h */
|
||||
#undef LINK_SPEC
|
||||
#define LINK_SPEC \
|
||||
@ -165,44 +248,19 @@ Boston, MA 02111-1307, USA. */
|
||||
%{!fno-PIC:%{!fno-pic:-KPIC}} \
|
||||
%{fno-PIC:-non_shared} %{fno-pic:-non_shared}"
|
||||
|
||||
/* We don't need those nonsenses. */
|
||||
#undef INVOKE__main
|
||||
#undef CTOR_LIST_BEGIN
|
||||
#undef CTOR_LIST_END
|
||||
#undef DTOR_LIST_BEGIN
|
||||
#undef DTOR_LIST_END
|
||||
|
||||
/* The MIPS assembler has different syntax for .set. We set it to
|
||||
.dummy to trap any errors. */
|
||||
#undef SET_ASM_OP
|
||||
#define SET_ASM_OP "\t.dummy\t"
|
||||
|
||||
#undef ASM_OUTPUT_SOURCE_LINE
|
||||
#define ASM_OUTPUT_SOURCE_LINE(FILE, LINE) \
|
||||
do \
|
||||
{ \
|
||||
static int sym_lineno = 1; \
|
||||
fprintf (FILE, "%sLM%d:\n\t%s 68,0,%d,%sLM%d", \
|
||||
LOCAL_LABEL_PREFIX, sym_lineno, ASM_STABN_OP, \
|
||||
LINE, LOCAL_LABEL_PREFIX, sym_lineno); \
|
||||
putc ('-', FILE); \
|
||||
assemble_name (FILE, \
|
||||
XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));\
|
||||
putc ('\n', FILE); \
|
||||
sym_lineno++; \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
/* This is how we tell the assembler that two symbols have the
|
||||
same value. */
|
||||
#undef ASM_OUTPUT_DEF
|
||||
#define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2) \
|
||||
do { \
|
||||
fprintf ((FILE), "\t"); \
|
||||
do { \
|
||||
fputc ( '\t', FILE); \
|
||||
assemble_name (FILE, LABEL1); \
|
||||
fprintf (FILE, "="); \
|
||||
fputs ( " = ", FILE); \
|
||||
assemble_name (FILE, LABEL2); \
|
||||
fprintf (FILE, "\n"); \
|
||||
fputc ( '\n', FILE); \
|
||||
} while (0)
|
||||
|
||||
#undef ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL
|
||||
@ -248,8 +306,3 @@ while (0)
|
||||
/* Tell function_prologue in mips.c that we have already output the .ent/.end
|
||||
pseudo-ops. */
|
||||
#define FUNCTION_NAME_ALREADY_DECLARED
|
||||
|
||||
/* Output #ident as a .ident. */
|
||||
#undef ASM_OUTPUT_IDENT
|
||||
#define ASM_OUTPUT_IDENT(FILE, NAME) \
|
||||
fprintf (FILE, "\t%s\t\"%s\"\n", IDENT_ASM_OP, NAME);
|
||||
|
22
gcc/config/mips/little.h
Normal file
22
gcc/config/mips/little.h
Normal file
@ -0,0 +1,22 @@
|
||||
/* Definition of little endian mips machine for GNU compiler.
|
||||
|
||||
Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU CC.
|
||||
|
||||
GNU CC is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU CC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU CC; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#define TARGET_ENDIAN_DEFAULT 0
|
@ -60,6 +60,7 @@ extern void mips_va_start PARAMS ((int, tree, rtx));
|
||||
#endif /* RTX_CODE */
|
||||
extern struct rtx_def *mips_va_arg PARAMS ((tree, tree));
|
||||
extern void mips_select_section PARAMS ((tree, int));
|
||||
extern void mips_unique_section PARAMS ((tree, int));
|
||||
#endif /* TREE_CODE */
|
||||
|
||||
#ifdef RTX_CODE
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -862,6 +862,7 @@ while (0)
|
||||
|
||||
/* ASM_SPEC is the set of arguments to pass to the assembler. */
|
||||
|
||||
#undef ASM_SPEC
|
||||
#define ASM_SPEC "\
|
||||
%{!membedded-pic:%{G*}} %(endian_spec) %{mips1} %{mips2} %{mips3} %{mips4} \
|
||||
%{mips16:%{!mno-mips16:-mips16}} %{mno-mips16:-no-mips16} \
|
||||
@ -991,6 +992,7 @@ while (0)
|
||||
|
||||
/* For C++ we need to ensure that _LANGUAGE_C_PLUS_PLUS is defined independent
|
||||
of the source file extension. */
|
||||
#undef CPLUSPLUS_CPP_SPEC
|
||||
#define CPLUSPLUS_CPP_SPEC "\
|
||||
-D__LANGUAGE_C_PLUS_PLUS -D_LANGUAGE_C_PLUS_PLUS \
|
||||
%(cpp) \
|
||||
@ -3818,12 +3820,16 @@ while (0)
|
||||
/* Output to assembler file text saying following lines
|
||||
may contain character constants, extra white space, comments, etc. */
|
||||
|
||||
#ifndef ASM_APP_ON
|
||||
#define ASM_APP_ON " #APP\n"
|
||||
#endif
|
||||
|
||||
/* Output to assembler file text saying following lines
|
||||
no longer contain unusual constructs. */
|
||||
|
||||
#ifndef ASM_APP_OFF
|
||||
#define ASM_APP_OFF " #NO_APP\n"
|
||||
#endif
|
||||
|
||||
/* How to refer to registers in assembler output.
|
||||
This sequence is indexed by compiler's hard-register-number (see above).
|
||||
@ -4115,9 +4121,10 @@ while (0)
|
||||
#define LABEL_AFTER_LOC(STREAM)
|
||||
#endif
|
||||
|
||||
#undef ASM_OUTPUT_SOURCE_LINE
|
||||
#ifndef ASM_OUTPUT_SOURCE_LINE
|
||||
#define ASM_OUTPUT_SOURCE_LINE(STREAM, LINE) \
|
||||
mips_output_lineno (STREAM, LINE)
|
||||
#endif
|
||||
|
||||
/* The MIPS implementation uses some labels for its own purpose. The
|
||||
following lists what labels are created, and are all formed by the
|
||||
@ -4406,8 +4413,8 @@ do { \
|
||||
/* Handle certain cpp directives used in header files on sysV. */
|
||||
#define SCCS_DIRECTIVE
|
||||
|
||||
#ifndef ASM_OUTPUT_IDENT
|
||||
/* Output #ident as a in the read-only data section. */
|
||||
#undef ASM_OUTPUT_IDENT
|
||||
#define ASM_OUTPUT_IDENT(FILE, STRING) \
|
||||
{ \
|
||||
const char *p = STRING; \
|
||||
@ -4415,6 +4422,7 @@ do { \
|
||||
rdata_section (); \
|
||||
assemble_string (p, size); \
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Default to -G 8 */
|
||||
#ifndef MIPS_DEFAULT_GVALUE
|
||||
|
Loading…
Reference in New Issue
Block a user