Home | History | Annotate | Line # | Download | only in sparc
      1 /* Definitions of target machine for GCC, for ELF on NetBSD/sparc
      2    and NetBSD/sparc64.
      3    Copyright (C) 2002-2022 Free Software Foundation, Inc.
      4    Contributed by Matthew Green (mrg (at) eterna.com.au).
      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 3, 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 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