1/* Definitions of target machine for GNU compiler.
2   MIPS SDE version.
3   Copyright (C) 2003, 2004, 2007, 2008, 2009
4   Free Software Foundation, Inc.
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 3, or (at your option)
11any later version.
12
13GCC is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with GCC; see the file COPYING3.  If not see
20<http://www.gnu.org/licenses/>.  */
21
22#undef DRIVER_SELF_SPECS
23#define DRIVER_SELF_SPECS						\
24  /* Make sure a -mips option is present.  This helps us to pick	\
25     the right multilib, and also makes the later specs easier		\
26     to write.  */							\
27  MIPS_ISA_LEVEL_SPEC,							\
28									\
29  /* Infer the default float setting from -march.  */			\
30  MIPS_ARCH_FLOAT_SPEC,							\
31									\
32  /* If no ABI option is specified, infer one from the ISA level	\
33     or -mgp setting.  */						\
34  "%{!mabi=*: %{" MIPS_32BIT_OPTION_SPEC ": -mabi=32;: -mabi=n32}}",	\
35									\
36  /* Remove a redundant -mfp64 for -mabi=n32; we want the !mfp64	\
37     multilibs.  There's no need to check whether the architecture	\
38     is 64-bit; cc1 will complain if it isn't.  */			\
39  "%{mabi=n32: %<mfp64}",						\
40									\
41  /* Make sure that an endian option is always present.  This makes	\
42     things like LINK_SPEC easier to write.  */				\
43  "%{!EB:%{!EL:%(endian_spec)}}",					\
44									\
45  /* -mcode-xonly is a traditional alias for -mcode-readable=pcrel and	\
46     -mno-data-in-code is a traditional alias for -mcode-readable=no.	\
47     The latter trumps the former.  */					\
48  "%{mno-data-in-code: -mcode-readable=no}",				\
49  "%{!mcode-readable=no: %{mcode-xonly: -mcode-readable=pcrel}}",	\
50  "%<mno-data-in-code %<mcode-xonly",					\
51									\
52  /* Configuration-independent MIPS rules.  */				\
53  BASE_DRIVER_SELF_SPECS
54
55/* Use trap rather than break for all but MIPS I ISA.  Force -no-mips16,
56   so that MIPS16 assembler code requires an explicit ".set mips16".
57   Very little hand-written MIPS16 assembler exists, and some build
58   systems expect code to be assembled as non-MIPS16 even if the
59   prevailing compiler flags select -mips16.  */
60#undef SUBTARGET_ASM_SPEC
61#define SUBTARGET_ASM_SPEC "\
62%{!mips1:--trap} \
63%{mips16:-no-mips16}"
64
65#undef LINK_SPEC
66#define LINK_SPEC "\
67%(endian_spec) \
68%{G*} %{mips1} %{mips2} %{mips3} %{mips4} %{mips32*} %{mips64*} \
69%{bestGnum} \
70%{shared} %{non_shared} %{call_shared} \
71%{mabi=n32:-melf32%{EB:b}%{EL:l}tsmipn32} \
72%{mabi=64:-melf64%{EB:b}%{EL:l}tsmip} \
73%{mabi=32:-melf32%{EB:b}%{EL:l}tsmip}"
74
75#undef DEFAULT_SIGNED_CHAR
76#define DEFAULT_SIGNED_CHAR 0
77
78/* SDE-MIPS won't ever support SDB debugging info.  */
79#undef SDB_DEBUGGING_INFO
80
81/* Describe how we implement __builtin_eh_return.  */
82
83/* At the moment, nothing appears to use more than 2 EH data registers.
84   The chosen registers must not clash with the return register ($2),
85   EH_RETURN_STACKADJ ($3), or MIPS_EPILOGUE_TEMP ($5), and they must
86   be general MIPS16 registers.  Pick $6 and $7.  */
87#undef EH_RETURN_DATA_REGNO
88#define EH_RETURN_DATA_REGNO(N) \
89  ((N) < 2 ? 7 - (N) : INVALID_REGNUM)
90
91/* Use $5 as a temporary for both MIPS16 and non-MIPS16.  */
92#undef MIPS_EPILOGUE_TEMP_REGNUM
93#define MIPS_EPILOGUE_TEMP_REGNUM \
94  (cfun->machine->interrupt_handler_p ? K0_REG_NUM : GP_REG_FIRST + 5)
95
96/* Using long will always be right for size_t and ptrdiff_t, since
97   sizeof(long) must equal sizeof(void *), following from the setting
98   of the -mlong64 option.  */
99#undef SIZE_TYPE
100#define SIZE_TYPE "long unsigned int"
101#undef PTRDIFF_TYPE
102#define PTRDIFF_TYPE "long int"
103
104/* Enable parsing of #pragma pack(push,<n>) and #pragma pack(pop).  */
105#define HANDLE_PRAGMA_PACK_PUSH_POP 1
106
107/* Use standard ELF-style local labels (not '$' as on early Irix).  */
108#undef LOCAL_LABEL_PREFIX
109#define LOCAL_LABEL_PREFIX "."
110
111/* Use periods rather than dollar signs in special g++ assembler names.  */
112#define NO_DOLLAR_IN_LABEL
113
114/* Attach a special .ident directive to the end of the file to identify
115   the version of GCC which compiled this code.  */
116#undef IDENT_ASM_OP
117#define IDENT_ASM_OP "\t.ident\t"
118
119/* Output #ident string into the ELF .comment section, so it doesn't
120   form part of the load image, and so that it can be stripped.  */
121#undef ASM_OUTPUT_IDENT
122#define ASM_OUTPUT_IDENT(STREAM, STRING) \
123  fprintf (STREAM, "%s\"%s\"\n", IDENT_ASM_OP, STRING);
124
125/* Currently we don't support 128bit long doubles, so for now we force
126   n32 to be 64bit.  */
127#undef LONG_DOUBLE_TYPE_SIZE
128#define LONG_DOUBLE_TYPE_SIZE 64
129
130#ifdef IN_LIBGCC2
131#undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE
132#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64
133#endif
134
135/* Force all .init and .fini entries to be 32-bit, not mips16, so that
136   in a mixed environment they are all the same mode. The crti.asm and
137   crtn.asm files will also be compiled as 32-bit due to the
138   -no-mips16 flag in SUBTARGET_ASM_SPEC above. */
139#undef CRT_CALL_STATIC_FUNCTION
140#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
141   asm (SECTION_OP "\n\
142	.set push\n\
143	.set nomips16\n\
144	jal " USER_LABEL_PREFIX #FUNC "\n\
145	.set pop\n\
146	" TEXT_SECTION_ASM_OP);
147