OSDN Git Service

Undo part of 2009-10-23 change
[pf3gnuchains/gcc-fork.git] / gcc / config / rs6000 / sysv4.h
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, 2005, 2006, 2007, 2008, 2009  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 3, 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    Under Section 7 of GPL version 3, you are granted additional
19    permissions described in the GCC Runtime Library Exception, version
20    3.1, as published by the Free Software Foundation.
21
22    You should have received a copy of the GNU General Public License and
23    a copy of the GCC Runtime Library Exception along with this program;
24    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
25    <http://www.gnu.org/licenses/>.  */
26
27 /* Header files should be C++ aware in general.  */
28 #undef  NO_IMPLICIT_EXTERN_C
29 #define NO_IMPLICIT_EXTERN_C
30
31 /* Yes!  We are ELF.  */
32 #define TARGET_OBJECT_FORMAT OBJECT_ELF
33
34 /* Default ABI to compile code for.  */
35 #define DEFAULT_ABI rs6000_current_abi
36
37 /* Default ABI to use.  */
38 #define RS6000_ABI_NAME "sysv"
39
40 /* Override rs6000.h definition.  */
41 #undef  ASM_DEFAULT_SPEC
42 #define ASM_DEFAULT_SPEC "-mppc"
43
44 /* Small data support types.  */
45 enum rs6000_sdata_type {
46   SDATA_NONE,                   /* No small data support.  */
47   SDATA_DATA,                   /* Just put data in .sbss/.sdata, don't use relocs.  */
48   SDATA_SYSV,                   /* Use r13 to point to .sdata/.sbss.  */
49   SDATA_EABI                    /* Use r13 like above, r2 points to .sdata2/.sbss2.  */
50 };
51
52 extern enum rs6000_sdata_type rs6000_sdata;
53
54 #define TARGET_TOC              ((target_flags & MASK_64BIT)            \
55                                  || ((target_flags & (MASK_RELOCATABLE  \
56                                                       | MASK_MINIMAL_TOC)) \
57                                      && flag_pic > 1)                   \
58                                  || DEFAULT_ABI == ABI_AIX)
59
60 #define TARGET_BITFIELD_TYPE    (! TARGET_NO_BITFIELD_TYPE)
61 #define TARGET_BIG_ENDIAN       (! TARGET_LITTLE_ENDIAN)
62 #define TARGET_PROTOTYPE        target_prototype
63 #define TARGET_NO_PROTOTYPE     (! TARGET_PROTOTYPE)
64 #define TARGET_NO_TOC           (! TARGET_TOC)
65 #define TARGET_NO_EABI          (! TARGET_EABI)
66
67 #ifdef HAVE_AS_REL16
68 #undef TARGET_SECURE_PLT
69 #define TARGET_SECURE_PLT       secure_plt
70 #endif
71
72 extern const char *rs6000_abi_name;
73 extern const char *rs6000_sdata_name;
74 extern const char *rs6000_tls_size_string; /* For -mtls-size= */
75
76 #define SDATA_DEFAULT_SIZE 8
77
78 /* Sometimes certain combinations of command options do not make sense
79    on a particular target machine.  You can define a macro
80    `OVERRIDE_OPTIONS' to take account of this.  This macro, if
81    defined, is executed once just after all the command options have
82    been parsed.
83
84    The macro SUBTARGET_OVERRIDE_OPTIONS is provided for subtargets, to
85    get control.  */
86
87 #define SUBTARGET_OVERRIDE_OPTIONS                                      \
88 do {                                                                    \
89   if (!g_switch_set)                                                    \
90     g_switch_value = SDATA_DEFAULT_SIZE;                                \
91                                                                         \
92   if (rs6000_abi_name == NULL)                                          \
93     rs6000_abi_name = RS6000_ABI_NAME;                                  \
94                                                                         \
95   if (!strcmp (rs6000_abi_name, "sysv"))                                \
96     rs6000_current_abi = ABI_V4;                                        \
97   else if (!strcmp (rs6000_abi_name, "sysv-noeabi"))                    \
98     {                                                                   \
99       rs6000_current_abi = ABI_V4;                                      \
100       target_flags &= ~ MASK_EABI;                                      \
101     }                                                                   \
102   else if (!strcmp (rs6000_abi_name, "sysv-eabi")                       \
103            || !strcmp (rs6000_abi_name, "eabi"))                        \
104     {                                                                   \
105       rs6000_current_abi = ABI_V4;                                      \
106       target_flags |= MASK_EABI;                                        \
107     }                                                                   \
108   else if (!strcmp (rs6000_abi_name, "aixdesc"))                        \
109     rs6000_current_abi = ABI_AIX;                                       \
110   else if (!strcmp (rs6000_abi_name, "freebsd"))                        \
111     rs6000_current_abi = ABI_V4;                                        \
112   else if (!strcmp (rs6000_abi_name, "linux"))                          \
113     {                                                                   \
114       if (TARGET_64BIT)                                                 \
115         rs6000_current_abi = ABI_AIX;                                   \
116       else                                                              \
117         rs6000_current_abi = ABI_V4;                                    \
118     }                                                                   \
119   else if (!strcmp (rs6000_abi_name, "gnu"))                            \
120     rs6000_current_abi = ABI_V4;                                        \
121   else if (!strcmp (rs6000_abi_name, "netbsd"))                         \
122     rs6000_current_abi = ABI_V4;                                        \
123   else if (!strcmp (rs6000_abi_name, "openbsd"))                        \
124     rs6000_current_abi = ABI_V4;                                        \
125   else if (!strcmp (rs6000_abi_name, "i960-old"))                       \
126     {                                                                   \
127       rs6000_current_abi = ABI_V4;                                      \
128       target_flags |= (MASK_LITTLE_ENDIAN | MASK_EABI);                 \
129       target_flags &= ~MASK_STRICT_ALIGN;                               \
130       TARGET_NO_BITFIELD_WORD = 1;                                      \
131     }                                                                   \
132   else                                                                  \
133     {                                                                   \
134       rs6000_current_abi = ABI_V4;                                      \
135       error ("bad value for -mcall-%s", rs6000_abi_name);               \
136     }                                                                   \
137                                                                         \
138   if (rs6000_sdata_name)                                                \
139     {                                                                   \
140       if (!strcmp (rs6000_sdata_name, "none"))                          \
141         rs6000_sdata = SDATA_NONE;                                      \
142       else if (!strcmp (rs6000_sdata_name, "data"))                     \
143         rs6000_sdata = SDATA_DATA;                                      \
144       else if (!strcmp (rs6000_sdata_name, "default"))                  \
145         rs6000_sdata = (TARGET_EABI) ? SDATA_EABI : SDATA_SYSV;         \
146       else if (!strcmp (rs6000_sdata_name, "sysv"))                     \
147         rs6000_sdata = SDATA_SYSV;                                      \
148       else if (!strcmp (rs6000_sdata_name, "eabi"))                     \
149         rs6000_sdata = SDATA_EABI;                                      \
150       else                                                              \
151         error ("bad value for -msdata=%s", rs6000_sdata_name);          \
152     }                                                                   \
153   else if (DEFAULT_ABI == ABI_V4)                                       \
154     {                                                                   \
155       rs6000_sdata = SDATA_DATA;                                        \
156       rs6000_sdata_name = "data";                                       \
157     }                                                                   \
158   else                                                                  \
159     {                                                                   \
160       rs6000_sdata = SDATA_NONE;                                        \
161       rs6000_sdata_name = "none";                                       \
162     }                                                                   \
163                                                                         \
164   if (TARGET_RELOCATABLE &&                                             \
165       (rs6000_sdata == SDATA_EABI || rs6000_sdata == SDATA_SYSV))       \
166     {                                                                   \
167       rs6000_sdata = SDATA_DATA;                                        \
168       error ("-mrelocatable and -msdata=%s are incompatible",           \
169              rs6000_sdata_name);                                        \
170     }                                                                   \
171                                                                         \
172   else if (flag_pic && DEFAULT_ABI != ABI_AIX                           \
173            && (rs6000_sdata == SDATA_EABI                               \
174                || rs6000_sdata == SDATA_SYSV))                          \
175     {                                                                   \
176       rs6000_sdata = SDATA_DATA;                                        \
177       error ("-f%s and -msdata=%s are incompatible",                    \
178              (flag_pic > 1) ? "PIC" : "pic",                            \
179              rs6000_sdata_name);                                        \
180     }                                                                   \
181                                                                         \
182   if ((rs6000_sdata != SDATA_NONE && DEFAULT_ABI != ABI_V4)             \
183       || (rs6000_sdata == SDATA_EABI && !TARGET_EABI))                  \
184     {                                                                   \
185       rs6000_sdata = SDATA_NONE;                                        \
186       error ("-msdata=%s and -mcall-%s are incompatible",               \
187              rs6000_sdata_name, rs6000_abi_name);                       \
188     }                                                                   \
189                                                                         \
190   targetm.have_srodata_section = rs6000_sdata == SDATA_EABI;            \
191                                                                         \
192   if (TARGET_RELOCATABLE && !TARGET_MINIMAL_TOC)                        \
193     {                                                                   \
194       target_flags |= MASK_MINIMAL_TOC;                                 \
195       error ("-mrelocatable and -mno-minimal-toc are incompatible");    \
196     }                                                                   \
197                                                                         \
198   if (TARGET_RELOCATABLE && rs6000_current_abi == ABI_AIX)              \
199     {                                                                   \
200       target_flags &= ~MASK_RELOCATABLE;                                \
201       error ("-mrelocatable and -mcall-%s are incompatible",            \
202              rs6000_abi_name);                                          \
203     }                                                                   \
204                                                                         \
205   if (!TARGET_64BIT && flag_pic > 1 && rs6000_current_abi == ABI_AIX)   \
206     {                                                                   \
207       flag_pic = 0;                                                     \
208       error ("-fPIC and -mcall-%s are incompatible",                    \
209              rs6000_abi_name);                                          \
210     }                                                                   \
211                                                                         \
212   if (rs6000_current_abi == ABI_AIX && TARGET_LITTLE_ENDIAN)            \
213     {                                                                   \
214       target_flags &= ~MASK_LITTLE_ENDIAN;                              \
215       error ("-mcall-aixdesc must be big endian");                      \
216     }                                                                   \
217                                                                         \
218   if (TARGET_SECURE_PLT != secure_plt)                                  \
219     {                                                                   \
220       error ("-msecure-plt not supported by your assembler");           \
221     }                                                                   \
222                                                                         \
223   /* Treat -fPIC the same as -mrelocatable.  */                         \
224   if (flag_pic > 1 && DEFAULT_ABI != ABI_AIX)                           \
225     {                                                                   \
226       target_flags |= MASK_RELOCATABLE | MASK_MINIMAL_TOC;              \
227       TARGET_NO_FP_IN_TOC = 1;                                          \
228     }                                                                   \
229                                                                         \
230   else if (TARGET_RELOCATABLE)                                          \
231     flag_pic = 2;                                                       \
232 } while (0)
233
234 #ifndef RS6000_BI_ARCH
235 # define SUBSUBTARGET_OVERRIDE_OPTIONS                                  \
236 do {                                                                    \
237   if ((TARGET_DEFAULT ^ target_flags) & MASK_64BIT)                     \
238     error ("-m%s not supported in this configuration",                  \
239            (target_flags & MASK_64BIT) ? "64" : "32");                  \
240 } while (0)
241 #endif
242
243 /* Override rs6000.h definition.  */
244 #undef  TARGET_DEFAULT
245 #define TARGET_DEFAULT (MASK_POWERPC | MASK_NEW_MNEMONICS)
246
247 /* Override rs6000.h definition.  */
248 #undef  PROCESSOR_DEFAULT
249 #define PROCESSOR_DEFAULT PROCESSOR_PPC750
250
251 /* SVR4 only defined for PowerPC, so short-circuit POWER patterns.  */
252 #undef  TARGET_POWER
253 #define TARGET_POWER 0
254
255 #define FIXED_R2 1
256 /* System V.4 uses register 13 as a pointer to the small data area,
257    so it is not available to the normal user.  */
258 #define FIXED_R13 1
259
260 /* Override default big endianism definitions in rs6000.h.  */
261 #undef  BYTES_BIG_ENDIAN
262 #undef  WORDS_BIG_ENDIAN
263 #define BYTES_BIG_ENDIAN (TARGET_BIG_ENDIAN)
264 #define WORDS_BIG_ENDIAN (TARGET_BIG_ENDIAN)
265
266 /* Define this to set the endianness to use in libgcc2.c, which can
267    not depend on target_flags.  */
268 #if !defined(__LITTLE_ENDIAN__) && !defined(__sun__)
269 #define LIBGCC2_WORDS_BIG_ENDIAN 1
270 #else
271 #define LIBGCC2_WORDS_BIG_ENDIAN 0
272 #endif
273
274 /* Define cutoff for using external functions to save floating point.
275    When optimizing for size, use external functions when profitable.  */
276 #define FP_SAVE_INLINE(FIRST_REG) (optimize_size                        \
277                                    ? ((FIRST_REG) == 62                 \
278                                       || (FIRST_REG) == 63)             \
279                                    : (FIRST_REG) < 64)
280 /* And similarly for general purpose registers.  */
281 #define GP_SAVE_INLINE(FIRST_REG) ((FIRST_REG) < 32     \
282                                    && !optimize_size)
283
284 /* Put jump tables in read-only memory, rather than in .text.  */
285 #define JUMP_TABLES_IN_TEXT_SECTION 0
286
287 /* Prefix and suffix to use to saving floating point.  */
288 #define SAVE_FP_PREFIX "_savefpr_"
289 #define SAVE_FP_SUFFIX ""
290
291 /* Prefix and suffix to use to restoring floating point.  */
292 #define RESTORE_FP_PREFIX "_restfpr_"
293 #define RESTORE_FP_SUFFIX ""
294
295 /* Type used for ptrdiff_t, as a string used in a declaration.  */
296 #define PTRDIFF_TYPE "int"
297
298 /* Type used for wchar_t, as a string used in a declaration.  */
299 /* Override svr4.h definition.  */
300 #undef  WCHAR_TYPE
301 #define WCHAR_TYPE "long int"
302
303 /* Width of wchar_t in bits.  */
304 /* Override svr4.h definition.  */
305 #undef  WCHAR_TYPE_SIZE
306 #define WCHAR_TYPE_SIZE 32
307
308 /* Make int foo : 8 not cause structures to be aligned to an int boundary.  */
309 /* Override elfos.h definition.  */
310 #undef  PCC_BITFIELD_TYPE_MATTERS
311 #define PCC_BITFIELD_TYPE_MATTERS (TARGET_BITFIELD_TYPE)
312
313 #undef  BITFIELD_NBYTES_LIMITED
314 #define BITFIELD_NBYTES_LIMITED (TARGET_NO_BITFIELD_WORD)
315
316 /* Define this macro to be the value 1 if instructions will fail to
317    work if given data not on the nominal alignment.  If instructions
318    will merely go slower in that case, define this macro as 0.  */
319 #undef  STRICT_ALIGNMENT
320 #define STRICT_ALIGNMENT (TARGET_STRICT_ALIGN)
321
322 /* Define this macro if you wish to preserve a certain alignment for
323    the stack pointer, greater than what the hardware enforces.  The
324    definition is a C expression for the desired alignment (measured
325    in bits).  This macro must evaluate to a value equal to or larger
326    than STACK_BOUNDARY.
327    For the SYSV ABI and variants the alignment of the stack pointer
328    is usually controlled manually in rs6000.c. However, to maintain
329    alignment across alloca () in all circumstances,
330    PREFERRED_STACK_BOUNDARY needs to be set as well.
331    This has the additional advantage of allowing a bigger maximum
332    alignment of user objects on the stack.  */
333
334 #undef PREFERRED_STACK_BOUNDARY
335 #define PREFERRED_STACK_BOUNDARY 128
336
337 /* Real stack boundary as mandated by the appropriate ABI.  */
338 #define ABI_STACK_BOUNDARY \
339   ((TARGET_EABI && !TARGET_ALTIVEC && !TARGET_ALTIVEC_ABI) ? 64 : 128)
340
341 /* An expression for the alignment of a structure field FIELD if the
342    alignment computed in the usual way is COMPUTED.  */
343 #define ADJUST_FIELD_ALIGN(FIELD, COMPUTED)                                   \
344         ((TARGET_ALTIVEC && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE)     \
345          ? 128 : COMPUTED)
346
347 #undef  BIGGEST_FIELD_ALIGNMENT
348
349 /* Use ELF style section commands.  */
350
351 #define TEXT_SECTION_ASM_OP     "\t.section\t\".text\""
352
353 #define DATA_SECTION_ASM_OP     "\t.section\t\".data\""
354
355 #define BSS_SECTION_ASM_OP      "\t.section\t\".bss\""
356
357 /* Override elfos.h definition.  */
358 #undef  INIT_SECTION_ASM_OP
359 #define INIT_SECTION_ASM_OP "\t.section\t\".init\",\"ax\""
360
361 /* Override elfos.h definition.  */
362 #undef  FINI_SECTION_ASM_OP
363 #define FINI_SECTION_ASM_OP "\t.section\t\".fini\",\"ax\""
364
365 #define TOC_SECTION_ASM_OP "\t.section\t\".got\",\"aw\""
366
367 /* Put PC relative got entries in .got2.  */
368 #define MINIMAL_TOC_SECTION_ASM_OP \
369   (TARGET_RELOCATABLE || (flag_pic && DEFAULT_ABI != ABI_AIX)           \
370    ? "\t.section\t\".got2\",\"aw\"" : "\t.section\t\".got1\",\"aw\"")
371
372 #define SDATA_SECTION_ASM_OP "\t.section\t\".sdata\",\"aw\""
373 #define SDATA2_SECTION_ASM_OP "\t.section\t\".sdata2\",\"a\""
374 #define SBSS_SECTION_ASM_OP "\t.section\t\".sbss\",\"aw\",@nobits"
375
376 /* Override default elf definitions.  */
377 #define TARGET_ASM_INIT_SECTIONS rs6000_elf_asm_init_sections
378 #undef  TARGET_ASM_RELOC_RW_MASK
379 #define TARGET_ASM_RELOC_RW_MASK rs6000_elf_reloc_rw_mask
380 #undef  TARGET_ASM_SELECT_RTX_SECTION
381 #define TARGET_ASM_SELECT_RTX_SECTION rs6000_elf_select_rtx_section
382
383 /* Return nonzero if this entry is to be written into the constant pool
384    in a special way.  We do so if this is a SYMBOL_REF, LABEL_REF or a CONST
385    containing one of them.  If -mfp-in-toc (the default), we also do
386    this for floating-point constants.  We actually can only do this
387    if the FP formats of the target and host machines are the same, but
388    we can't check that since not every file that uses these target macros
389    includes real.h.
390
391    Unlike AIX, we don't key off of -mminimal-toc, but instead do not
392    allow floating point constants in the TOC if -mrelocatable.  */
393
394 #undef  ASM_OUTPUT_SPECIAL_POOL_ENTRY_P
395 #define ASM_OUTPUT_SPECIAL_POOL_ENTRY_P(X, MODE)                        \
396   (TARGET_TOC                                                           \
397    && (GET_CODE (X) == SYMBOL_REF                                       \
398        || (GET_CODE (X) == CONST && GET_CODE (XEXP (X, 0)) == PLUS      \
399            && GET_CODE (XEXP (XEXP (X, 0), 0)) == SYMBOL_REF)           \
400        || GET_CODE (X) == LABEL_REF                                     \
401        || (GET_CODE (X) == CONST_INT                                    \
402            && GET_MODE_BITSIZE (MODE) <= GET_MODE_BITSIZE (Pmode))      \
403        || (!TARGET_NO_FP_IN_TOC                                         \
404            && !TARGET_RELOCATABLE                                       \
405            && GET_CODE (X) == CONST_DOUBLE                              \
406            && SCALAR_FLOAT_MODE_P (GET_MODE (X))                        \
407            && BITS_PER_WORD == HOST_BITS_PER_INT)))
408
409 /* These macros generate the special .type and .size directives which
410    are used to set the corresponding fields of the linker symbol table
411    entries in an ELF object file under SVR4.  These macros also output
412    the starting labels for the relevant functions/objects.  */
413
414 /* Write the extra assembler code needed to declare a function properly.
415    Some svr4 assemblers need to also have something extra said about the
416    function's return value.  We allow for that here.  */
417
418 extern int rs6000_pic_labelno;
419
420 /* Override elfos.h definition.  */
421 #undef  ASM_DECLARE_FUNCTION_NAME
422 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)                     \
423   rs6000_elf_declare_function_name ((FILE), (NAME), (DECL))
424
425 /* The USER_LABEL_PREFIX stuff is affected by the -fleading-underscore
426    flag.  The LOCAL_LABEL_PREFIX variable is used by dbxelf.h.  */
427
428 #define LOCAL_LABEL_PREFIX "."
429 #define USER_LABEL_PREFIX ""
430
431 /* svr4.h overrides (*targetm.asm_out.internal_label).  */
432
433 #define ASM_OUTPUT_INTERNAL_LABEL_PREFIX(FILE,PREFIX)   \
434   asm_fprintf (FILE, "%L%s", PREFIX)
435
436 /* Globalizing directive for a label.  */
437 #define GLOBAL_ASM_OP "\t.globl "
438
439 /* This says how to output assembler code to declare an
440    uninitialized internal linkage data object.  Under SVR4,
441    the linker seems to want the alignment of data objects
442    to depend on their types.  We do exactly that here.  */
443
444 #define LOCAL_ASM_OP    "\t.local\t"
445
446 #define LCOMM_ASM_OP    "\t.lcomm\t"
447
448 /* Describe how to emit uninitialized local items.  */
449 #define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN)    \
450 do {                                                                    \
451   if ((DECL) && rs6000_elf_in_small_data_p (DECL))                      \
452     {                                                                   \
453       switch_to_section (sbss_section);                                 \
454       ASM_OUTPUT_ALIGN (FILE, exact_log2 (ALIGN / BITS_PER_UNIT));      \
455       ASM_OUTPUT_LABEL (FILE, NAME);                                    \
456       ASM_OUTPUT_SKIP (FILE, SIZE);                                     \
457       if (!flag_inhibit_size_directive && (SIZE) > 0)                   \
458         ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE);                   \
459     }                                                                   \
460   else                                                                  \
461     {                                                                   \
462       fprintf (FILE, "%s", LCOMM_ASM_OP);                               \
463       assemble_name ((FILE), (NAME));                                   \
464       fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n",          \
465                (SIZE), (ALIGN) / BITS_PER_UNIT);                        \
466     }                                                                   \
467   ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");                     \
468 } while (0)
469
470 /* Describe how to emit uninitialized external linkage items.  */
471 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN)           \
472 do {                                                                    \
473   ASM_OUTPUT_ALIGNED_DECL_LOCAL (FILE, DECL, NAME, SIZE, ALIGN);        \
474 } while (0)
475
476 #ifdef HAVE_GAS_MAX_SKIP_P2ALIGN
477 /* To support -falign-* switches we need to use .p2align so
478    that alignment directives in code sections will be padded
479    with no-op instructions, rather than zeroes.  */
480 #define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP)                    \
481   if ((LOG) != 0)                                                       \
482     {                                                                   \
483       if ((MAX_SKIP) == 0)                                              \
484         fprintf ((FILE), "\t.p2align %d\n", (LOG));                     \
485       else                                                              \
486         fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP));     \
487     }
488 #endif
489
490 /* This is how to output code to push a register on the stack.
491    It need not be very fast code.
492
493    On the rs6000, we must keep the backchain up to date.  In order
494    to simplify things, always allocate 16 bytes for a push (System V
495    wants to keep stack aligned to a 16 byte boundary).  */
496
497 #define ASM_OUTPUT_REG_PUSH(FILE, REGNO)                                \
498 do {                                                                    \
499   if (DEFAULT_ABI == ABI_V4)                                            \
500     asm_fprintf (FILE,                                                  \
501                  "\t{stu|stwu} %s,-16(%s)\n\t{st|stw} %s,12(%s)\n",     \
502                  reg_names[1], reg_names[1], reg_names[REGNO],          \
503                  reg_names[1]);                                         \
504 } while (0)
505
506 /* This is how to output an insn to pop a register from the stack.
507    It need not be very fast code.  */
508
509 #define ASM_OUTPUT_REG_POP(FILE, REGNO)                                 \
510 do {                                                                    \
511   if (DEFAULT_ABI == ABI_V4)                                            \
512     asm_fprintf (FILE,                                                  \
513                  "\t{l|lwz} %s,12(%s)\n\t{ai|addic} %s,%s,16\n",        \
514                  reg_names[REGNO], reg_names[1], reg_names[1],          \
515                  reg_names[1]);                                         \
516 } while (0)
517
518 /* Switch  Recognition by gcc.c.  Add -G xx support.  */
519
520 /* Override svr4.h definition.  */
521 #undef  SWITCH_TAKES_ARG
522 #define SWITCH_TAKES_ARG(CHAR)                                          \
523   ((CHAR) == 'D' || (CHAR) == 'U' || (CHAR) == 'o'                      \
524    || (CHAR) == 'e' || (CHAR) == 'T' || (CHAR) == 'u'                   \
525    || (CHAR) == 'I' || (CHAR) == 'm' || (CHAR) == 'x'                   \
526    || (CHAR) == 'L' || (CHAR) == 'A' || (CHAR) == 'V'                   \
527    || (CHAR) == 'B' || (CHAR) == 'b' || (CHAR) == 'G')
528
529 extern int fixuplabelno;
530
531 /* Handle constructors specially for -mrelocatable.  */
532 #define TARGET_ASM_CONSTRUCTOR  rs6000_elf_asm_out_constructor
533 #define TARGET_ASM_DESTRUCTOR   rs6000_elf_asm_out_destructor
534
535 /* This is the end of what might become sysv4.h.  */
536
537 /* Use DWARF 2 debugging information by default.  */
538 #undef  PREFERRED_DEBUGGING_TYPE
539 #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
540
541 /* Historically we have also supported stabs debugging.  */
542 #define DBX_DEBUGGING_INFO 1
543
544 #define TARGET_ENCODE_SECTION_INFO  rs6000_elf_encode_section_info
545 #define TARGET_IN_SMALL_DATA_P  rs6000_elf_in_small_data_p
546
547 /* The ELF version doesn't encode [DS] or whatever at the end of symbols.  */
548
549 #define RS6000_OUTPUT_BASENAME(FILE, NAME)      \
550     assemble_name (FILE, NAME)
551
552 /* We have to output the stabs for the function name *first*, before
553    outputting its label.  */
554
555 #define DBX_FUNCTION_FIRST
556
557 /* This is the end of what might become sysv4dbx.h.  */
558
559 #ifndef TARGET_VERSION
560 #define TARGET_VERSION fprintf (stderr, " (PowerPC System V.4)");
561 #endif
562 \f
563 #define TARGET_OS_SYSV_CPP_BUILTINS()           \
564   do                                            \
565     {                                           \
566       if (target_flags_explicit                 \
567           & MASK_RELOCATABLE)                   \
568         builtin_define ("_RELOCATABLE");        \
569     }                                           \
570   while (0)
571
572 #ifndef TARGET_OS_CPP_BUILTINS
573 #define TARGET_OS_CPP_BUILTINS()                \
574   do                                            \
575     {                                           \
576       builtin_define_std ("PPC");               \
577       builtin_define_std ("unix");              \
578       builtin_define ("__svr4__");              \
579       builtin_assert ("system=unix");           \
580       builtin_assert ("system=svr4");           \
581       builtin_assert ("cpu=powerpc");           \
582       builtin_assert ("machine=powerpc");       \
583       TARGET_OS_SYSV_CPP_BUILTINS ();           \
584     }                                           \
585   while (0)
586 #endif
587
588 /* Pass various options to the assembler.  */
589 /* Override svr4.h definition.  */
590 #undef  ASM_SPEC
591 #define ASM_SPEC "%(asm_cpu) \
592 %{,assembler|,assembler-with-cpp: %{mregnames} %{mno-regnames}}" \
593 SVR4_ASM_SPEC \
594 "%{mrelocatable} %{mrelocatable-lib} %{fpic|fpie|fPIC|fPIE:-K PIC} \
595 %{memb|msdata=eabi: -memb} \
596 %{mlittle|mlittle-endian:-mlittle; \
597   mbig|mbig-endian      :-mbig;    \
598   mcall-aixdesc |                  \
599   mcall-freebsd |                  \
600   mcall-netbsd  |                  \
601   mcall-openbsd |                  \
602   mcall-linux   |                  \
603   mcall-gnu             :-mbig;    \
604   mcall-i960-old        :-mlittle}"
605
606 #define CC1_ENDIAN_BIG_SPEC ""
607
608 #define CC1_ENDIAN_LITTLE_SPEC "\
609 %{!mstrict-align: %{!mno-strict-align: \
610     %{!mcall-i960-old: \
611         -mstrict-align \
612     } \
613 }}"
614
615 #define CC1_ENDIAN_DEFAULT_SPEC "%(cc1_endian_big)"
616
617 #ifndef CC1_SECURE_PLT_DEFAULT_SPEC
618 #define CC1_SECURE_PLT_DEFAULT_SPEC ""
619 #endif
620
621 /* Pass -G xxx to the compiler and set correct endian mode.  */
622 #define CC1_SPEC "%{G*} %(cc1_cpu) \
623 %{mlittle|mlittle-endian: %(cc1_endian_little);           \
624   mbig   |mbig-endian   : %(cc1_endian_big);              \
625   mcall-aixdesc |                                         \
626   mcall-freebsd |                                         \
627   mcall-netbsd  |                                         \
628   mcall-openbsd |                                         \
629   mcall-linux   |                                         \
630   mcall-gnu             : -mbig %(cc1_endian_big);        \
631   mcall-i960-old        : -mlittle %(cc1_endian_little);  \
632                         : %(cc1_endian_default)}          \
633 %{meabi: %{!mcall-*: -mcall-sysv }} \
634 %{!meabi: %{!mno-eabi: \
635     %{mrelocatable: -meabi } \
636     %{mcall-freebsd: -mno-eabi } \
637     %{mcall-i960-old: -meabi } \
638     %{mcall-linux: -mno-eabi } \
639     %{mcall-gnu: -mno-eabi } \
640     %{mcall-netbsd: -mno-eabi } \
641     %{mcall-openbsd: -mno-eabi }}} \
642 %{msdata: -msdata=default} \
643 %{mno-sdata: -msdata=none} \
644 %{!mbss-plt: %{!msecure-plt: %(cc1_secure_plt_default)}} \
645 %{profile: -p}"
646
647 /* Don't put -Y P,<path> for cross compilers.  */
648 #ifndef CROSS_DIRECTORY_STRUCTURE
649 #define LINK_PATH_SPEC "\
650 %{!R*:%{L*:-R %*}} \
651 %{!nostdlib: %{!YP,*: \
652     %{compat-bsd: \
653         %{p:-Y P,/usr/ucblib:/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \
654         %{!p:-Y P,/usr/ucblib:/usr/ccs/lib:/usr/lib}} \
655         %{!R*: %{!L*: -R /usr/ucblib}} \
656     %{!compat-bsd: \
657         %{p:-Y P,/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \
658         %{!p:-Y P,/usr/ccs/lib:/usr/lib}}}}"
659
660 #else
661 #define LINK_PATH_SPEC ""
662 #endif
663
664 /* Default starting address if specified.  */
665 #define LINK_START_SPEC "\
666 %{mads         : %(link_start_ads)         ; \
667   myellowknife : %(link_start_yellowknife) ; \
668   mmvme        : %(link_start_mvme)        ; \
669   msim         : %(link_start_sim)         ; \
670   mcall-freebsd: %(link_start_freebsd)     ; \
671   mcall-linux  : %(link_start_linux)       ; \
672   mcall-gnu    : %(link_start_gnu)         ; \
673   mcall-netbsd : %(link_start_netbsd)      ; \
674   mcall-openbsd: %(link_start_openbsd)     ; \
675                : %(link_start_default)     }"
676
677 #define LINK_START_DEFAULT_SPEC ""
678
679 /* Override svr4.h definition.  */
680 #undef  LINK_SPEC
681 #define LINK_SPEC "\
682 %{h*} %{v:-V} %{!msdata=none:%{G*}} %{msdata=none:-G0} \
683 %{YP,*} %{R*} \
684 %{Qy:} %{!Qn:-Qy} \
685 %(link_shlib) \
686 %{!Wl,-T*: %{!T*: %(link_start) }} \
687 %(link_target) \
688 %(link_os)"
689
690 /* For now, turn off shared libraries by default.  */
691 #ifndef SHARED_LIB_SUPPORT
692 #define NO_SHARED_LIB_SUPPORT
693 #endif
694
695 #ifndef NO_SHARED_LIB_SUPPORT
696 /* Shared libraries are default.  */
697 #define LINK_SHLIB_SPEC "\
698 %{!static: %(link_path) %{!R*:%{L*:-R %*}}} \
699 %{mshlib: } \
700 %{static:-dn -Bstatic} \
701 %{shared:-G -dy -z text} \
702 %{symbolic:-Bsymbolic -G -dy -z text}"
703
704 #else
705 /* Shared libraries are not default.  */
706 #define LINK_SHLIB_SPEC "\
707 %{mshlib: %(link_path) } \
708 %{!mshlib: %{!shared: %{!symbolic: -dn -Bstatic}}} \
709 %{static: } \
710 %{shared:-G -dy -z text %(link_path) } \
711 %{symbolic:-Bsymbolic -G -dy -z text %(link_path) }"
712 #endif
713
714 /* Override the default target of the linker.  */
715 #define LINK_TARGET_SPEC "\
716 %{mlittle: --oformat elf32-powerpcle } %{mlittle-endian: --oformat elf32-powerpcle } \
717 %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: \
718     %{mcall-i960-old: --oformat elf32-powerpcle} \
719   }}}}"
720
721 /* Any specific OS flags.  */
722 #define LINK_OS_SPEC "\
723 %{mads         : %(link_os_ads)         ; \
724   myellowknife : %(link_os_yellowknife) ; \
725   mmvme        : %(link_os_mvme)        ; \
726   msim         : %(link_os_sim)         ; \
727   mcall-freebsd: %(link_os_freebsd)     ; \
728   mcall-linux  : %(link_os_linux)       ; \
729   mcall-gnu    : %(link_os_gnu)         ; \
730   mcall-netbsd : %(link_os_netbsd)      ; \
731   mcall-openbsd: %(link_os_openbsd)     ; \
732                : %(link_os_default)     }"
733
734 #define LINK_OS_DEFAULT_SPEC ""
735
736 #define DRIVER_SELF_SPECS "%{mfpu=none: %<mfpu=* \
737         %<msingle-float %<mdouble-float}"
738
739 /* Override rs6000.h definition.  */
740 #undef  CPP_SPEC
741 #define CPP_SPEC "%{posix: -D_POSIX_SOURCE} \
742 %{mads         : %(cpp_os_ads)         ; \
743   myellowknife : %(cpp_os_yellowknife) ; \
744   mmvme        : %(cpp_os_mvme)        ; \
745   msim         : %(cpp_os_sim)         ; \
746   mcall-freebsd: %(cpp_os_freebsd)     ; \
747   mcall-linux  : %(cpp_os_linux)       ; \
748   mcall-gnu    : %(cpp_os_gnu)         ; \
749   mcall-netbsd : %(cpp_os_netbsd)      ; \
750   mcall-openbsd: %(cpp_os_openbsd)     ; \
751                : %(cpp_os_default)     }"
752
753 #define CPP_OS_DEFAULT_SPEC ""
754
755 /* Override svr4.h definition.  */
756 #undef  STARTFILE_SPEC
757 #define STARTFILE_SPEC "\
758 %{mads         : %(startfile_ads)         ; \
759   myellowknife : %(startfile_yellowknife) ; \
760   mmvme        : %(startfile_mvme)        ; \
761   msim         : %(startfile_sim)         ; \
762   mcall-freebsd: %(startfile_freebsd)     ; \
763   mcall-linux  : %(startfile_linux)       ; \
764   mcall-gnu    : %(startfile_gnu)         ; \
765   mcall-netbsd : %(startfile_netbsd)      ; \
766   mcall-openbsd: %(startfile_openbsd)     ; \
767                : %(startfile_default)     }"
768
769 #define STARTFILE_DEFAULT_SPEC "ecrti.o%s crtbegin.o%s"
770
771 /* Override svr4.h definition.  */
772 #undef  LIB_SPEC
773 #define LIB_SPEC "\
774 %{mads         : %(lib_ads)         ; \
775   myellowknife : %(lib_yellowknife) ; \
776   mmvme        : %(lib_mvme)        ; \
777   msim         : %(lib_sim)         ; \
778   mcall-freebsd: %(lib_freebsd)     ; \
779   mcall-linux  : %(lib_linux)       ; \
780   mcall-gnu    : %(lib_gnu)         ; \
781   mcall-netbsd : %(lib_netbsd)      ; \
782   mcall-openbsd: %(lib_openbsd)     ; \
783                : %(lib_default)     }"
784
785 #define LIB_DEFAULT_SPEC "-lc"
786
787 /* Override svr4.h definition.  */
788 #undef  ENDFILE_SPEC
789 #define ENDFILE_SPEC "\
790 %{mads         : %(endfile_ads)         ; \
791   myellowknife : %(endfile_yellowknife) ; \
792   mmvme        : %(endfile_mvme)        ; \
793   msim         : %(endfile_sim)         ; \
794   mcall-freebsd: %(endfile_freebsd)     ; \
795   mcall-linux  : %(endfile_linux)       ; \
796   mcall-gnu    : %(endfile_gnu)         ; \
797   mcall-netbsd : %(endfile_netbsd)      ; \
798   mcall-openbsd: %(endfile_openbsd)     ; \
799                : %(crtsavres_default) %(endfile_default)     }"
800
801 #define CRTSAVRES_DEFAULT_SPEC ""
802
803 #define ENDFILE_DEFAULT_SPEC "crtend.o%s ecrtn.o%s"
804
805 /* Motorola ADS support.  */
806 #define LIB_ADS_SPEC "--start-group -lads -lc --end-group"
807
808 #define STARTFILE_ADS_SPEC "ecrti.o%s crt0.o%s crtbegin.o%s"
809
810 #define ENDFILE_ADS_SPEC "crtend.o%s ecrtn.o%s"
811
812 #define LINK_START_ADS_SPEC "-T ads.ld%s"
813
814 #define LINK_OS_ADS_SPEC ""
815
816 #define CPP_OS_ADS_SPEC ""
817
818 /* Motorola Yellowknife support.  */
819 #define LIB_YELLOWKNIFE_SPEC "--start-group -lyk -lc --end-group"
820
821 #define STARTFILE_YELLOWKNIFE_SPEC "ecrti.o%s crt0.o%s crtbegin.o%s"
822
823 #define ENDFILE_YELLOWKNIFE_SPEC "crtend.o%s ecrtn.o%s"
824
825 #define LINK_START_YELLOWKNIFE_SPEC "-T yellowknife.ld%s"
826
827 #define LINK_OS_YELLOWKNIFE_SPEC ""
828
829 #define CPP_OS_YELLOWKNIFE_SPEC ""
830
831 /* Motorola MVME support.  */
832 #define LIB_MVME_SPEC "--start-group -lmvme -lc --end-group"
833
834 #define STARTFILE_MVME_SPEC "ecrti.o%s crt0.o%s crtbegin.o%s"
835
836 #define ENDFILE_MVME_SPEC "crtend.o%s ecrtn.o%s"
837
838 #define LINK_START_MVME_SPEC "-Ttext 0x40000"
839
840 #define LINK_OS_MVME_SPEC ""
841
842 #define CPP_OS_MVME_SPEC ""
843
844 /* PowerPC simulator based on netbsd system calls support.  */
845 #define LIB_SIM_SPEC "--start-group -lsim -lc --end-group"
846
847 #define STARTFILE_SIM_SPEC "ecrti.o%s sim-crt0.o%s crtbegin.o%s"
848
849 #define ENDFILE_SIM_SPEC "crtend.o%s ecrtn.o%s"
850
851 #define LINK_START_SIM_SPEC ""
852
853 #define LINK_OS_SIM_SPEC "-m elf32ppcsim"
854
855 #define CPP_OS_SIM_SPEC ""
856
857 /* FreeBSD support.  */
858
859 #define CPP_OS_FREEBSD_SPEC     "\
860   -D__PPC__ -D__ppc__ -D__PowerPC__ -D__powerpc__ \
861   -Acpu=powerpc -Amachine=powerpc"
862
863 #define STARTFILE_FREEBSD_SPEC  FBSD_STARTFILE_SPEC
864 #define ENDFILE_FREEBSD_SPEC    FBSD_ENDFILE_SPEC
865 #define LIB_FREEBSD_SPEC        FBSD_LIB_SPEC
866 #define LINK_START_FREEBSD_SPEC ""
867
868 #define LINK_OS_FREEBSD_SPEC "\
869   %{p:%nconsider using `-pg' instead of `-p' with gprof(1)} \
870   %{v:-V} \
871   %{assert*} %{R*} %{rpath*} %{defsym*} \
872   %{shared:-Bshareable %{h*} %{soname*}} \
873   %{!shared: \
874     %{!static: \
875       %{rdynamic: -export-dynamic} \
876       %{!dynamic-linker:-dynamic-linker %(fbsd_dynamic_linker) }} \
877     %{static:-Bstatic}} \
878   %{symbolic:-Bsymbolic}"
879
880 /* GNU/Linux support.  */
881 #define LIB_LINUX_SPEC "%{mnewlib: --start-group -llinux -lc --end-group } \
882 %{!mnewlib: %{pthread:-lpthread} %{shared:-lc} \
883 %{!shared: %{profile:-lc_p} %{!profile:-lc}}}"
884
885 #ifdef HAVE_LD_PIE
886 #define STARTFILE_LINUX_SPEC "\
887 %{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \
888 %{mnewlib:ecrti.o%s;:crti.o%s} \
889 %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
890 #else
891 #define STARTFILE_LINUX_SPEC "\
892 %{!shared: %{pg|p|profile:gcrt1.o%s;:crt1.o%s}} \
893 %{mnewlib:ecrti.o%s;:crti.o%s} \
894 %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
895 #endif
896
897 #define ENDFILE_LINUX_SPEC "\
898 %{shared|pie:crtendS.o%s;:crtend.o%s} \
899 %{mnewlib:ecrtn.o%s;:crtn.o%s}"
900
901 #define LINK_START_LINUX_SPEC ""
902
903 #define GLIBC_DYNAMIC_LINKER "/lib/ld.so.1"
904 #define UCLIBC_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
905 #if UCLIBC_DEFAULT
906 #define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:%{muclibc:%e-mglibc and -muclibc used together}" G ";:" U "}"
907 #else
908 #define CHOOSE_DYNAMIC_LINKER(G, U) "%{muclibc:%{mglibc:%e-mglibc and -muclibc used together}" U ";:" G "}"
909 #endif
910 #define LINUX_DYNAMIC_LINKER \
911   CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER)
912
913 #define LINK_OS_LINUX_SPEC "-m elf32ppclinux %{!shared: %{!static: \
914   %{rdynamic:-export-dynamic} \
915   %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER "}}}"
916
917 #if defined(HAVE_LD_EH_FRAME_HDR)
918 # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
919 #endif
920
921 #define CPP_OS_LINUX_SPEC "-D__unix__ -D__gnu_linux__ -D__linux__ \
922 %{!undef:                                                         \
923   %{!ansi:                                                        \
924     %{!std=*:-Dunix -D__unix -Dlinux -D__linux}                   \
925     %{std=gnu*:-Dunix -D__unix -Dlinux -D__linux}}}               \
926 -Asystem=linux -Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT}"
927
928 /* GNU/Hurd support.  */
929 #define LIB_GNU_SPEC "%{mnewlib: --start-group -lgnu -lc --end-group } \
930 %{!mnewlib: %{shared:-lc} %{!shared: %{pthread:-lpthread } \
931 %{profile:-lc_p} %{!profile:-lc}}}"
932
933 #define STARTFILE_GNU_SPEC "\
934 %{!shared: %{!static: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}} \
935 %{static: %{pg:gcrt0.o%s} %{!pg:%{p:gcrt0.o%s} %{!p:crt0.o%s}}} \
936 %{mnewlib: ecrti.o%s} %{!mnewlib: crti.o%s} \
937 %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
938
939 #define ENDFILE_GNU_SPEC "%{!shared:crtend.o%s} %{shared:crtendS.o%s} \
940 %{mnewlib: ecrtn.o%s} %{!mnewlib: crtn.o%s}"
941
942 #define LINK_START_GNU_SPEC ""
943
944 #define LINK_OS_GNU_SPEC "-m elf32ppclinux %{!shared: %{!static: \
945   %{rdynamic:-export-dynamic} \
946   %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}"
947
948 #define CPP_OS_GNU_SPEC "-D__unix__ -D__gnu_hurd__ -D__GNU__    \
949 %{!undef:                                                       \
950   %{!ansi: -Dunix -D__unix}}                                    \
951 -Asystem=gnu -Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT}"
952
953 /* NetBSD support.  */
954 #define LIB_NETBSD_SPEC "\
955 %{profile:-lgmon -lc_p} %{!profile:-lc}"
956
957 #define STARTFILE_NETBSD_SPEC "\
958 ncrti.o%s crt0.o%s \
959 %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
960
961 #define ENDFILE_NETBSD_SPEC "\
962 %{!shared:crtend.o%s} %{shared:crtendS.o%s} \
963 ncrtn.o%s"
964
965 #define LINK_START_NETBSD_SPEC "\
966 "
967
968 #define LINK_OS_NETBSD_SPEC "\
969 %{!shared: %{!static: \
970   %{rdynamic:-export-dynamic} \
971   %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}}}"
972
973 #define CPP_OS_NETBSD_SPEC "\
974 -D__powerpc__ -D__NetBSD__ -D__KPRINTF_ATTRIBUTE__"
975
976 /* OpenBSD support.  */
977 #ifndef LIB_OPENBSD_SPEC
978 #define LIB_OPENBSD_SPEC "%{!shared:%{pthread:-lpthread%{p:_p}%{!p:%{pg:_p}}}} %{!shared:-lc%{p:_p}%{!p:%{pg:_p}}}"
979 #endif
980
981 #ifndef STARTFILE_OPENBSD_SPEC
982 #define STARTFILE_OPENBSD_SPEC "\
983 %{!shared: %{pg:gcrt0.o%s} %{!pg:%{p:gcrt0.o%s} %{!p:crt0.o%s}}} \
984 %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
985 #endif
986
987 #ifndef ENDFILE_OPENBSD_SPEC
988 #define ENDFILE_OPENBSD_SPEC "\
989 %{!shared:crtend.o%s} %{shared:crtendS.o%s}"
990 #endif
991
992 #ifndef LINK_START_OPENBSD_SPEC
993 #define LINK_START_OPENBSD_SPEC "-Ttext 0x400074"
994 #endif
995
996 #ifndef LINK_OS_OPENBSD_SPEC
997 #define LINK_OS_OPENBSD_SPEC ""
998 #endif
999
1000 #ifndef CPP_OS_OPENBSD_SPEC
1001 #define CPP_OS_OPENBSD_SPEC "%{posix:-D_POSIX_SOURCE} %{pthread:-D_POSIX_THREADS}"
1002 #endif
1003
1004 /* Define any extra SPECS that the compiler needs to generate.  */
1005 /* Override rs6000.h definition.  */
1006 #undef  SUBTARGET_EXTRA_SPECS
1007 #define SUBTARGET_EXTRA_SPECS                                           \
1008   { "crtsavres_default",        CRTSAVRES_DEFAULT_SPEC },               \
1009   { "lib_ads",                  LIB_ADS_SPEC },                         \
1010   { "lib_yellowknife",          LIB_YELLOWKNIFE_SPEC },                 \
1011   { "lib_mvme",                 LIB_MVME_SPEC },                        \
1012   { "lib_sim",                  LIB_SIM_SPEC },                         \
1013   { "lib_freebsd",              LIB_FREEBSD_SPEC },                     \
1014   { "lib_gnu",                  LIB_GNU_SPEC },                         \
1015   { "lib_linux",                LIB_LINUX_SPEC },                       \
1016   { "lib_netbsd",               LIB_NETBSD_SPEC },                      \
1017   { "lib_openbsd",              LIB_OPENBSD_SPEC },                     \
1018   { "lib_default",              LIB_DEFAULT_SPEC },                     \
1019   { "startfile_ads",            STARTFILE_ADS_SPEC },                   \
1020   { "startfile_yellowknife",    STARTFILE_YELLOWKNIFE_SPEC },           \
1021   { "startfile_mvme",           STARTFILE_MVME_SPEC },                  \
1022   { "startfile_sim",            STARTFILE_SIM_SPEC },                   \
1023   { "startfile_freebsd",        STARTFILE_FREEBSD_SPEC },               \
1024   { "startfile_gnu",            STARTFILE_GNU_SPEC },                   \
1025   { "startfile_linux",          STARTFILE_LINUX_SPEC },                 \
1026   { "startfile_netbsd",         STARTFILE_NETBSD_SPEC },                \
1027   { "startfile_openbsd",        STARTFILE_OPENBSD_SPEC },               \
1028   { "startfile_default",        STARTFILE_DEFAULT_SPEC },               \
1029   { "endfile_ads",              ENDFILE_ADS_SPEC },                     \
1030   { "endfile_yellowknife",      ENDFILE_YELLOWKNIFE_SPEC },             \
1031   { "endfile_mvme",             ENDFILE_MVME_SPEC },                    \
1032   { "endfile_sim",              ENDFILE_SIM_SPEC },                     \
1033   { "endfile_freebsd",          ENDFILE_FREEBSD_SPEC },                 \
1034   { "endfile_gnu",              ENDFILE_GNU_SPEC },                     \
1035   { "endfile_linux",            ENDFILE_LINUX_SPEC },                   \
1036   { "endfile_netbsd",           ENDFILE_NETBSD_SPEC },                  \
1037   { "endfile_openbsd",          ENDFILE_OPENBSD_SPEC },                 \
1038   { "endfile_default",          ENDFILE_DEFAULT_SPEC },                 \
1039   { "link_path",                LINK_PATH_SPEC },                       \
1040   { "link_shlib",               LINK_SHLIB_SPEC },                      \
1041   { "link_target",              LINK_TARGET_SPEC },                     \
1042   { "link_start",               LINK_START_SPEC },                      \
1043   { "link_start_ads",           LINK_START_ADS_SPEC },                  \
1044   { "link_start_yellowknife",   LINK_START_YELLOWKNIFE_SPEC },          \
1045   { "link_start_mvme",          LINK_START_MVME_SPEC },                 \
1046   { "link_start_sim",           LINK_START_SIM_SPEC },                  \
1047   { "link_start_freebsd",       LINK_START_FREEBSD_SPEC },              \
1048   { "link_start_gnu",           LINK_START_GNU_SPEC },                  \
1049   { "link_start_linux",         LINK_START_LINUX_SPEC },                \
1050   { "link_start_netbsd",        LINK_START_NETBSD_SPEC },               \
1051   { "link_start_openbsd",       LINK_START_OPENBSD_SPEC },              \
1052   { "link_start_default",       LINK_START_DEFAULT_SPEC },              \
1053   { "link_os",                  LINK_OS_SPEC },                         \
1054   { "link_os_ads",              LINK_OS_ADS_SPEC },                     \
1055   { "link_os_yellowknife",      LINK_OS_YELLOWKNIFE_SPEC },             \
1056   { "link_os_mvme",             LINK_OS_MVME_SPEC },                    \
1057   { "link_os_sim",              LINK_OS_SIM_SPEC },                     \
1058   { "link_os_freebsd",          LINK_OS_FREEBSD_SPEC },                 \
1059   { "link_os_linux",            LINK_OS_LINUX_SPEC },                   \
1060   { "link_os_gnu",              LINK_OS_GNU_SPEC },                     \
1061   { "link_os_netbsd",           LINK_OS_NETBSD_SPEC },                  \
1062   { "link_os_openbsd",          LINK_OS_OPENBSD_SPEC },                 \
1063   { "link_os_default",          LINK_OS_DEFAULT_SPEC },                 \
1064   { "cc1_endian_big",           CC1_ENDIAN_BIG_SPEC },                  \
1065   { "cc1_endian_little",        CC1_ENDIAN_LITTLE_SPEC },               \
1066   { "cc1_endian_default",       CC1_ENDIAN_DEFAULT_SPEC },              \
1067   { "cc1_secure_plt_default",   CC1_SECURE_PLT_DEFAULT_SPEC },          \
1068   { "cpp_os_ads",               CPP_OS_ADS_SPEC },                      \
1069   { "cpp_os_yellowknife",       CPP_OS_YELLOWKNIFE_SPEC },              \
1070   { "cpp_os_mvme",              CPP_OS_MVME_SPEC },                     \
1071   { "cpp_os_sim",               CPP_OS_SIM_SPEC },                      \
1072   { "cpp_os_freebsd",           CPP_OS_FREEBSD_SPEC },                  \
1073   { "cpp_os_gnu",               CPP_OS_GNU_SPEC },                      \
1074   { "cpp_os_linux",             CPP_OS_LINUX_SPEC },                    \
1075   { "cpp_os_netbsd",            CPP_OS_NETBSD_SPEC },                   \
1076   { "cpp_os_openbsd",           CPP_OS_OPENBSD_SPEC },                  \
1077   { "cpp_os_default",           CPP_OS_DEFAULT_SPEC },                  \
1078   { "fbsd_dynamic_linker",      FBSD_DYNAMIC_LINKER },                  \
1079   SUBSUBTARGET_EXTRA_SPECS
1080
1081 #define SUBSUBTARGET_EXTRA_SPECS
1082
1083 /* Define this macro as a C expression for the initializer of an
1084    array of string to tell the driver program which options are
1085    defaults for this target and thus do not need to be handled
1086    specially when using `MULTILIB_OPTIONS'.
1087
1088    Do not define this macro if `MULTILIB_OPTIONS' is not defined in
1089    the target makefile fragment or if none of the options listed in
1090    `MULTILIB_OPTIONS' are set by default.  *Note Target Fragment::.  */
1091
1092 #define MULTILIB_DEFAULTS { "mbig", "mcall-sysv" }
1093
1094 /* Define this macro if the code for function profiling should come
1095    before the function prologue.  Normally, the profiling code comes
1096    after.  */
1097 #define PROFILE_BEFORE_PROLOGUE 1
1098
1099 /* Function name to call to do profiling.  */
1100 #define RS6000_MCOUNT "_mcount"
1101
1102 /* Define this macro (to a value of 1) if you want to support the
1103    Win32 style pragmas #pragma pack(push,<n>)' and #pragma
1104    pack(pop)'.  The pack(push,<n>) pragma specifies the maximum
1105    alignment (in bytes) of fields within a structure, in much the
1106    same way as the __aligned__' and __packed__' __attribute__'s
1107    do.  A pack value of zero resets the behavior to the default.
1108    Successive invocations of this pragma cause the previous values to
1109    be stacked, so that invocations of #pragma pack(pop)' will return
1110    to the previous value.  */
1111
1112 #define HANDLE_PRAGMA_PACK_PUSH_POP 1
1113
1114 /* Select a format to encode pointers in exception handling data.  CODE
1115    is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
1116    true if the symbol may be affected by dynamic relocations.  */
1117 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL)                            \
1118   ((flag_pic || TARGET_RELOCATABLE)                                          \
1119    ? (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4) \
1120    : DW_EH_PE_absptr)
1121
1122 #define DOUBLE_INT_ASM_OP "\t.quad\t"
1123
1124 /* Generate entries in .fixup for relocatable addresses.  */
1125 #define RELOCATABLE_NEEDS_FIXUP 1
1126
1127 /* This target uses the sysv4.opt file.  */
1128 #define TARGET_USES_SYSV4_OPT 1