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 6 This file is part of GCC. 7 8 GCC is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3, or (at your option) 11 any later version. 12 13 GCC is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along 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