sysv4.h revision 132718
1/* Target definitions for GNU compiler for PowerPC running System V.4
2   Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3   2004 Free Software Foundation, Inc.
4   Contributed by Cygnus Support.
5
6   This file is part of GCC.
7
8   GCC is free software; you can redistribute it and/or modify it
9   under the terms of the GNU General Public License as published
10   by the Free Software Foundation; either version 2, or (at your
11   option) any later version.
12
13   GCC is distributed in the hope that it will be useful, but WITHOUT
14   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16   License for more details.
17
18   You should have received a copy of the GNU General Public License
19   along with GCC; see the file COPYING.  If not, write to the
20   Free Software Foundation, 59 Temple Place - Suite 330, Boston,
21   MA 02111-1307, USA.  */
22
23/* Header files should be C++ aware in general.  */
24#define NO_IMPLICIT_EXTERN_C
25
26/* Yes!  We are ELF.  */
27#define	TARGET_OBJECT_FORMAT OBJECT_ELF
28
29/* Default ABI to compile code for.  */
30#define DEFAULT_ABI rs6000_current_abi
31
32/* Default ABI to use.  */
33#define RS6000_ABI_NAME "sysv"
34
35/* Override rs6000.h definition.  */
36#undef	ASM_DEFAULT_SPEC
37#define	ASM_DEFAULT_SPEC "-mppc"
38
39/* Small data support types.  */
40enum rs6000_sdata_type {
41  SDATA_NONE,			/* No small data support.  */
42  SDATA_DATA,			/* Just put data in .sbss/.sdata, don't use relocs.  */
43  SDATA_SYSV,			/* Use r13 to point to .sdata/.sbss.  */
44  SDATA_EABI			/* Use r13 like above, r2 points to .sdata2/.sbss2.  */
45};
46
47extern enum rs6000_sdata_type rs6000_sdata;
48
49/* V.4/eabi switches.  */
50#define	MASK_NO_BITFIELD_TYPE	0x40000000	/* Set PCC_BITFIELD_TYPE_MATTERS to 0.  */
51#define	MASK_STRICT_ALIGN	0x20000000	/* Set STRICT_ALIGNMENT to 1.  */
52#define	MASK_RELOCATABLE	0x10000000	/* GOT pointers are PC relative.  */
53#define	MASK_EABI		0x08000000	/* Adhere to eabi, not System V spec.  */
54#define	MASK_LITTLE_ENDIAN	0x04000000	/* Target is little endian.  */
55#define	MASK_REGNAMES		0x02000000	/* Use alternate register names.  */
56#define	MASK_PROTOTYPE		0x01000000	/* Only prototyped fcns pass variable args.  */
57#define MASK_NO_BITFIELD_WORD	0x00800000	/* Bitfields cannot cross word boundaries */
58
59#define	TARGET_NO_BITFIELD_TYPE	(target_flags & MASK_NO_BITFIELD_TYPE)
60#define	TARGET_STRICT_ALIGN	(target_flags & MASK_STRICT_ALIGN)
61#define	TARGET_RELOCATABLE	(target_flags & MASK_RELOCATABLE)
62#define	TARGET_EABI		(target_flags & MASK_EABI)
63#define	TARGET_LITTLE_ENDIAN	(target_flags & MASK_LITTLE_ENDIAN)
64#define	TARGET_REGNAMES		(target_flags & MASK_REGNAMES)
65#define	TARGET_PROTOTYPE	(target_flags & MASK_PROTOTYPE)
66#define TARGET_NO_BITFIELD_WORD	(target_flags & MASK_NO_BITFIELD_WORD)
67#define	TARGET_TOC		((target_flags & MASK_64BIT)		\
68				 || ((target_flags & (MASK_RELOCATABLE	\
69						      | MASK_MINIMAL_TOC)) \
70				     && flag_pic > 1)			\
71				 || DEFAULT_ABI == ABI_AIX)
72
73#define	TARGET_BITFIELD_TYPE	(! TARGET_NO_BITFIELD_TYPE)
74#define	TARGET_BIG_ENDIAN	(! TARGET_LITTLE_ENDIAN)
75#define	TARGET_NO_PROTOTYPE	(! TARGET_PROTOTYPE)
76#define	TARGET_NO_TOC		(! TARGET_TOC)
77#define	TARGET_NO_EABI		(! TARGET_EABI)
78
79/* Strings provided by SUBTARGET_OPTIONS */
80extern const char *rs6000_abi_name;
81extern const char *rs6000_sdata_name;
82extern const char *rs6000_tls_size_string; /* For -mtls-size= */
83
84/* Override rs6000.h definition.  */
85#undef	SUBTARGET_OPTIONS
86#define	SUBTARGET_OPTIONS							\
87  { "call-",  &rs6000_abi_name, N_("Select ABI calling convention"), 0},	\
88  { "sdata=", &rs6000_sdata_name, N_("Select method for sdata handling"), 0},	\
89  { "tls-size=", &rs6000_tls_size_string,					\
90   N_("Specify bit size of immediate TLS offsets"), 0 }
91
92#define SDATA_DEFAULT_SIZE 8
93
94/* Note, V.4 no longer uses a normal TOC, so make -mfull-toc, be just
95   the same as -mminimal-toc.  */
96/* Override rs6000.h definition.  */
97#undef	SUBTARGET_SWITCHES
98#define SUBTARGET_SWITCHES						\
99  { "bit-align",	-MASK_NO_BITFIELD_TYPE,				\
100    N_("Align to the base type of the bit-field") },			\
101  { "no-bit-align",	 MASK_NO_BITFIELD_TYPE,				\
102    N_("Don't align to the base type of the bit-field") },		\
103  { "strict-align",	 MASK_STRICT_ALIGN,				\
104    N_("Don't assume that unaligned accesses are handled by the system") }, \
105  { "no-strict-align",	-MASK_STRICT_ALIGN,				\
106    N_("Assume that unaligned accesses are handled by the system") },	\
107  { "relocatable",	 MASK_RELOCATABLE | MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC, \
108    N_("Produce code relocatable at runtime") },			\
109  { "no-relocatable",	-MASK_RELOCATABLE,				\
110    N_("Don't produce code relocatable at runtime") },			\
111  { "relocatable-lib",	 MASK_RELOCATABLE | MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC, \
112    N_("Produce code relocatable at runtime") },			\
113  { "no-relocatable-lib", -MASK_RELOCATABLE,				\
114    N_("Don't produce code relocatable at runtime") },			\
115  { "little-endian",	 MASK_LITTLE_ENDIAN,				\
116    N_("Produce little endian code") },					\
117  { "little",		 MASK_LITTLE_ENDIAN,				\
118    N_("Produce little endian code") },					\
119  { "big-endian",	-MASK_LITTLE_ENDIAN,				\
120    N_("Produce big endian code") },					\
121  { "big",		-MASK_LITTLE_ENDIAN,				\
122    N_("Produce big endian code") },					\
123  { "no-toc",		 0, N_("no description yet") },			\
124  { "toc",		 MASK_MINIMAL_TOC, N_("no description yet") },	\
125  { "full-toc",		 MASK_MINIMAL_TOC, N_("no description yet") },	\
126  { "prototype",	 MASK_PROTOTYPE, N_("no description yet") },	\
127  { "no-prototype",	-MASK_PROTOTYPE, N_("no description yet") },	\
128  { "no-traceback",	 0, N_("no description yet") },			\
129  { "eabi",		 MASK_EABI, N_("Use EABI") },			\
130  { "no-eabi",		-MASK_EABI, N_("Don't use EABI") },		\
131  { "bit-word",		-MASK_NO_BITFIELD_WORD, "" },			\
132  { "no-bit-word",	 MASK_NO_BITFIELD_WORD,				\
133    N_("Do not allow bit-fields to cross word boundaries") },		\
134  { "regnames",		  MASK_REGNAMES,				\
135    N_("Use alternate register names") },				\
136  { "no-regnames",	 -MASK_REGNAMES,				\
137    N_("Don't use alternate register names") },				\
138  { "sdata",		 0, N_("no description yet") },			\
139  { "no-sdata",		 0, N_("no description yet") },			\
140  { "sim",		 0,						\
141    N_("Link with libsim.a, libc.a and sim-crt0.o") },			\
142  { "ads",		 0,						\
143    N_("Link with libads.a, libc.a and crt0.o") },			\
144  { "yellowknife",	 0,						\
145    N_("Link with libyk.a, libc.a and crt0.o") },			\
146  { "mvme",		 0,						\
147    N_("Link with libmvme.a, libc.a and crt0.o") },			\
148  { "emb",		 0,						\
149    N_("Set the PPC_EMB bit in the ELF flags header") },		\
150  { "windiss",           0, N_("Use the WindISS simulator") },          \
151  { "shlib",		 0, N_("no description yet") },			\
152  { "64",		 MASK_64BIT | MASK_POWERPC64 | MASK_POWERPC,	\
153			 N_("Generate 64-bit code") },			\
154  { "32",		 - (MASK_64BIT | MASK_POWERPC64),		\
155			 N_("Generate 32-bit code") },			\
156  EXTRA_SUBTARGET_SWITCHES						\
157  { "newlib",		 0, N_("no description yet") },
158
159/* This is meant to be redefined in the host dependent files.  */
160#define EXTRA_SUBTARGET_SWITCHES
161
162/* Sometimes certain combinations of command options do not make sense
163   on a particular target machine.  You can define a macro
164   `OVERRIDE_OPTIONS' to take account of this.  This macro, if
165   defined, is executed once just after all the command options have
166   been parsed.
167
168   The macro SUBTARGET_OVERRIDE_OPTIONS is provided for subtargets, to
169   get control.  */
170
171#define SUBTARGET_OVERRIDE_OPTIONS					\
172do {									\
173  if (!g_switch_set)							\
174    g_switch_value = SDATA_DEFAULT_SIZE;				\
175									\
176  if (rs6000_abi_name == NULL)						\
177    rs6000_abi_name = RS6000_ABI_NAME;					\
178									\
179  if (!strcmp (rs6000_abi_name, "sysv"))				\
180    rs6000_current_abi = ABI_V4;					\
181  else if (!strcmp (rs6000_abi_name, "sysv-noeabi"))			\
182    {									\
183      rs6000_current_abi = ABI_V4;					\
184      target_flags &= ~ MASK_EABI;					\
185    }									\
186  else if (!strcmp (rs6000_abi_name, "sysv-eabi")			\
187	   || !strcmp (rs6000_abi_name, "eabi"))			\
188    {									\
189      rs6000_current_abi = ABI_V4;					\
190      target_flags |= MASK_EABI;					\
191    }									\
192  else if (!strcmp (rs6000_abi_name, "aixdesc"))			\
193    rs6000_current_abi = ABI_AIX;					\
194  else if (!strcmp (rs6000_abi_name, "freebsd"))			\
195    rs6000_current_abi = ABI_V4;					\
196  else if (!strcmp (rs6000_abi_name, "linux"))				\
197    rs6000_current_abi = ABI_V4;					\
198  else if (!strcmp (rs6000_abi_name, "gnu"))				\
199    rs6000_current_abi = ABI_V4;					\
200  else if (!strcmp (rs6000_abi_name, "netbsd"))				\
201    rs6000_current_abi = ABI_V4;					\
202  else if (!strcmp (rs6000_abi_name, "openbsd"))			\
203    rs6000_current_abi = ABI_V4;					\
204  else if (!strcmp (rs6000_abi_name, "i960-old"))			\
205    {									\
206      rs6000_current_abi = ABI_V4;					\
207      target_flags |= (MASK_LITTLE_ENDIAN | MASK_EABI			\
208		       | MASK_NO_BITFIELD_WORD);			\
209      target_flags &= ~MASK_STRICT_ALIGN;				\
210    }									\
211  else									\
212    {									\
213      rs6000_current_abi = ABI_V4;					\
214      error ("bad value for -mcall-%s", rs6000_abi_name);		\
215    }									\
216									\
217  if (rs6000_sdata_name)						\
218    {									\
219      if (!strcmp (rs6000_sdata_name, "none"))				\
220	rs6000_sdata = SDATA_NONE;					\
221      else if (!strcmp (rs6000_sdata_name, "data"))			\
222	rs6000_sdata = SDATA_DATA;					\
223      else if (!strcmp (rs6000_sdata_name, "default"))			\
224	rs6000_sdata = (TARGET_EABI) ? SDATA_EABI : SDATA_SYSV;		\
225      else if (!strcmp (rs6000_sdata_name, "sysv"))			\
226	rs6000_sdata = SDATA_SYSV;					\
227      else if (!strcmp (rs6000_sdata_name, "eabi"))			\
228	rs6000_sdata = SDATA_EABI;					\
229      else								\
230	error ("bad value for -msdata=%s", rs6000_sdata_name);		\
231    }									\
232  else if (DEFAULT_ABI == ABI_V4)					\
233    {									\
234      rs6000_sdata = SDATA_DATA;					\
235      rs6000_sdata_name = "data";					\
236    }									\
237  else									\
238    {									\
239      rs6000_sdata = SDATA_NONE;					\
240      rs6000_sdata_name = "none";					\
241    }									\
242									\
243  if (TARGET_RELOCATABLE &&						\
244      (rs6000_sdata == SDATA_EABI || rs6000_sdata == SDATA_SYSV))	\
245    {									\
246      rs6000_sdata = SDATA_DATA;					\
247      error ("-mrelocatable and -msdata=%s are incompatible",		\
248	     rs6000_sdata_name);					\
249    }									\
250									\
251  else if (flag_pic && DEFAULT_ABI != ABI_AIX				\
252	   && (rs6000_sdata == SDATA_EABI				\
253	       || rs6000_sdata == SDATA_SYSV))				\
254    {									\
255      rs6000_sdata = SDATA_DATA;					\
256      error ("-f%s and -msdata=%s are incompatible",			\
257	     (flag_pic > 1) ? "PIC" : "pic",				\
258	     rs6000_sdata_name);					\
259    }									\
260									\
261  if ((rs6000_sdata != SDATA_NONE && DEFAULT_ABI != ABI_V4)		\
262      || (rs6000_sdata == SDATA_EABI && !TARGET_EABI))			\
263    {									\
264      rs6000_sdata = SDATA_NONE;					\
265      error ("-msdata=%s and -mcall-%s are incompatible",		\
266	     rs6000_sdata_name, rs6000_abi_name);			\
267    }									\
268									\
269  targetm.have_srodata_section = rs6000_sdata == SDATA_EABI;		\
270									\
271  if (TARGET_RELOCATABLE && !TARGET_MINIMAL_TOC)			\
272    {									\
273      target_flags |= MASK_MINIMAL_TOC;					\
274      error ("-mrelocatable and -mno-minimal-toc are incompatible");	\
275    }									\
276									\
277  if (TARGET_RELOCATABLE && rs6000_current_abi == ABI_AIX)		\
278    {									\
279      target_flags &= ~MASK_RELOCATABLE;				\
280      error ("-mrelocatable and -mcall-%s are incompatible",		\
281	     rs6000_abi_name);						\
282    }									\
283									\
284  if (!TARGET_64BIT && flag_pic > 1 && rs6000_current_abi == ABI_AIX)	\
285    {									\
286      flag_pic = 0;							\
287      error ("-fPIC and -mcall-%s are incompatible",			\
288	     rs6000_abi_name);						\
289    }									\
290									\
291  if (rs6000_current_abi == ABI_AIX && TARGET_LITTLE_ENDIAN)		\
292    {									\
293      target_flags &= ~MASK_LITTLE_ENDIAN;				\
294      error ("-mcall-aixdesc must be big endian");			\
295    }									\
296									\
297  /* Treat -fPIC the same as -mrelocatable.  */				\
298  if (flag_pic > 1 && DEFAULT_ABI != ABI_AIX)				\
299    target_flags |= MASK_RELOCATABLE | MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC; \
300									\
301  else if (TARGET_RELOCATABLE)						\
302    flag_pic = 2;							\
303} while (0)
304
305#ifndef RS6000_BI_ARCH
306# define SUBSUBTARGET_OVERRIDE_OPTIONS					\
307do {									\
308  if ((TARGET_DEFAULT ^ target_flags) & MASK_64BIT)			\
309    error ("-m%s not supported in this configuration",			\
310	   (target_flags & MASK_64BIT) ? "64" : "32");			\
311} while (0)
312#endif
313
314/* Override rs6000.h definition.  */
315#undef	TARGET_DEFAULT
316#define	TARGET_DEFAULT (MASK_POWERPC | MASK_NEW_MNEMONICS)
317
318/* Override rs6000.h definition.  */
319#undef	PROCESSOR_DEFAULT
320#define	PROCESSOR_DEFAULT PROCESSOR_PPC750
321
322#define FIXED_R2 1
323/* System V.4 uses register 13 as a pointer to the small data area,
324   so it is not available to the normal user.  */
325#define FIXED_R13 1
326
327/* Size of the V.4 varargs area if needed.  */
328/* Override rs6000.h definition.  */
329#undef	RS6000_VARARGS_AREA
330#define RS6000_VARARGS_AREA ((cfun->machine->sysv_varargs_p) ? RS6000_VARARGS_SIZE : 0)
331
332/* Override default big endianism definitions in rs6000.h.  */
333#undef	BYTES_BIG_ENDIAN
334#undef	WORDS_BIG_ENDIAN
335#define	BYTES_BIG_ENDIAN (TARGET_BIG_ENDIAN)
336#define	WORDS_BIG_ENDIAN (TARGET_BIG_ENDIAN)
337
338/* Define this to set the endianness to use in libgcc2.c, which can
339   not depend on target_flags.  */
340#if !defined(__LITTLE_ENDIAN__) && !defined(__sun__)
341#define LIBGCC2_WORDS_BIG_ENDIAN 1
342#else
343#define LIBGCC2_WORDS_BIG_ENDIAN 0
344#endif
345
346/* Define cutoff for using external functions to save floating point.
347   Currently on V.4, always use inline stores.  */
348#define FP_SAVE_INLINE(FIRST_REG) ((FIRST_REG) < 64)
349
350/* Put jump tables in read-only memory, rather than in .text.  */
351#define JUMP_TABLES_IN_TEXT_SECTION 0
352
353/* Prefix and suffix to use to saving floating point.  */
354#define	SAVE_FP_PREFIX "_savefpr_"
355#define SAVE_FP_SUFFIX "_l"
356
357/* Prefix and suffix to use to restoring floating point.  */
358#define	RESTORE_FP_PREFIX "_restfpr_"
359#define RESTORE_FP_SUFFIX "_l"
360
361/* Type used for ptrdiff_t, as a string used in a declaration.  */
362#define PTRDIFF_TYPE "int"
363
364/* Type used for wchar_t, as a string used in a declaration.  */
365/* Override svr4.h definition.  */
366#undef	WCHAR_TYPE
367#define WCHAR_TYPE "long int"
368
369/* Width of wchar_t in bits.  */
370/* Override svr4.h definition.  */
371#undef	WCHAR_TYPE_SIZE
372#define WCHAR_TYPE_SIZE 32
373
374/* Make int foo : 8 not cause structures to be aligned to an int boundary.  */
375/* Override elfos.h definition.  */
376#undef	PCC_BITFIELD_TYPE_MATTERS
377#define	PCC_BITFIELD_TYPE_MATTERS (TARGET_BITFIELD_TYPE)
378
379#undef	BITFIELD_NBYTES_LIMITED
380#define	BITFIELD_NBYTES_LIMITED (TARGET_NO_BITFIELD_WORD)
381
382/* Define this macro to be the value 1 if instructions will fail to
383   work if given data not on the nominal alignment.  If instructions
384   will merely go slower in that case, define this macro as 0.  */
385#undef	STRICT_ALIGNMENT
386#define	STRICT_ALIGNMENT (TARGET_STRICT_ALIGN)
387
388/* Define this macro if you wish to preserve a certain alignment for
389   the stack pointer, greater than what the hardware enforces.  The
390   definition is a C expression for the desired alignment (measured
391   in bits).  This macro must evaluate to a value equal to or larger
392   than STACK_BOUNDARY.
393   For the SYSV ABI and variants the alignment of the stack pointer
394   is usually controlled manually in rs6000.c. However, to maintain
395   alignment across alloca () in all circumstances,
396   PREFERRED_STACK_BOUNDARY needs to be set as well.
397   This has the additional advantage of allowing a bigger maximum
398   alignment of user objects on the stack.  */
399
400#undef PREFERRED_STACK_BOUNDARY
401#define PREFERRED_STACK_BOUNDARY 128
402
403/* Real stack boundary as mandated by the appropriate ABI.  */
404#define ABI_STACK_BOUNDARY \
405  ((TARGET_EABI && !TARGET_ALTIVEC && !TARGET_ALTIVEC_ABI) ? 64 : 128)
406
407/* An expression for the alignment of a structure field FIELD if the
408   alignment computed in the usual way is COMPUTED.  */
409#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED)				      \
410	((TARGET_ALTIVEC && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE)     \
411	 ? 128 : COMPUTED)
412
413/* Define this macro as an expression for the alignment of a type
414   (given by TYPE as a tree node) if the alignment computed in the
415   usual way is COMPUTED and the alignment explicitly specified was
416   SPECIFIED.  */
417#define ROUND_TYPE_ALIGN(TYPE, COMPUTED, SPECIFIED)			\
418	((TARGET_ALTIVEC  && TREE_CODE (TYPE) == VECTOR_TYPE)	        \
419	 ? MAX (MAX ((COMPUTED), (SPECIFIED)), 128)                     \
420         : MAX (COMPUTED, SPECIFIED))
421
422#undef  BIGGEST_FIELD_ALIGNMENT
423
424/* Use ELF style section commands.  */
425
426#define	TEXT_SECTION_ASM_OP	"\t.section\t\".text\""
427
428#define	DATA_SECTION_ASM_OP	"\t.section\t\".data\""
429
430#define	BSS_SECTION_ASM_OP	"\t.section\t\".bss\""
431
432/* Override elfos.h definition.  */
433#undef	INIT_SECTION_ASM_OP
434#define	INIT_SECTION_ASM_OP "\t.section\t\".init\",\"ax\""
435
436/* Override elfos.h definition.  */
437#undef	FINI_SECTION_ASM_OP
438#define	FINI_SECTION_ASM_OP "\t.section\t\".fini\",\"ax\""
439
440#define	TOC_SECTION_ASM_OP "\t.section\t\".got\",\"aw\""
441
442/* Put PC relative got entries in .got2.  */
443#define	MINIMAL_TOC_SECTION_ASM_OP \
444  (TARGET_RELOCATABLE || (flag_pic && DEFAULT_ABI != ABI_AIX)		\
445   ? "\t.section\t\".got2\",\"aw\"" : "\t.section\t\".got1\",\"aw\"")
446
447#define	SDATA_SECTION_ASM_OP "\t.section\t\".sdata\",\"aw\""
448#define	SDATA2_SECTION_ASM_OP "\t.section\t\".sdata2\",\"a\""
449#define	SBSS_SECTION_ASM_OP "\t.section\t\".sbss\",\"aw\",@nobits"
450
451/* Besides the usual ELF sections, we need a toc section.  */
452/* Override elfos.h definition.  */
453#undef	EXTRA_SECTIONS
454#define	EXTRA_SECTIONS in_toc, in_sdata, in_sdata2, in_sbss, in_init, in_fini
455
456/* Override elfos.h definition.  */
457#undef	EXTRA_SECTION_FUNCTIONS
458#define	EXTRA_SECTION_FUNCTIONS						\
459  TOC_SECTION_FUNCTION							\
460  SDATA_SECTION_FUNCTION						\
461  SDATA2_SECTION_FUNCTION						\
462  SBSS_SECTION_FUNCTION							\
463  INIT_SECTION_FUNCTION							\
464  FINI_SECTION_FUNCTION
465
466#define	TOC_SECTION_FUNCTION						\
467void									\
468toc_section (void)							\
469{									\
470  if (in_section != in_toc)						\
471    {									\
472      in_section = in_toc;						\
473      if (DEFAULT_ABI == ABI_AIX					\
474	  && TARGET_MINIMAL_TOC						\
475	  && !TARGET_RELOCATABLE)					\
476	{								\
477	  if (! toc_initialized)					\
478	    {								\
479	      toc_initialized = 1;					\
480	      fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);	\
481	      (*targetm.asm_out.internal_label) (asm_out_file, "LCTOC", 0); \
482	      fprintf (asm_out_file, "\t.tc ");				\
483	      ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1[TC],"); \
484	      ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1"); \
485	      fprintf (asm_out_file, "\n");				\
486									\
487	      fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP); \
488	      ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1"); \
489	      fprintf (asm_out_file, " = .+32768\n");			\
490	    }								\
491	  else								\
492	    fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);	\
493	}								\
494      else if (DEFAULT_ABI == ABI_AIX && !TARGET_RELOCATABLE)		\
495	fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);		\
496      else								\
497	{								\
498	  fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);	\
499	  if (! toc_initialized)					\
500	    {								\
501	      ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1"); \
502	      fprintf (asm_out_file, " = .+32768\n");			\
503	      toc_initialized = 1;					\
504	    }								\
505	}								\
506    }									\
507}									\
508									\
509extern int in_toc_section (void);					\
510int in_toc_section (void)						\
511{									\
512  return in_section == in_toc;						\
513}
514
515#define	SDATA_SECTION_FUNCTION						\
516void									\
517sdata_section (void)							\
518{									\
519  if (in_section != in_sdata)						\
520    {									\
521      in_section = in_sdata;						\
522      fprintf (asm_out_file, "%s\n", SDATA_SECTION_ASM_OP);		\
523    }									\
524}
525
526#define	SDATA2_SECTION_FUNCTION						\
527void									\
528sdata2_section (void)							\
529{									\
530  if (in_section != in_sdata2)						\
531    {									\
532      in_section = in_sdata2;						\
533      fprintf (asm_out_file, "%s\n", SDATA2_SECTION_ASM_OP);		\
534    }									\
535}
536
537#define	SBSS_SECTION_FUNCTION						\
538void									\
539sbss_section (void)							\
540{									\
541  if (in_section != in_sbss)						\
542    {									\
543      in_section = in_sbss;						\
544      fprintf (asm_out_file, "%s\n", SBSS_SECTION_ASM_OP);		\
545    }									\
546}
547
548#define	INIT_SECTION_FUNCTION						\
549void									\
550init_section (void)							\
551{									\
552  if (in_section != in_init)						\
553    {									\
554      in_section = in_init;						\
555      fprintf (asm_out_file, "%s\n", INIT_SECTION_ASM_OP);		\
556    }									\
557}
558
559#define	FINI_SECTION_FUNCTION						\
560void									\
561fini_section (void)							\
562{									\
563  if (in_section != in_fini)						\
564    {									\
565      in_section = in_fini;						\
566      fprintf (asm_out_file, "%s\n", FINI_SECTION_ASM_OP);		\
567    }									\
568}
569
570/* Override default elf definitions.  */
571#undef	TARGET_ASM_SELECT_RTX_SECTION
572#define	TARGET_ASM_SELECT_RTX_SECTION rs6000_elf_select_rtx_section
573#undef	TARGET_ASM_SELECT_SECTION
574#define	TARGET_ASM_SELECT_SECTION  rs6000_elf_select_section
575#define TARGET_ASM_UNIQUE_SECTION  rs6000_elf_unique_section
576
577/* Return nonzero if this entry is to be written into the constant pool
578   in a special way.  We do so if this is a SYMBOL_REF, LABEL_REF or a CONST
579   containing one of them.  If -mfp-in-toc (the default), we also do
580   this for floating-point constants.  We actually can only do this
581   if the FP formats of the target and host machines are the same, but
582   we can't check that since not every file that uses
583   GO_IF_LEGITIMATE_ADDRESS_P includes real.h.
584
585   Unlike AIX, we don't key off of -mminimal-toc, but instead do not
586   allow floating point constants in the TOC if -mrelocatable.  */
587
588#undef	ASM_OUTPUT_SPECIAL_POOL_ENTRY_P
589#define	ASM_OUTPUT_SPECIAL_POOL_ENTRY_P(X, MODE)			\
590  (TARGET_TOC								\
591   && (GET_CODE (X) == SYMBOL_REF					\
592       || (GET_CODE (X) == CONST && GET_CODE (XEXP (X, 0)) == PLUS	\
593	   && GET_CODE (XEXP (XEXP (X, 0), 0)) == SYMBOL_REF)		\
594       || GET_CODE (X) == LABEL_REF					\
595       || (GET_CODE (X) == CONST_INT 					\
596	   && GET_MODE_BITSIZE (MODE) <= GET_MODE_BITSIZE (Pmode))	\
597       || (!TARGET_NO_FP_IN_TOC						\
598	   && !TARGET_RELOCATABLE					\
599	   && GET_CODE (X) == CONST_DOUBLE				\
600	   && GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT		\
601	   && BITS_PER_WORD == HOST_BITS_PER_INT)))
602
603/* These macros generate the special .type and .size directives which
604   are used to set the corresponding fields of the linker symbol table
605   entries in an ELF object file under SVR4.  These macros also output
606   the starting labels for the relevant functions/objects.  */
607
608/* Write the extra assembler code needed to declare a function properly.
609   Some svr4 assemblers need to also have something extra said about the
610   function's return value.  We allow for that here.  */
611
612extern int rs6000_pic_labelno;
613
614/* Override elfos.h definition.  */
615#undef	ASM_DECLARE_FUNCTION_NAME
616#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)			\
617  rs6000_elf_declare_function_name ((FILE), (NAME), (DECL))
618
619/* The USER_LABEL_PREFIX stuff is affected by the -fleading-underscore
620   flag.  The LOCAL_LABEL_PREFIX variable is used by dbxelf.h.  */
621
622#define	LOCAL_LABEL_PREFIX "."
623#define	USER_LABEL_PREFIX ""
624
625/* svr4.h overrides (*targetm.asm_out.internal_label).  */
626
627#define	ASM_OUTPUT_INTERNAL_LABEL_PREFIX(FILE,PREFIX)	\
628  asm_fprintf (FILE, "%L%s", PREFIX)
629
630/* Globalizing directive for a label.  */
631#define GLOBAL_ASM_OP "\t.globl "
632
633/* This says how to output assembler code to declare an
634   uninitialized internal linkage data object.  Under SVR4,
635   the linker seems to want the alignment of data objects
636   to depend on their types.  We do exactly that here.  */
637
638#define	LOCAL_ASM_OP	"\t.local\t"
639
640#define	LCOMM_ASM_OP	"\t.lcomm\t"
641
642/* Override elfos.h definition.  */
643#undef	ASM_OUTPUT_ALIGNED_LOCAL
644#define	ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN)		\
645do {									\
646  if (rs6000_sdata != SDATA_NONE && (SIZE) > 0				\
647      && (SIZE) <= g_switch_value)					\
648    {									\
649      sbss_section ();							\
650      ASM_OUTPUT_ALIGN (FILE, exact_log2 (ALIGN / BITS_PER_UNIT));	\
651      ASM_OUTPUT_LABEL (FILE, NAME);					\
652      ASM_OUTPUT_SKIP (FILE, SIZE);					\
653      if (!flag_inhibit_size_directive && (SIZE) > 0)			\
654	ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE);			\
655    }									\
656  else									\
657    {									\
658      fprintf (FILE, "%s", LCOMM_ASM_OP);				\
659      assemble_name ((FILE), (NAME));					\
660      fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n",		\
661	       (SIZE), (ALIGN) / BITS_PER_UNIT);			\
662    }									\
663  ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");			\
664} while (0)
665
666/* Describe how to emit uninitialized external linkage items.  */
667#define	ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN)		\
668do {									\
669  ASM_OUTPUT_ALIGNED_LOCAL (FILE, NAME, SIZE, ALIGN);			\
670} while (0)
671
672#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN
673/* To support -falign-* switches we need to use .p2align so
674   that alignment directives in code sections will be padded
675   with no-op instructions, rather than zeroes.  */
676#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP)			\
677  if ((LOG) != 0)							\
678    {									\
679      if ((MAX_SKIP) == 0)						\
680	fprintf ((FILE), "\t.p2align %d\n", (LOG));			\
681      else								\
682	fprintf ((FILE), "\t.p2align %d,,%d\n",	(LOG), (MAX_SKIP));	\
683    }
684#endif
685
686/* This is how to output code to push a register on the stack.
687   It need not be very fast code.
688
689   On the rs6000, we must keep the backchain up to date.  In order
690   to simplify things, always allocate 16 bytes for a push (System V
691   wants to keep stack aligned to a 16 byte boundary).  */
692
693#define	ASM_OUTPUT_REG_PUSH(FILE, REGNO)				\
694do {									\
695  if (DEFAULT_ABI == ABI_V4)						\
696    asm_fprintf (FILE,							\
697		 "\t{stu|stwu} %s,-16(%s)\n\t{st|stw} %s,12(%s)\n",	\
698		 reg_names[1], reg_names[1], reg_names[REGNO],		\
699		 reg_names[1]);						\
700} while (0)
701
702/* This is how to output an insn to pop a register from the stack.
703   It need not be very fast code.  */
704
705#define	ASM_OUTPUT_REG_POP(FILE, REGNO)					\
706do {									\
707  if (DEFAULT_ABI == ABI_V4)						\
708    asm_fprintf (FILE,							\
709		 "\t{l|lwz} %s,12(%s)\n\t{ai|addic} %s,%s,16\n",	\
710		 reg_names[REGNO], reg_names[1], reg_names[1],		\
711		 reg_names[1]);						\
712} while (0)
713
714/* Switch  Recognition by gcc.c.  Add -G xx support.  */
715
716/* Override svr4.h definition.  */
717#undef	SWITCH_TAKES_ARG
718#define	SWITCH_TAKES_ARG(CHAR)						\
719  ((CHAR) == 'D' || (CHAR) == 'U' || (CHAR) == 'o'			\
720   || (CHAR) == 'e' || (CHAR) == 'T' || (CHAR) == 'u'			\
721   || (CHAR) == 'I' || (CHAR) == 'm' || (CHAR) == 'x'			\
722   || (CHAR) == 'L' || (CHAR) == 'A' || (CHAR) == 'V'			\
723   || (CHAR) == 'B' || (CHAR) == 'b' || (CHAR) == 'G')
724
725extern int fixuplabelno;
726
727/* Handle constructors specially for -mrelocatable.  */
728#define TARGET_ASM_CONSTRUCTOR  rs6000_elf_asm_out_constructor
729#define TARGET_ASM_DESTRUCTOR   rs6000_elf_asm_out_destructor
730
731/* This is the end of what might become sysv4.h.  */
732
733/* Use DWARF 2 debugging information by default.  */
734#undef  PREFERRED_DEBUGGING_TYPE
735#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
736
737/* Historically we have also supported stabs debugging.  */
738#define DBX_DEBUGGING_INFO 1
739
740#define DBX_REGISTER_NUMBER(REGNO) rs6000_dbx_register_number (REGNO)
741
742/* Map register numbers held in the call frame info that gcc has
743   collected using DWARF_FRAME_REGNUM to those that should be output in
744   .debug_frame and .eh_frame.  We continue to use gcc hard reg numbers
745   for .eh_frame, but use the numbers mandated by the various ABIs for
746   .debug_frame.  rs6000_emit_prologue has translated any combination of
747   CR2, CR3, CR4 saves to a save of CR2.  The actual code emitted saves
748   the whole of CR, so we map CR2_REGNO to the DWARF reg for CR.  */
749#define DWARF2_FRAME_REG_OUT(REGNO, FOR_EH)	\
750  ((FOR_EH) ? (REGNO)				\
751   : (REGNO) == CR2_REGNO ? 64			\
752   : DBX_REGISTER_NUMBER (REGNO))
753
754#define TARGET_ENCODE_SECTION_INFO  rs6000_elf_encode_section_info
755#define TARGET_IN_SMALL_DATA_P  rs6000_elf_in_small_data_p
756#define TARGET_SECTION_TYPE_FLAGS  rs6000_elf_section_type_flags
757
758/* The ELF version doesn't encode [DS] or whatever at the end of symbols.  */
759
760#define	RS6000_OUTPUT_BASENAME(FILE, NAME)	\
761    assemble_name (FILE, NAME)
762
763/* We have to output the stabs for the function name *first*, before
764   outputting its label.  */
765
766#define	DBX_FUNCTION_FIRST
767
768/* This is the end of what might become sysv4dbx.h.  */
769
770#ifndef	TARGET_VERSION
771#define	TARGET_VERSION fprintf (stderr, " (PowerPC System V.4)");
772#endif
773
774#define TARGET_OS_SYSV_CPP_BUILTINS()	  \
775  do                                      \
776    {                                     \
777      if (flag_pic == 1)		  \
778        {				  \
779	  builtin_define ("__pic__=1");	  \
780	  builtin_define ("__PIC__=1");	  \
781        }				  \
782      else if (flag_pic == 2)		  \
783        {				  \
784	  builtin_define ("__pic__=2");	  \
785	  builtin_define ("__PIC__=2");	  \
786        }				  \
787      if (target_flags_explicit		  \
788	  & MASK_RELOCATABLE)		  \
789	builtin_define ("_RELOCATABLE");  \
790    }                                     \
791  while (0)
792
793#ifndef	TARGET_OS_CPP_BUILTINS
794#define TARGET_OS_CPP_BUILTINS()          \
795  do                                      \
796    {                                     \
797      builtin_define_std ("PPC");         \
798      builtin_define_std ("unix");        \
799      builtin_define ("__svr4__");        \
800      builtin_assert ("system=unix");     \
801      builtin_assert ("system=svr4");     \
802      builtin_assert ("cpu=powerpc");     \
803      builtin_assert ("machine=powerpc"); \
804      TARGET_OS_SYSV_CPP_BUILTINS ();	  \
805    }                                     \
806  while (0)
807#endif
808
809/* Pass various options to the assembler.  */
810/* Override svr4.h definition.  */
811#undef	ASM_SPEC
812#define	ASM_SPEC "%(asm_cpu) \
813%{.s: %{mregnames} %{mno-regnames}} %{.S: %{mregnames} %{mno-regnames}} \
814%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} \
815%{mrelocatable} %{mrelocatable-lib} %{fpic|fpie|fPIC|fPIE:-K PIC} \
816%{memb|msdata|msdata=eabi: -memb} \
817%{mlittle|mlittle-endian:-mlittle; \
818  mbig|mbig-endian      :-mbig;    \
819  mcall-aixdesc |		   \
820  mcall-freebsd |		   \
821  mcall-netbsd  |		   \
822  mcall-openbsd |		   \
823  mcall-linux   |		   \
824  mcall-gnu             :-mbig;    \
825  mcall-i960-old        :-mlittle}"
826
827#define	CC1_ENDIAN_BIG_SPEC ""
828
829#define	CC1_ENDIAN_LITTLE_SPEC "\
830%{!mstrict-align: %{!mno-strict-align: \
831    %{!mcall-i960-old: \
832	-mstrict-align \
833    } \
834}}"
835
836#define	CC1_ENDIAN_DEFAULT_SPEC "%(cc1_endian_big)"
837
838/* Pass -G xxx to the compiler and set correct endian mode.  */
839#define	CC1_SPEC "%{G*} \
840%{mlittle|mlittle-endian: %(cc1_endian_little);           \
841  mbig   |mbig-endian   : %(cc1_endian_big);              \
842  mcall-aixdesc |					  \
843  mcall-freebsd |					  \
844  mcall-netbsd  |					  \
845  mcall-openbsd |					  \
846  mcall-linux   |					  \
847  mcall-gnu             : -mbig %(cc1_endian_big);        \
848  mcall-i960-old        : -mlittle %(cc1_endian_little);  \
849                        : %(cc1_endian_default)}          \
850%{mno-sdata: -msdata=none } \
851%{meabi: %{!mcall-*: -mcall-sysv }} \
852%{!meabi: %{!mno-eabi: \
853    %{mrelocatable: -meabi } \
854    %{mcall-freebsd: -mno-eabi } \
855    %{mcall-i960-old: -meabi } \
856    %{mcall-linux: -mno-eabi } \
857    %{mcall-gnu: -mno-eabi } \
858    %{mcall-netbsd: -mno-eabi } \
859    %{mcall-openbsd: -mno-eabi }}} \
860%{msdata: -msdata=default} \
861%{mno-sdata: -msdata=none} \
862%{profile: -p}"
863
864/* Don't put -Y P,<path> for cross compilers.  */
865#ifndef CROSS_COMPILE
866#define LINK_PATH_SPEC "\
867%{!R*:%{L*:-R %*}} \
868%{!nostdlib: %{!YP,*: \
869    %{compat-bsd: \
870	%{p:-Y P,/usr/ucblib:/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \
871	%{!p:-Y P,/usr/ucblib:/usr/ccs/lib:/usr/lib}} \
872	%{!R*: %{!L*: -R /usr/ucblib}} \
873    %{!compat-bsd: \
874	%{p:-Y P,/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \
875	%{!p:-Y P,/usr/ccs/lib:/usr/lib}}}}"
876
877#else
878#define LINK_PATH_SPEC ""
879#endif
880
881/* Default starting address if specified.  */
882#define LINK_START_SPEC "\
883%{mads         : %(link_start_ads)         ; \
884  myellowknife : %(link_start_yellowknife) ; \
885  mmvme        : %(link_start_mvme)        ; \
886  msim         : %(link_start_sim)         ; \
887  mwindiss     : %(link_start_windiss)     ; \
888  mcall-freebsd: %(link_start_freebsd)     ; \
889  mcall-linux  : %(link_start_linux)       ; \
890  mcall-gnu    : %(link_start_gnu)         ; \
891  mcall-netbsd : %(link_start_netbsd)      ; \
892  mcall-openbsd: %(link_start_openbsd)     ; \
893               : %(link_start_default)     }"
894
895#define LINK_START_DEFAULT_SPEC ""
896
897/* Override svr4.h definition.  */
898#undef	LINK_SPEC
899#define	LINK_SPEC "\
900%{h*} %{v:-V} %{!msdata=none:%{G*}} %{msdata=none:-G0} \
901%{YP,*} %{R*} \
902%{Qy:} %{!Qn:-Qy} \
903%(link_shlib) \
904%{!Wl,-T*: %{!T*: %(link_start) }} \
905%(link_target) \
906%(link_os)"
907
908/* For now, turn off shared libraries by default.  */
909#ifndef SHARED_LIB_SUPPORT
910#define NO_SHARED_LIB_SUPPORT
911#endif
912
913#ifndef NO_SHARED_LIB_SUPPORT
914/* Shared libraries are default.  */
915#define LINK_SHLIB_SPEC "\
916%{!static: %(link_path) %{!R*:%{L*:-R %*}}} \
917%{mshlib: } \
918%{static:-dn -Bstatic} \
919%{shared:-G -dy -z text} \
920%{symbolic:-Bsymbolic -G -dy -z text}"
921
922#else
923/* Shared libraries are not default.  */
924#define LINK_SHLIB_SPEC "\
925%{mshlib: %(link_path) } \
926%{!mshlib: %{!shared: %{!symbolic: -dn -Bstatic}}} \
927%{static: } \
928%{shared:-G -dy -z text %(link_path) } \
929%{symbolic:-Bsymbolic -G -dy -z text %(link_path) }"
930#endif
931
932/* Override the default target of the linker.  */
933#define	LINK_TARGET_SPEC "\
934%{mlittle: --oformat elf32-powerpcle } %{mlittle-endian: --oformat elf32-powerpcle } \
935%{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: \
936    %{mcall-i960-old: --oformat elf32-powerpcle} \
937  }}}}"
938
939/* Any specific OS flags.  */
940#define LINK_OS_SPEC "\
941%{mads         : %(link_os_ads)         ; \
942  myellowknife : %(link_os_yellowknife) ; \
943  mmvme        : %(link_os_mvme)        ; \
944  msim         : %(link_os_sim)         ; \
945  mwindiss     : %(link_os_windiss)     ; \
946  mcall-freebsd: %(link_os_freebsd)     ; \
947  mcall-linux  : %(link_os_linux)       ; \
948  mcall-gnu    : %(link_os_gnu)         ; \
949  mcall-netbsd : %(link_os_netbsd)      ; \
950  mcall-openbsd: %(link_os_openbsd)     ; \
951               : %(link_os_default)     }"
952
953#define LINK_OS_DEFAULT_SPEC ""
954
955/* Override rs6000.h definition.  */
956#undef	CPP_SPEC
957#define	CPP_SPEC "%{posix: -D_POSIX_SOURCE} \
958%{mads         : %(cpp_os_ads)         ; \
959  myellowknife : %(cpp_os_yellowknife) ; \
960  mmvme        : %(cpp_os_mvme)        ; \
961  msim         : %(cpp_os_sim)         ; \
962  mwindiss     : %(cpp_os_windiss)     ; \
963  mcall-freebsd: %(cpp_os_freebsd)     ; \
964  mcall-linux  : %(cpp_os_linux)       ; \
965  mcall-gnu    : %(cpp_os_gnu)         ; \
966  mcall-netbsd : %(cpp_os_netbsd)      ; \
967  mcall-openbsd: %(cpp_os_openbsd)     ; \
968               : %(cpp_os_default)     }"
969
970#define	CPP_OS_DEFAULT_SPEC ""
971
972/* Override svr4.h definition.  */
973#undef	STARTFILE_SPEC
974#define	STARTFILE_SPEC "\
975%{mads         : %(startfile_ads)         ; \
976  myellowknife : %(startfile_yellowknife) ; \
977  mmvme        : %(startfile_mvme)        ; \
978  msim         : %(startfile_sim)         ; \
979  mwindiss     : %(startfile_windiss)     ; \
980  mcall-freebsd: %(startfile_freebsd)     ; \
981  mcall-linux  : %(startfile_linux)       ; \
982  mcall-gnu    : %(startfile_gnu)         ; \
983  mcall-netbsd : %(startfile_netbsd)      ; \
984  mcall-openbsd: %(startfile_openbsd)     ; \
985               : %(startfile_default)     }"
986
987#define	STARTFILE_DEFAULT_SPEC ""
988
989/* Override svr4.h definition.  */
990#undef	LIB_SPEC
991#define	LIB_SPEC "\
992%{mads         : %(lib_ads)         ; \
993  myellowknife : %(lib_yellowknife) ; \
994  mmvme        : %(lib_mvme)        ; \
995  msim         : %(lib_sim)         ; \
996  mwindiss     : %(lib_windiss)     ; \
997  mcall-freebsd: %(lib_freebsd)     ; \
998  mcall-linux  : %(lib_linux)       ; \
999  mcall-gnu    : %(lib_gnu)         ; \
1000  mcall-netbsd : %(lib_netbsd)      ; \
1001  mcall-openbsd: %(lib_openbsd)     ; \
1002               : %(lib_default)     }"
1003
1004#define LIB_DEFAULT_SPEC ""
1005
1006/* Override svr4.h definition.  */
1007#undef	ENDFILE_SPEC
1008#define	ENDFILE_SPEC "\
1009%{mads         : crtsavres.o%s        %(endfile_ads)         ; \
1010  myellowknife : crtsavres.o%s        %(endfile_yellowknife) ; \
1011  mmvme        : crtsavres.o%s        %(endfile_mvme)        ; \
1012  msim         : crtsavres.o%s        %(endfile_sim)         ; \
1013  mwindiss     :                      %(endfile_windiss)     ; \
1014  mcall-freebsd: crtsavres.o%s        %(endfile_freebsd)     ; \
1015  mcall-linux  : crtsavres.o%s        %(endfile_linux)       ; \
1016  mcall-gnu    : crtsavres.o%s        %(endfile_gnu)         ; \
1017  mcall-netbsd : crtsavres.o%s        %(endfile_netbsd)      ; \
1018  mcall-openbsd: crtsavres.o%s        %(endfile_openbsd)     ; \
1019               : %(crtsavres_default) %(endfile_default)     }"
1020
1021#define CRTSAVRES_DEFAULT_SPEC "crtsavres.o%s"
1022
1023#define	ENDFILE_DEFAULT_SPEC ""
1024
1025/* Motorola ADS support.  */
1026#define LIB_ADS_SPEC "--start-group -lads -lc --end-group"
1027
1028#define	STARTFILE_ADS_SPEC "ecrti.o%s crt0.o%s crtbegin.o%s"
1029
1030#define	ENDFILE_ADS_SPEC "crtend.o%s ecrtn.o%s"
1031
1032#define LINK_START_ADS_SPEC "-T ads.ld%s"
1033
1034#define LINK_OS_ADS_SPEC ""
1035
1036#define CPP_OS_ADS_SPEC ""
1037
1038/* Motorola Yellowknife support.  */
1039#define LIB_YELLOWKNIFE_SPEC "--start-group -lyk -lc --end-group"
1040
1041#define	STARTFILE_YELLOWKNIFE_SPEC "ecrti.o%s crt0.o%s crtbegin.o%s"
1042
1043#define	ENDFILE_YELLOWKNIFE_SPEC "crtend.o%s ecrtn.o%s"
1044
1045#define LINK_START_YELLOWKNIFE_SPEC "-T yellowknife.ld%s"
1046
1047#define LINK_OS_YELLOWKNIFE_SPEC ""
1048
1049#define CPP_OS_YELLOWKNIFE_SPEC ""
1050
1051/* Motorola MVME support.  */
1052#define LIB_MVME_SPEC "--start-group -lmvme -lc --end-group"
1053
1054#define	STARTFILE_MVME_SPEC "ecrti.o%s crt0.o%s crtbegin.o%s"
1055
1056#define	ENDFILE_MVME_SPEC "crtend.o%s ecrtn.o%s"
1057
1058#define LINK_START_MVME_SPEC "-Ttext 0x40000"
1059
1060#define LINK_OS_MVME_SPEC ""
1061
1062#define CPP_OS_MVME_SPEC ""
1063
1064/* PowerPC simulator based on netbsd system calls support.  */
1065#define LIB_SIM_SPEC "--start-group -lsim -lc --end-group"
1066
1067#define	STARTFILE_SIM_SPEC "ecrti.o%s sim-crt0.o%s crtbegin.o%s"
1068
1069#define	ENDFILE_SIM_SPEC "crtend.o%s ecrtn.o%s"
1070
1071#define LINK_START_SIM_SPEC ""
1072
1073#define LINK_OS_SIM_SPEC "-m elf32ppcsim"
1074
1075#define CPP_OS_SIM_SPEC ""
1076
1077/* FreeBSD support.  */
1078
1079#define CPP_OS_FREEBSD_SPEC	"\
1080  -D__PPC__ -D__ppc__ -D__PowerPC__ -D__powerpc__ \
1081  -Acpu=powerpc -Amachine=powerpc"
1082
1083#define	STARTFILE_FREEBSD_SPEC	FBSD_STARTFILE_SPEC
1084#define ENDFILE_FREEBSD_SPEC	FBSD_ENDFILE_SPEC
1085#define LIB_FREEBSD_SPEC	FBSD_LIB_SPEC
1086#define LINK_START_FREEBSD_SPEC	""
1087
1088#define LINK_OS_FREEBSD_SPEC "\
1089  %{p:%e`-p' not supported; use `-pg' and gprof(1)} \
1090  %{Wl,*:%*} \
1091  %{v:-V} \
1092  %{assert*} %{R*} %{rpath*} %{defsym*} \
1093  %{shared:-Bshareable %{h*} %{soname*}} \
1094  %{!shared: \
1095    %{!static: \
1096      %{rdynamic: -export-dynamic} \
1097      %{!dynamic-linker:-dynamic-linker %(fbsd_dynamic_linker) }} \
1098    %{static:-Bstatic}} \
1099  %{symbolic:-Bsymbolic}"
1100
1101/* GNU/Linux support.  */
1102#define LIB_LINUX_SPEC "%{mnewlib: --start-group -llinux -lc --end-group } \
1103%{!mnewlib: %{pthread:-lpthread} %{shared:-lc} \
1104%{!shared: %{profile:-lc_p} %{!profile:-lc}}}"
1105
1106#ifdef HAVE_LD_PIE
1107#define	STARTFILE_LINUX_SPEC "\
1108%{!shared: %{pg|p:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \
1109%{mnewlib:ecrti.o%s;:crti.o%s} \
1110%{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
1111#else
1112#define	STARTFILE_LINUX_SPEC "\
1113%{!shared: %{pg|p:gcrt1.o%s;:crt1.o%s}} \
1114%{mnewlib:ecrti.o%s;:crti.o%s} \
1115%{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
1116#endif
1117
1118#define	ENDFILE_LINUX_SPEC "%{!shared:crtend.o%s} %{shared:crtendS.o%s} \
1119%{mnewlib: ecrtn.o%s} %{!mnewlib: crtn.o%s}"
1120
1121#define LINK_START_LINUX_SPEC ""
1122
1123#define LINK_OS_LINUX_SPEC "-m elf32ppclinux %{!shared: %{!static: \
1124  %{rdynamic:-export-dynamic} \
1125  %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}"
1126
1127#if defined(HAVE_LD_EH_FRAME_HDR)
1128# define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
1129#endif
1130
1131#define CPP_OS_LINUX_SPEC "-D__unix__ -D__gnu_linux__ -D__linux__ \
1132%{!undef:							  \
1133  %{!ansi:							  \
1134    %{!std=*:-Dunix -D__unix -Dlinux -D__linux}			  \
1135    %{std=gnu*:-Dunix -D__unix -Dlinux -D__linux}}}		  \
1136-Asystem=linux -Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT}"
1137
1138/* GNU/Hurd support.  */
1139#define LIB_GNU_SPEC "%{mnewlib: --start-group -lgnu -lc --end-group } \
1140%{!mnewlib: %{shared:-lc} %{!shared: %{pthread:-lpthread } \
1141%{profile:-lc_p} %{!profile:-lc}}}"
1142
1143#define	STARTFILE_GNU_SPEC "\
1144%{!shared: %{!static: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}} \
1145%{static: %{pg:gcrt0.o%s} %{!pg:%{p:gcrt0.o%s} %{!p:crt0.o%s}}} \
1146%{mnewlib: ecrti.o%s} %{!mnewlib: crti.o%s} \
1147%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
1148
1149#define	ENDFILE_GNU_SPEC "%{!shared:crtend.o%s} %{shared:crtendS.o%s} \
1150%{mnewlib: ecrtn.o%s} %{!mnewlib: crtn.o%s}"
1151
1152#define LINK_START_GNU_SPEC ""
1153
1154#define LINK_OS_GNU_SPEC "-m elf32ppclinux %{!shared: %{!static: \
1155  %{rdynamic:-export-dynamic} \
1156  %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}"
1157
1158#define CPP_OS_GNU_SPEC "-D__unix__ -D__gnu_hurd__ -D__GNU__	\
1159%{!undef:					                \
1160  %{!ansi: -Dunix -D__unix}}			                \
1161-Asystem=gnu -Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT}"
1162
1163/* NetBSD support.  */
1164#define LIB_NETBSD_SPEC "\
1165%{profile:-lgmon -lc_p} %{!profile:-lc}"
1166
1167#define	STARTFILE_NETBSD_SPEC "\
1168ncrti.o%s crt0.o%s \
1169%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
1170
1171#define ENDFILE_NETBSD_SPEC "\
1172%{!shared:crtend.o%s} %{shared:crtendS.o%s} \
1173ncrtn.o%s"
1174
1175#define LINK_START_NETBSD_SPEC "\
1176"
1177
1178#define LINK_OS_NETBSD_SPEC "\
1179%{!shared: %{!static: \
1180  %{rdynamic:-export-dynamic} \
1181  %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}}}"
1182
1183#define CPP_OS_NETBSD_SPEC "\
1184-D__powerpc__ -D__NetBSD__ -D__KPRINTF_ATTRIBUTE__"
1185
1186/* OpenBSD support.  */
1187#ifndef	LIB_OPENBSD_SPEC
1188#define LIB_OPENBSD_SPEC "%{!shared:%{pthread:-lpthread%{p:_p}%{!p:%{pg:_p}}}} %{!shared:-lc%{p:_p}%{!p:%{pg:_p}}}"
1189#endif
1190
1191#ifndef	STARTFILE_OPENBSD_SPEC
1192#define	STARTFILE_OPENBSD_SPEC "\
1193%{!shared: %{pg:gcrt0.o%s} %{!pg:%{p:gcrt0.o%s} %{!p:crt0.o%s}}} \
1194%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
1195#endif
1196
1197#ifndef	ENDFILE_OPENBSD_SPEC
1198#define	ENDFILE_OPENBSD_SPEC "\
1199%{!shared:crtend.o%s} %{shared:crtendS.o%s}"
1200#endif
1201
1202#ifndef LINK_START_OPENBSD_SPEC
1203#define LINK_START_OPENBSD_SPEC "-Ttext 0x400074"
1204#endif
1205
1206#ifndef LINK_OS_OPENBSD_SPEC
1207#define LINK_OS_OPENBSD_SPEC ""
1208#endif
1209
1210#ifndef CPP_OS_OPENBSD_SPEC
1211#define CPP_OS_OPENBSD_SPEC "%{posix:-D_POSIX_SOURCE} %{pthread:-D_POSIX_THREADS}"
1212#endif
1213
1214/* WindISS support.  */
1215
1216#define LIB_WINDISS_SPEC "--start-group -li -lcfp -lwindiss -lram -limpl -limpfp --end-group"
1217
1218#define CPP_OS_WINDISS_SPEC "\
1219-D__rtasim \
1220-D__EABI__ \
1221-D__ppc \
1222%{!msoft-float: -D__hardfp} \
1223"
1224
1225#define STARTFILE_WINDISS_SPEC "crt0.o%s crtbegin.o%s"
1226
1227#define ENDFILE_WINDISS_SPEC "crtend.o%s"
1228
1229#define LINK_START_WINDISS_SPEC ""
1230
1231#define LINK_OS_WINDISS_SPEC ""
1232
1233/* Define any extra SPECS that the compiler needs to generate.  */
1234/* Override rs6000.h definition.  */
1235#undef	SUBTARGET_EXTRA_SPECS
1236#define	SUBTARGET_EXTRA_SPECS						\
1237  { "crtsavres_default",        CRTSAVRES_DEFAULT_SPEC },              \
1238  { "lib_ads",			LIB_ADS_SPEC },				\
1239  { "lib_yellowknife",		LIB_YELLOWKNIFE_SPEC },			\
1240  { "lib_mvme",			LIB_MVME_SPEC },			\
1241  { "lib_sim",			LIB_SIM_SPEC },				\
1242  { "lib_freebsd",		LIB_FREEBSD_SPEC },			\
1243  { "lib_gnu",			LIB_GNU_SPEC },				\
1244  { "lib_linux",		LIB_LINUX_SPEC },			\
1245  { "lib_netbsd",		LIB_NETBSD_SPEC },			\
1246  { "lib_openbsd",		LIB_OPENBSD_SPEC },			\
1247  { "lib_windiss",              LIB_WINDISS_SPEC },                     \
1248  { "lib_default",		LIB_DEFAULT_SPEC },			\
1249  { "startfile_ads",		STARTFILE_ADS_SPEC },			\
1250  { "startfile_yellowknife",	STARTFILE_YELLOWKNIFE_SPEC },		\
1251  { "startfile_mvme",		STARTFILE_MVME_SPEC },			\
1252  { "startfile_sim",		STARTFILE_SIM_SPEC },			\
1253  { "startfile_freebsd",	STARTFILE_FREEBSD_SPEC },		\
1254  { "startfile_gnu",		STARTFILE_GNU_SPEC },			\
1255  { "startfile_linux",		STARTFILE_LINUX_SPEC },			\
1256  { "startfile_netbsd",		STARTFILE_NETBSD_SPEC },		\
1257  { "startfile_openbsd",	STARTFILE_OPENBSD_SPEC },		\
1258  { "startfile_windiss",        STARTFILE_WINDISS_SPEC },               \
1259  { "startfile_default",	STARTFILE_DEFAULT_SPEC },		\
1260  { "endfile_ads",		ENDFILE_ADS_SPEC },			\
1261  { "endfile_yellowknife",	ENDFILE_YELLOWKNIFE_SPEC },		\
1262  { "endfile_mvme",		ENDFILE_MVME_SPEC },			\
1263  { "endfile_sim",		ENDFILE_SIM_SPEC },			\
1264  { "endfile_freebsd",		ENDFILE_FREEBSD_SPEC },			\
1265  { "endfile_gnu",		ENDFILE_GNU_SPEC },			\
1266  { "endfile_linux",		ENDFILE_LINUX_SPEC },			\
1267  { "endfile_netbsd",		ENDFILE_NETBSD_SPEC },			\
1268  { "endfile_openbsd",		ENDFILE_OPENBSD_SPEC },			\
1269  { "endfile_windiss",          ENDFILE_WINDISS_SPEC },                 \
1270  { "endfile_default",		ENDFILE_DEFAULT_SPEC },			\
1271  { "link_path",		LINK_PATH_SPEC },			\
1272  { "link_shlib",		LINK_SHLIB_SPEC },			\
1273  { "link_target",		LINK_TARGET_SPEC },			\
1274  { "link_start",		LINK_START_SPEC },			\
1275  { "link_start_ads",		LINK_START_ADS_SPEC },			\
1276  { "link_start_yellowknife",	LINK_START_YELLOWKNIFE_SPEC },		\
1277  { "link_start_mvme",		LINK_START_MVME_SPEC },			\
1278  { "link_start_sim",		LINK_START_SIM_SPEC },			\
1279  { "link_start_freebsd",	LINK_START_FREEBSD_SPEC },		\
1280  { "link_start_gnu",		LINK_START_GNU_SPEC },			\
1281  { "link_start_linux",		LINK_START_LINUX_SPEC },		\
1282  { "link_start_netbsd",	LINK_START_NETBSD_SPEC },		\
1283  { "link_start_openbsd",	LINK_START_OPENBSD_SPEC },		\
1284  { "link_start_windiss",	LINK_START_WINDISS_SPEC },		\
1285  { "link_start_default",	LINK_START_DEFAULT_SPEC },		\
1286  { "link_os",			LINK_OS_SPEC },				\
1287  { "link_os_ads",		LINK_OS_ADS_SPEC },			\
1288  { "link_os_yellowknife",	LINK_OS_YELLOWKNIFE_SPEC },		\
1289  { "link_os_mvme",		LINK_OS_MVME_SPEC },			\
1290  { "link_os_sim",		LINK_OS_SIM_SPEC },			\
1291  { "link_os_freebsd",		LINK_OS_FREEBSD_SPEC },			\
1292  { "link_os_linux",		LINK_OS_LINUX_SPEC },			\
1293  { "link_os_gnu",		LINK_OS_GNU_SPEC },			\
1294  { "link_os_netbsd",		LINK_OS_NETBSD_SPEC },			\
1295  { "link_os_openbsd",		LINK_OS_OPENBSD_SPEC },			\
1296  { "link_os_windiss",		LINK_OS_WINDISS_SPEC },			\
1297  { "link_os_default",		LINK_OS_DEFAULT_SPEC },			\
1298  { "cc1_endian_big",		CC1_ENDIAN_BIG_SPEC },			\
1299  { "cc1_endian_little",	CC1_ENDIAN_LITTLE_SPEC },		\
1300  { "cc1_endian_default",	CC1_ENDIAN_DEFAULT_SPEC },		\
1301  { "cpp_os_ads",		CPP_OS_ADS_SPEC },			\
1302  { "cpp_os_yellowknife",	CPP_OS_YELLOWKNIFE_SPEC },		\
1303  { "cpp_os_mvme",		CPP_OS_MVME_SPEC },			\
1304  { "cpp_os_sim",		CPP_OS_SIM_SPEC },			\
1305  { "cpp_os_freebsd",		CPP_OS_FREEBSD_SPEC },			\
1306  { "cpp_os_gnu",		CPP_OS_GNU_SPEC },			\
1307  { "cpp_os_linux",		CPP_OS_LINUX_SPEC },			\
1308  { "cpp_os_netbsd",		CPP_OS_NETBSD_SPEC },			\
1309  { "cpp_os_openbsd",		CPP_OS_OPENBSD_SPEC },			\
1310  { "cpp_os_windiss",           CPP_OS_WINDISS_SPEC },                  \
1311  { "cpp_os_default",		CPP_OS_DEFAULT_SPEC },			\
1312  { "fbsd_dynamic_linker",	FBSD_DYNAMIC_LINKER },			\
1313  SUBSUBTARGET_EXTRA_SPECS
1314
1315#define	SUBSUBTARGET_EXTRA_SPECS
1316
1317/* Define this macro as a C expression for the initializer of an
1318   array of string to tell the driver program which options are
1319   defaults for this target and thus do not need to be handled
1320   specially when using `MULTILIB_OPTIONS'.
1321
1322   Do not define this macro if `MULTILIB_OPTIONS' is not defined in
1323   the target makefile fragment or if none of the options listed in
1324   `MULTILIB_OPTIONS' are set by default.  *Note Target Fragment::.  */
1325
1326#define	MULTILIB_DEFAULTS { "mbig", "mcall-sysv" }
1327
1328/* Define this macro if the code for function profiling should come
1329   before the function prologue.  Normally, the profiling code comes
1330   after.  */
1331#define PROFILE_BEFORE_PROLOGUE 1
1332
1333/* Function name to call to do profiling.  */
1334#define RS6000_MCOUNT "_mcount"
1335
1336/* Define this macro (to a value of 1) if you want to support the
1337   Win32 style pragmas #pragma pack(push,<n>)' and #pragma
1338   pack(pop)'.  The pack(push,<n>) pragma specifies the maximum
1339   alignment (in bytes) of fields within a structure, in much the
1340   same way as the __aligned__' and __packed__' __attribute__'s
1341   do.  A pack value of zero resets the behavior to the default.
1342   Successive invocations of this pragma cause the previous values to
1343   be stacked, so that invocations of #pragma pack(pop)' will return
1344   to the previous value.  */
1345
1346#define HANDLE_PRAGMA_PACK_PUSH_POP 1
1347
1348/* Select a format to encode pointers in exception handling data.  CODE
1349   is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
1350   true if the symbol may be affected by dynamic relocations.  */
1351#define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL)			     \
1352  ((flag_pic || TARGET_RELOCATABLE)					     \
1353   ? (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4) \
1354   : DW_EH_PE_absptr)
1355
1356#define TARGET_ASM_EXCEPTION_SECTION readonly_data_section
1357
1358#define DOUBLE_INT_ASM_OP "\t.quad\t"
1359
1360/* Generate entries in .fixup for relocatable addresses.  */
1361#define RELOCATABLE_NEEDS_FIXUP
1362