1/* Definitions for 64-bit SPARC running Linux-based GNU systems with ELF. 2 Copyright 1996, 1997, 1998 Free Software Foundation, Inc. 3 Contributed by David S. Miller (davem@caip.rutgers.edu) 4 5This file is part of GNU CC. 6 7GNU CC is free software; you can redistribute it and/or modify 8it under the terms of the GNU General Public License as published by 9the Free Software Foundation; either version 2, or (at your option) 10any later version. 11 12GNU CC is distributed in the hope that it will be useful, 13but WITHOUT ANY WARRANTY; without even the implied warranty of 14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15GNU General Public License for more details. 16 17You should have received a copy of the GNU General Public License 18along with GNU CC; see the file COPYING. If not, write to 19the Free Software Foundation, 59 Temple Place - Suite 330, 20Boston, MA 02111-1307, USA. */ 21 22#define SPARC_BI_ARCH 23 24#define LINUX_DEFAULT_ELF 25 26/* Don't assume anything about the header files. */ 27#define NO_IMPLICIT_EXTERN_C 28 29#undef HAVE_ATEXIT 30#define HAVE_ATEXIT 31 32#include <sparc/sysv4.h> 33 34#undef MD_EXEC_PREFIX 35#undef MD_STARTFILE_PREFIX 36 37#if TARGET_CPU_DEFAULT == TARGET_CPU_v9 || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc 38/* A 64 bit v9 compiler with stack-bias, 39 in a Medium/Low code model environment. */ 40 41#undef TARGET_DEFAULT 42#define TARGET_DEFAULT \ 43 (MASK_V9 + MASK_PTR64 + MASK_64BIT /* + MASK_HARD_QUAD */ \ 44 + MASK_STACK_BIAS + MASK_APP_REGS + MASK_EPILOGUE + MASK_FPU) 45#endif 46 47/* Output at beginning of assembler file. */ 48/* The .file command should always begin the output. */ 49#undef ASM_FILE_START 50#define ASM_FILE_START(FILE) \ 51 do { \ 52 output_file_directive (FILE, main_input_filename); \ 53 fprintf (FILE, "\t.version\t\"01.01\"\n"); \ 54 } while (0) 55 56#undef ASM_CPU_DEFAULT_SPEC 57#define ASM_CPU_DEFAULT_SPEC "-Av9a" 58 59/* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add 60 the GNU/Linux magical crtbegin.o file (see crtstuff.c) which 61 provides part of the support for getting C++ file-scope static 62 object constructed before entering `main'. */ 63 64#undef STARTFILE_SPEC 65 66#define STARTFILE_SPEC32 \ 67 "%{!shared: \ 68 %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}\ 69 crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}" 70 71#define STARTFILE_SPEC64 \ 72 "%{!shared: \ 73 %{pg:/usr/lib64/gcrt1.o%s} %{!pg:%{p:/usr/lib64/gcrt1.o%s} %{!p:/usr/lib64/crt1.o%s}}}\ 74 /usr/lib64/crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}" 75 76#ifdef SPARC_BI_ARCH 77 78#if DEFAULT_ARCH32_P 79#define STARTFILE_SPEC "\ 80%{m32:" STARTFILE_SPEC32 "} \ 81%{m64:" STARTFILE_SPEC64 "} \ 82%{!m32:%{!m64:" STARTFILE_SPEC32 "}}" 83#else 84#define STARTFILE_SPEC "\ 85%{m32:" STARTFILE_SPEC32 "} \ 86%{m64:" STARTFILE_SPEC64 "} \ 87%{!m32:%{!m64:" STARTFILE_SPEC64 "}}" 88#endif 89 90#else 91 92#define STARTFILE_SPEC STARTFILE_SPEC64 93 94#endif 95 96/* Provide a ENDFILE_SPEC appropriate for GNU/Linux. Here we tack on 97 the GNU/Linux magical crtend.o file (see crtstuff.c) which 98 provides part of the support for getting C++ file-scope static 99 object constructed before entering `main', followed by a normal 100 GNU/Linux "finalizer" file, `crtn.o'. */ 101 102#undef ENDFILE_SPEC 103 104#define ENDFILE_SPEC32 \ 105 "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" 106 107#define ENDFILE_SPEC64 \ 108 "%{!shared:crtend.o%s} %{shared:crtendS.o%s} /usr/lib64/crtn.o%s" 109 110#ifdef SPARC_BI_ARCH 111 112#if DEFAULT_ARCH32_P 113#define ENDFILE_SPEC "\ 114%{m32:" ENDFILE_SPEC32 "} \ 115%{m64:" ENDFILE_SPEC64 "} \ 116%{!m32:%{!m64:" ENDFILE_SPEC32 "}}" 117#else 118#define ENDFILE_SPEC "\ 119%{m32:" ENDFILE_SPEC32 "} \ 120%{m64:" ENDFILE_SPEC64 "} \ 121%{!m32:%{!m64:" ENDFILE_SPEC64 "}}" 122#endif 123 124#else 125 126#define ENDFILE_SPEC ENDFILE_SPEC64 127 128#endif 129 130#undef TARGET_VERSION 131#define TARGET_VERSION fprintf (stderr, " (sparc64 GNU/Linux with ELF)"); 132 133/* The default code model. */ 134#undef SPARC_DEFAULT_CMODEL 135#define SPARC_DEFAULT_CMODEL CM_MEDLOW 136 137#undef WCHAR_TYPE 138#define WCHAR_TYPE "long int" 139 140#undef WCHAR_TYPE_SIZE 141#define WCHAR_TYPE_SIZE BITS_PER_WORD 142 143#undef LONG_DOUBLE_TYPE_SIZE 144#define LONG_DOUBLE_TYPE_SIZE 128 145 146#undef CPP_PREDEFINES 147#define CPP_PREDEFINES "-D__ELF__ -Dunix -D_LONGLONG -D__sparc__ -Dlinux -Asystem(unix) -Asystem(posix)" 148 149#undef CPP_SUBTARGET_SPEC 150#define CPP_SUBTARGET_SPEC "\ 151%{fPIC:-D__PIC__ -D__pic__} \ 152%{fpic:-D__PIC__ -D__pic__} \ 153%{posix:-D_POSIX_SOURCE} \ 154%{pthread:-D_REENTRANT} \ 155" 156 157#undef LIB_SPEC 158#define LIB_SPEC \ 159 "%{shared: -lc} \ 160 %{!shared: %{mieee-fp:-lieee} %{pthread:-lpthread} \ 161 %{profile:-lc_p} %{!profile: -lc}}" 162 163/* Provide a LINK_SPEC appropriate for GNU/Linux. Here we provide support 164 for the special GCC options -static and -shared, which allow us to 165 link things in one of these three modes by applying the appropriate 166 combinations of options at link-time. We like to support here for 167 as many of the other GNU linker options as possible. But I don't 168 have the time to search for those flags. I am sure how to add 169 support for -soname shared_object_name. H.J. 170 171 I took out %{v:%{!V:-V}}. It is too much :-(. They can use 172 -Wl,-V. 173 174 When the -shared link option is used a final link is not being 175 done. */ 176 177/* If ELF is the default format, we should not use /lib/elf. */ 178 179#ifdef SPARC_BI_ARCH 180 181#undef SUBTARGET_EXTRA_SPECS 182#define SUBTARGET_EXTRA_SPECS \ 183 { "link_arch32", LINK_ARCH32_SPEC }, \ 184 { "link_arch64", LINK_ARCH64_SPEC }, \ 185 { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \ 186 { "link_arch", LINK_ARCH_SPEC }, 187 188#define LINK_ARCH32_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \ 189 %{!shared: \ 190 %{!ibcs: \ 191 %{!static: \ 192 %{rdynamic:-export-dynamic} \ 193 %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ 194 %{static:-static}}} \ 195" 196 197#define LINK_ARCH64_SPEC "-m elf64_sparc -Y P,/usr/lib64 %{shared:-shared} \ 198 %{!shared: \ 199 %{!ibcs: \ 200 %{!static: \ 201 %{rdynamic:-export-dynamic} \ 202 %{!dynamic-linker:-dynamic-linker /lib64/ld-linux.so.2}} \ 203 %{static:-static}}} \ 204" 205 206#define LINK_ARCH_SPEC "\ 207%{m32:%(link_arch32)} \ 208%{m64:%(link_arch64)} \ 209%{!m32:%{!m64:%(link_arch_default)}} \ 210" 211 212#define LINK_ARCH_DEFAULT_SPEC \ 213(DEFAULT_ARCH32_P ? LINK_ARCH32_SPEC : LINK_ARCH64_SPEC) 214 215#undef LINK_SPEC 216#define LINK_SPEC "\ 217%(link_arch) \ 218%{mlittle-endian:-EL} \ 219" 220 221#undef CC1_SPEC 222#if DEFAULT_ARCH32_P 223#define CC1_SPEC "\ 224%{sun4:} %{target:} \ 225%{mcypress:-mcpu=cypress} \ 226%{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \ 227%{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \ 228%{m64:-mptr64 -mcpu=ultrasparc -mstack-bias} \ 229" 230#else 231#define CC1_SPEC "\ 232%{sun4:} %{target:} \ 233%{mcypress:-mcpu=cypress} \ 234%{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \ 235%{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \ 236%{m32:-mptr32 -mcpu=cypress -mno-stack-bias} \ 237" 238#endif 239 240#if DEFAULT_ARCH32_P 241#define MULTILIB_DEFAULTS { "m32" } 242#else 243#define MULTILIB_DEFAULTS { "m64" } 244#endif 245 246#else /* !SPARC_BI_ARCH */ 247 248#undef LINK_SPEC 249#define LINK_ARCH_SPEC "-m elf64_sparc -Y P,/usr/lib64 %{shared:-shared} \ 250 %{!shared: \ 251 %{!ibcs: \ 252 %{!static: \ 253 %{rdynamic:-export-dynamic} \ 254 %{!dynamic-linker:-dynamic-linker /lib64/ld-linux.so.2}} \ 255 %{static:-static}}} \ 256%{mlittle-endian:-EL} \ 257" 258 259#endif /* !SPARC_BI_ARCH */ 260 261/* The sun bundled assembler doesn't accept -Yd, (and neither does gas). 262 It's safe to pass -s always, even if -g is not used. */ 263#undef ASM_SPEC 264#define ASM_SPEC "\ 265%{V} \ 266%{v:%{!V:-V}} \ 267%{!Qn:-Qy} \ 268%{n} \ 269%{T} \ 270%{Ym,*} \ 271%{Wa,*:%*} \ 272-s %{fpic:-K PIC} %{fPIC:-K PIC} \ 273%{mlittle-endian:-EL} \ 274%(asm_cpu) %(asm_arch) \ 275" 276 277/* Same as sparc.h */ 278#undef DBX_REGISTER_NUMBER 279#define DBX_REGISTER_NUMBER(REGNO) (REGNO) 280 281/* System V Release 4 uses DWARF debugging info. Buf DWARF1 doesn't do 282 64-bit anything, so we use DWARF2. */ 283 284#undef DWARF2_DEBUGGING_INFO 285#undef DWARF_DEBUGGING_INFO 286#undef DBX_DEBUGGING_INFO 287#define DWARF2_DEBUGGING_INFO 288#define DBX_DEBUGGING_INFO 289 290#undef PREFERRED_DEBUGGING_TYPE 291#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG 292 293#undef ASM_OUTPUT_ALIGNED_LOCAL 294#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ 295do { \ 296 fputs ("\t.local\t", (FILE)); \ 297 assemble_name ((FILE), (NAME)); \ 298 putc ('\n', (FILE)); \ 299 ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \ 300} while (0) 301 302#undef COMMON_ASM_OP 303#define COMMON_ASM_OP "\t.common" 304 305/* This is how to output a definition of an internal numbered label where 306 PREFIX is the class of label and NUM is the number within the class. */ 307 308#undef ASM_OUTPUT_INTERNAL_LABEL 309#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ 310 fprintf (FILE, ".L%s%d:\n", PREFIX, NUM) 311 312/* This is how to output a reference to an internal numbered label where 313 PREFIX is the class of label and NUM is the number within the class. */ 314 315#undef ASM_OUTPUT_INTERNAL_LABELREF 316#define ASM_OUTPUT_INTERNAL_LABELREF(FILE,PREFIX,NUM) \ 317 fprintf (FILE, ".L%s%d", PREFIX, NUM) 318 319/* This is how to store into the string LABEL 320 the symbol_ref name of an internal numbered label where 321 PREFIX is the class of label and NUM is the number within the class. 322 This is suitable for output with `assemble_name'. */ 323 324#undef ASM_GENERATE_INTERNAL_LABEL 325#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ 326 sprintf (LABEL, "*.L%s%d", PREFIX, NUM) 327 328/* Stabs doesn't use this, and it confuses a simulator. */ 329/* ??? Need to see what DWARF needs, if anything. */ 330#undef ASM_IDENTIFY_GCC 331#define ASM_IDENTIFY_GCC(FILE) 332 333/* Define the names of various pseudo-ops used by the Sparc/svr4 assembler. 334 ??? If ints are 64 bits then UNALIGNED_INT_ASM_OP (defined elsewhere) is 335 misnamed. These should all refer to explicit sizes (half/word/xword?), 336 anything other than short/int/long/etc. */ 337 338#define UNALIGNED_DOUBLE_INT_ASM_OP ".uaxword" 339 340/* DWARF bits. */ 341 342/* Follow Irix 6 and not the Dwarf2 draft in using 64-bit offsets. 343 Obviously the Dwarf2 folks havn't tried to actually build systems 344 with their spec. On a 64-bit system, only 64-bit relocs become 345 RELATIVE relocations. */ 346 347/* #define DWARF_OFFSET_SIZE PTR_SIZE */ 348 349/* Override MACHINE_STATE_{SAVE,RESTORE} because we have special 350 traps available which can get and set the condition codes 351 reliably. */ 352#undef MACHINE_STATE_SAVE 353#define MACHINE_STATE_SAVE(ID) \ 354 unsigned long int ms_flags, ms_saveret; \ 355 asm volatile("ta 0x20\n\t" \ 356 "mov %%g1, %0\n\t" \ 357 "mov %%g2, %1\n\t" \ 358 : "=r" (ms_flags), "=r" (ms_saveret)); 359 360#undef MACHINE_STATE_RESTORE 361#define MACHINE_STATE_RESTORE(ID) \ 362 asm volatile("mov %0, %%g1\n\t" \ 363 "mov %1, %%g2\n\t" \ 364 "ta 0x21\n\t" \ 365 : /* no outputs */ \ 366 : "r" (ms_flags), "r" (ms_saveret)); 367