1 /* Definitions for 64-bit SPARC running Linux-based GNU systems with ELF. 2 Copyright 1996, 1997, 1998, 2000, 2002, 2003, 2004, 2005, 2006 3 Free Software Foundation, Inc. 4 Contributed by David S. Miller (davem@caip.rutgers.edu) 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 2, 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 COPYING. If not, write to 20 the Free Software Foundation, 51 Franklin Street, Fifth Floor, 21 Boston, MA 02110-1301, USA. */ 22 23 #define TARGET_OS_CPP_BUILTINS() \ 24 do \ 25 { \ 26 builtin_define_std ("unix"); \ 27 builtin_define_std ("linux"); \ 28 builtin_define ("_LONGLONG"); \ 29 builtin_define ("__gnu_linux__"); \ 30 builtin_assert ("system=linux"); \ 31 builtin_assert ("system=unix"); \ 32 builtin_assert ("system=posix"); \ 33 if (TARGET_ARCH32 && TARGET_LONG_DOUBLE_128) \ 34 builtin_define ("__LONG_DOUBLE_128__"); \ 35 } \ 36 while (0) 37 38 /* Don't assume anything about the header files. */ 39 #define NO_IMPLICIT_EXTERN_C 40 41 #undef MD_EXEC_PREFIX 42 #undef MD_STARTFILE_PREFIX 43 44 #if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ 45 || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc \ 46 || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc3 \ 47 || TARGET_CPU_DEFAULT == TARGET_CPU_niagara 48 /* A 64 bit v9 compiler with stack-bias, 49 in a Medium/Low code model environment. */ 50 51 #undef TARGET_DEFAULT 52 #define TARGET_DEFAULT \ 53 (MASK_V9 + MASK_PTR64 + MASK_64BIT /* + MASK_HARD_QUAD */ \ 54 + MASK_STACK_BIAS + MASK_APP_REGS + MASK_FPU + MASK_LONG_DOUBLE_128) 55 #endif 56 57 #undef ASM_CPU_DEFAULT_SPEC 58 #define ASM_CPU_DEFAULT_SPEC "-Av9a" 59 60 /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add 61 the GNU/Linux magical crtbegin.o file (see crtstuff.c) which 62 provides part of the support for getting C++ file-scope static 63 object constructed before entering `main'. */ 64 65 #undef STARTFILE_SPEC 66 67 #ifdef HAVE_LD_PIE 68 #define STARTFILE_SPEC \ 69 "%{!shared:%{pg|p:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}}\ 70 crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbeginS.o%s}" 71 #else 72 #define STARTFILE_SPEC \ 73 "%{!shared:%{pg|p:gcrt1.o%s;:crt1.o%s}}\ 74 crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbeginS.o%s}" 75 #endif 76 77 /* Provide a ENDFILE_SPEC appropriate for GNU/Linux. Here we tack on 78 the GNU/Linux magical crtend.o file (see crtstuff.c) which 79 provides part of the support for getting C++ file-scope static 80 object constructed before entering `main', followed by a normal 81 GNU/Linux "finalizer" file, `crtn.o'. */ 82 83 #undef ENDFILE_SPEC 84 85 #define ENDFILE_SPEC \ 86 "%{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s\ 87 %{ffast-math|funsafe-math-optimizations:crtfastmath.o%s}" 88 89 /* The GNU C++ standard library requires that these macros be defined. */ 90 #undef CPLUSPLUS_CPP_SPEC 91 #define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)" 92 93 #undef TARGET_VERSION 94 #define TARGET_VERSION fprintf (stderr, " (sparc64 GNU/Linux with ELF)"); 95 96 /* The default code model. */ 97 #undef SPARC_DEFAULT_CMODEL 98 #define SPARC_DEFAULT_CMODEL CM_MEDLOW 99 100 #undef WCHAR_TYPE 101 #define WCHAR_TYPE "int" 102 103 #undef WCHAR_TYPE_SIZE 104 #define WCHAR_TYPE_SIZE 32 105 106 /* Define for support of TFmode long double. 107 SPARC ABI says that long double is 4 words. */ 108 #undef LONG_DOUBLE_TYPE_SIZE 109 #define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64) 110 111 /* Define this to set long double type size to use in libgcc2.c, which can 112 not depend on target_flags. */ 113 #if defined(__arch64__) || defined(__LONG_DOUBLE_128__) 114 #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128 115 #else 116 #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 117 #endif 118 119 #undef CPP_SUBTARGET_SPEC 120 #define CPP_SUBTARGET_SPEC "\ 121 %{posix:-D_POSIX_SOURCE} \ 122 %{pthread:-D_REENTRANT} \ 123 " 124 125 #undef LIB_SPEC 126 #define LIB_SPEC \ 127 "%{pthread:-lpthread} \ 128 %{shared:-lc} \ 129 %{!shared: %{mieee-fp:-lieee} %{profile:-lc_p}%{!profile:-lc}}" 130 131 /* Provide a LINK_SPEC appropriate for GNU/Linux. Here we provide support 132 for the special GCC options -static and -shared, which allow us to 133 link things in one of these three modes by applying the appropriate 134 combinations of options at link-time. We like to support here for 135 as many of the other GNU linker options as possible. But I don't 136 have the time to search for those flags. I am sure how to add 137 support for -soname shared_object_name. H.J. 138 139 I took out %{v:%{!V:-V}}. It is too much :-(. They can use 140 -Wl,-V. 141 142 When the -shared link option is used a final link is not being 143 done. */ 144 145 /* If ELF is the default format, we should not use /lib/elf. */ 146 147 #define GLIBC_DYNAMIC_LINKER32 "/lib/ld-linux.so.2" 148 #define GLIBC_DYNAMIC_LINKER64 "/lib64/ld-linux.so.2" 149 #define UCLIBC_DYNAMIC_LINKER32 "/lib/ld-uClibc.so.0" 150 #define UCLIBC_DYNAMIC_LINKER64 "/lib/ld64-uClibc.so.0" 151 #if UCLIBC_DEFAULT 152 #define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:%{muclibc:%e-mglibc and -muclibc used together}" G ";:" U "}" 153 #else 154 #define CHOOSE_DYNAMIC_LINKER(G, U) "%{muclibc:%{mglibc:%e-mglibc and -muclibc used together}" U ";:" G "}" 155 #endif 156 #define LINUX_DYNAMIC_LINKER32 \ 157 CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32) 158 #define LINUX_DYNAMIC_LINKER64 \ 159 CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64) 160 161 #ifdef SPARC_BI_ARCH 162 163 #undef SUBTARGET_EXTRA_SPECS 164 #define SUBTARGET_EXTRA_SPECS \ 165 { "link_arch32", LINK_ARCH32_SPEC }, \ 166 { "link_arch64", LINK_ARCH64_SPEC }, \ 167 { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \ 168 { "link_arch", LINK_ARCH_SPEC }, 169 170 #define LINK_ARCH32_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \ 171 %{!shared: \ 172 %{!ibcs: \ 173 %{!static: \ 174 %{rdynamic:-export-dynamic} \ 175 %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER32 "}} \ 176 %{static:-static}}} \ 177 " 178 179 #define LINK_ARCH64_SPEC "-m elf64_sparc -Y P,/usr/lib64 %{shared:-shared} \ 180 %{!shared: \ 181 %{!ibcs: \ 182 %{!static: \ 183 %{rdynamic:-export-dynamic} \ 184 %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER64 "}} \ 185 %{static:-static}}} \ 186 " 187 188 #define LINK_ARCH_SPEC "\ 189 %{m32:%(link_arch32)} \ 190 %{m64:%(link_arch64)} \ 191 %{!m32:%{!m64:%(link_arch_default)}} \ 192 " 193 194 #define LINK_ARCH_DEFAULT_SPEC \ 195 (DEFAULT_ARCH32_P ? LINK_ARCH32_SPEC : LINK_ARCH64_SPEC) 196 197 #undef LINK_SPEC 198 #define LINK_SPEC "\ 199 %(link_arch) \ 200 %{mlittle-endian:-EL} \ 201 %{!mno-relax:%{!r:-relax}} \ 202 " 203 204 #undef CC1_SPEC 205 #if DEFAULT_ARCH32_P 206 #define CC1_SPEC "\ 207 %{sun4:} %{target:} \ 208 %{mcypress:-mcpu=cypress} \ 209 %{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \ 210 %{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \ 211 %{m32:%{m64:%emay not use both -m32 and -m64}} \ 212 %{m64:-mptr64 -mstack-bias -mlong-double-128 \ 213 %{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8:%{!msupersparc:-mcpu=ultrasparc}}}}}}} \ 214 %{!mno-vis:%{!mcpu=v9:-mvis}}} \ 215 " 216 #else 217 #define CC1_SPEC "\ 218 %{sun4:} %{target:} \ 219 %{mcypress:-mcpu=cypress} \ 220 %{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \ 221 %{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \ 222 %{m32:%{m64:%emay not use both -m32 and -m64}} \ 223 %{m32:-mptr32 -mno-stack-bias %{!mlong-double-128:-mlong-double-64} \ 224 %{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8:%{!msupersparc:-mcpu=cypress}}}}}}}} \ 225 %{!m32:%{!mcpu*:-mcpu=ultrasparc}} \ 226 %{!mno-vis:%{!m32:%{!mcpu=v9:-mvis}}} \ 227 " 228 #endif 229 230 /* Support for a compile-time default CPU, et cetera. The rules are: 231 --with-cpu is ignored if -mcpu is specified. 232 --with-tune is ignored if -mtune is specified. 233 --with-float is ignored if -mhard-float, -msoft-float, -mfpu, or -mno-fpu 234 are specified. 235 In the SPARC_BI_ARCH compiler we cannot pass %{!mcpu=*:-mcpu=%(VALUE)} 236 here, otherwise say -mcpu=v7 would be passed even when -m64. 237 CC1_SPEC above takes care of this instead. */ 238 #undef OPTION_DEFAULT_SPECS 239 #if DEFAULT_ARCH32_P 240 #define OPTION_DEFAULT_SPECS \ 241 {"cpu", "%{!m64:%{!mcpu=*:-mcpu=%(VALUE)}}" }, \ 242 {"tune", "%{!mtune=*:-mtune=%(VALUE)}" }, \ 243 {"float", "%{!msoft-float:%{!mhard-float:%{!fpu:%{!no-fpu:-m%(VALUE)-float}}}}" } 244 #else 245 #define OPTION_DEFAULT_SPECS \ 246 {"cpu", "%{!m32:%{!mcpu=*:-mcpu=%(VALUE)}}" }, \ 247 {"tune", "%{!mtune=*:-mtune=%(VALUE)}" }, \ 248 {"float", "%{!msoft-float:%{!mhard-float:%{!fpu:%{!no-fpu:-m%(VALUE)-float}}}}" } 249 #endif 250 251 #if DEFAULT_ARCH32_P 252 #define MULTILIB_DEFAULTS { "m32" } 253 #else 254 #define MULTILIB_DEFAULTS { "m64" } 255 #endif 256 257 #else /* !SPARC_BI_ARCH */ 258 259 #undef LINK_SPEC 260 #define LINK_SPEC "-m elf64_sparc -Y P,/usr/lib64 %{shared:-shared} \ 261 %{!shared: \ 262 %{!ibcs: \ 263 %{!static: \ 264 %{rdynamic:-export-dynamic} \ 265 %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER64 "}} \ 266 %{static:-static}}} \ 267 %{mlittle-endian:-EL} \ 268 %{!mno-relax:%{!r:-relax}} \ 269 " 270 271 #endif /* !SPARC_BI_ARCH */ 272 273 /* The sun bundled assembler doesn't accept -Yd, (and neither does gas). 274 It's safe to pass -s always, even if -g is not used. */ 275 #undef ASM_SPEC 276 #define ASM_SPEC "\ 277 %{V} \ 278 %{v:%{!V:-V}} \ 279 %{!Qn:-Qy} \ 280 %{n} \ 281 %{T} \ 282 %{Ym,*} \ 283 %{Wa,*:%*} \ 284 -s %{fpic|fPIC|fpie|fPIE:-K PIC} \ 285 %{mlittle-endian:-EL} \ 286 %(asm_cpu) %(asm_arch) %(asm_relax)" 287 288 /* Same as sparc.h */ 289 #undef DBX_REGISTER_NUMBER 290 #define DBX_REGISTER_NUMBER(REGNO) (REGNO) 291 292 #undef ASM_OUTPUT_ALIGNED_LOCAL 293 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ 294 do { \ 295 fputs ("\t.local\t", (FILE)); \ 296 assemble_name ((FILE), (NAME)); \ 297 putc ('\n', (FILE)); \ 298 ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \ 299 } while (0) 300 301 #undef COMMON_ASM_OP 302 #define COMMON_ASM_OP "\t.common\t" 303 304 #undef LOCAL_LABEL_PREFIX 305 #define LOCAL_LABEL_PREFIX "." 306 307 /* This is how to store into the string LABEL 308 the symbol_ref name of an internal numbered label where 309 PREFIX is the class of label and NUM is the number within the class. 310 This is suitable for output with `assemble_name'. */ 311 312 #undef ASM_GENERATE_INTERNAL_LABEL 313 #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ 314 sprintf (LABEL, "*.L%s%ld", PREFIX, (long)(NUM)) 315 316 /* DWARF bits. */ 317 318 /* Follow Irix 6 and not the Dwarf2 draft in using 64-bit offsets. 319 Obviously the Dwarf2 folks haven't tried to actually build systems 320 with their spec. On a 64-bit system, only 64-bit relocs become 321 RELATIVE relocations. */ 322 323 /* #define DWARF_OFFSET_SIZE PTR_SIZE */ 324 325 #undef DITF_CONVERSION_LIBFUNCS 326 #define DITF_CONVERSION_LIBFUNCS 1 327 328 #if defined(HAVE_LD_EH_FRAME_HDR) 329 #define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " 330 #endif 331 332 #ifdef HAVE_AS_TLS 333 #undef TARGET_SUN_TLS 334 #undef TARGET_GNU_TLS 335 #define TARGET_SUN_TLS 0 336 #define TARGET_GNU_TLS 1 337 #endif 338 339 /* Don't be different from other Linux platforms in this regard. */ 340 #define HANDLE_PRAGMA_PACK_PUSH_POP 341 342 /* We use GNU ld so undefine this so that attribute((init_priority)) works. */ 343 #undef CTORS_SECTION_ASM_OP 344 #undef DTORS_SECTION_ASM_OP 345 346 /* Determine whether the entire c99 runtime is present in the 347 runtime library. */ 348 #define TARGET_C99_FUNCTIONS (OPTION_GLIBC) 349 350 #define TARGET_POSIX_IO 351 352 #undef LINK_GCC_C_SEQUENCE_SPEC 353 #define LINK_GCC_C_SEQUENCE_SPEC \ 354 "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" 355 356 /* Use --as-needed -lgcc_s for eh support. */ 357 #ifdef HAVE_LD_AS_NEEDED 358 #define USE_LD_AS_NEEDED 1 359 #endif 360 361 #define MD_UNWIND_SUPPORT "config/sparc/linux-unwind.h" 362 363 /* Linux currently uses RMO in uniprocessor mode, which is equivalent to 364 TMO, and TMO in multiprocessor mode. But they reserve the right to 365 change their minds. */ 366 #undef SPARC_RELAXED_ORDERING 367 #define SPARC_RELAXED_ORDERING true 368 369 #undef NEED_INDICATE_EXEC_STACK 370 #define NEED_INDICATE_EXEC_STACK 1 371 372 #ifdef TARGET_LIBC_PROVIDES_SSP 373 /* sparc glibc provides __stack_chk_guard in [%g7 + 0x14], 374 sparc64 glibc provides it at [%g7 + 0x28]. */ 375 #define TARGET_THREAD_SSP_OFFSET (TARGET_ARCH64 ? 0x28 : 0x14) 376 #endif 377 378 /* Define if long doubles should be mangled as 'g'. */ 379 #define TARGET_ALTERNATE_LONG_DOUBLE_MANGLING 380