freebsd.h revision 218824
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
40218824Snwhitehorn#ifdef HAVE_LD_NO_DOT_SYMS
41218824Snwhitehorn/* New ABI uses a local sym for the function entry point.  */
42218824Snwhitehornextern int dot_symbols;
43218824Snwhitehorn#undef DOT_SYMBOLS
44218824Snwhitehorn#define DOT_SYMBOLS dot_symbols
45218824Snwhitehorn#endif
46218824Snwhitehorn
47209867Snwhitehorn#undef  FBSD_TARGET_CPU_CPP_BUILTINS
48209867Snwhitehorn#define FBSD_TARGET_CPU_CPP_BUILTINS()		\
49209867Snwhitehorn  do						\
50209867Snwhitehorn    {						\
51209867Snwhitehorn      builtin_define ("__PPC__");		\
52209867Snwhitehorn      builtin_define ("__ppc__");		\
53209867Snwhitehorn      builtin_define ("__PowerPC__");		\
54209867Snwhitehorn      builtin_define ("__powerpc__");		\
55209867Snwhitehorn      if (TARGET_64BIT)				\
56209867Snwhitehorn	{					\
57209867Snwhitehorn	  builtin_define ("__LP64__");		\
58209867Snwhitehorn	  builtin_define ("__ppc64__");		\
59209867Snwhitehorn	  builtin_define ("__powerpc64__");	\
60209867Snwhitehorn	  builtin_define ("__arch64__");	\
61209867Snwhitehorn	  builtin_assert ("cpu=powerpc64");	\
62209867Snwhitehorn	  builtin_assert ("machine=powerpc64");	\
63209867Snwhitehorn	} else {				\
64209867Snwhitehorn	  builtin_assert ("cpu=powerpc");	\
65209867Snwhitehorn	  builtin_assert ("machine=powerpc");	\
66209867Snwhitehorn	}					\
67209867Snwhitehorn    }						\
68209867Snwhitehorn  while (0)
69209867Snwhitehorn
70209867Snwhitehorn#define INVALID_64BIT "-m%s not supported in this configuration"
71209867Snwhitehorn#define INVALID_32BIT INVALID_64BIT
72209867Snwhitehorn
73209867Snwhitehorn#undef	SUBSUBTARGET_OVERRIDE_OPTIONS
74209867Snwhitehorn#define	SUBSUBTARGET_OVERRIDE_OPTIONS				\
75209867Snwhitehorn  do								\
76209867Snwhitehorn    {								\
77209867Snwhitehorn      if (!rs6000_explicit_options.alignment)			\
78209867Snwhitehorn	rs6000_alignment_flags = MASK_ALIGN_NATURAL;		\
79209867Snwhitehorn      if (TARGET_64BIT)						\
80209867Snwhitehorn	{							\
81209867Snwhitehorn	  if (DEFAULT_ABI != ABI_AIX)				\
82209867Snwhitehorn	    {							\
83209867Snwhitehorn	      rs6000_current_abi = ABI_AIX;			\
84209867Snwhitehorn	      error (INVALID_64BIT, "call");			\
85209867Snwhitehorn	    }							\
86209867Snwhitehorn	  dot_symbols = !strcmp (rs6000_abi_name, "aixdesc");	\
87209867Snwhitehorn	  if (target_flags & MASK_RELOCATABLE)			\
88209867Snwhitehorn	    {							\
89209867Snwhitehorn	      target_flags &= ~MASK_RELOCATABLE;		\
90209867Snwhitehorn	      error (INVALID_64BIT, "relocatable");		\
91209867Snwhitehorn	    }							\
92209867Snwhitehorn	  if (target_flags & MASK_EABI)				\
93209867Snwhitehorn	    {							\
94209867Snwhitehorn	      target_flags &= ~MASK_EABI;			\
95209867Snwhitehorn	      error (INVALID_64BIT, "eabi");			\
96209867Snwhitehorn	    }							\
97209867Snwhitehorn	  if (target_flags & MASK_PROTOTYPE)			\
98209867Snwhitehorn	    {							\
99209867Snwhitehorn	      target_flags &= ~MASK_PROTOTYPE;			\
100209867Snwhitehorn	      error (INVALID_64BIT, "prototype");		\
101209867Snwhitehorn	    }							\
102209867Snwhitehorn	  if ((target_flags & MASK_POWERPC64) == 0)		\
103209867Snwhitehorn	    {							\
104209867Snwhitehorn	      target_flags |= MASK_POWERPC64;			\
105209867Snwhitehorn	      error ("64 bit CPU required");			\
106209867Snwhitehorn	    }							\
107209867Snwhitehorn	}							\
108209867Snwhitehorn    }								\
109209867Snwhitehorn  while (0)
110209867Snwhitehorn
111209867Snwhitehorn
11290075Sobrien#undef	STARTFILE_DEFAULT_SPEC
11390075Sobrien#define STARTFILE_DEFAULT_SPEC "%(startfile_freebsd)"
11490075Sobrien
11590075Sobrien#undef	ENDFILE_DEFAULT_SPEC
11690075Sobrien#define ENDFILE_DEFAULT_SPEC "%(endfile_freebsd)"
11790075Sobrien
11890075Sobrien#undef	LIB_DEFAULT_SPEC
11990075Sobrien#define LIB_DEFAULT_SPEC "%(lib_freebsd)"
12090075Sobrien
12190075Sobrien#undef	LINK_START_DEFAULT_SPEC
12290075Sobrien#define LINK_START_DEFAULT_SPEC "%(link_start_freebsd)"
12390075Sobrien
12490075Sobrien#undef	LINK_OS_DEFAULT_SPEC
12590075Sobrien#define	LINK_OS_DEFAULT_SPEC "%(link_os_freebsd)"
12690075Sobrien
127117395Skan/* XXX: This is wrong for many platforms in sysv4.h.
128132718Skan   We should work on getting that definition fixed.  */
129117395Skan#undef  LINK_SHLIB_SPEC
130117395Skan#define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}}"
13190075Sobrien
132117395Skan
13390075Sobrien/************************[  Target stuff  ]***********************************/
13490075Sobrien
13590075Sobrien/* Define the actual types of some ANSI-mandated types.
13690075Sobrien   Needs to agree with <machine/ansi.h>.  GCC defaults come from c-decl.c,
13790075Sobrien   c-common.c, and config/<arch>/<arch>.h.  */
13890075Sobrien
139117395Skan#undef  SIZE_TYPE
140209867Snwhitehorn#define SIZE_TYPE	(TARGET_64BIT ? "long unsigned int" : "unsigned int")
141117395Skan
142209867Snwhitehorn#undef  PTRDIFF_TYPE
143209867Snwhitehorn#define PTRDIFF_TYPE	(TARGET_64BIT ? "long int" : "int")
144209867Snwhitehorn
14590075Sobrien/* rs6000.h gets this wrong for FreeBSD.  We use the GCC defaults instead.  */
14690075Sobrien#undef WCHAR_TYPE
14790075Sobrien
14890075Sobrien#undef  WCHAR_TYPE_SIZE
14990075Sobrien#define WCHAR_TYPE_SIZE 32
15090075Sobrien
15190075Sobrien#undef  TARGET_VERSION
15290075Sobrien#define TARGET_VERSION fprintf (stderr, " (FreeBSD/PowerPC ELF)");
15390075Sobrien
15490075Sobrien/* Override rs6000.h definition.  */
15590075Sobrien#undef  ASM_APP_ON
15690075Sobrien#define ASM_APP_ON "#APP\n"
15790075Sobrien
15890075Sobrien/* Override rs6000.h definition.  */
15990075Sobrien#undef  ASM_APP_OFF
16090075Sobrien#define ASM_APP_OFF "#NO_APP\n"
161209867Snwhitehorn
162209867Snwhitehorn/* Tell the assembler we want 32/64-bit binaries if -m32 or -m64 is passed */
163209867Snwhitehorn#if (TARGET_DEFAULT & MASK_64BIT)
164209867Snwhitehorn#define	SVR4_ASM_SPEC "%(asm_cpu) \
165209867Snwhitehorn%{.s: %{mregnames} %{mno-regnames}} %{.S: %{mregnames} %{mno-regnames}} \
166209867Snwhitehorn%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} \
167209867Snwhitehorn%{mrelocatable} %{mrelocatable-lib} %{fpic|fpie|fPIC|fPIE:-K PIC} \
168209867Snwhitehorn%{memb|msdata|msdata=eabi: -memb} \
169209867Snwhitehorn%{mlittle|mlittle-endian:-mlittle; \
170209867Snwhitehorn  mbig|mbig-endian      :-mbig;    \
171209867Snwhitehorn  mcall-aixdesc |		   \
172209867Snwhitehorn  mcall-freebsd |		   \
173209867Snwhitehorn  mcall-netbsd  |		   \
174209867Snwhitehorn  mcall-openbsd |		   \
175209867Snwhitehorn  mcall-linux   |		   \
176209867Snwhitehorn  mcall-gnu             :-mbig;    \
177209867Snwhitehorn  mcall-i960-old        :-mlittle}"
178209867Snwhitehorn#define LINK_OS_FREEBSD_SPEC_DEF "\
179209867Snwhitehorn  %{p:%nconsider using `-pg' instead of `-p' with gprof(1)} \
180209867Snwhitehorn  %{v:-V} \
181209867Snwhitehorn  %{assert*} %{R*} %{rpath*} %{defsym*} \
182209867Snwhitehorn  %{shared:-Bshareable %{h*} %{soname*}} \
183209867Snwhitehorn  %{!shared: \
184209867Snwhitehorn    %{!static: \
185209867Snwhitehorn      %{rdynamic: -export-dynamic} \
186209867Snwhitehorn      %{!dynamic-linker:-dynamic-linker %(fbsd_dynamic_linker) }} \
187209867Snwhitehorn    %{static:-Bstatic}} \
188209867Snwhitehorn  %{symbolic:-Bsymbolic}"
189209867Snwhitehorn
190209867Snwhitehorn
191209867Snwhitehorn#undef	ASM_DEFAULT_SPEC
192209867Snwhitehorn#undef	ASM_SPEC
193209867Snwhitehorn#undef	LINK_OS_FREEBSD_SPEC
194209867Snwhitehorn#define	ASM_DEFAULT_SPEC	"-mppc%{!m32:64}"
195209867Snwhitehorn#define	ASM_SPEC		"%{m32:-a32}%{!m32:-a64} " SVR4_ASM_SPEC
196209867Snwhitehorn#define	LINK_OS_FREEBSD_SPEC	"%{m32:-melf32ppc}%{!m32:-melf64ppc} " LINK_OS_FREEBSD_SPEC_DEF
197209867Snwhitehorn#endif
198209867Snwhitehorn
199209867Snwhitehorn/* _init and _fini functions are built from bits spread across many
200209867Snwhitehorn   object files, each potentially with a different TOC pointer.  For
201209867Snwhitehorn   that reason, place a nop after the call so that the linker can
202209867Snwhitehorn   restore the TOC pointer if a TOC adjusting call stub is needed.  */
203209867Snwhitehorn#ifdef __powerpc64__
204209867Snwhitehorn#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC)	\
205209867Snwhitehorn  asm (SECTION_OP "\n"					\
206218824Snwhitehorn"	bl " #FUNC "\n"					\
207209867Snwhitehorn"	nop\n"						\
208209867Snwhitehorn"	.previous");
209209867Snwhitehorn#endif
210209867Snwhitehorn
211209867Snwhitehorn/* __throw will restore its own return address to be the same as the
212209867Snwhitehorn   return address of the function that the throw is being made to.
213209867Snwhitehorn   This is unfortunate, because we want to check the original
214209867Snwhitehorn   return address to see if we need to restore the TOC.
215209867Snwhitehorn   So we have to squirrel it away with this.  */
216209867Snwhitehorn#define SETUP_FRAME_ADDRESSES() \
217209867Snwhitehorn  do { if (TARGET_64BIT) rs6000_aix_emit_builtin_unwind_init (); } while (0)
218209867Snwhitehorn
219209867Snwhitehorn/* Select a format to encode pointers in exception handling data.  CODE
220209867Snwhitehorn   is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
221209867Snwhitehorn   true if the symbol may be affected by dynamic relocations.  */
222209867Snwhitehorn#undef	ASM_PREFERRED_EH_DATA_FORMAT
223209867Snwhitehorn#define	ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \
224209867Snwhitehorn  ((TARGET_64BIT || flag_pic || TARGET_RELOCATABLE)			\
225209867Snwhitehorn   ? (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel		\
226209867Snwhitehorn      | (TARGET_64BIT ? DW_EH_PE_udata8 : DW_EH_PE_sdata4))		\
227209867Snwhitehorn   : DW_EH_PE_absptr)
228209867Snwhitehorn
229213185Snwhitehorn#ifdef __powerpc64__
230209867Snwhitehorn#define MD_FROB_UPDATE_CONTEXT(CTX, FS)					\
231209867Snwhitehorn    if ((FS)->regs.reg[2].how == REG_UNSAVED)				\
232209867Snwhitehorn      {									\
233213185Snwhitehorn	unsigned int *insn = (unsigned int *)				\
234209867Snwhitehorn	    _Unwind_GetGR ((CTX), LINK_REGISTER_REGNUM);		\
235213185Snwhitehorn	if (insn != NULL && *insn == 0xE8410028)			\
236209867Snwhitehorn	  _Unwind_SetGRPtr ((CTX), 2, (CTX)->cfa + 40);			\
237213185Snwhitehorn      }
238213185Snwhitehorn#endif
239209867Snwhitehorn
240217396Skib#define TARGET_ASM_FILE_END rs6000_elf_end_indicate_exec_stack
241217396Skib
242209867Snwhitehorn/* FreeBSD doesn't support saving and restoring 64-bit regs with a 32-bit
243209867Snwhitehorn   kernel. This is supported when running on a 64-bit kernel with
244209867Snwhitehorn   COMPAT_FREEBSD32, but tell GCC it isn't so that our 32-bit binaries
245209867Snwhitehorn   are compatible. */
246209867Snwhitehorn#define OS_MISSING_POWERPC64 !TARGET_64BIT
247209867Snwhitehorn
248209867Snwhitehorn/* Function profiling bits */
249209867Snwhitehorn#undef  RS6000_MCOUNT
250209867Snwhitehorn#define RS6000_MCOUNT ((TARGET_64BIT) ? "._mcount" : "_mcount")
251209867Snwhitehorn#define PROFILE_HOOK(LABEL) \
252209867Snwhitehorn  do { if (TARGET_64BIT) output_profile_hook (LABEL); } while (0)
253209867Snwhitehorn
254217396Skib#undef NEED_INDICATE_EXEC_STACK
255217396Skib#define NEED_INDICATE_EXEC_STACK 1
256