1 /* Definitions of target machine for GNU compiler, for ELF on NetBSD/sparc 2 and NetBSD/sparc64. 3 Copyright (C) 2002 Free Software Foundation, Inc. 4 Contributed by Matthew Green (mrg@eterna.com.au). 5 6 This file is part of GNU CC. 7 8 GNU CC 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 2, or (at your option) 11 any later version. 12 13 GNU CC 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 GNU CC; see the file COPYING. If not, write to 20 the Free Software Foundation, 59 Temple Place - Suite 330, 21 Boston, MA 02111-1307, USA. */ 22 23 #define TARGET_OS_CPP_BUILTINS() \ 24 do \ 25 { \ 26 NETBSD_OS_CPP_BUILTINS_ELF(); \ 27 if (TARGET_ARCH64) \ 28 { \ 29 NETBSD_OS_CPP_BUILTINS_LP64(); \ 30 builtin_define ("__sparc64__"); \ 31 builtin_define ("__sparc_v9__"); \ 32 } \ 33 else \ 34 builtin_define ("__sparc"); \ 35 builtin_define ("__sparc__"); \ 36 } \ 37 while (0) 38 39 /* Make sure these are undefined. */ 40 #undef MD_EXEC_PREFIX 41 #undef MD_STARTFILE_PREFIX 42 43 /* Make sure this is undefined. */ 44 #undef CPP_PREDEFINES 45 46 /* CPP defines used by all NetBSD targets. */ 47 #undef CPP_SUBTARGET_SPEC 48 #define CPP_SUBTARGET_SPEC "%(netbsd_cpp_spec)" 49 50 /* SIZE_TYPE and PTRDIFF_TYPE are wrong from sparc/sparc.h. */ 51 #undef SIZE_TYPE 52 #define SIZE_TYPE "long unsigned int" 53 54 #undef PTRDIFF_TYPE 55 #define PTRDIFF_TYPE "long int" 56 57 #undef PREFERRED_DEBUGGING_TYPE 58 #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG 59 60 /* This is the char to use for continuation (in case we need to turn 61 continuation back on). */ 62 #undef DBX_CONTIN_CHAR 63 #define DBX_CONTIN_CHAR '?' 64 65 #undef DBX_REGISTER_NUMBER 66 #define DBX_REGISTER_NUMBER(REGNO) \ 67 (TARGET_FLAT && REGNO == HARD_FRAME_POINTER_REGNUM ? 31 : REGNO) 68 69 #undef LOCAL_LABEL_PREFIX 70 #define LOCAL_LABEL_PREFIX "." 71 72 /* This is how to output a definition of an internal numbered label where 73 PREFIX is the class of label and NUM is the number within the class. */ 74 75 #undef ASM_OUTPUT_INTERNAL_LABEL 76 #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ 77 fprintf (FILE, ".L%s%d:\n", PREFIX, NUM) 78 79 /* This is how to output a reference to an internal numbered label where 80 PREFIX is the class of label and NUM is the number within the class. */ 81 82 #undef ASM_OUTPUT_INTERNAL_LABELREF 83 #define ASM_OUTPUT_INTERNAL_LABELREF(FILE,PREFIX,NUM) \ 84 fprintf (FILE, ".L%s%d", PREFIX, NUM) 85 86 /* This is how to store into the string LABEL 87 the symbol_ref name of an internal numbered label where 88 PREFIX is the class of label and NUM is the number within the class. 89 This is suitable for output with `assemble_name'. */ 90 91 #undef ASM_GENERATE_INTERNAL_LABEL 92 #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ 93 sprintf ((LABEL), "*.L%s%ld", (PREFIX), (long)(NUM)) 94 95 #undef USER_LABEL_PREFIX 96 #define USER_LABEL_PREFIX "" 97 98 #undef ASM_SPEC 99 #define ASM_SPEC "%{fpic:-K PIC} %{fPIC:-K PIC} %{V} %{v:%{!V:-V}} \ 100 %{mlittle-endian:-EL} \ 101 %(asm_cpu) %(asm_arch) %(asm_relax)" 102 103 #undef STDC_0_IN_SYSTEM_HEADERS 104 105 /* Attempt to enable execute permissions on the stack. */ 106 #define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK 107 108 #undef TARGET_VERSION 109 #define TARGET_VERSION fprintf (stderr, " (%s)", TARGET_NAME); 110 111 /* 112 * Clean up afterwards generic SPARC ELF configuration. 113 */ 114 115 /* FIXME: Aren't these supposed to be available for SPARC ELF? */ 116 #undef MULDI3_LIBCALL 117 #undef DIVDI3_LIBCALL 118 #undef UDIVDI3_LIBCALL 119 #undef MODDI3_LIBCALL 120 #undef UMODDI3_LIBCALL 121 #undef INIT_SUBTARGET_OPTABS 122 #define INIT_SUBTARGET_OPTABS 123 124 /* Below here exists the merged NetBSD/sparc & NetBSD/sparc64 compiler 125 description, allowing one to build 32 bit or 64 bit applications 126 on either. We define the sparc & sparc64 versions of things, 127 occasionally a neutral version (should be the same as "netbsd-elf.h") 128 and then based on SPARC_BI_ARCH, DEFAULT_ARCH32_P, and TARGET_CPU_DEFAULT, 129 we choose the correct version. */ 130 131 /* We use the default NetBSD ELF STARTFILE_SPEC and ENDFILE_SPEC 132 definitions, even for the SPARC_BI_ARCH compiler, because NetBSD does 133 not have a default place to find these libraries.. */ 134 135 /* Name the port(s). */ 136 #define TARGET_NAME64 "NetBSD/sparc64 ELF" 137 #define TARGET_NAME32 "NetBSD/sparc ELF" 138 139 /* TARGET_CPU_DEFAULT is set in Makefile.in. We test for 64-bit default 140 platform here. */ 141 142 #if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ 143 || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc 144 /* A 64 bit v9 compiler with stack-bias, 145 in a Medium/Low code model environment. */ 146 147 #undef TARGET_DEFAULT 148 #define TARGET_DEFAULT \ 149 (MASK_V9 + MASK_PTR64 + MASK_64BIT /* + MASK_HARD_QUAD */ \ 150 + MASK_STACK_BIAS + MASK_APP_REGS + MASK_FPU + MASK_LONG_DOUBLE_128) 151 152 #undef SPARC_DEFAULT_CMODEL 153 #define SPARC_DEFAULT_CMODEL CM_MEDANY 154 155 #endif 156 157 /* CC1_SPEC for NetBSD/sparc. */ 158 #define CC1_SPEC32 \ 159 "%{sun4:} %{target:} \ 160 %{mcypress:-mcpu=cypress} \ 161 %{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \ 162 %{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \ 163 %{m32:%{m64:%emay not use both -m32 and -m64}} \ 164 %{m64: \ 165 -mptr64 -mstack-bias -mno-v8plus -mlong-double-128 \ 166 %{!mcpu*: \ 167 %{!mcypress: \ 168 %{!msparclite: \ 169 %{!mf930: \ 170 %{!mf934: \ 171 %{!mv8*: \ 172 %{!msupersparc:-mcpu=ultrasparc}}}}}}} \ 173 %{!mno-vis:%{!mcpu=v9:-mvis}} \ 174 %{p:-mcmodel=medlow} \ 175 %{pg:-mcmodel=medlow}}" 176 177 #define CC1_SPEC64 \ 178 "%{sun4:} %{target:} \ 179 %{mcypress:-mcpu=cypress} \ 180 %{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \ 181 %{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \ 182 %{m32:%{m64:%emay not use both -m32 and -m64}} \ 183 %{m32: \ 184 -mptr32 -mno-stack-bias \ 185 %{!mlong-double-128:-mlong-double-64} \ 186 %{!mcpu*: \ 187 %{!mcypress: \ 188 %{!msparclite: \ 189 %{!mf930: \ 190 %{!mf934: \ 191 %{!mv8*: \ 192 %{!msupersparc:-mcpu=cypress}}}}}}}} \ 193 %{!m32: \ 194 %{p:-mcmodel=medlow} \ 195 %{pg:-mcmodel=medlow}}" 196 197 /* Make sure we use the right output format. Pick a default and then 198 make sure -m32/-m64 switch to the right one. */ 199 200 #define LINK_ARCH32_SPEC "-m elf32_sparc" 201 202 #define LINK_ARCH64_SPEC "-m elf64_sparc" 203 204 #define LINK_ARCH_SPEC \ 205 "%{m32:%(link_arch32)} \ 206 %{m64:%(link_arch64)} \ 207 %{!m32:%{!m64:%(link_arch_default)}}" 208 209 #undef LINK_SPEC 210 #define LINK_SPEC \ 211 "%(link_arch) \ 212 %{!mno-relax:%{!r:-relax}} \ 213 %(netbsd_link_spec)" 214 215 #define NETBSD_ENTRY_POINT "__start" 216 217 #if DEFAULT_ARCH32_P 218 #define LINK_ARCH_DEFAULT_SPEC LINK_ARCH32_SPEC 219 #else 220 #define LINK_ARCH_DEFAULT_SPEC LINK_ARCH64_SPEC 221 #endif 222 223 /* What extra spec entries do we need? */ 224 #undef SUBTARGET_EXTRA_SPECS 225 #define SUBTARGET_EXTRA_SPECS \ 226 { "link_arch32", LINK_ARCH32_SPEC }, \ 227 { "link_arch64", LINK_ARCH64_SPEC }, \ 228 { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \ 229 { "link_arch", LINK_ARCH_SPEC }, \ 230 { "netbsd_cpp_spec", NETBSD_CPP_SPEC }, \ 231 { "netbsd_link_spec", NETBSD_LINK_SPEC_ELF }, \ 232 { "netbsd_entry_point", NETBSD_ENTRY_POINT }, 233 234 235 /* What extra switches do we need? */ 236 #undef SUBTARGET_SWITCHES 237 #define SUBTARGET_SWITCHES \ 238 {"long-double-64", -MASK_LONG_DOUBLE_128, N_("Use 64 bit long doubles") }, \ 239 {"long-double-128", MASK_LONG_DOUBLE_128, N_("Use 128 bit long doubles") }, 240 241 242 /* Build a compiler that supports -m32 and -m64? */ 243 244 #ifdef SPARC_BI_ARCH 245 246 #undef LONG_DOUBLE_TYPE_SIZE 247 #define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64) 248 249 #undef MAX_LONG_DOUBLE_TYPE_SIZE 250 #define MAX_LONG_DOUBLE_TYPE_SIZE 128 251 252 #if defined(__arch64__) || defined(__LONG_DOUBLE_128__) 253 #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128 254 #else 255 #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 256 #endif 257 258 #undef CC1_SPEC 259 #if DEFAULT_ARCH32_P 260 #define CC1_SPEC CC1_SPEC32 261 #else 262 #define CC1_SPEC CC1_SPEC64 263 #endif 264 265 #if DEFAULT_ARCH32_P 266 #define MULTILIB_DEFAULTS { "m32" } 267 #else 268 #define MULTILIB_DEFAULTS { "m64" } 269 #endif 270 271 /* Name the port. */ 272 #undef TARGET_NAME 273 #define TARGET_NAME (DEFAULT_ARCH32_P ? TARGET_NAME32 : TARGET_NAME64) 274 275 #else /* SPARC_BI_ARCH */ 276 277 #if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ 278 || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc 279 280 #undef LONG_DOUBLE_TYPE_SIZE 281 #define LONG_DOUBLE_TYPE_SIZE 128 282 283 #undef MAX_LONG_DOUBLE_TYPE_SIZE 284 #define MAX_LONG_DOUBLE_TYPE_SIZE 128 285 286 #undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE 287 #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128 288 289 #undef CC1_SPEC 290 #define CC1_SPEC CC1_SPEC64 291 292 #undef TARGET_NAME 293 #define TARGET_NAME TARGET_NAME64 294 295 #else /* TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ 296 || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc */ 297 298 /* A 32-bit only compiler. NetBSD don't support 128 bit `long double' 299 for 32-bit code, unlike Solaris. */ 300 301 #undef LONG_DOUBLE_TYPE_SIZE 302 #define LONG_DOUBLE_TYPE_SIZE 64 303 304 #undef MAX_LONG_DOUBLE_TYPE_SIZE 305 #define MAX_LONG_DOUBLE_TYPE_SIZE 64 306 307 #undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE 308 #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 309 310 #undef CC1_SPEC 311 #define CC1_SPEC CC1_SPEC32 312 313 #undef TARGET_NAME 314 #define TARGET_NAME TARGET_NAME32 315 316 #endif /* TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ 317 || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc */ 318 319 #endif /* SPARC_BI_ARCH */ 320 321 /* We use GNU ld so undefine this so that attribute((init_priority)) works. */ 322 #undef CTORS_SECTION_ASM_OP 323 #undef DTORS_SECTION_ASM_OP 324