freebsd.h revision 209867
190075Sobrien/* Definitions for PowerPC running FreeBSD using the ELF format 2132718Skan Copyright (C) 2001, 2003 Free Software Foundation, Inc. 390075Sobrien Contributed by David E. O'Brien <obrien@FreeBSD.org> and BSDi. 490075Sobrien 5132718Skan This file is part of GCC. 690075Sobrien 7132718Skan GCC is free software; you can redistribute it and/or modify it 8132718Skan under the terms of the GNU General Public License as published 9132718Skan by the Free Software Foundation; either version 2, or (at your 10132718Skan option) any later version. 1190075Sobrien 12132718Skan GCC is distributed in the hope that it will be useful, but WITHOUT 13132718Skan ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14132718Skan or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 15132718Skan License for more details. 1690075Sobrien 17132718Skan You should have received a copy of the GNU General Public License 18132718Skan along with GCC; see the file COPYING. If not, write to the 19169706Skan Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, 20169706Skan MA 02110-1301, USA. */ 2190075Sobrien 2290075Sobrien/* Override the defaults, which exist to force the proper definition. */ 2390075Sobrien 24209867Snwhitehorn#ifdef IN_LIBGCC2 25209867Snwhitehorn#undef TARGET_64BIT 26209867Snwhitehorn#ifdef __powerpc64__ 27209867Snwhitehorn#define TARGET_64BIT 1 28209867Snwhitehorn#else 29209867Snwhitehorn#define TARGET_64BIT 0 30209867Snwhitehorn#endif 31209867Snwhitehorn#endif 3290075Sobrien 33209867Snwhitehorn/* On 64-bit systems, use the AIX ABI like Linux and NetBSD */ 34147823Sscottl 35209867Snwhitehorn#undef DEFAULT_ABI 36209867Snwhitehorn#define DEFAULT_ABI (TARGET_64BIT ? ABI_AIX : ABI_V4) 37209867Snwhitehorn#undef TARGET_AIX 38209867Snwhitehorn#define TARGET_AIX TARGET_64BIT 39209867Snwhitehorn 40209867Snwhitehorn#undef FBSD_TARGET_CPU_CPP_BUILTINS 41209867Snwhitehorn#define FBSD_TARGET_CPU_CPP_BUILTINS() \ 42209867Snwhitehorn do \ 43209867Snwhitehorn { \ 44209867Snwhitehorn builtin_define ("__PPC__"); \ 45209867Snwhitehorn builtin_define ("__ppc__"); \ 46209867Snwhitehorn builtin_define ("__PowerPC__"); \ 47209867Snwhitehorn builtin_define ("__powerpc__"); \ 48209867Snwhitehorn if (TARGET_64BIT) \ 49209867Snwhitehorn { \ 50209867Snwhitehorn builtin_define ("__LP64__"); \ 51209867Snwhitehorn builtin_define ("__ppc64__"); \ 52209867Snwhitehorn builtin_define ("__powerpc64__"); \ 53209867Snwhitehorn builtin_define ("__arch64__"); \ 54209867Snwhitehorn builtin_assert ("cpu=powerpc64"); \ 55209867Snwhitehorn builtin_assert ("machine=powerpc64"); \ 56209867Snwhitehorn } else { \ 57209867Snwhitehorn builtin_assert ("cpu=powerpc"); \ 58209867Snwhitehorn builtin_assert ("machine=powerpc"); \ 59209867Snwhitehorn } \ 60209867Snwhitehorn } \ 61209867Snwhitehorn while (0) 62209867Snwhitehorn 63209867Snwhitehorn#define INVALID_64BIT "-m%s not supported in this configuration" 64209867Snwhitehorn#define INVALID_32BIT INVALID_64BIT 65209867Snwhitehorn 66209867Snwhitehorn#undef SUBSUBTARGET_OVERRIDE_OPTIONS 67209867Snwhitehorn#define SUBSUBTARGET_OVERRIDE_OPTIONS \ 68209867Snwhitehorn do \ 69209867Snwhitehorn { \ 70209867Snwhitehorn if (!rs6000_explicit_options.alignment) \ 71209867Snwhitehorn rs6000_alignment_flags = MASK_ALIGN_NATURAL; \ 72209867Snwhitehorn if (TARGET_64BIT) \ 73209867Snwhitehorn { \ 74209867Snwhitehorn if (DEFAULT_ABI != ABI_AIX) \ 75209867Snwhitehorn { \ 76209867Snwhitehorn rs6000_current_abi = ABI_AIX; \ 77209867Snwhitehorn error (INVALID_64BIT, "call"); \ 78209867Snwhitehorn } \ 79209867Snwhitehorn dot_symbols = !strcmp (rs6000_abi_name, "aixdesc"); \ 80209867Snwhitehorn if (target_flags & MASK_RELOCATABLE) \ 81209867Snwhitehorn { \ 82209867Snwhitehorn target_flags &= ~MASK_RELOCATABLE; \ 83209867Snwhitehorn error (INVALID_64BIT, "relocatable"); \ 84209867Snwhitehorn } \ 85209867Snwhitehorn if (target_flags & MASK_EABI) \ 86209867Snwhitehorn { \ 87209867Snwhitehorn target_flags &= ~MASK_EABI; \ 88209867Snwhitehorn error (INVALID_64BIT, "eabi"); \ 89209867Snwhitehorn } \ 90209867Snwhitehorn if (target_flags & MASK_PROTOTYPE) \ 91209867Snwhitehorn { \ 92209867Snwhitehorn target_flags &= ~MASK_PROTOTYPE; \ 93209867Snwhitehorn error (INVALID_64BIT, "prototype"); \ 94209867Snwhitehorn } \ 95209867Snwhitehorn if ((target_flags & MASK_POWERPC64) == 0) \ 96209867Snwhitehorn { \ 97209867Snwhitehorn target_flags |= MASK_POWERPC64; \ 98209867Snwhitehorn error ("64 bit CPU required"); \ 99209867Snwhitehorn } \ 100209867Snwhitehorn } \ 101209867Snwhitehorn } \ 102209867Snwhitehorn while (0) 103209867Snwhitehorn 104209867Snwhitehorn 10590075Sobrien#undef STARTFILE_DEFAULT_SPEC 10690075Sobrien#define STARTFILE_DEFAULT_SPEC "%(startfile_freebsd)" 10790075Sobrien 10890075Sobrien#undef ENDFILE_DEFAULT_SPEC 10990075Sobrien#define ENDFILE_DEFAULT_SPEC "%(endfile_freebsd)" 11090075Sobrien 11190075Sobrien#undef LIB_DEFAULT_SPEC 11290075Sobrien#define LIB_DEFAULT_SPEC "%(lib_freebsd)" 11390075Sobrien 11490075Sobrien#undef LINK_START_DEFAULT_SPEC 11590075Sobrien#define LINK_START_DEFAULT_SPEC "%(link_start_freebsd)" 11690075Sobrien 11790075Sobrien#undef LINK_OS_DEFAULT_SPEC 11890075Sobrien#define LINK_OS_DEFAULT_SPEC "%(link_os_freebsd)" 11990075Sobrien 120117395Skan/* XXX: This is wrong for many platforms in sysv4.h. 121132718Skan We should work on getting that definition fixed. */ 122117395Skan#undef LINK_SHLIB_SPEC 123117395Skan#define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}}" 12490075Sobrien 125117395Skan 12690075Sobrien/************************[ Target stuff ]***********************************/ 12790075Sobrien 12890075Sobrien/* Define the actual types of some ANSI-mandated types. 12990075Sobrien Needs to agree with <machine/ansi.h>. GCC defaults come from c-decl.c, 13090075Sobrien c-common.c, and config/<arch>/<arch>.h. */ 13190075Sobrien 132117395Skan#undef SIZE_TYPE 133209867Snwhitehorn#define SIZE_TYPE (TARGET_64BIT ? "long unsigned int" : "unsigned int") 134117395Skan 135209867Snwhitehorn#undef PTRDIFF_TYPE 136209867Snwhitehorn#define PTRDIFF_TYPE (TARGET_64BIT ? "long int" : "int") 137209867Snwhitehorn 13890075Sobrien/* rs6000.h gets this wrong for FreeBSD. We use the GCC defaults instead. */ 13990075Sobrien#undef WCHAR_TYPE 14090075Sobrien 14190075Sobrien#undef WCHAR_TYPE_SIZE 14290075Sobrien#define WCHAR_TYPE_SIZE 32 14390075Sobrien 14490075Sobrien#undef TARGET_VERSION 14590075Sobrien#define TARGET_VERSION fprintf (stderr, " (FreeBSD/PowerPC ELF)"); 14690075Sobrien 14790075Sobrien/* Override rs6000.h definition. */ 14890075Sobrien#undef ASM_APP_ON 14990075Sobrien#define ASM_APP_ON "#APP\n" 15090075Sobrien 15190075Sobrien/* Override rs6000.h definition. */ 15290075Sobrien#undef ASM_APP_OFF 15390075Sobrien#define ASM_APP_OFF "#NO_APP\n" 154209867Snwhitehorn 155209867Snwhitehorn/* Tell the assembler we want 32/64-bit binaries if -m32 or -m64 is passed */ 156209867Snwhitehorn#if (TARGET_DEFAULT & MASK_64BIT) 157209867Snwhitehorn#define SVR4_ASM_SPEC "%(asm_cpu) \ 158209867Snwhitehorn%{.s: %{mregnames} %{mno-regnames}} %{.S: %{mregnames} %{mno-regnames}} \ 159209867Snwhitehorn%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} \ 160209867Snwhitehorn%{mrelocatable} %{mrelocatable-lib} %{fpic|fpie|fPIC|fPIE:-K PIC} \ 161209867Snwhitehorn%{memb|msdata|msdata=eabi: -memb} \ 162209867Snwhitehorn%{mlittle|mlittle-endian:-mlittle; \ 163209867Snwhitehorn mbig|mbig-endian :-mbig; \ 164209867Snwhitehorn mcall-aixdesc | \ 165209867Snwhitehorn mcall-freebsd | \ 166209867Snwhitehorn mcall-netbsd | \ 167209867Snwhitehorn mcall-openbsd | \ 168209867Snwhitehorn mcall-linux | \ 169209867Snwhitehorn mcall-gnu :-mbig; \ 170209867Snwhitehorn mcall-i960-old :-mlittle}" 171209867Snwhitehorn#define LINK_OS_FREEBSD_SPEC_DEF "\ 172209867Snwhitehorn %{p:%nconsider using `-pg' instead of `-p' with gprof(1)} \ 173209867Snwhitehorn %{v:-V} \ 174209867Snwhitehorn %{assert*} %{R*} %{rpath*} %{defsym*} \ 175209867Snwhitehorn %{shared:-Bshareable %{h*} %{soname*}} \ 176209867Snwhitehorn %{!shared: \ 177209867Snwhitehorn %{!static: \ 178209867Snwhitehorn %{rdynamic: -export-dynamic} \ 179209867Snwhitehorn %{!dynamic-linker:-dynamic-linker %(fbsd_dynamic_linker) }} \ 180209867Snwhitehorn %{static:-Bstatic}} \ 181209867Snwhitehorn %{symbolic:-Bsymbolic}" 182209867Snwhitehorn 183209867Snwhitehorn 184209867Snwhitehorn#undef ASM_DEFAULT_SPEC 185209867Snwhitehorn#undef ASM_SPEC 186209867Snwhitehorn#undef LINK_OS_FREEBSD_SPEC 187209867Snwhitehorn#define ASM_DEFAULT_SPEC "-mppc%{!m32:64}" 188209867Snwhitehorn#define ASM_SPEC "%{m32:-a32}%{!m32:-a64} " SVR4_ASM_SPEC 189209867Snwhitehorn#define LINK_OS_FREEBSD_SPEC "%{m32:-melf32ppc}%{!m32:-melf64ppc} " LINK_OS_FREEBSD_SPEC_DEF 190209867Snwhitehorn#endif 191209867Snwhitehorn 192209867Snwhitehorn/* _init and _fini functions are built from bits spread across many 193209867Snwhitehorn object files, each potentially with a different TOC pointer. For 194209867Snwhitehorn that reason, place a nop after the call so that the linker can 195209867Snwhitehorn restore the TOC pointer if a TOC adjusting call stub is needed. */ 196209867Snwhitehorn#ifdef __powerpc64__ 197209867Snwhitehorn#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \ 198209867Snwhitehorn asm (SECTION_OP "\n" \ 199209867Snwhitehorn" bl ." #FUNC "\n" \ 200209867Snwhitehorn" nop\n" \ 201209867Snwhitehorn" .previous"); 202209867Snwhitehorn#endif 203209867Snwhitehorn 204209867Snwhitehorn/* __throw will restore its own return address to be the same as the 205209867Snwhitehorn return address of the function that the throw is being made to. 206209867Snwhitehorn This is unfortunate, because we want to check the original 207209867Snwhitehorn return address to see if we need to restore the TOC. 208209867Snwhitehorn So we have to squirrel it away with this. */ 209209867Snwhitehorn#define SETUP_FRAME_ADDRESSES() \ 210209867Snwhitehorn do { if (TARGET_64BIT) rs6000_aix_emit_builtin_unwind_init (); } while (0) 211209867Snwhitehorn 212209867Snwhitehorn/* Select a format to encode pointers in exception handling data. CODE 213209867Snwhitehorn is 0 for data, 1 for code labels, 2 for function pointers. GLOBAL is 214209867Snwhitehorn true if the symbol may be affected by dynamic relocations. */ 215209867Snwhitehorn#undef ASM_PREFERRED_EH_DATA_FORMAT 216209867Snwhitehorn#define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \ 217209867Snwhitehorn ((TARGET_64BIT || flag_pic || TARGET_RELOCATABLE) \ 218209867Snwhitehorn ? (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel \ 219209867Snwhitehorn | (TARGET_64BIT ? DW_EH_PE_udata8 : DW_EH_PE_sdata4)) \ 220209867Snwhitehorn : DW_EH_PE_absptr) 221209867Snwhitehorn 222209867Snwhitehorn#define MD_FROB_UPDATE_CONTEXT(CTX, FS) \ 223209867Snwhitehorn if (TARGET_64BIT) { \ 224209867Snwhitehorn if ((FS)->regs.reg[2].how == REG_UNSAVED) \ 225209867Snwhitehorn { \ 226209867Snwhitehorn unsigned int *insn \ 227209867Snwhitehorn = (unsigned int *) \ 228209867Snwhitehorn _Unwind_GetGR ((CTX), LINK_REGISTER_REGNUM); \ 229209867Snwhitehorn if (*insn == 0xE8410028) \ 230209867Snwhitehorn _Unwind_SetGRPtr ((CTX), 2, (CTX)->cfa + 40); \ 231209867Snwhitehorn } \ 232209867Snwhitehorn } 233209867Snwhitehorn 234209867Snwhitehorn/* FreeBSD doesn't support saving and restoring 64-bit regs with a 32-bit 235209867Snwhitehorn kernel. This is supported when running on a 64-bit kernel with 236209867Snwhitehorn COMPAT_FREEBSD32, but tell GCC it isn't so that our 32-bit binaries 237209867Snwhitehorn are compatible. */ 238209867Snwhitehorn#define OS_MISSING_POWERPC64 !TARGET_64BIT 239209867Snwhitehorn 240209867Snwhitehorn/* Function profiling bits */ 241209867Snwhitehorn#undef RS6000_MCOUNT 242209867Snwhitehorn#define RS6000_MCOUNT ((TARGET_64BIT) ? "._mcount" : "_mcount") 243209867Snwhitehorn#define PROFILE_HOOK(LABEL) \ 244209867Snwhitehorn do { if (TARGET_64BIT) output_profile_hook (LABEL); } while (0) 245209867Snwhitehorn 246