1 /* Definitions for SPARC running Linux-based GNU systems with ELF. 2 Copyright (C) 1996-2019 Free Software Foundation, Inc. 3 Contributed by Eddie C. Dost (ecd@skynet.be) 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 #define TARGET_OS_CPP_BUILTINS() \ 22 do \ 23 { \ 24 GNU_USER_TARGET_OS_CPP_BUILTINS(); \ 25 if (TARGET_LONG_DOUBLE_128) \ 26 builtin_define ("__LONG_DOUBLE_128__"); \ 27 } \ 28 while (0) 29 30 /* Provide a ENDFILE_SPEC appropriate for GNU/Linux. Here we tack on 31 the GNU/Linux magical crtend.o file (see crtstuff.c) which 32 provides part of the support for getting C++ file-scope static 33 object constructed before entering `main', followed by a normal 34 GNU/Linux "finalizer" file, `crtn.o'. */ 35 36 #undef ENDFILE_SPEC 37 #define ENDFILE_SPEC \ 38 "%{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s\ 39 %{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s}" 40 41 /* -mcpu=native handling only makes sense with compiler running on 42 a SPARC chip. */ 43 #if defined(__sparc__) && defined(__linux__) 44 extern const char *host_detect_local_cpu (int argc, const char **argv); 45 # define EXTRA_SPEC_FUNCTIONS \ 46 { "local_cpu_detect", host_detect_local_cpu }, 47 48 # define MCPU_MTUNE_NATIVE_SPECS \ 49 " %{mcpu=native:%<mcpu=native %:local_cpu_detect(cpu)}" \ 50 " %{mtune=native:%<mtune=native %:local_cpu_detect(tune)}" 51 #else 52 # define MCPU_MTUNE_NATIVE_SPECS "" 53 #endif 54 55 #define DRIVER_SELF_SPECS MCPU_MTUNE_NATIVE_SPECS 56 57 #undef ASAN_CC1_SPEC 58 #define ASAN_CC1_SPEC "%{%:sanitize(address):-funwind-tables}" 59 60 #undef CC1_SPEC 61 #define CC1_SPEC GNU_USER_TARGET_CC1_SPEC ASAN_CC1_SPEC 62 63 #undef SIZE_TYPE 64 #define SIZE_TYPE "unsigned int" 65 66 #undef PTRDIFF_TYPE 67 #define PTRDIFF_TYPE "int" 68 69 #undef WCHAR_TYPE 70 #define WCHAR_TYPE "int" 71 72 #undef WCHAR_TYPE_SIZE 73 #define WCHAR_TYPE_SIZE 32 74 75 #undef CPP_SUBTARGET_SPEC 76 #define CPP_SUBTARGET_SPEC \ 77 "%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}" 78 79 /* Provide a LINK_SPEC appropriate for GNU/Linux. Here we provide support 80 for the special GCC options -static and -shared, which allow us to 81 link things in one of these three modes by applying the appropriate 82 combinations of options at link-time. 83 84 When the -shared link option is used a final link is not being 85 done. */ 86 87 #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2" 88 89 #undef LINK_SPEC 90 #define LINK_SPEC "-m elf32_sparc %{shared:-shared} \ 91 %{!mno-relax:%{!r:-relax}} \ 92 %{!shared: \ 93 %{!static: \ 94 %{rdynamic:-export-dynamic} \ 95 -dynamic-linker " GNU_USER_DYNAMIC_LINKER "} \ 96 %{static:-static}}" 97 98 /* It's safe to pass -s always, even if -g is not used. */ 99 #undef ASM_SPEC 100 #define ASM_SPEC "\ 101 -s \ 102 %{" FPIE_OR_FPIC_SPEC ":-K PIC} \ 103 %{!.c:%{findirect-dispatch:-K PIC}} \ 104 %(asm_cpu) %(asm_relax)" 105 106 #undef ASM_OUTPUT_ALIGNED_LOCAL 107 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ 108 do { \ 109 fputs ("\t.local\t", (FILE)); \ 110 assemble_name ((FILE), (NAME)); \ 111 putc ('\n', (FILE)); \ 112 ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \ 113 } while (0) 114 115 #undef COMMON_ASM_OP 116 #define COMMON_ASM_OP "\t.common\t" 117 118 #undef LOCAL_LABEL_PREFIX 119 #define LOCAL_LABEL_PREFIX "." 120 121 122 /* Define for support of TFmode long double. 123 SPARC ABI says that long double is 4 words. */ 124 #define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64) 125 126 #undef DITF_CONVERSION_LIBFUNCS 127 #define DITF_CONVERSION_LIBFUNCS 1 128 129 #ifdef HAVE_AS_TLS 130 #undef TARGET_SUN_TLS 131 #undef TARGET_GNU_TLS 132 #define TARGET_SUN_TLS 0 133 #define TARGET_GNU_TLS 1 134 #endif 135 136 /* We use GNU ld so undefine this so that attribute((init_priority)) works. */ 137 #undef CTORS_SECTION_ASM_OP 138 #undef DTORS_SECTION_ASM_OP 139 140 /* Static stack checking is supported by means of probes. */ 141 #define STACK_CHECK_STATIC_BUILTIN 1 142 143 #undef NEED_INDICATE_EXEC_STACK 144 #define NEED_INDICATE_EXEC_STACK 1 145 146 #ifdef TARGET_LIBC_PROVIDES_SSP 147 /* sparc glibc provides __stack_chk_guard in [%g7 + 0x14]. */ 148 #define TARGET_THREAD_SSP_OFFSET 0x14 149 #endif 150 151 /* Define if long doubles should be mangled as 'g'. */ 152 #define TARGET_ALTERNATE_LONG_DOUBLE_MANGLING 153 154 /* We use glibc _mcount for profiling. */ 155 #undef NO_PROFILE_COUNTERS 156 #define NO_PROFILE_COUNTERS 1 157