190075Sobrien/* Definitions of target machine for GNU compiler,
2117395Skan   for 64 bit PowerPC linux.
3169689Skan   Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006
4132718Skan   Free Software Foundation, Inc.
590075Sobrien
6132718Skan   This file is part of GCC.
790075Sobrien
8132718Skan   GCC is free software; you can redistribute it and/or modify it
9132718Skan   under the terms of the GNU General Public License as published
10132718Skan   by the Free Software Foundation; either version 2, or (at your
11132718Skan   option) any later version.
1290075Sobrien
13132718Skan   GCC is distributed in the hope that it will be useful, but WITHOUT
14132718Skan   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15132718Skan   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16132718Skan   License for more details.
1790075Sobrien
18132718Skan   You should have received a copy of the GNU General Public License
19132718Skan   along with GCC; see the file COPYING.  If not, write to the
20169689Skan   Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
21169689Skan   MA 02110-1301, USA.  */
2290075Sobrien
23132718Skan#ifndef RS6000_BI_ARCH
2490075Sobrien
25132718Skan#undef	DEFAULT_ABI
26132718Skan#define	DEFAULT_ABI ABI_AIX
2790075Sobrien
28132718Skan#undef	TARGET_64BIT
29132718Skan#define	TARGET_64BIT 1
3090075Sobrien
31132718Skan#define	DEFAULT_ARCH64_P 1
32132718Skan#define	RS6000_BI_ARCH_P 0
33132718Skan
34132718Skan#else
35132718Skan
36132718Skan#define	DEFAULT_ARCH64_P (TARGET_DEFAULT & MASK_64BIT)
37132718Skan#define	RS6000_BI_ARCH_P 1
38132718Skan
39132718Skan#endif
40132718Skan
41132718Skan#ifdef IN_LIBGCC2
42132718Skan#undef TARGET_64BIT
43132718Skan#ifdef __powerpc64__
44132718Skan#define TARGET_64BIT 1
45132718Skan#else
46132718Skan#define TARGET_64BIT 0
47132718Skan#endif
48132718Skan#endif
49132718Skan
50132718Skan#undef	TARGET_AIX
51132718Skan#define	TARGET_AIX TARGET_64BIT
52132718Skan
53169689Skan#ifdef HAVE_LD_NO_DOT_SYMS
54169689Skan/* New ABI uses a local sym for the function entry point.  */
55169689Skanextern int dot_symbols;
56169689Skan#undef DOT_SYMBOLS
57169689Skan#define DOT_SYMBOLS dot_symbols
58169689Skan#endif
5990075Sobrien
60169689Skan#undef  PROCESSOR_DEFAULT
61169689Skan#define PROCESSOR_DEFAULT PROCESSOR_POWER4
62169689Skan#undef  PROCESSOR_DEFAULT64
63169689Skan#define PROCESSOR_DEFAULT64 PROCESSOR_POWER4
64169689Skan
65146895Skan/* We don't need to generate entries in .fixup, except when
66146895Skan   -mrelocatable or -mrelocatable-lib is given.  */
67146895Skan#undef RELOCATABLE_NEEDS_FIXUP
68146895Skan#define RELOCATABLE_NEEDS_FIXUP \
69146895Skan  (target_flags & target_flags_explicit & MASK_RELOCATABLE)
7090075Sobrien
71132718Skan#undef	RS6000_ABI_NAME
72169689Skan#define	RS6000_ABI_NAME "linux"
73132718Skan
74132718Skan#define INVALID_64BIT "-m%s not supported in this configuration"
75132718Skan#define INVALID_32BIT INVALID_64BIT
76132718Skan
77132718Skan#undef	SUBSUBTARGET_OVERRIDE_OPTIONS
78132718Skan#define	SUBSUBTARGET_OVERRIDE_OPTIONS				\
79132718Skan  do								\
80132718Skan    {								\
81169689Skan      if (!rs6000_explicit_options.alignment)			\
82132718Skan	rs6000_alignment_flags = MASK_ALIGN_NATURAL;		\
83132718Skan      if (TARGET_64BIT)						\
84132718Skan	{							\
85132718Skan	  if (DEFAULT_ABI != ABI_AIX)				\
86132718Skan	    {							\
87132718Skan	      rs6000_current_abi = ABI_AIX;			\
88132718Skan	      error (INVALID_64BIT, "call");			\
89132718Skan	    }							\
90169689Skan	  dot_symbols = !strcmp (rs6000_abi_name, "aixdesc");	\
91132718Skan	  if (target_flags & MASK_RELOCATABLE)			\
92132718Skan	    {							\
93132718Skan	      target_flags &= ~MASK_RELOCATABLE;		\
94132718Skan	      error (INVALID_64BIT, "relocatable");		\
95132718Skan	    }							\
96132718Skan	  if (target_flags & MASK_EABI)				\
97132718Skan	    {							\
98132718Skan	      target_flags &= ~MASK_EABI;			\
99132718Skan	      error (INVALID_64BIT, "eabi");			\
100132718Skan	    }							\
101132718Skan	  if (target_flags & MASK_PROTOTYPE)			\
102132718Skan	    {							\
103132718Skan	      target_flags &= ~MASK_PROTOTYPE;			\
104132718Skan	      error (INVALID_64BIT, "prototype");		\
105132718Skan	    }							\
106169689Skan	  if ((target_flags & MASK_POWERPC64) == 0)		\
107132718Skan	    {							\
108132718Skan	      target_flags |= MASK_POWERPC64;			\
109132718Skan	      error ("-m64 requires a PowerPC64 cpu");		\
110132718Skan	    }							\
111132718Skan	}							\
112132718Skan      else							\
113132718Skan	{							\
114132718Skan	  if (!RS6000_BI_ARCH_P)				\
115132718Skan	    error (INVALID_32BIT, "32");			\
116132718Skan	  if (TARGET_PROFILE_KERNEL)				\
117132718Skan	    {							\
118132718Skan	      target_flags &= ~MASK_PROFILE_KERNEL;		\
119132718Skan	      error (INVALID_32BIT, "profile-kernel");		\
120132718Skan	    }							\
121132718Skan	}							\
122132718Skan    }								\
123132718Skan  while (0)
124132718Skan
125132718Skan#ifdef	RS6000_BI_ARCH
126132718Skan
127132718Skan#undef	OVERRIDE_OPTIONS
128132718Skan#define	OVERRIDE_OPTIONS \
129132718Skan  rs6000_override_options (((TARGET_DEFAULT ^ target_flags) & MASK_64BIT) \
130132718Skan			   ? (char *) 0 : TARGET_CPU_DEFAULT)
131132718Skan
132132718Skan#endif
133132718Skan
134132718Skan#undef	ASM_DEFAULT_SPEC
135103445Skan#undef	ASM_SPEC
136132718Skan#undef	LINK_OS_LINUX_SPEC
137103445Skan
138132718Skan#ifndef	RS6000_BI_ARCH
139132718Skan#define	ASM_DEFAULT_SPEC "-mppc64"
140169689Skan#define	ASM_SPEC	 "%(asm_spec64) %(asm_spec_common)"
141132718Skan#define	LINK_OS_LINUX_SPEC "%(link_os_linux_spec64)"
142132718Skan#else
143132718Skan#if DEFAULT_ARCH64_P
144132718Skan#define	ASM_DEFAULT_SPEC "-mppc%{!m32:64}"
145169689Skan#define	ASM_SPEC	 "%{m32:%(asm_spec32)}%{!m32:%(asm_spec64)} %(asm_spec_common)"
146132718Skan#define	LINK_OS_LINUX_SPEC "%{m32:%(link_os_linux_spec32)}%{!m32:%(link_os_linux_spec64)}"
147132718Skan#else
148132718Skan#define	ASM_DEFAULT_SPEC "-mppc%{m64:64}"
149169689Skan#define	ASM_SPEC	 "%{!m64:%(asm_spec32)}%{m64:%(asm_spec64)} %(asm_spec_common)"
150132718Skan#define	LINK_OS_LINUX_SPEC "%{!m64:%(link_os_linux_spec32)}%{m64:%(link_os_linux_spec64)}"
151132718Skan#endif
152132718Skan#endif
153132718Skan
154132718Skan#define ASM_SPEC32 "-a32 %{n} %{T} %{Ym,*} %{Yd,*} \
155132718Skan%{mrelocatable} %{mrelocatable-lib} %{fpic:-K PIC} %{fPIC:-K PIC} \
156132718Skan%{memb} %{!memb: %{msdata: -memb} %{msdata=eabi: -memb}} \
157132718Skan%{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: \
158132718Skan    %{mcall-freebsd: -mbig} \
159132718Skan    %{mcall-i960-old: -mlittle} \
160132718Skan    %{mcall-linux: -mbig} \
161132718Skan    %{mcall-gnu: -mbig} \
162132718Skan    %{mcall-netbsd: -mbig} \
163132718Skan}}}}"
164132718Skan
165132718Skan#define ASM_SPEC64 "-a64"
166132718Skan
167132718Skan#define ASM_SPEC_COMMON "%(asm_cpu) \
168132718Skan%{.s: %{mregnames} %{mno-regnames}} %{.S: %{mregnames} %{mno-regnames}} \
169132718Skan%{v:-V} %{Qy:} %{!Qn:-Qy} %{Wa,*:%*} \
170132718Skan%{mlittle} %{mlittle-endian} %{mbig} %{mbig-endian}"
171132718Skan
172132718Skan#undef	SUBSUBTARGET_EXTRA_SPECS
173132718Skan#define SUBSUBTARGET_EXTRA_SPECS \
174132718Skan  { "asm_spec_common",		ASM_SPEC_COMMON },			\
175132718Skan  { "asm_spec32",		ASM_SPEC32 },				\
176132718Skan  { "asm_spec64",		ASM_SPEC64 },				\
177132718Skan  { "link_os_linux_spec32",	LINK_OS_LINUX_SPEC32 },			\
178132718Skan  { "link_os_linux_spec64",	LINK_OS_LINUX_SPEC64 },
179132718Skan
180132718Skan#undef	MULTILIB_DEFAULTS
181132718Skan#if DEFAULT_ARCH64_P
182132718Skan#define MULTILIB_DEFAULTS { "m64" }
183132718Skan#else
184132718Skan#define MULTILIB_DEFAULTS { "m32" }
185132718Skan#endif
186132718Skan
187132718Skan#ifndef RS6000_BI_ARCH
188132718Skan
189132718Skan/* 64-bit PowerPC Linux is always big-endian.  */
190132718Skan#undef	TARGET_LITTLE_ENDIAN
191132718Skan#define TARGET_LITTLE_ENDIAN	0
192132718Skan
19390075Sobrien/* 64-bit PowerPC Linux always has a TOC.  */
19490075Sobrien#undef  TARGET_TOC
19590075Sobrien#define	TARGET_TOC		1
19690075Sobrien
197132718Skan/* Some things from sysv4.h we don't do when 64 bit.  */
198132718Skan#undef	TARGET_RELOCATABLE
199132718Skan#define	TARGET_RELOCATABLE	0
200132718Skan#undef	TARGET_EABI
201132718Skan#define	TARGET_EABI		0
202132718Skan#undef	TARGET_PROTOTYPE
203132718Skan#define	TARGET_PROTOTYPE	0
204146895Skan#undef RELOCATABLE_NEEDS_FIXUP
205146895Skan#define RELOCATABLE_NEEDS_FIXUP 0
20690075Sobrien
207132718Skan#endif
208132718Skan
209132718Skan/* We use glibc _mcount for profiling.  */
210169689Skan#define NO_PROFILE_COUNTERS 1
211132718Skan#define PROFILE_HOOK(LABEL) \
212132718Skan  do { if (TARGET_64BIT) output_profile_hook (LABEL); } while (0)
213132718Skan
214132718Skan/* PowerPC64 Linux word-aligns FP doubles when -malign-power is given.  */
215103445Skan#undef  ADJUST_FIELD_ALIGN
21690075Sobrien#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
217132718Skan  ((TARGET_ALTIVEC && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE)	\
218132718Skan   ? 128								\
219132718Skan   : (TARGET_64BIT							\
220132718Skan      && TARGET_ALIGN_NATURAL == 0					\
221132718Skan      && TYPE_MODE (TREE_CODE (TREE_TYPE (FIELD)) == ARRAY_TYPE		\
222132718Skan		    ? get_inner_array_type (FIELD)			\
223132718Skan		    : TREE_TYPE (FIELD)) == DFmode)			\
224132718Skan   ? MIN ((COMPUTED), 32)						\
225132718Skan   : (COMPUTED))
22690075Sobrien
227132718Skan/* PowerPC64 Linux increases natural record alignment to doubleword if
228132718Skan   the first field is an FP double, only if in power alignment mode.  */
229132718Skan#undef  ROUND_TYPE_ALIGN
230132718Skan#define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED)			\
231169689Skan  ((TARGET_64BIT							\
232169689Skan    && (TREE_CODE (STRUCT) == RECORD_TYPE				\
233169689Skan	|| TREE_CODE (STRUCT) == UNION_TYPE				\
234169689Skan	|| TREE_CODE (STRUCT) == QUAL_UNION_TYPE)			\
235169689Skan    && TARGET_ALIGN_NATURAL == 0)					\
236132718Skan   ? rs6000_special_round_type_align (STRUCT, COMPUTED, SPECIFIED)	\
23790075Sobrien   : MAX ((COMPUTED), (SPECIFIED)))
23890075Sobrien
239161651Skan/* Use the default for compiling target libs.  */
240161651Skan#ifdef IN_TARGET_LIBS
241161651Skan#undef TARGET_ALIGN_NATURAL
242161651Skan#define TARGET_ALIGN_NATURAL 1
243161651Skan#endif
244161651Skan
24590075Sobrien/* Indicate that jump tables go in the text section.  */
24690075Sobrien#undef  JUMP_TABLES_IN_TEXT_SECTION
247132718Skan#define JUMP_TABLES_IN_TEXT_SECTION TARGET_64BIT
24890075Sobrien
249132718Skan/* The linux ppc64 ABI isn't explicit on whether aggregates smaller
250132718Skan   than a doubleword should be padded upward or downward.  You could
251132718Skan   reasonably assume that they follow the normal rules for structure
252132718Skan   layout treating the parameter area as any other block of memory,
253169689Skan   then map the reg param area to registers.  i.e. pad upward.
254132718Skan   Setting both of the following defines results in this behavior.
255132718Skan   Setting just the first one will result in aggregates that fit in a
256132718Skan   doubleword being padded downward, and others being padded upward.
257132718Skan   Not a bad idea as this results in struct { int x; } being passed
258132718Skan   the same way as an int.  */
259132718Skan#define AGGREGATE_PADDING_FIXED TARGET_64BIT
260132718Skan#define AGGREGATES_PAD_UPWARD_ALWAYS 0
26190075Sobrien
262132718Skan/* Specify padding for the last element of a block move between
263132718Skan   registers and memory.  FIRST is nonzero if this is the only
264132718Skan   element.  */
265132718Skan#define BLOCK_REG_PADDING(MODE, TYPE, FIRST) \
266132718Skan  (!(FIRST) ? upward : FUNCTION_ARG_PADDING (MODE, TYPE))
267132718Skan
26890075Sobrien/* __throw will restore its own return address to be the same as the
26990075Sobrien   return address of the function that the throw is being made to.
27090075Sobrien   This is unfortunate, because we want to check the original
27190075Sobrien   return address to see if we need to restore the TOC.
27290075Sobrien   So we have to squirrel it away with this.  */
273132718Skan#define SETUP_FRAME_ADDRESSES() \
274132718Skan  do { if (TARGET_64BIT) rs6000_aix_emit_builtin_unwind_init (); } while (0)
27590075Sobrien
276117395Skan/* Override svr4.h  */
27790075Sobrien#undef MD_EXEC_PREFIX
27890075Sobrien#undef MD_STARTFILE_PREFIX
27990075Sobrien
280146895Skan/* Linux doesn't support saving and restoring 64-bit regs in a 32-bit
281146895Skan   process.  */
282146895Skan#define OS_MISSING_POWERPC64 !TARGET_64BIT
283146895Skan
284146895Skan/* glibc has float and long double forms of math functions.  */
285146895Skan#undef  TARGET_C99_FUNCTIONS
286169689Skan#define TARGET_C99_FUNCTIONS (OPTION_GLIBC)
287146895Skan
288132718Skan#undef  TARGET_OS_CPP_BUILTINS
289169689Skan#define TARGET_OS_CPP_BUILTINS()			\
290132718Skan  do							\
291132718Skan    {							\
292132718Skan      if (TARGET_64BIT)					\
293132718Skan	{						\
294132718Skan	  builtin_define ("__PPC__");			\
295132718Skan	  builtin_define ("__PPC64__");			\
296132718Skan	  builtin_define ("__powerpc__");		\
297132718Skan	  builtin_define ("__powerpc64__");		\
298132718Skan	  builtin_assert ("cpu=powerpc64");		\
299132718Skan	  builtin_assert ("machine=powerpc64");		\
300132718Skan	}						\
301132718Skan      else						\
302132718Skan	{						\
303132718Skan	  builtin_define_std ("PPC");			\
304132718Skan	  builtin_define_std ("powerpc");		\
305132718Skan	  builtin_assert ("cpu=powerpc");		\
306132718Skan	  builtin_assert ("machine=powerpc");		\
307132718Skan	  TARGET_OS_SYSV_CPP_BUILTINS ();		\
308132718Skan	}						\
309132718Skan    }							\
310117395Skan  while (0)
31190075Sobrien
31290075Sobrien#undef  CPP_OS_DEFAULT_SPEC
31390075Sobrien#define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux)"
31490075Sobrien
31590075Sobrien/* The GNU C++ standard library currently requires _GNU_SOURCE being
31690075Sobrien   defined on glibc-based systems. This temporary hack accomplishes this,
31790075Sobrien   it should go away as soon as libstdc++-v3 has a real fix.  */
31890075Sobrien#undef  CPLUSPLUS_CPP_SPEC
31990075Sobrien#define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)"
32090075Sobrien
32190075Sobrien#undef  LINK_SHLIB_SPEC
32290075Sobrien#define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}}"
32390075Sobrien
32490075Sobrien#undef  LIB_DEFAULT_SPEC
32590075Sobrien#define LIB_DEFAULT_SPEC "%(lib_linux)"
32690075Sobrien
32790075Sobrien#undef  STARTFILE_DEFAULT_SPEC
32890075Sobrien#define STARTFILE_DEFAULT_SPEC "%(startfile_linux)"
32990075Sobrien
33090075Sobrien#undef	ENDFILE_DEFAULT_SPEC
33190075Sobrien#define ENDFILE_DEFAULT_SPEC "%(endfile_linux)"
33290075Sobrien
33390075Sobrien#undef	LINK_START_DEFAULT_SPEC
33490075Sobrien#define LINK_START_DEFAULT_SPEC "%(link_start_linux)"
33590075Sobrien
33690075Sobrien#undef	LINK_OS_DEFAULT_SPEC
33790075Sobrien#define LINK_OS_DEFAULT_SPEC "%(link_os_linux)"
33890075Sobrien
339169689Skan#define GLIBC_DYNAMIC_LINKER32 "/lib/ld.so.1"
340169689Skan#define GLIBC_DYNAMIC_LINKER64 "/lib64/ld64.so.1"
341169689Skan#define UCLIBC_DYNAMIC_LINKER32 "/lib/ld-uClibc.so.0"
342169689Skan#define UCLIBC_DYNAMIC_LINKER64 "/lib/ld64-uClibc.so.0"
343169689Skan#if UCLIBC_DEFAULT
344169689Skan#define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:%{muclibc:%e-mglibc and -muclibc used together}" G ";:" U "}"
345169689Skan#else
346169689Skan#define CHOOSE_DYNAMIC_LINKER(G, U) "%{muclibc:%{mglibc:%e-mglibc and -muclibc used together}" U ";:" G "}"
347169689Skan#endif
348169689Skan#define LINUX_DYNAMIC_LINKER32 \
349169689Skan  CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32)
350169689Skan#define LINUX_DYNAMIC_LINKER64 \
351169689Skan  CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64)
352169689Skan
353169689Skan
354132718Skan#define LINK_OS_LINUX_SPEC32 "-m elf32ppclinux %{!shared: %{!static: \
35590075Sobrien  %{rdynamic:-export-dynamic} \
356169689Skan  %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER32 "}}}"
357132718Skan
358132718Skan#define LINK_OS_LINUX_SPEC64 "-m elf64ppc %{!shared: %{!static: \
359132718Skan  %{rdynamic:-export-dynamic} \
360169689Skan  %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER64 "}}}"
361117395Skan
36290075Sobrien#undef  TOC_SECTION_ASM_OP
363132718Skan#define TOC_SECTION_ASM_OP \
364132718Skan  (TARGET_64BIT						\
365132718Skan   ? "\t.section\t\".toc\",\"aw\""			\
366132718Skan   : "\t.section\t\".got\",\"aw\"")
36790075Sobrien
36890075Sobrien#undef  MINIMAL_TOC_SECTION_ASM_OP
369132718Skan#define MINIMAL_TOC_SECTION_ASM_OP \
370132718Skan  (TARGET_64BIT						\
371132718Skan   ? "\t.section\t\".toc1\",\"aw\""			\
372132718Skan   : ((TARGET_RELOCATABLE || flag_pic)			\
373132718Skan      ? "\t.section\t\".got2\",\"aw\""			\
374132718Skan      : "\t.section\t\".got1\",\"aw\""))
37590075Sobrien
37690075Sobrien#undef  TARGET_VERSION
37790075Sobrien#define TARGET_VERSION fprintf (stderr, " (PowerPC64 GNU/Linux)");
37890075Sobrien
37990075Sobrien/* Must be at least as big as our pointer type.  */
380132718Skan#undef	SIZE_TYPE
381132718Skan#define	SIZE_TYPE (TARGET_64BIT ? "long unsigned int" : "unsigned int")
38290075Sobrien
383132718Skan#undef	PTRDIFF_TYPE
384132718Skan#define	PTRDIFF_TYPE (TARGET_64BIT ? "long int" : "int")
38590075Sobrien
386132718Skan#undef	WCHAR_TYPE
387132718Skan#define	WCHAR_TYPE (TARGET_64BIT ? "int" : "long int")
38890075Sobrien#undef  WCHAR_TYPE_SIZE
38990075Sobrien#define WCHAR_TYPE_SIZE 32
39090075Sobrien
39190075Sobrien/* Override rs6000.h definition.  */
39290075Sobrien#undef  ASM_APP_ON
39390075Sobrien#define ASM_APP_ON "#APP\n"
39490075Sobrien
39590075Sobrien/* Override rs6000.h definition.  */
39690075Sobrien#undef  ASM_APP_OFF
39790075Sobrien#define ASM_APP_OFF "#NO_APP\n"
39890075Sobrien
39990075Sobrien/* PowerPC no-op instruction.  */
40090075Sobrien#undef  RS6000_CALL_GLUE
401132718Skan#define RS6000_CALL_GLUE (TARGET_64BIT ? "nop" : "cror 31,31,31")
40290075Sobrien
40390075Sobrien#undef  RS6000_MCOUNT
40490075Sobrien#define RS6000_MCOUNT "_mcount"
40590075Sobrien
406117395Skan#ifdef __powerpc64__
407117395Skan/* _init and _fini functions are built from bits spread across many
408117395Skan   object files, each potentially with a different TOC pointer.  For
409117395Skan   that reason, place a nop after the call so that the linker can
410117395Skan   restore the TOC pointer if a TOC adjusting call stub is needed.  */
411169689Skan#if DOT_SYMBOLS
412117395Skan#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC)	\
413117395Skan  asm (SECTION_OP "\n"					\
414117395Skan"	bl ." #FUNC "\n"				\
415117395Skan"	nop\n"						\
416117395Skan"	.previous");
417169689Skan#else
418169689Skan#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC)	\
419169689Skan  asm (SECTION_OP "\n"					\
420169689Skan"	bl " #FUNC "\n"					\
421169689Skan"	nop\n"						\
422169689Skan"	.previous");
423117395Skan#endif
424169689Skan#endif
425117395Skan
42690075Sobrien/* FP save and restore routines.  */
42790075Sobrien#undef  SAVE_FP_PREFIX
428132718Skan#define SAVE_FP_PREFIX (TARGET_64BIT ? "._savef" : "_savefpr_")
42990075Sobrien#undef  SAVE_FP_SUFFIX
430132718Skan#define SAVE_FP_SUFFIX (TARGET_64BIT ? "" : "_l")
43190075Sobrien#undef  RESTORE_FP_PREFIX
432132718Skan#define RESTORE_FP_PREFIX (TARGET_64BIT ? "._restf" : "_restfpr_")
43390075Sobrien#undef  RESTORE_FP_SUFFIX
434132718Skan#define RESTORE_FP_SUFFIX (TARGET_64BIT ? "" : "_l")
43590075Sobrien
43690075Sobrien/* Dwarf2 debugging.  */
43790075Sobrien#undef  PREFERRED_DEBUGGING_TYPE
43890075Sobrien#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
43990075Sobrien
44096263Sobrien/* This is how to declare the size of a function.  */
44196263Sobrien#undef	ASM_DECLARE_FUNCTION_SIZE
44296263Sobrien#define	ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL)			\
44396263Sobrien  do									\
44496263Sobrien    {									\
44596263Sobrien      if (!flag_inhibit_size_directive)					\
44696263Sobrien	{								\
447132718Skan	  fputs ("\t.size\t", (FILE));					\
448169689Skan	  if (TARGET_64BIT && DOT_SYMBOLS)				\
449132718Skan	    putc ('.', (FILE));						\
45096263Sobrien	  assemble_name ((FILE), (FNAME));				\
451132718Skan	  fputs (",.-", (FILE));					\
452169689Skan	  rs6000_output_function_entry (FILE, FNAME);			\
45396263Sobrien	  putc ('\n', (FILE));						\
45496263Sobrien	}								\
45596263Sobrien    }									\
45696263Sobrien  while (0)
45796263Sobrien
458117395Skan/* Return nonzero if this entry is to be written into the constant
45990075Sobrien   pool in a special way.  We do so if this is a SYMBOL_REF, LABEL_REF
46090075Sobrien   or a CONST containing one of them.  If -mfp-in-toc (the default),
46190075Sobrien   we also do this for floating-point constants.  We actually can only
46290075Sobrien   do this if the FP formats of the target and host machines are the
46390075Sobrien   same, but we can't check that since not every file that uses
46490075Sobrien   GO_IF_LEGITIMATE_ADDRESS_P includes real.h.  We also do this when
46590075Sobrien   we can write the entry into the TOC and the entry is not larger
46690075Sobrien   than a TOC entry.  */
46790075Sobrien
46890075Sobrien#undef  ASM_OUTPUT_SPECIAL_POOL_ENTRY_P
46990075Sobrien#define ASM_OUTPUT_SPECIAL_POOL_ENTRY_P(X, MODE)			\
47090075Sobrien  (TARGET_TOC								\
47190075Sobrien   && (GET_CODE (X) == SYMBOL_REF					\
47290075Sobrien       || (GET_CODE (X) == CONST && GET_CODE (XEXP (X, 0)) == PLUS	\
47390075Sobrien	   && GET_CODE (XEXP (XEXP (X, 0), 0)) == SYMBOL_REF)		\
47490075Sobrien       || GET_CODE (X) == LABEL_REF					\
47590075Sobrien       || (GET_CODE (X) == CONST_INT 					\
47690075Sobrien	   && GET_MODE_BITSIZE (MODE) <= GET_MODE_BITSIZE (Pmode))	\
47790075Sobrien       || (GET_CODE (X) == CONST_DOUBLE					\
478132718Skan	   && ((TARGET_64BIT						\
479132718Skan		&& (TARGET_POWERPC64					\
480132718Skan		    || TARGET_MINIMAL_TOC				\
481169689Skan		    || (SCALAR_FLOAT_MODE_P (GET_MODE (X))		\
482132718Skan			&& ! TARGET_NO_FP_IN_TOC)))			\
483132718Skan	       || (!TARGET_64BIT					\
484132718Skan		   && !TARGET_NO_FP_IN_TOC				\
485132718Skan		   && !TARGET_RELOCATABLE				\
486169689Skan		   && SCALAR_FLOAT_MODE_P (GET_MODE (X))		\
487132718Skan		   && BITS_PER_WORD == HOST_BITS_PER_INT)))))
48890075Sobrien
489103445Skan/* Select a format to encode pointers in exception handling data.  CODE
490103445Skan   is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
491103445Skan   true if the symbol may be affected by dynamic relocations.  */
492103445Skan#undef	ASM_PREFERRED_EH_DATA_FORMAT
493103445Skan#define	ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \
494132718Skan  ((TARGET_64BIT || flag_pic || TARGET_RELOCATABLE)			\
495132718Skan   ? (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel		\
496132718Skan      | (TARGET_64BIT ? DW_EH_PE_udata8 : DW_EH_PE_sdata4))		\
497132718Skan   : DW_EH_PE_absptr)
498132718Skan
499132718Skan/* For backward compatibility, we must continue to use the AIX
500132718Skan   structure return convention.  */
501132718Skan#undef DRAFT_V4_STRUCT_RET
502132718Skan#define DRAFT_V4_STRUCT_RET (!TARGET_64BIT)
503132718Skan
504146895Skan#define TARGET_ASM_FILE_END rs6000_elf_end_indicate_exec_stack
505132718Skan
506169689Skan#define TARGET_POSIX_IO
507132718Skan
508132718Skan#define LINK_GCC_C_SEQUENCE_SPEC \
509132718Skan  "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
510132718Skan
511169689Skan/* Use --as-needed -lgcc_s for eh support.  */
512169689Skan#ifdef HAVE_LD_AS_NEEDED
513169689Skan#define USE_LD_AS_NEEDED 1
514132718Skan#endif
515169689Skan
516169689Skan#define MD_UNWIND_SUPPORT "config/rs6000/linux-unwind.h"
517169689Skan
518169689Skan#ifdef TARGET_LIBC_PROVIDES_SSP
519169689Skan/* ppc32 glibc provides __stack_chk_guard in -0x7008(2),
520169689Skan   ppc64 glibc provides it at -0x7010(13).  */
521169689Skan#define TARGET_THREAD_SSP_OFFSET	(TARGET_64BIT ? -0x7010 : -0x7008)
522169689Skan#endif
523169689Skan
524169689Skan#define POWERPC_LINUX
525169689Skan
526169689Skan/* ppc{32,64} linux has 128-bit long double support in glibc 2.4 and later.  */
527169689Skan#ifdef TARGET_DEFAULT_LONG_DOUBLE_128
528169689Skan#define RS6000_DEFAULT_LONG_DOUBLE_SIZE 128
529169689Skan#endif
530