1 /* Definitions of target machine for GNU compiler.
2    MIPS SDE version.
3    Copyright (C) 2003-2020 Free Software Foundation, Inc.
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11 
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 #undef DRIVER_SELF_SPECS
22 #define DRIVER_SELF_SPECS						\
23   /* Set the ISA for the default multilib.  */				\
24   MIPS_DEFAULT_ISA_LEVEL_SPEC,						\
25 									\
26   /* Make sure a -mips option is present.  This helps us to pick	\
27      the right multilib, and also makes the later specs easier		\
28      to write.  */							\
29   MIPS_ISA_LEVEL_SPEC,							\
30 									\
31   /* Infer the default float setting from -march.  */			\
32   MIPS_ARCH_FLOAT_SPEC,							\
33 									\
34   /* If no ABI option is specified, infer one from the ISA level	\
35      or -mgp setting.  */						\
36   "%{!mabi=*: %{" MIPS_32BIT_OPTION_SPEC ": -mabi=32;: -mabi=n32}}",	\
37 									\
38   /* Remove a redundant -mfp64 for -mabi=n32; we want the !mfp64	\
39      multilibs.  There's no need to check whether the architecture	\
40      is 64-bit; cc1 will complain if it isn't.  */			\
41   "%{mabi=n32: %<mfp64}",						\
42 									\
43   /* Make sure that an endian option is always present.  This makes	\
44      things like LINK_SPEC easier to write.  */				\
45   "%{!EB:%{!EL:%(endian_spec)}}",					\
46 									\
47   /* Configuration-independent MIPS rules.  */				\
48   BASE_DRIVER_SELF_SPECS
49 
50 /* Use trap rather than break for all but MIPS I ISA.  Force -no-mips16,
51    so that MIPS16 assembler code requires an explicit ".set mips16".
52    Very little hand-written MIPS16 assembler exists, and some build
53    systems expect code to be assembled as non-MIPS16 even if the
54    prevailing compiler flags select -mips16.  */
55 #undef SUBTARGET_ASM_SPEC
56 #define SUBTARGET_ASM_SPEC "\
57 %{!mips1:--trap} \
58 %{mips16:-no-mips16}"
59 
60 #undef LINK_SPEC
61 #define LINK_SPEC "\
62 %(endian_spec) \
63 %{G*} %{mips1} %{mips2} %{mips3} %{mips4} %{mips32*} %{mips64*} \
64 %{shared} \
65 %{mabi=n32:-melf32%{EB:b}%{EL:l}tsmipn32} \
66 %{mabi=64:-melf64%{EB:b}%{EL:l}tsmip} \
67 %{mabi=32:-melf32%{EB:b}%{EL:l}tsmip}"
68 
69 #undef DEFAULT_SIGNED_CHAR
70 #define DEFAULT_SIGNED_CHAR 0
71 
72 /* Describe how we implement __builtin_eh_return.  */
73 
74 /* At the moment, nothing appears to use more than 2 EH data registers.
75    The chosen registers must not clash with the return register ($2),
76    EH_RETURN_STACKADJ ($3), or MIPS_EPILOGUE_TEMP ($5), and they must
77    be general MIPS16 registers.  Pick $6 and $7.  */
78 #undef EH_RETURN_DATA_REGNO
79 #define EH_RETURN_DATA_REGNO(N) \
80   ((N) < 2 ? 7 - (N) : INVALID_REGNUM)
81 
82 /* Use $5 as a temporary for both MIPS16 and non-MIPS16.  */
83 #undef MIPS_EPILOGUE_TEMP_REGNUM
84 #define MIPS_EPILOGUE_TEMP_REGNUM \
85   (cfun->machine->interrupt_handler_p ? K0_REG_NUM : GP_REG_FIRST + 5)
86 
87 /* Using long will always be right for size_t and ptrdiff_t, since
88    sizeof(long) must equal sizeof(void *), following from the setting
89    of the -mlong64 option.  */
90 #undef SIZE_TYPE
91 #define SIZE_TYPE "long unsigned int"
92 #undef PTRDIFF_TYPE
93 #define PTRDIFF_TYPE "long int"
94 
95 /* Force all .init and .fini entries to be 32-bit, not mips16, so that
96    in a mixed environment they are all the same mode. The crti.asm and
97    crtn.asm files will also be compiled as 32-bit due to the
98    -no-mips16 flag in SUBTARGET_ASM_SPEC above. */
99 #undef CRT_CALL_STATIC_FUNCTION
100 #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
101    asm (SECTION_OP "\n\
102 	.set push\n\
103 	.set nomips16\n\
104 	jal " USER_LABEL_PREFIX #FUNC "\n\
105 	.set pop\n\
106 	" TEXT_SECTION_ASM_OP);
107