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