1/* Definitions of target machine for GCC, for ELF on NetBSD/sparc 2 and NetBSD/sparc64. 3 Copyright (C) 2002-2020 Free Software Foundation, Inc. 4 Contributed by Matthew Green (mrg@eterna.com.au). 5 6This file is part of GCC. 7 8GCC is free software; you can redistribute it and/or modify 9it under the terms of the GNU General Public License as published by 10the Free Software Foundation; either version 3, or (at your option) 11any later version. 12 13GCC is distributed in the hope that it will be useful, 14but WITHOUT ANY WARRANTY; without even the implied warranty of 15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16GNU General Public License for more details. 17 18You should have received a copy of the GNU General Public License 19along with GCC; see the file COPYING3. If not see 20<http://www.gnu.org/licenses/>. */ 21 22#define TARGET_OS_CPP_BUILTINS() \ 23 do \ 24 { \ 25 NETBSD_OS_CPP_BUILTINS_ELF(); \ 26 if (TARGET_ARCH64) \ 27 { \ 28 builtin_define ("__sparc64__"); \ 29 builtin_define ("__sparc_v9__"); \ 30 builtin_define ("__sparcv9"); \ 31 } \ 32 else \ 33 builtin_define ("__sparc"); \ 34 builtin_define ("__sparc__"); \ 35 } \ 36 while (0) 37 38/* CPP defines used by all NetBSD targets. */ 39#undef CPP_SUBTARGET_SPEC 40#define CPP_SUBTARGET_SPEC "%(netbsd_cpp_spec)" 41 42/* SIZE_TYPE and PTRDIFF_TYPE are wrong from sparc/sparc.h. */ 43#undef SIZE_TYPE 44#define SIZE_TYPE "long unsigned int" 45 46#undef PTRDIFF_TYPE 47#define PTRDIFF_TYPE "long int" 48 49/* we keep these "long" on both 32bit and 64bit targets */ 50#undef INTPTR_TYPE 51#define INTPTR_TYPE PTRDIFF_TYPE 52 53#undef UINTPTR_TYPE 54#define UINTPTR_TYPE SIZE_TYPE 55 56#undef INT_FAST8_TYPE 57#define INT_FAST8_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "int") 58 59#undef UINT_FAST8_TYPE 60#define UINT_FAST8_TYPE (LONG_TYPE_SIZE == 64 ? "unsigned char" : "unsigned int") 61 62#undef INT_FAST16_TYPE 63#define INT_FAST16_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "int") 64 65#undef UINT_FAST16_TYPE 66#define UINT_FAST16_TYPE (LONG_TYPE_SIZE == 64 ? "short unsigned int" : "unsigned int") 67 68#undef INT_FAST32_TYPE 69#define INT_FAST32_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "int") 70 71#undef UINT_FAST32_TYPE 72#define UINT_FAST32_TYPE "unsigned int" 73 74#undef INT_FAST64_TYPE 75#define INT_FAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "long long int") 76 77#undef UINT_FAST64_TYPE 78#define UINT_FAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "long long unsigned int") 79 80/* This is the char to use for continuation (in case we need to turn 81 continuation back on). */ 82#undef DBX_CONTIN_CHAR 83#define DBX_CONTIN_CHAR '?' 84 85#undef LOCAL_LABEL_PREFIX 86#define LOCAL_LABEL_PREFIX "." 87 88/* This is how to store into the string LABEL 89 the symbol_ref name of an internal numbered label where 90 PREFIX is the class of label and NUM is the number within the class. 91 This is suitable for output with `assemble_name'. */ 92 93#undef ASM_GENERATE_INTERNAL_LABEL 94#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ 95 sprintf ((LABEL), "*.L%s%ld", (PREFIX), (long)(NUM)) 96 97#undef USER_LABEL_PREFIX 98#define USER_LABEL_PREFIX "" 99 100#undef ASM_SPEC 101#define ASM_SPEC "%{" FPIE_OR_FPIC_SPEC ":-K PIC} \ 102%(asm_cpu) %(asm_arch) %(asm_relax)" 103 104#undef STDC_0_IN_SYSTEM_HEADERS 105 106#define HAVE_ENABLE_EXECUTE_STACK 107 108/* Below here exists the merged NetBSD/sparc & NetBSD/sparc64 compiler 109 description, allowing one to build 32-bit or 64-bit applications 110 on either. We define the sparc & sparc64 versions of things, 111 occasionally a neutral version (should be the same as "netbsd-elf.h") 112 and then based on SPARC_BI_ARCH, DEFAULT_ARCH32_P, and TARGET_CPU_DEFAULT, 113 we choose the correct version. */ 114 115/* We use the default NetBSD ELF STARTFILE_SPEC and ENDFILE_SPEC 116 definitions, even for the SPARC_BI_ARCH compiler, because NetBSD does 117 not have a default place to find these libraries.. */ 118 119/* TARGET_CPU_DEFAULT is set in Makefile.in. We test for 64-bit default 120 platform here. */ 121 122#if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ 123 || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc 124/* A 64 bit v9 compiler with stack-bias, 125 in a Medium/Low code model environment. */ 126 127#undef TARGET_DEFAULT 128#define TARGET_DEFAULT \ 129 (MASK_V9 + MASK_PTR64 + MASK_64BIT /* + MASK_HARD_QUAD */ \ 130 + MASK_STACK_BIAS + MASK_APP_REGS + MASK_FPU + MASK_LONG_DOUBLE_128) 131 132#undef SPARC_DEFAULT_CMODEL 133#define SPARC_DEFAULT_CMODEL CM_MEDMID 134 135#endif 136 137/* CC1_SPEC for NetBSD/sparc. */ 138#define CC1_SPEC32 \ 139 "%{m32:%{m64:%emay not use both -m32 and -m64}} \ 140 %{m64: \ 141 -mptr64 -mstack-bias -mno-v8plus -mlong-double-128 \ 142 %{!mcpu*:%{!mv8plus:-mcpu=ultrasparc}} \ 143 %{!mno-vis:%{!mcpu=v9:-mvis}} \ 144 %{p:-mcmodel=medlow} \ 145 %{pg:-mcmodel=medlow}} " \ 146 NETBSD_CC1_AND_CC1PLUS_SPEC 147 148#define CC1_SPEC64 \ 149 "%{m32:%{m64:%emay not use both -m32 and -m64}} \ 150 %{m32: \ 151 -mptr32 -mno-stack-bias \ 152 %{!mlong-double-128:-mlong-double-64} \ 153 %{!mcpu*:%{!mv8plus:-mcpu=cypress}}} \ 154 %{!m32: \ 155 %{p:-mcmodel=medlow} \ 156 %{pg:-mcmodel=medlow}} " \ 157 NETBSD_CC1_AND_CC1PLUS_SPEC 158 159#if defined(SPARC_BI_ARCH) || defined(__arch64__) 160/* add code model specific object to the link line for 64bit */ 161#define LINK_SPEC_CODE_MODEL64 \ 162 "%{!shared:" \ 163 "%{!mcmodel=*:%:if-exists(%R/usr/lib/sparc_mcmedmid.o)}" \ 164 "%{mcmodel=medlow:%:if-exists(%R/usr/lib/sparc_mcmedlow.o)}" \ 165 "%{mcmodel=medmid:%:if-exists(%R/usr/lib/sparc_mcmedmid.o)}" \ 166 "%{mcmodel=medany:%:if-exists(%R/usr/lib/sparc_mcmedany.o)}" \ 167 "}" 168 169#ifdef SPARC_BI_ARCH 170#define LINK_SPEC_CODE_MODEL "%{!m32:" LINK_SPEC_CODE_MODEL64 "}" 171#else 172#define LINK_SPEC_CODE_MODEL LINK_SPEC_CODE_MODEL64 173#endif 174#else 175#define LINK_SPEC_CODE_MODEL "" 176#endif 177 178/* Make sure we use the right output format. Pick a default and then 179 make sure -m32/-m64 switch to the right one. */ 180 181#define LINK_ARCH32_SPEC "-m elf32_sparc" 182 183#define LINK_ARCH64_SPEC "-m elf64_sparc" 184 185#define LINK_ARCH_SPEC \ 186 "%{m32:%(link_arch32)} \ 187 %{m64:%(link_arch64)} \ 188 %{!m32:%{!m64:%(link_arch_default)}}" 189 190#undef LINK_SPEC 191#define LINK_SPEC \ 192 "%(link_arch) \ 193 %{!mno-relax:%{!r:-relax}} \ 194 %(netbsd_link_spec) " \ 195 LINK_SPEC_CODE_MODEL 196 197#define NETBSD_ENTRY_POINT "__start" 198 199#if DEFAULT_ARCH32_P 200#define LINK_ARCH_DEFAULT_SPEC LINK_ARCH32_SPEC 201#else 202#define LINK_ARCH_DEFAULT_SPEC LINK_ARCH64_SPEC 203#endif 204 205/* What extra spec entries do we need? */ 206#undef SUBTARGET_EXTRA_SPECS 207#define SUBTARGET_EXTRA_SPECS \ 208 { "link_arch32", LINK_ARCH32_SPEC }, \ 209 { "link_arch64", LINK_ARCH64_SPEC }, \ 210 { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \ 211 { "link_arch", LINK_ARCH_SPEC }, \ 212 NETBSD_SUBTARGET_EXTRA_SPECS 213 214 215/* Build a compiler that supports -m32 and -m64? */ 216 217#ifdef SPARC_BI_ARCH 218 219#undef LONG_DOUBLE_TYPE_SIZE 220#define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64) 221 222#undef CC1_SPEC 223#if DEFAULT_ARCH32_P 224#define CC1_SPEC CC1_SPEC32 225#else 226#define CC1_SPEC CC1_SPEC64 227#endif 228 229#if DEFAULT_ARCH32_P 230#define MULTILIB_DEFAULTS { "m32" } 231#else 232#define MULTILIB_DEFAULTS { "m64" } 233#endif 234 235#else /* SPARC_BI_ARCH */ 236 237#if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ 238 || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc 239 240#undef LONG_DOUBLE_TYPE_SIZE 241#define LONG_DOUBLE_TYPE_SIZE 128 242 243#undef CC1_SPEC 244#define CC1_SPEC CC1_SPEC64 245 246#else /* TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ 247 || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc */ 248 249/* A 32-bit only compiler. NetBSD don't support 128 bit `long double' 250 for 32-bit code, unlike Solaris. */ 251 252#undef LONG_DOUBLE_TYPE_SIZE 253#define LONG_DOUBLE_TYPE_SIZE 64 254 255#undef CC1_SPEC 256#define CC1_SPEC CC1_SPEC32 257 258#endif /* TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ 259 || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc */ 260 261#endif /* SPARC_BI_ARCH */ 262 263#ifdef HAVE_AS_TLS 264#undef TARGET_SUN_TLS 265#undef TARGET_GNU_TLS 266#define TARGET_SUN_TLS 0 267#define TARGET_GNU_TLS 1 268#endif 269 270/* We use GNU ld so undefine this so that attribute((init_priority)) works. */ 271#undef CTORS_SECTION_ASM_OP 272#undef DTORS_SECTION_ASM_OP 273