11debfc3dSmrg /* Definitions of target machine for GCC, for ELF on NetBSD/sparc 21debfc3dSmrg and NetBSD/sparc64. 3*8feb0f0bSmrg Copyright (C) 2002-2020 Free Software Foundation, Inc. 41debfc3dSmrg Contributed by Matthew Green (mrg@eterna.com.au). 51debfc3dSmrg 61debfc3dSmrg This file is part of GCC. 71debfc3dSmrg 81debfc3dSmrg GCC is free software; you can redistribute it and/or modify 91debfc3dSmrg it under the terms of the GNU General Public License as published by 101debfc3dSmrg the Free Software Foundation; either version 3, or (at your option) 111debfc3dSmrg any later version. 121debfc3dSmrg 131debfc3dSmrg GCC is distributed in the hope that it will be useful, 141debfc3dSmrg but WITHOUT ANY WARRANTY; without even the implied warranty of 151debfc3dSmrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 161debfc3dSmrg GNU General Public License for more details. 171debfc3dSmrg 181debfc3dSmrg You should have received a copy of the GNU General Public License 191debfc3dSmrg along with GCC; see the file COPYING3. If not see 201debfc3dSmrg <http://www.gnu.org/licenses/>. */ 211debfc3dSmrg 221debfc3dSmrg #define TARGET_OS_CPP_BUILTINS() \ 231debfc3dSmrg do \ 241debfc3dSmrg { \ 251debfc3dSmrg NETBSD_OS_CPP_BUILTINS_ELF(); \ 261debfc3dSmrg if (TARGET_ARCH64) \ 271debfc3dSmrg { \ 281debfc3dSmrg builtin_define ("__sparc64__"); \ 291debfc3dSmrg builtin_define ("__sparc_v9__"); \ 301debfc3dSmrg builtin_define ("__sparcv9"); \ 311debfc3dSmrg } \ 321debfc3dSmrg else \ 331debfc3dSmrg builtin_define ("__sparc"); \ 341debfc3dSmrg builtin_define ("__sparc__"); \ 351debfc3dSmrg } \ 361debfc3dSmrg while (0) 371debfc3dSmrg 381debfc3dSmrg /* CPP defines used by all NetBSD targets. */ 391debfc3dSmrg #undef CPP_SUBTARGET_SPEC 401debfc3dSmrg #define CPP_SUBTARGET_SPEC "%(netbsd_cpp_spec)" 411debfc3dSmrg 421debfc3dSmrg /* SIZE_TYPE and PTRDIFF_TYPE are wrong from sparc/sparc.h. */ 431debfc3dSmrg #undef SIZE_TYPE 441debfc3dSmrg #define SIZE_TYPE "long unsigned int" 451debfc3dSmrg 461debfc3dSmrg #undef PTRDIFF_TYPE 471debfc3dSmrg #define PTRDIFF_TYPE "long int" 481debfc3dSmrg 491debfc3dSmrg /* we keep these "long" on both 32bit and 64bit targets */ 501debfc3dSmrg #undef INTPTR_TYPE 511debfc3dSmrg #define INTPTR_TYPE PTRDIFF_TYPE 521debfc3dSmrg 531debfc3dSmrg #undef UINTPTR_TYPE 541debfc3dSmrg #define UINTPTR_TYPE SIZE_TYPE 551debfc3dSmrg 561debfc3dSmrg #undef INT_FAST8_TYPE 571debfc3dSmrg #define INT_FAST8_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "int") 581debfc3dSmrg 591debfc3dSmrg #undef UINT_FAST8_TYPE 601debfc3dSmrg #define UINT_FAST8_TYPE (LONG_TYPE_SIZE == 64 ? "unsigned char" : "unsigned int") 611debfc3dSmrg 621debfc3dSmrg #undef INT_FAST16_TYPE 631debfc3dSmrg #define INT_FAST16_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "int") 641debfc3dSmrg 651debfc3dSmrg #undef UINT_FAST16_TYPE 661debfc3dSmrg #define UINT_FAST16_TYPE (LONG_TYPE_SIZE == 64 ? "short unsigned int" : "unsigned int") 671debfc3dSmrg 681debfc3dSmrg #undef INT_FAST32_TYPE 691debfc3dSmrg #define INT_FAST32_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "int") 701debfc3dSmrg 711debfc3dSmrg #undef UINT_FAST32_TYPE 721debfc3dSmrg #define UINT_FAST32_TYPE "unsigned int" 731debfc3dSmrg 741debfc3dSmrg #undef INT_FAST64_TYPE 751debfc3dSmrg #define INT_FAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "long long int") 761debfc3dSmrg 771debfc3dSmrg #undef UINT_FAST64_TYPE 781debfc3dSmrg #define UINT_FAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "long long unsigned int") 791debfc3dSmrg 801debfc3dSmrg /* This is the char to use for continuation (in case we need to turn 811debfc3dSmrg continuation back on). */ 821debfc3dSmrg #undef DBX_CONTIN_CHAR 831debfc3dSmrg #define DBX_CONTIN_CHAR '?' 841debfc3dSmrg 851debfc3dSmrg #undef LOCAL_LABEL_PREFIX 861debfc3dSmrg #define LOCAL_LABEL_PREFIX "." 871debfc3dSmrg 881debfc3dSmrg /* This is how to store into the string LABEL 891debfc3dSmrg the symbol_ref name of an internal numbered label where 901debfc3dSmrg PREFIX is the class of label and NUM is the number within the class. 911debfc3dSmrg This is suitable for output with `assemble_name'. */ 921debfc3dSmrg 931debfc3dSmrg #undef ASM_GENERATE_INTERNAL_LABEL 941debfc3dSmrg #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ 951debfc3dSmrg sprintf ((LABEL), "*.L%s%ld", (PREFIX), (long)(NUM)) 961debfc3dSmrg 971debfc3dSmrg #undef USER_LABEL_PREFIX 981debfc3dSmrg #define USER_LABEL_PREFIX "" 991debfc3dSmrg 1001debfc3dSmrg #undef ASM_SPEC 1011debfc3dSmrg #define ASM_SPEC "%{" FPIE_OR_FPIC_SPEC ":-K PIC} \ 1021debfc3dSmrg %(asm_cpu) %(asm_arch) %(asm_relax)" 1031debfc3dSmrg 1041debfc3dSmrg #undef STDC_0_IN_SYSTEM_HEADERS 1051debfc3dSmrg 1061debfc3dSmrg #define HAVE_ENABLE_EXECUTE_STACK 1071debfc3dSmrg 1081debfc3dSmrg /* Below here exists the merged NetBSD/sparc & NetBSD/sparc64 compiler 1091debfc3dSmrg description, allowing one to build 32-bit or 64-bit applications 1101debfc3dSmrg on either. We define the sparc & sparc64 versions of things, 1111debfc3dSmrg occasionally a neutral version (should be the same as "netbsd-elf.h") 1121debfc3dSmrg and then based on SPARC_BI_ARCH, DEFAULT_ARCH32_P, and TARGET_CPU_DEFAULT, 1131debfc3dSmrg we choose the correct version. */ 1141debfc3dSmrg 1151debfc3dSmrg /* We use the default NetBSD ELF STARTFILE_SPEC and ENDFILE_SPEC 1161debfc3dSmrg definitions, even for the SPARC_BI_ARCH compiler, because NetBSD does 1171debfc3dSmrg not have a default place to find these libraries.. */ 1181debfc3dSmrg 1191debfc3dSmrg /* TARGET_CPU_DEFAULT is set in Makefile.in. We test for 64-bit default 1201debfc3dSmrg platform here. */ 1211debfc3dSmrg 1221debfc3dSmrg #if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ 1231debfc3dSmrg || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc 1241debfc3dSmrg /* A 64 bit v9 compiler with stack-bias, 1251debfc3dSmrg in a Medium/Low code model environment. */ 1261debfc3dSmrg 1271debfc3dSmrg #undef TARGET_DEFAULT 1281debfc3dSmrg #define TARGET_DEFAULT \ 1291debfc3dSmrg (MASK_V9 + MASK_PTR64 + MASK_64BIT /* + MASK_HARD_QUAD */ \ 1301debfc3dSmrg + MASK_STACK_BIAS + MASK_APP_REGS + MASK_FPU + MASK_LONG_DOUBLE_128) 1311debfc3dSmrg 1321debfc3dSmrg #undef SPARC_DEFAULT_CMODEL 1331debfc3dSmrg #define SPARC_DEFAULT_CMODEL CM_MEDMID 1341debfc3dSmrg 1351debfc3dSmrg #endif 1361debfc3dSmrg 1371debfc3dSmrg /* CC1_SPEC for NetBSD/sparc. */ 1381debfc3dSmrg #define CC1_SPEC32 \ 1391debfc3dSmrg "%{m32:%{m64:%emay not use both -m32 and -m64}} \ 1401debfc3dSmrg %{m64: \ 1411debfc3dSmrg -mptr64 -mstack-bias -mno-v8plus -mlong-double-128 \ 1421debfc3dSmrg %{!mcpu*:%{!mv8plus:-mcpu=ultrasparc}} \ 1431debfc3dSmrg %{!mno-vis:%{!mcpu=v9:-mvis}} \ 1441debfc3dSmrg %{p:-mcmodel=medlow} \ 1451debfc3dSmrg %{pg:-mcmodel=medlow}} " \ 1461debfc3dSmrg NETBSD_CC1_AND_CC1PLUS_SPEC 1471debfc3dSmrg 1481debfc3dSmrg #define CC1_SPEC64 \ 1491debfc3dSmrg "%{m32:%{m64:%emay not use both -m32 and -m64}} \ 1501debfc3dSmrg %{m32: \ 1511debfc3dSmrg -mptr32 -mno-stack-bias \ 1521debfc3dSmrg %{!mlong-double-128:-mlong-double-64} \ 1531debfc3dSmrg %{!mcpu*:%{!mv8plus:-mcpu=cypress}}} \ 1541debfc3dSmrg %{!m32: \ 1551debfc3dSmrg %{p:-mcmodel=medlow} \ 1561debfc3dSmrg %{pg:-mcmodel=medlow}} " \ 1571debfc3dSmrg NETBSD_CC1_AND_CC1PLUS_SPEC 1581debfc3dSmrg 1591debfc3dSmrg #if defined(SPARC_BI_ARCH) || defined(__arch64__) 1601debfc3dSmrg /* add code model specific object to the link line for 64bit */ 1611debfc3dSmrg #define LINK_SPEC_CODE_MODEL64 \ 1621debfc3dSmrg "%{!shared:" \ 1631debfc3dSmrg "%{!mcmodel=*:%:if-exists(%R/usr/lib/sparc_mcmedmid.o)}" \ 1641debfc3dSmrg "%{mcmodel=medlow:%:if-exists(%R/usr/lib/sparc_mcmedlow.o)}" \ 1651debfc3dSmrg "%{mcmodel=medmid:%:if-exists(%R/usr/lib/sparc_mcmedmid.o)}" \ 1661debfc3dSmrg "%{mcmodel=medany:%:if-exists(%R/usr/lib/sparc_mcmedany.o)}" \ 1671debfc3dSmrg "}" 1681debfc3dSmrg 1691debfc3dSmrg #ifdef SPARC_BI_ARCH 1701debfc3dSmrg #define LINK_SPEC_CODE_MODEL "%{!m32:" LINK_SPEC_CODE_MODEL64 "}" 1711debfc3dSmrg #else 1721debfc3dSmrg #define LINK_SPEC_CODE_MODEL LINK_SPEC_CODE_MODEL64 1731debfc3dSmrg #endif 1741debfc3dSmrg #else 1751debfc3dSmrg #define LINK_SPEC_CODE_MODEL "" 1761debfc3dSmrg #endif 1771debfc3dSmrg 1781debfc3dSmrg /* Make sure we use the right output format. Pick a default and then 1791debfc3dSmrg make sure -m32/-m64 switch to the right one. */ 1801debfc3dSmrg 1811debfc3dSmrg #define LINK_ARCH32_SPEC "-m elf32_sparc" 1821debfc3dSmrg 1831debfc3dSmrg #define LINK_ARCH64_SPEC "-m elf64_sparc" 1841debfc3dSmrg 1851debfc3dSmrg #define LINK_ARCH_SPEC \ 1861debfc3dSmrg "%{m32:%(link_arch32)} \ 1871debfc3dSmrg %{m64:%(link_arch64)} \ 1881debfc3dSmrg %{!m32:%{!m64:%(link_arch_default)}}" 1891debfc3dSmrg 1901debfc3dSmrg #undef LINK_SPEC 1911debfc3dSmrg #define LINK_SPEC \ 1921debfc3dSmrg "%(link_arch) \ 1931debfc3dSmrg %{!mno-relax:%{!r:-relax}} \ 1941debfc3dSmrg %(netbsd_link_spec) " \ 1951debfc3dSmrg LINK_SPEC_CODE_MODEL 1961debfc3dSmrg 1971debfc3dSmrg #define NETBSD_ENTRY_POINT "__start" 1981debfc3dSmrg 1991debfc3dSmrg #if DEFAULT_ARCH32_P 2001debfc3dSmrg #define LINK_ARCH_DEFAULT_SPEC LINK_ARCH32_SPEC 2011debfc3dSmrg #else 2021debfc3dSmrg #define LINK_ARCH_DEFAULT_SPEC LINK_ARCH64_SPEC 2031debfc3dSmrg #endif 2041debfc3dSmrg 2051debfc3dSmrg /* What extra spec entries do we need? */ 2061debfc3dSmrg #undef SUBTARGET_EXTRA_SPECS 2071debfc3dSmrg #define SUBTARGET_EXTRA_SPECS \ 2081debfc3dSmrg { "link_arch32", LINK_ARCH32_SPEC }, \ 2091debfc3dSmrg { "link_arch64", LINK_ARCH64_SPEC }, \ 2101debfc3dSmrg { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \ 2111debfc3dSmrg { "link_arch", LINK_ARCH_SPEC }, \ 2121debfc3dSmrg NETBSD_SUBTARGET_EXTRA_SPECS 2131debfc3dSmrg 2141debfc3dSmrg 2151debfc3dSmrg /* Build a compiler that supports -m32 and -m64? */ 2161debfc3dSmrg 2171debfc3dSmrg #ifdef SPARC_BI_ARCH 2181debfc3dSmrg 2191debfc3dSmrg #undef LONG_DOUBLE_TYPE_SIZE 2201debfc3dSmrg #define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64) 2211debfc3dSmrg 2221debfc3dSmrg #undef CC1_SPEC 2231debfc3dSmrg #if DEFAULT_ARCH32_P 2241debfc3dSmrg #define CC1_SPEC CC1_SPEC32 2251debfc3dSmrg #else 2261debfc3dSmrg #define CC1_SPEC CC1_SPEC64 2271debfc3dSmrg #endif 2281debfc3dSmrg 2291debfc3dSmrg #if DEFAULT_ARCH32_P 2301debfc3dSmrg #define MULTILIB_DEFAULTS { "m32" } 2311debfc3dSmrg #else 2321debfc3dSmrg #define MULTILIB_DEFAULTS { "m64" } 2331debfc3dSmrg #endif 2341debfc3dSmrg 2351debfc3dSmrg #else /* SPARC_BI_ARCH */ 2361debfc3dSmrg 2371debfc3dSmrg #if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ 2381debfc3dSmrg || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc 2391debfc3dSmrg 2401debfc3dSmrg #undef LONG_DOUBLE_TYPE_SIZE 2411debfc3dSmrg #define LONG_DOUBLE_TYPE_SIZE 128 2421debfc3dSmrg 2431debfc3dSmrg #undef CC1_SPEC 2441debfc3dSmrg #define CC1_SPEC CC1_SPEC64 2451debfc3dSmrg 2461debfc3dSmrg #else /* TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ 2471debfc3dSmrg || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc */ 2481debfc3dSmrg 2491debfc3dSmrg /* A 32-bit only compiler. NetBSD don't support 128 bit `long double' 2501debfc3dSmrg for 32-bit code, unlike Solaris. */ 2511debfc3dSmrg 2521debfc3dSmrg #undef LONG_DOUBLE_TYPE_SIZE 2531debfc3dSmrg #define LONG_DOUBLE_TYPE_SIZE 64 2541debfc3dSmrg 2551debfc3dSmrg #undef CC1_SPEC 2561debfc3dSmrg #define CC1_SPEC CC1_SPEC32 2571debfc3dSmrg 2581debfc3dSmrg #endif /* TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ 2591debfc3dSmrg || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc */ 2601debfc3dSmrg 2611debfc3dSmrg #endif /* SPARC_BI_ARCH */ 2621debfc3dSmrg 2631debfc3dSmrg #ifdef HAVE_AS_TLS 2641debfc3dSmrg #undef TARGET_SUN_TLS 2651debfc3dSmrg #undef TARGET_GNU_TLS 2661debfc3dSmrg #define TARGET_SUN_TLS 0 2671debfc3dSmrg #define TARGET_GNU_TLS 1 2681debfc3dSmrg #endif 2691debfc3dSmrg 2701debfc3dSmrg /* We use GNU ld so undefine this so that attribute((init_priority)) works. */ 2711debfc3dSmrg #undef CTORS_SECTION_ASM_OP 2721debfc3dSmrg #undef DTORS_SECTION_ASM_OP 273