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
8 changed files with 286 additions and 141 deletions
|
@ -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>
|
2001-08-08 Bernd Schmidt <bernds@redhat.com>
|
||||||
|
|
||||||
* cselib.c (cselib_record_sets): If insn is predicated, turn
|
* 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.
|
mips*-*-linux*) # Linux MIPS, either endian.
|
||||||
xmake_file=x-linux
|
xmake_file=x-linux
|
||||||
|
tm_file="linux.h mips/linux.h"
|
||||||
case $machine in
|
case $machine in
|
||||||
mips*el-*) tm_file="elfos.h mips/elfl.h mips/linux.h" ;;
|
mips*el-*) tm_file="mips/little.h $tm_file" ;;
|
||||||
*) tm_file="elfos.h mips/elf.h mips/linux.h" ;;
|
|
||||||
esac
|
esac
|
||||||
tmake_file="t-slibgcc-elf-ver t-linux"
|
tmake_file="t-slibgcc-elf-ver t-linux"
|
||||||
extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
|
extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
|
||||||
|
|
|
@ -198,69 +198,7 @@ do { \
|
||||||
#define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
|
#define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
|
||||||
#undef UNIQUE_SECTION
|
#undef UNIQUE_SECTION
|
||||||
#define UNIQUE_SECTION(DECL,RELOC) \
|
#define UNIQUE_SECTION(DECL,RELOC) \
|
||||||
do { \
|
mips_unique_section ((DECL), (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); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Support the ctors/dtors and other sections. */
|
/* 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,
|
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
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
|
#undef TARGET_VERSION
|
||||||
#if TARGET_ENDIAN_DEFAULT == 0
|
#if TARGET_ENDIAN_DEFAULT == 0
|
||||||
#define TARGET_VERSION fprintf (stderr, " (MIPSel GNU/Linux with ELF)");
|
#define TARGET_VERSION fprintf (stderr, " (MIPSel GNU/Linux with ELF)");
|
||||||
|
@ -35,17 +157,6 @@ Boston, MA 02111-1307, USA. */
|
||||||
#undef TARGET_DEFAULT
|
#undef TARGET_DEFAULT
|
||||||
#define TARGET_DEFAULT (MASK_ABICALLS|MASK_GAS)
|
#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. */
|
/* Specify predefined symbols in preprocessor. */
|
||||||
#undef CPP_PREDEFINES
|
#undef CPP_PREDEFINES
|
||||||
#if TARGET_ENDIAN_DEFAULT == 0
|
#if TARGET_ENDIAN_DEFAULT == 0
|
||||||
|
@ -112,40 +223,12 @@ Boston, MA 02111-1307, USA. */
|
||||||
-D_GNU_SOURCE %(cpp) \
|
-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 */
|
/* From iris5.h */
|
||||||
/* -G is incompatible with -KPIC which is the default, so only allow objects
|
/* -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. */
|
in the small data section if the user explicitly asks for it. */
|
||||||
#undef MIPS_DEFAULT_GVALUE
|
#undef MIPS_DEFAULT_GVALUE
|
||||||
#define MIPS_DEFAULT_GVALUE 0
|
#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 */
|
/* Borrowed from sparc/linux.h */
|
||||||
#undef LINK_SPEC
|
#undef LINK_SPEC
|
||||||
#define LINK_SPEC \
|
#define LINK_SPEC \
|
||||||
|
@ -165,44 +248,19 @@ Boston, MA 02111-1307, USA. */
|
||||||
%{!fno-PIC:%{!fno-pic:-KPIC}} \
|
%{!fno-PIC:%{!fno-pic:-KPIC}} \
|
||||||
%{fno-PIC:-non_shared} %{fno-pic:-non_shared}"
|
%{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
|
/* The MIPS assembler has different syntax for .set. We set it to
|
||||||
.dummy to trap any errors. */
|
.dummy to trap any errors. */
|
||||||
#undef SET_ASM_OP
|
#undef SET_ASM_OP
|
||||||
#define SET_ASM_OP "\t.dummy\t"
|
#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
|
#undef ASM_OUTPUT_DEF
|
||||||
#define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2) \
|
#define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2) \
|
||||||
do { \
|
do { \
|
||||||
fprintf ((FILE), "\t"); \
|
fputc ( '\t', FILE); \
|
||||||
assemble_name (FILE, LABEL1); \
|
assemble_name (FILE, LABEL1); \
|
||||||
fprintf (FILE, "="); \
|
fputs ( " = ", FILE); \
|
||||||
assemble_name (FILE, LABEL2); \
|
assemble_name (FILE, LABEL2); \
|
||||||
fprintf (FILE, "\n"); \
|
fputc ( '\n', FILE); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#undef ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL
|
#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
|
/* Tell function_prologue in mips.c that we have already output the .ent/.end
|
||||||
pseudo-ops. */
|
pseudo-ops. */
|
||||||
#define FUNCTION_NAME_ALREADY_DECLARED
|
#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 */
|
#endif /* RTX_CODE */
|
||||||
extern struct rtx_def *mips_va_arg PARAMS ((tree, tree));
|
extern struct rtx_def *mips_va_arg PARAMS ((tree, tree));
|
||||||
extern void mips_select_section PARAMS ((tree, int));
|
extern void mips_select_section PARAMS ((tree, int));
|
||||||
|
extern void mips_unique_section PARAMS ((tree, int));
|
||||||
#endif /* TREE_CODE */
|
#endif /* TREE_CODE */
|
||||||
|
|
||||||
#ifdef RTX_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",
|
fprintf (asm_out_file, "\t.section %s,%u,%u,%u,%u\n",
|
||||||
name, sh_type, sh_flags, sh_entsize, align);
|
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. */
|
/* ASM_SPEC is the set of arguments to pass to the assembler. */
|
||||||
|
|
||||||
|
#undef ASM_SPEC
|
||||||
#define ASM_SPEC "\
|
#define ASM_SPEC "\
|
||||||
%{!membedded-pic:%{G*}} %(endian_spec) %{mips1} %{mips2} %{mips3} %{mips4} \
|
%{!membedded-pic:%{G*}} %(endian_spec) %{mips1} %{mips2} %{mips3} %{mips4} \
|
||||||
%{mips16:%{!mno-mips16:-mips16}} %{mno-mips16:-no-mips16} \
|
%{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
|
/* For C++ we need to ensure that _LANGUAGE_C_PLUS_PLUS is defined independent
|
||||||
of the source file extension. */
|
of the source file extension. */
|
||||||
|
#undef CPLUSPLUS_CPP_SPEC
|
||||||
#define CPLUSPLUS_CPP_SPEC "\
|
#define CPLUSPLUS_CPP_SPEC "\
|
||||||
-D__LANGUAGE_C_PLUS_PLUS -D_LANGUAGE_C_PLUS_PLUS \
|
-D__LANGUAGE_C_PLUS_PLUS -D_LANGUAGE_C_PLUS_PLUS \
|
||||||
%(cpp) \
|
%(cpp) \
|
||||||
|
@ -3818,12 +3820,16 @@ while (0)
|
||||||
/* Output to assembler file text saying following lines
|
/* Output to assembler file text saying following lines
|
||||||
may contain character constants, extra white space, comments, etc. */
|
may contain character constants, extra white space, comments, etc. */
|
||||||
|
|
||||||
|
#ifndef ASM_APP_ON
|
||||||
#define ASM_APP_ON " #APP\n"
|
#define ASM_APP_ON " #APP\n"
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Output to assembler file text saying following lines
|
/* Output to assembler file text saying following lines
|
||||||
no longer contain unusual constructs. */
|
no longer contain unusual constructs. */
|
||||||
|
|
||||||
|
#ifndef ASM_APP_OFF
|
||||||
#define ASM_APP_OFF " #NO_APP\n"
|
#define ASM_APP_OFF " #NO_APP\n"
|
||||||
|
#endif
|
||||||
|
|
||||||
/* How to refer to registers in assembler output.
|
/* How to refer to registers in assembler output.
|
||||||
This sequence is indexed by compiler's hard-register-number (see above).
|
This sequence is indexed by compiler's hard-register-number (see above).
|
||||||
|
@ -4115,9 +4121,10 @@ while (0)
|
||||||
#define LABEL_AFTER_LOC(STREAM)
|
#define LABEL_AFTER_LOC(STREAM)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#undef ASM_OUTPUT_SOURCE_LINE
|
#ifndef ASM_OUTPUT_SOURCE_LINE
|
||||||
#define ASM_OUTPUT_SOURCE_LINE(STREAM, LINE) \
|
#define ASM_OUTPUT_SOURCE_LINE(STREAM, LINE) \
|
||||||
mips_output_lineno (STREAM, LINE)
|
mips_output_lineno (STREAM, LINE)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The MIPS implementation uses some labels for its own purpose. The
|
/* The MIPS implementation uses some labels for its own purpose. The
|
||||||
following lists what labels are created, and are all formed by 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. */
|
/* Handle certain cpp directives used in header files on sysV. */
|
||||||
#define SCCS_DIRECTIVE
|
#define SCCS_DIRECTIVE
|
||||||
|
|
||||||
|
#ifndef ASM_OUTPUT_IDENT
|
||||||
/* Output #ident as a in the read-only data section. */
|
/* Output #ident as a in the read-only data section. */
|
||||||
#undef ASM_OUTPUT_IDENT
|
|
||||||
#define ASM_OUTPUT_IDENT(FILE, STRING) \
|
#define ASM_OUTPUT_IDENT(FILE, STRING) \
|
||||||
{ \
|
{ \
|
||||||
const char *p = STRING; \
|
const char *p = STRING; \
|
||||||
|
@ -4415,6 +4422,7 @@ do { \
|
||||||
rdata_section (); \
|
rdata_section (); \
|
||||||
assemble_string (p, size); \
|
assemble_string (p, size); \
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Default to -G 8 */
|
/* Default to -G 8 */
|
||||||
#ifndef MIPS_DEFAULT_GVALUE
|
#ifndef MIPS_DEFAULT_GVALUE
|
||||||
|
|
Loading…
Add table
Reference in a new issue