1132718Skan/* Definitions of target machine for GCC, for ELF on NetBSD/sparc 296263Sobrien and NetBSD/sparc64. 3169689Skan Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. 496263Sobrien Contributed by Matthew Green (mrg@eterna.com.au). 596263Sobrien 6132718SkanThis file is part of GCC. 796263Sobrien 8132718SkanGCC is free software; you can redistribute it and/or modify 996263Sobrienit under the terms of the GNU General Public License as published by 1096263Sobrienthe Free Software Foundation; either version 2, or (at your option) 1196263Sobrienany later version. 1296263Sobrien 13132718SkanGCC is distributed in the hope that it will be useful, 1496263Sobrienbut WITHOUT ANY WARRANTY; without even the implied warranty of 1596263SobrienMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1696263SobrienGNU General Public License for more details. 1796263Sobrien 1896263SobrienYou should have received a copy of the GNU General Public License 19132718Skanalong with GCC; see the file COPYING. If not, write to 20169689Skanthe Free Software Foundation, 51 Franklin Street, Fifth Floor, 21169689SkanBoston, MA 02110-1301, USA. */ 2296263Sobrien 23117395Skan#define TARGET_OS_CPP_BUILTINS() \ 24117395Skan do \ 25117395Skan { \ 26117395Skan NETBSD_OS_CPP_BUILTINS_ELF(); \ 27117395Skan if (TARGET_ARCH64) \ 28117395Skan { \ 29117395Skan builtin_define ("__sparc64__"); \ 30117395Skan builtin_define ("__sparc_v9__"); \ 31132718Skan builtin_define ("__sparcv9"); \ 32117395Skan } \ 33117395Skan else \ 34117395Skan builtin_define ("__sparc"); \ 35117395Skan builtin_define ("__sparc__"); \ 36117395Skan } \ 37117395Skan while (0) 38117395Skan 3996263Sobrien/* Make sure these are undefined. */ 4096263Sobrien#undef MD_EXEC_PREFIX 4196263Sobrien#undef MD_STARTFILE_PREFIX 4296263Sobrien 43117395Skan/* CPP defines used by all NetBSD targets. */ 44117395Skan#undef CPP_SUBTARGET_SPEC 45117395Skan#define CPP_SUBTARGET_SPEC "%(netbsd_cpp_spec)" 4696263Sobrien 4796263Sobrien/* SIZE_TYPE and PTRDIFF_TYPE are wrong from sparc/sparc.h. */ 4896263Sobrien#undef SIZE_TYPE 4996263Sobrien#define SIZE_TYPE "long unsigned int" 5096263Sobrien 5196263Sobrien#undef PTRDIFF_TYPE 5296263Sobrien#define PTRDIFF_TYPE "long int" 5396263Sobrien 5496263Sobrien/* This is the char to use for continuation (in case we need to turn 5596263Sobrien continuation back on). */ 5696263Sobrien#undef DBX_CONTIN_CHAR 5796263Sobrien#define DBX_CONTIN_CHAR '?' 5896263Sobrien 5996263Sobrien#undef LOCAL_LABEL_PREFIX 6096263Sobrien#define LOCAL_LABEL_PREFIX "." 6196263Sobrien 6296263Sobrien/* This is how to store into the string LABEL 6396263Sobrien the symbol_ref name of an internal numbered label where 6496263Sobrien PREFIX is the class of label and NUM is the number within the class. 6596263Sobrien This is suitable for output with `assemble_name'. */ 6696263Sobrien 6796263Sobrien#undef ASM_GENERATE_INTERNAL_LABEL 6896263Sobrien#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ 6996263Sobrien sprintf ((LABEL), "*.L%s%ld", (PREFIX), (long)(NUM)) 7096263Sobrien 7196263Sobrien#undef USER_LABEL_PREFIX 7296263Sobrien#define USER_LABEL_PREFIX "" 7396263Sobrien 7496263Sobrien#undef ASM_SPEC 75132718Skan#define ASM_SPEC "%{fpic|fPIC|fpie|fPIE:-K PIC} %{V} %{v:%{!V:-V}} \ 7696263Sobrien%{mlittle-endian:-EL} \ 7796263Sobrien%(asm_cpu) %(asm_arch) %(asm_relax)" 7896263Sobrien 7996263Sobrien#undef STDC_0_IN_SYSTEM_HEADERS 8096263Sobrien 81117395Skan/* Attempt to enable execute permissions on the stack. */ 82132718Skan#define ENABLE_EXECUTE_STACK NETBSD_ENABLE_EXECUTE_STACK 83117395Skan 8496263Sobrien#undef TARGET_VERSION 8596263Sobrien#define TARGET_VERSION fprintf (stderr, " (%s)", TARGET_NAME); 8696263Sobrien 8796263Sobrien/* Below here exists the merged NetBSD/sparc & NetBSD/sparc64 compiler 8896263Sobrien description, allowing one to build 32 bit or 64 bit applications 8996263Sobrien on either. We define the sparc & sparc64 versions of things, 9096263Sobrien occasionally a neutral version (should be the same as "netbsd-elf.h") 9196263Sobrien and then based on SPARC_BI_ARCH, DEFAULT_ARCH32_P, and TARGET_CPU_DEFAULT, 9296263Sobrien we choose the correct version. */ 9396263Sobrien 9496263Sobrien/* We use the default NetBSD ELF STARTFILE_SPEC and ENDFILE_SPEC 9596263Sobrien definitions, even for the SPARC_BI_ARCH compiler, because NetBSD does 9696263Sobrien not have a default place to find these libraries.. */ 9796263Sobrien 9896263Sobrien/* Name the port(s). */ 9996263Sobrien#define TARGET_NAME64 "NetBSD/sparc64 ELF" 10096263Sobrien#define TARGET_NAME32 "NetBSD/sparc ELF" 10196263Sobrien 10296263Sobrien/* TARGET_CPU_DEFAULT is set in Makefile.in. We test for 64-bit default 10396263Sobrien platform here. */ 10496263Sobrien 10596263Sobrien#if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ 10696263Sobrien || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc 10796263Sobrien/* A 64 bit v9 compiler with stack-bias, 10896263Sobrien in a Medium/Low code model environment. */ 10996263Sobrien 11096263Sobrien#undef TARGET_DEFAULT 11196263Sobrien#define TARGET_DEFAULT \ 11296263Sobrien (MASK_V9 + MASK_PTR64 + MASK_64BIT /* + MASK_HARD_QUAD */ \ 11396263Sobrien + MASK_STACK_BIAS + MASK_APP_REGS + MASK_FPU + MASK_LONG_DOUBLE_128) 11496263Sobrien 11596263Sobrien#undef SPARC_DEFAULT_CMODEL 11696263Sobrien#define SPARC_DEFAULT_CMODEL CM_MEDANY 11796263Sobrien 11896263Sobrien#endif 11996263Sobrien 12096263Sobrien/* CC1_SPEC for NetBSD/sparc. */ 12196263Sobrien#define CC1_SPEC32 \ 12296263Sobrien "%{sun4:} %{target:} \ 12396263Sobrien %{mcypress:-mcpu=cypress} \ 12496263Sobrien %{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \ 12596263Sobrien %{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \ 12696263Sobrien %{m32:%{m64:%emay not use both -m32 and -m64}} \ 12796263Sobrien %{m64: \ 12896263Sobrien -mptr64 -mstack-bias -mno-v8plus -mlong-double-128 \ 12996263Sobrien %{!mcpu*: \ 13096263Sobrien %{!mcypress: \ 13196263Sobrien %{!msparclite: \ 13296263Sobrien %{!mf930: \ 13396263Sobrien %{!mf934: \ 13496263Sobrien %{!mv8*: \ 13596263Sobrien %{!msupersparc:-mcpu=ultrasparc}}}}}}} \ 13696263Sobrien %{!mno-vis:%{!mcpu=v9:-mvis}} \ 13796263Sobrien %{p:-mcmodel=medlow} \ 13896263Sobrien %{pg:-mcmodel=medlow}}" 13996263Sobrien 14096263Sobrien#define CC1_SPEC64 \ 14196263Sobrien "%{sun4:} %{target:} \ 14296263Sobrien %{mcypress:-mcpu=cypress} \ 14396263Sobrien %{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \ 14496263Sobrien %{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \ 14596263Sobrien %{m32:%{m64:%emay not use both -m32 and -m64}} \ 14696263Sobrien %{m32: \ 14796263Sobrien -mptr32 -mno-stack-bias \ 14896263Sobrien %{!mlong-double-128:-mlong-double-64} \ 14996263Sobrien %{!mcpu*: \ 15096263Sobrien %{!mcypress: \ 15196263Sobrien %{!msparclite: \ 15296263Sobrien %{!mf930: \ 15396263Sobrien %{!mf934: \ 15496263Sobrien %{!mv8*: \ 15596263Sobrien %{!msupersparc:-mcpu=cypress}}}}}}}} \ 15696263Sobrien %{!m32: \ 15796263Sobrien %{p:-mcmodel=medlow} \ 15896263Sobrien %{pg:-mcmodel=medlow}}" 15996263Sobrien 16096263Sobrien/* Make sure we use the right output format. Pick a default and then 16196263Sobrien make sure -m32/-m64 switch to the right one. */ 16296263Sobrien 163117395Skan#define LINK_ARCH32_SPEC "-m elf32_sparc" 16496263Sobrien 165117395Skan#define LINK_ARCH64_SPEC "-m elf64_sparc" 16696263Sobrien 167117395Skan#define LINK_ARCH_SPEC \ 168117395Skan "%{m32:%(link_arch32)} \ 169117395Skan %{m64:%(link_arch64)} \ 170117395Skan %{!m32:%{!m64:%(link_arch_default)}}" 17196263Sobrien 172117395Skan#undef LINK_SPEC 173117395Skan#define LINK_SPEC \ 174117395Skan "%(link_arch) \ 175117395Skan %{!mno-relax:%{!r:-relax}} \ 176117395Skan %(netbsd_link_spec)" 177117395Skan 178117395Skan#define NETBSD_ENTRY_POINT "__start" 179117395Skan 18096263Sobrien#if DEFAULT_ARCH32_P 18196263Sobrien#define LINK_ARCH_DEFAULT_SPEC LINK_ARCH32_SPEC 18296263Sobrien#else 18396263Sobrien#define LINK_ARCH_DEFAULT_SPEC LINK_ARCH64_SPEC 18496263Sobrien#endif 18596263Sobrien 18696263Sobrien/* What extra spec entries do we need? */ 18796263Sobrien#undef SUBTARGET_EXTRA_SPECS 18896263Sobrien#define SUBTARGET_EXTRA_SPECS \ 18996263Sobrien { "link_arch32", LINK_ARCH32_SPEC }, \ 19096263Sobrien { "link_arch64", LINK_ARCH64_SPEC }, \ 19196263Sobrien { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \ 19296263Sobrien { "link_arch", LINK_ARCH_SPEC }, \ 193117395Skan { "netbsd_cpp_spec", NETBSD_CPP_SPEC }, \ 194117395Skan { "netbsd_link_spec", NETBSD_LINK_SPEC_ELF }, \ 195117395Skan { "netbsd_entry_point", NETBSD_ENTRY_POINT }, 19696263Sobrien 19796263Sobrien 19896263Sobrien/* Build a compiler that supports -m32 and -m64? */ 19996263Sobrien 20096263Sobrien#ifdef SPARC_BI_ARCH 20196263Sobrien 20296263Sobrien#undef LONG_DOUBLE_TYPE_SIZE 20396263Sobrien#define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64) 20496263Sobrien 20596263Sobrien#if defined(__arch64__) || defined(__LONG_DOUBLE_128__) 20696263Sobrien#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128 20796263Sobrien#else 20896263Sobrien#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 20996263Sobrien#endif 21096263Sobrien 21196263Sobrien#undef CC1_SPEC 21296263Sobrien#if DEFAULT_ARCH32_P 21396263Sobrien#define CC1_SPEC CC1_SPEC32 21496263Sobrien#else 21596263Sobrien#define CC1_SPEC CC1_SPEC64 21696263Sobrien#endif 21796263Sobrien 21896263Sobrien#if DEFAULT_ARCH32_P 21996263Sobrien#define MULTILIB_DEFAULTS { "m32" } 22096263Sobrien#else 22196263Sobrien#define MULTILIB_DEFAULTS { "m64" } 22296263Sobrien#endif 22396263Sobrien 224169689Skan/* Name the port. */ 22596263Sobrien#undef TARGET_NAME 22696263Sobrien#define TARGET_NAME (DEFAULT_ARCH32_P ? TARGET_NAME32 : TARGET_NAME64) 22796263Sobrien 22896263Sobrien#else /* SPARC_BI_ARCH */ 22996263Sobrien 23096263Sobrien#if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ 23196263Sobrien || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc 23296263Sobrien 23396263Sobrien#undef LONG_DOUBLE_TYPE_SIZE 23496263Sobrien#define LONG_DOUBLE_TYPE_SIZE 128 23596263Sobrien 23696263Sobrien#undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE 23796263Sobrien#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128 23896263Sobrien 23996263Sobrien#undef CC1_SPEC 24096263Sobrien#define CC1_SPEC CC1_SPEC64 24196263Sobrien 24296263Sobrien#undef TARGET_NAME 24396263Sobrien#define TARGET_NAME TARGET_NAME64 24496263Sobrien 24596263Sobrien#else /* TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ 24696263Sobrien || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc */ 24796263Sobrien 24896263Sobrien/* A 32-bit only compiler. NetBSD don't support 128 bit `long double' 24996263Sobrien for 32-bit code, unlike Solaris. */ 25096263Sobrien 25196263Sobrien#undef LONG_DOUBLE_TYPE_SIZE 25296263Sobrien#define LONG_DOUBLE_TYPE_SIZE 64 25396263Sobrien 25496263Sobrien#undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE 25596263Sobrien#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 25696263Sobrien 25796263Sobrien#undef CC1_SPEC 25896263Sobrien#define CC1_SPEC CC1_SPEC32 25996263Sobrien 26096263Sobrien#undef TARGET_NAME 26196263Sobrien#define TARGET_NAME TARGET_NAME32 26296263Sobrien 26396263Sobrien#endif /* TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ 26496263Sobrien || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc */ 26596263Sobrien 26696263Sobrien#endif /* SPARC_BI_ARCH */ 26796263Sobrien 26896263Sobrien/* We use GNU ld so undefine this so that attribute((init_priority)) works. */ 26996263Sobrien#undef CTORS_SECTION_ASM_OP 27096263Sobrien#undef DTORS_SECTION_ASM_OP 271