OSDN Git Service

* config/rs6000/rs6000.c (output_toc): Allow 32-bit targets to
[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
3    Free Software Foundation, Inc.
4    Contributed by Cygnus Support.
5
6 This file is part of GNU CC.
7
8 GNU CC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GNU CC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GNU CC; see the file COPYING.  If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA.  */
22
23
24 /* Yes!  We are ELF.  */
25 #define TARGET_OBJECT_FORMAT OBJECT_ELF
26
27 /* Default ABI to compile code for.  */
28 #define DEFAULT_ABI rs6000_current_abi
29
30 /* Default ABI to use.  */
31 #define RS6000_ABI_NAME "sysv"
32
33 /* Override rs6000.h definition.  */
34 #undef  ASM_DEFAULT_SPEC
35 #define ASM_DEFAULT_SPEC "-mppc"
36
37 /* Override rs6000.h definition.  */
38 #undef  CPP_DEFAULT_SPEC
39 #define CPP_DEFAULT_SPEC "-D_ARCH_PPC"
40
41 /* Small data support types.  */
42 enum rs6000_sdata_type {
43   SDATA_NONE,                   /* No small data support.  */
44   SDATA_DATA,                   /* Just put data in .sbss/.sdata, don't use relocs.  */
45   SDATA_SYSV,                   /* Use r13 to point to .sdata/.sbss.  */
46   SDATA_EABI                    /* Use r13 like above, r2 points to .sdata2/.sbss2.  */
47 };
48
49 extern enum rs6000_sdata_type rs6000_sdata;
50
51 /* V.4/eabi switches.  */
52 #define MASK_NO_BITFIELD_TYPE   0x40000000      /* Set PCC_BITFIELD_TYPE_MATTERS to 0.  */
53 #define MASK_STRICT_ALIGN       0x20000000      /* Set STRICT_ALIGNMENT to 1.  */
54 #define MASK_RELOCATABLE        0x10000000      /* GOT pointers are PC relative.  */
55 #define MASK_EABI               0x08000000      /* Adhere to eabi, not System V spec.  */
56 #define MASK_LITTLE_ENDIAN      0x04000000      /* Target is little endian.  */
57 #define MASK_REGNAMES           0x02000000      /* Use alternate register names.  */
58 #define MASK_PROTOTYPE          0x01000000      /* Only prototyped fcns pass variable args.  */
59 #define MASK_LONG_DOUBLE_128    0x00800000      /* Use IEEE quad long double.  */
60
61 #define TARGET_NO_BITFIELD_TYPE (target_flags & MASK_NO_BITFIELD_TYPE)
62 #define TARGET_STRICT_ALIGN     (target_flags & MASK_STRICT_ALIGN)
63 #define TARGET_RELOCATABLE      (target_flags & MASK_RELOCATABLE)
64 #define TARGET_EABI             (target_flags & MASK_EABI)
65 #define TARGET_LITTLE_ENDIAN    (target_flags & MASK_LITTLE_ENDIAN)
66 #define TARGET_REGNAMES         (target_flags & MASK_REGNAMES)
67 #define TARGET_PROTOTYPE        (target_flags & MASK_PROTOTYPE)
68 #define TARGET_LONG_DOUBLE_128  (target_flags & MASK_LONG_DOUBLE_128)
69 #define TARGET_TOC              ((target_flags & MASK_64BIT)            \
70                                  || ((target_flags & (MASK_RELOCATABLE  \
71                                                       | MASK_MINIMAL_TOC)) \
72                                      && flag_pic > 1)                   \
73                                  || DEFAULT_ABI == ABI_AIX)
74
75 #define TARGET_BITFIELD_TYPE    (! TARGET_NO_BITFIELD_TYPE)
76 #define TARGET_BIG_ENDIAN       (! TARGET_LITTLE_ENDIAN)
77 #define TARGET_NO_PROTOTYPE     (! TARGET_PROTOTYPE)
78 #define TARGET_NO_TOC           (! TARGET_TOC)
79 #define TARGET_NO_EABI          (! TARGET_EABI)
80
81 /* Strings provided by SUBTARGET_OPTIONS */
82 extern const char *rs6000_abi_name;
83 extern const char *rs6000_sdata_name;
84
85 /* Override rs6000.h definition.  */
86 #undef  SUBTARGET_OPTIONS
87 #define SUBTARGET_OPTIONS                                               \
88   { "call-",  &rs6000_abi_name, N_("Select ABI calling convention.") }, \
89   { "sdata=", &rs6000_sdata_name, N_("Select method for sdata handling.") }
90
91 /* Max # of bytes for variables to automatically be put into the .sdata
92    or .sdata2 sections.  */
93 extern int g_switch_value;              /* Value of the -G xx switch.  */
94 extern int g_switch_set;                /* Whether -G xx was passed.  */
95
96 #define SDATA_DEFAULT_SIZE 8
97
98 /* Note, V.4 no longer uses a normal TOC, so make -mfull-toc, be just
99    the same as -mminimal-toc.  */
100 /* Override rs6000.h definition.  */
101 #undef  SUBTARGET_SWITCHES
102 #define SUBTARGET_SWITCHES                                              \
103   { "bit-align",        -MASK_NO_BITFIELD_TYPE,                         \
104     N_("Align to the base type of the bitfield.") },                    \
105   { "no-bit-align",      MASK_NO_BITFIELD_TYPE,                         \
106     N_("Don't align to the base type of the bitfield.") },              \
107   { "strict-align",      MASK_STRICT_ALIGN,                             \
108     N_("Don't assume that unaligned accesses are handled by the system") }, \
109   { "no-strict-align",  -MASK_STRICT_ALIGN,                             \
110     N_("Assume that unaligned accesses are handled by the system") },   \
111   { "relocatable",       MASK_RELOCATABLE | MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC, \
112     N_("Produce code relocatable at runtime.") },                       \
113   { "no-relocatable",   -MASK_RELOCATABLE,                              \
114     N_("Don't produce code relocatable at runtime.") },                 \
115   { "relocatable-lib",   MASK_RELOCATABLE | MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC, \
116     N_("Produce code relocatable at runtime.") },                       \
117   { "no-relocatable-lib", -MASK_RELOCATABLE,                            \
118     N_("Don't produce code relocatable at runtime.") },                 \
119   { "little-endian",     MASK_LITTLE_ENDIAN,                            \
120     N_("Produce little endian code.") },                                \
121   { "little",            MASK_LITTLE_ENDIAN,                            \
122     N_("Produce little endian code.") },                                \
123   { "big-endian",       -MASK_LITTLE_ENDIAN,                            \
124     N_("Produce big endian code.") },                                   \
125   { "big",              -MASK_LITTLE_ENDIAN,                            \
126     N_("Produce big endian code.") },                                   \
127   { "long-double-64",   -MASK_LONG_DOUBLE_128,                          \
128     N_("Use 64 bit long doubles") },                                    \
129   { "long-double-128",   MASK_LONG_DOUBLE_128,                          \
130     N_("Use 128 bit long doubles") },                                   \
131   { "no-toc",            0, N_("no description yet") },                 \
132   { "toc",               MASK_MINIMAL_TOC, N_("no description yet") },  \
133   { "full-toc",          MASK_MINIMAL_TOC, N_("no description yet") },  \
134   { "prototype",         MASK_PROTOTYPE, N_("no description yet") },    \
135   { "no-prototype",     -MASK_PROTOTYPE, N_("no description yet") },    \
136   { "no-traceback",      0, N_("no description yet") },                 \
137   { "eabi",              MASK_EABI, N_("Use EABI.") },                  \
138   { "no-eabi",          -MASK_EABI, N_("Don't use EABI.") },            \
139   { "regnames",           MASK_REGNAMES,                                \
140     N_("Use alternate register names.") },                              \
141   { "no-regnames",       -MASK_REGNAMES,                                \
142     N_("Don't use alternate register names.") },                        \
143   { "sdata",             0, N_("no description yet") },                 \
144   { "no-sdata",          0, N_("no description yet") },                 \
145   { "sim",               0,                                             \
146     N_("Link with libsim.a, libc.a and sim-crt0.o.") },                 \
147   { "ads",               0,                                             \
148     N_("Link with libads.a, libc.a and crt0.o.") },                     \
149   { "yellowknife",       0,                                             \
150     N_("Link with libyk.a, libc.a and crt0.o.") },                      \
151   { "mvme",              0,                                             \
152     N_("Link with libmvme.a, libc.a and crt0.o.") },                    \
153   { "emb",               0,                                             \
154     N_("Set the PPC_EMB bit in the ELF flags header") },                \
155   { "vxworks",           0, N_("no description yet") },                 \
156   { "solaris-cclib",     0, N_("no description yet") },                 \
157   { "shlib",             0, N_("no description yet") },                 \
158   EXTRA_SUBTARGET_SWITCHES                                              \
159   { "newlib",            0, N_("no description yet") },
160
161 /* This is meant to be redefined in the host dependent files.  */
162 #define EXTRA_SUBTARGET_SWITCHES
163
164 /* Sometimes certain combinations of command options do not make sense
165    on a particular target machine.  You can define a macro
166    `OVERRIDE_OPTIONS' to take account of this.  This macro, if
167    defined, is executed once just after all the command options have
168    been parsed.
169
170    The macro SUBTARGET_OVERRIDE_OPTIONS is provided for subtargets, to
171    get control.  */
172
173 #define SUBTARGET_OVERRIDE_OPTIONS                                      \
174 do {                                                                    \
175   if (!g_switch_set)                                                    \
176     g_switch_value = SDATA_DEFAULT_SIZE;                                \
177                                                                         \
178   if (!strcmp (rs6000_abi_name, "sysv"))                                \
179     rs6000_current_abi = ABI_V4;                                        \
180   else if (!strcmp (rs6000_abi_name, "sysv-noeabi"))                    \
181     {                                                                   \
182       rs6000_current_abi = ABI_V4;                                      \
183       target_flags &= ~ MASK_EABI;                                      \
184     }                                                                   \
185   else if (!strcmp (rs6000_abi_name, "sysv-eabi")                       \
186            || !strcmp (rs6000_abi_name, "eabi"))                        \
187     {                                                                   \
188       rs6000_current_abi = ABI_V4;                                      \
189       target_flags |= MASK_EABI;                                        \
190     }                                                                   \
191   else if (!strcmp (rs6000_abi_name, "aix"))                            \
192     {                                                                   \
193       rs6000_current_abi = ABI_AIX_NODESC;                              \
194       target_flags |= MASK_EABI;                                        \
195     }                                                                   \
196   else if (!strcmp (rs6000_abi_name, "aixdesc"))                        \
197     rs6000_current_abi = ABI_AIX;                                       \
198   else if (!strcmp (rs6000_abi_name, "linux"))                          \
199     rs6000_current_abi = ABI_V4;                                        \
200   else if (!strcmp (rs6000_abi_name, "solaris"))                        \
201     rs6000_current_abi = ABI_SOLARIS;                                   \
202   else                                                                  \
203     {                                                                   \
204       rs6000_current_abi = ABI_V4;                                      \
205       error ("Bad value for -mcall-%s", rs6000_abi_name);               \
206     }                                                                   \
207                                                                         \
208   if (rs6000_sdata_name)                                                \
209     {                                                                   \
210       if (!strcmp (rs6000_sdata_name, "none"))                          \
211         rs6000_sdata = SDATA_NONE;                                      \
212       else if (!strcmp (rs6000_sdata_name, "data"))                     \
213         rs6000_sdata = SDATA_DATA;                                      \
214       else if (!strcmp (rs6000_sdata_name, "default"))                  \
215         rs6000_sdata = (TARGET_EABI) ? SDATA_EABI : SDATA_SYSV;         \
216       else if (!strcmp (rs6000_sdata_name, "sysv"))                     \
217         rs6000_sdata = SDATA_SYSV;                                      \
218       else if (!strcmp (rs6000_sdata_name, "eabi"))                     \
219         rs6000_sdata = SDATA_EABI;                                      \
220       else                                                              \
221         error ("Bad value for -msdata=%s", rs6000_sdata_name);          \
222     }                                                                   \
223   else if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)         \
224     {                                                                   \
225       rs6000_sdata = SDATA_DATA;                                        \
226       rs6000_sdata_name = "data";                                       \
227     }                                                                   \
228   else                                                                  \
229     {                                                                   \
230       rs6000_sdata = SDATA_NONE;                                        \
231       rs6000_sdata_name = "none";                                       \
232     }                                                                   \
233                                                                         \
234   if (TARGET_RELOCATABLE &&                                             \
235       (rs6000_sdata == SDATA_EABI || rs6000_sdata == SDATA_SYSV))       \
236     {                                                                   \
237       rs6000_sdata = SDATA_DATA;                                        \
238       error ("-mrelocatable and -msdata=%s are incompatible.",          \
239              rs6000_sdata_name);                                        \
240     }                                                                   \
241                                                                         \
242   else if (flag_pic &&                                                  \
243            (rs6000_sdata == SDATA_EABI || rs6000_sdata == SDATA_SYSV))  \
244     {                                                                   \
245       rs6000_sdata = SDATA_DATA;                                        \
246       error ("-f%s and -msdata=%s are incompatible.",                   \
247              (flag_pic > 1) ? "PIC" : "pic",                            \
248              rs6000_sdata_name);                                        \
249     }                                                                   \
250                                                                         \
251   if (rs6000_sdata != SDATA_NONE && DEFAULT_ABI != ABI_V4               \
252       && DEFAULT_ABI != ABI_SOLARIS)                                    \
253     {                                                                   \
254       rs6000_sdata = SDATA_NONE;                                        \
255       error ("-msdata=%s and -mcall-%s are incompatible.",              \
256              rs6000_sdata_name, rs6000_abi_name);                       \
257     }                                                                   \
258                                                                         \
259   if (TARGET_RELOCATABLE && !TARGET_MINIMAL_TOC)                        \
260     {                                                                   \
261       target_flags |= MASK_MINIMAL_TOC;                                 \
262       error ("-mrelocatable and -mno-minimal-toc are incompatible.");   \
263     }                                                                   \
264                                                                         \
265   if (TARGET_RELOCATABLE && rs6000_current_abi == ABI_AIX)              \
266     {                                                                   \
267       target_flags &= ~MASK_RELOCATABLE;                                \
268       error ("-mrelocatable and -mcall-%s are incompatible.",           \
269              rs6000_abi_name);                                          \
270     }                                                                   \
271                                                                         \
272   if (flag_pic > 1 && rs6000_current_abi == ABI_AIX)                    \
273     {                                                                   \
274       flag_pic = 0;                                                     \
275       error ("-fPIC and -mcall-%s are incompatible.",                   \
276              rs6000_abi_name);                                          \
277     }                                                                   \
278                                                                         \
279   if (rs6000_current_abi == ABI_AIX && TARGET_LITTLE_ENDIAN)            \
280     {                                                                   \
281       target_flags &= ~MASK_LITTLE_ENDIAN;                              \
282       error ("-mcall-aixdesc must be big endian");                      \
283     }                                                                   \
284                                                                         \
285   /* Treat -fPIC the same as -mrelocatable.  */                         \
286   if (flag_pic > 1)                                                     \
287     target_flags |= MASK_RELOCATABLE | MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC; \
288                                                                         \
289   else if (TARGET_RELOCATABLE)                                          \
290     flag_pic = 2;                                                       \
291                                                                         \
292 } while (0)
293
294
295 /* Override rs6000.h definition.  */
296 #undef  TARGET_DEFAULT
297 #define TARGET_DEFAULT (MASK_POWERPC | MASK_NEW_MNEMONICS)
298
299 /* Override rs6000.h definition.  */
300 #undef  PROCESSOR_DEFAULT
301 #define PROCESSOR_DEFAULT PROCESSOR_PPC750
302
303 /* System V.4 uses register 13 as a pointer to the small data area,
304    so it is not available to the normal user.  */
305
306 #define FIXED_R13 1
307
308 /* Size of the V.4 varargs area if needed.  */
309 /* Override rs6000.h definition.  */
310 #undef  RS6000_VARARGS_AREA
311 #define RS6000_VARARGS_AREA ((cfun->machine->sysv_varargs_p) ? RS6000_VARARGS_SIZE : 0)
312
313 /* Override default big endianism definitions in rs6000.h.  */
314 #undef  BYTES_BIG_ENDIAN
315 #undef  WORDS_BIG_ENDIAN
316 #define BYTES_BIG_ENDIAN (TARGET_BIG_ENDIAN)
317 #define WORDS_BIG_ENDIAN (TARGET_BIG_ENDIAN)
318
319 /* Define this to set the endianness to use in libgcc2.c, which can
320    not depend on target_flags.  */
321 #if !defined(_LITTLE_ENDIAN) && !defined(__sun__)
322 #define LIBGCC2_WORDS_BIG_ENDIAN 1
323 #else
324 #define LIBGCC2_WORDS_BIG_ENDIAN 0
325 #endif
326
327 /* Define cutoff for using external functions to save floating point.
328    Currently on V.4, always use inline stores.  */
329 #define FP_SAVE_INLINE(FIRST_REG) ((FIRST_REG) < 64)
330
331 /* Put jump tables in read-only memory, rather than in .text.  */
332 #define JUMP_TABLES_IN_TEXT_SECTION 0
333
334 /* Prefix and suffix to use to saving floating point.  */
335 #define SAVE_FP_PREFIX "_savefpr_"
336 #define SAVE_FP_SUFFIX "_l"
337
338 /* Prefix and suffix to use to restoring floating point.  */
339 #define RESTORE_FP_PREFIX "_restfpr_"
340 #define RESTORE_FP_SUFFIX "_l"
341
342 /* Type used for ptrdiff_t, as a string used in a declaration.  */
343 #define PTRDIFF_TYPE "int"
344
345 /* Type used for wchar_t, as a string used in a declaration.  */
346 /* Override svr4.h definition.  */
347 #undef  WCHAR_TYPE
348 #define WCHAR_TYPE "long int"
349
350 /* Width of wchar_t in bits.  */
351 /* Override svr4.h definition.  */
352 #undef  WCHAR_TYPE_SIZE
353 #define WCHAR_TYPE_SIZE 32
354
355 /* Define for support of TFmode long double and REAL_ARITHMETIC.
356    PowerPC SVR4 ABI says that long double is 4 words.  */
357 #undef LONG_DOUBLE_TYPE_SIZE
358 #define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64)
359
360 /* Constant which presents upper bound of the above value.  */
361 #define MAX_LONG_DOUBLE_TYPE_SIZE 128
362
363 /* Define this to set long double type size to use in libgcc2.c, which can
364    not depend on target_flags.  */
365 #ifdef __LONG_DOUBLE_128__
366 #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128
367 #else
368 #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64
369 #endif
370
371 /* Make int foo : 8 not cause structures to be aligned to an int boundary.  */
372 /* Override elfos.h definition.  */
373 #undef  PCC_BITFIELD_TYPE_MATTERS
374 #define PCC_BITFIELD_TYPE_MATTERS (TARGET_BITFIELD_TYPE)
375
376 /* Define this macro to be the value 1 if instructions will fail to
377    work if given data not on the nominal alignment.  If instructions
378    will merely go slower in that case, define this macro as 0.  */
379 #undef  STRICT_ALIGNMENT
380 #define STRICT_ALIGNMENT (TARGET_STRICT_ALIGN)
381
382 /* Alignment in bits of the stack boundary.  Note, in order to allow building
383    one set of libraries with -mno-eabi instead of eabi libraries and non-eabi
384    versions, just use 64 as the stack boundary.  */
385 #undef  STACK_BOUNDARY
386 #define STACK_BOUNDARY  64
387
388 /* Real stack boundary as mandated by the appropriate ABI.  */
389 #define ABI_STACK_BOUNDARY ((TARGET_EABI) ? 64 : 128)
390
391 /* No data type wants to be aligned rounder than this.  */
392 #undef  BIGGEST_ALIGNMENT
393 #define BIGGEST_ALIGNMENT ((TARGET_EABI) ? 64 : 128)
394
395 #undef  BIGGEST_FIELD_ALIGNMENT
396 #undef  ADJUST_FIELD_ALIGN
397 #undef  ROUND_TYPE_ALIGN
398
399 /* Use ELF style section commands.  */
400
401 #define TEXT_SECTION_ASM_OP     "\t.section\t\".text\""
402
403 #define DATA_SECTION_ASM_OP     "\t.section\t\".data\""
404
405 #define BSS_SECTION_ASM_OP      "\t.section\t\".bss\""
406
407 /* Override elfos.h definition.  */
408 #undef  INIT_SECTION_ASM_OP
409 #define INIT_SECTION_ASM_OP "\t.section\t\".init\",\"ax\""
410
411 /* Override elfos.h definition.  */
412 #undef  FINI_SECTION_ASM_OP
413 #define FINI_SECTION_ASM_OP "\t.section\t\".fini\",\"ax\""
414
415 #define TOC_SECTION_ASM_OP "\t.section\t\".got\",\"aw\""
416
417 /* Put PC relative got entries in .got2.  */
418 #define MINIMAL_TOC_SECTION_ASM_OP \
419   ((TARGET_RELOCATABLE || flag_pic) ? "\t.section\t\".got2\",\"aw\"" : "\t.section\t\".got1\",\"aw\"")
420
421 /* Put relocatable data in .data, not .rodata so initialized pointers can be updated.  */
422 /* Override elfos.h definition.  */
423 #undef  CONST_SECTION_ASM_OP
424 #define CONST_SECTION_ASM_OP \
425   ((TARGET_RELOCATABLE || flag_pic) ? "\t.section\t\".data\"\t# .rodata" : "\t.section\t\".rodata\"")
426
427
428 #define SDATA_SECTION_ASM_OP "\t.section\t\".sdata\",\"aw\""
429 #define SDATA2_SECTION_ASM_OP "\t.section\t\".sdata2\",\"a\""
430 #define SBSS_SECTION_ASM_OP \
431   ((DEFAULT_ABI == ABI_SOLARIS) ? "\t.section\t\".sbss\",\"aw\"" : "\t.section\t\".sbss\",\"aw\",@nobits")
432
433
434 /* Besides the usual ELF sections, we need a toc section.  */
435 /* Override elfos.h definition.  */
436 #undef  EXTRA_SECTIONS
437 #define EXTRA_SECTIONS in_const, in_ctors, in_dtors, in_toc, in_sdata, in_sdata2, in_sbss, in_init, in_fini
438
439 /* Override elfos.h definition.  */
440 #undef  EXTRA_SECTION_FUNCTIONS
441 #define EXTRA_SECTION_FUNCTIONS                                         \
442   CONST_SECTION_FUNCTION                                                \
443   CTORS_SECTION_FUNCTION                                                \
444   DTORS_SECTION_FUNCTION                                                \
445   TOC_SECTION_FUNCTION                                                  \
446   SDATA_SECTION_FUNCTION                                                \
447   SDATA2_SECTION_FUNCTION                                               \
448   SBSS_SECTION_FUNCTION                                                 \
449   INIT_SECTION_FUNCTION                                                 \
450   FINI_SECTION_FUNCTION
451
452 #define TOC_SECTION_FUNCTION                                            \
453 void                                                                    \
454 toc_section ()                                                          \
455 {                                                                       \
456   if (in_section != in_toc)                                             \
457     {                                                                   \
458       in_section = in_toc;                                              \
459       if (DEFAULT_ABI == ABI_AIX                                        \
460           && TARGET_MINIMAL_TOC                                         \
461           && !TARGET_RELOCATABLE)                                       \
462         {                                                               \
463           if (! toc_initialized)                                        \
464             {                                                           \
465               toc_initialized = 1;                                      \
466               fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);       \
467               ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LCTOC", 0);     \
468               fprintf (asm_out_file, "\t.tc ");                         \
469               ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1[TC],"); \
470               ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1"); \
471               fprintf (asm_out_file, "\n");                             \
472                                                                         \
473               fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP); \
474               ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1"); \
475               fprintf (asm_out_file, " = .+32768\n");                   \
476             }                                                           \
477           else                                                          \
478             fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP); \
479         }                                                               \
480       else if (DEFAULT_ABI == ABI_AIX && !TARGET_RELOCATABLE)           \
481         fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP);             \
482       else                                                              \
483         {                                                               \
484           fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);   \
485           if (! toc_initialized)                                        \
486             {                                                           \
487               ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1"); \
488               fprintf (asm_out_file, " = .+32768\n");                   \
489               toc_initialized = 1;                                      \
490             }                                                           \
491         }                                                               \
492     }                                                                   \
493 }
494
495 #define SDATA_SECTION_FUNCTION                                          \
496 void                                                                    \
497 sdata_section ()                                                        \
498 {                                                                       \
499   if (in_section != in_sdata)                                           \
500     {                                                                   \
501       in_section = in_sdata;                                            \
502       fprintf (asm_out_file, "%s\n", SDATA_SECTION_ASM_OP);             \
503     }                                                                   \
504 }
505
506 #define SDATA2_SECTION_FUNCTION                                         \
507 void                                                                    \
508 sdata2_section ()                                                       \
509 {                                                                       \
510   if (in_section != in_sdata2)                                          \
511     {                                                                   \
512       in_section = in_sdata2;                                           \
513       fprintf (asm_out_file, "%s\n", SDATA2_SECTION_ASM_OP);            \
514     }                                                                   \
515 }
516
517 #define SBSS_SECTION_FUNCTION                                           \
518 void                                                                    \
519 sbss_section ()                                                         \
520 {                                                                       \
521   if (in_section != in_sbss)                                            \
522     {                                                                   \
523       in_section = in_sbss;                                             \
524       fprintf (asm_out_file, "%s\n", SBSS_SECTION_ASM_OP);              \
525     }                                                                   \
526 }
527
528 #define INIT_SECTION_FUNCTION                                           \
529 void                                                                    \
530 init_section ()                                                         \
531 {                                                                       \
532   if (in_section != in_init)                                            \
533     {                                                                   \
534       in_section = in_init;                                             \
535       fprintf (asm_out_file, "%s\n", INIT_SECTION_ASM_OP);              \
536     }                                                                   \
537 }
538
539 #define FINI_SECTION_FUNCTION                                           \
540 void                                                                    \
541 fini_section ()                                                         \
542 {                                                                       \
543   if (in_section != in_fini)                                            \
544     {                                                                   \
545       in_section = in_fini;                                             \
546       fprintf (asm_out_file, "%s\n", FINI_SECTION_ASM_OP);              \
547     }                                                                   \
548 }
549
550 /* A C statement or statements to switch to the appropriate section
551    for output of RTX in mode MODE.  You can assume that RTX is some
552    kind of constant in RTL.  The argument MODE is redundant except in
553    the case of a `const_int' rtx.  Select the section by calling
554    `text_section' or one of the alternatives for other sections.
555
556    Do not define this macro if you put all constants in the read-only
557    data section.  */
558
559 /* Override elfos.h definition.  */
560 #undef  SELECT_RTX_SECTION
561 #define SELECT_RTX_SECTION(MODE, X) rs6000_select_rtx_section (MODE, X)
562
563 /* A C statement or statements to switch to the appropriate
564    section for output of DECL.  DECL is either a `VAR_DECL' node
565    or a constant of some sort.  RELOC indicates whether forming
566    the initial value of DECL requires link-time relocations.  */
567
568 /* Override elfos.h definition.  */
569 #undef  SELECT_SECTION
570 #define SELECT_SECTION(DECL, RELOC) rs6000_select_section (DECL, RELOC)
571
572 /* A C statement to build up a unique section name, expressed as a
573    STRING_CST node, and assign it to DECL_SECTION_NAME (decl).
574    RELOC indicates whether the initial value of EXP requires
575    link-time relocations.  If you do not define this macro, GCC will use
576    the symbol name prefixed by `.' as the section name.  Note - this
577    macro can now be called for unitialised data items as well as
578    initialised data and functions.  */
579
580 /* Override elfos.h definition.  */
581 #undef  UNIQUE_SECTION
582 #define UNIQUE_SECTION(DECL, RELOC) rs6000_unique_section (DECL, RELOC)
583
584 /* Return non-zero if this entry is to be written into the constant pool
585    in a special way.  We do so if this is a SYMBOL_REF, LABEL_REF or a CONST
586    containing one of them.  If -mfp-in-toc (the default), we also do
587    this for floating-point constants.  We actually can only do this
588    if the FP formats of the target and host machines are the same, but
589    we can't check that since not every file that uses
590    GO_IF_LEGITIMATE_ADDRESS_P includes real.h.
591
592    Unlike AIX, we don't key off of -mminimal-toc, but instead do not
593    allow floating point constants in the TOC if -mrelocatable.  */
594
595 #undef  ASM_OUTPUT_SPECIAL_POOL_ENTRY_P
596 #define ASM_OUTPUT_SPECIAL_POOL_ENTRY_P(X, MODE)                        \
597   (TARGET_TOC                                                           \
598    && (GET_CODE (X) == SYMBOL_REF                                       \
599        || (GET_CODE (X) == CONST && GET_CODE (XEXP (X, 0)) == PLUS      \
600            && GET_CODE (XEXP (XEXP (X, 0), 0)) == SYMBOL_REF)           \
601        || GET_CODE (X) == LABEL_REF                                     \
602        || (GET_CODE (X) == CONST_INT                                    \
603            && GET_MODE_BITSIZE (MODE) <= GET_MODE_BITSIZE (Pmode))      \
604        || (!TARGET_NO_FP_IN_TOC                                         \
605            && !TARGET_RELOCATABLE                                       \
606            && GET_CODE (X) == CONST_DOUBLE                              \
607            && GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT               \
608            && BITS_PER_WORD == HOST_BITS_PER_INT)))
609
610 /* These macros generate the special .type and .size directives which
611    are used to set the corresponding fields of the linker symbol table
612    entries in an ELF object file under SVR4.  These macros also output
613    the starting labels for the relevant functions/objects.  */
614
615 /* Write the extra assembler code needed to declare a function properly.
616    Some svr4 assemblers need to also have something extra said about the
617    function's return value.  We allow for that here.  */
618
619 extern int rs6000_pic_labelno;
620
621 /* Override elfos.h definition.  */
622 #undef  ASM_DECLARE_FUNCTION_NAME
623 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)                     \
624   do {                                                                  \
625     const char *init_ptr = (TARGET_64BIT) ? ".quad" : ".long";          \
626                                                                         \
627     if (TARGET_RELOCATABLE && (get_pool_size () != 0 || profile_flag)   \
628         && uses_TOC())                                                  \
629       {                                                                 \
630         char buf[256];                                                  \
631                                                                         \
632         ASM_OUTPUT_INTERNAL_LABEL (FILE, "LCL", rs6000_pic_labelno);    \
633                                                                         \
634         ASM_GENERATE_INTERNAL_LABEL (buf, "LCTOC", 1);                  \
635         fprintf (FILE, "\t%s ", init_ptr);                              \
636         assemble_name (FILE, buf);                                      \
637         putc ('-', FILE);                                               \
638         ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);   \
639         assemble_name (FILE, buf);                                      \
640         putc ('\n', FILE);                                              \
641       }                                                                 \
642                                                                         \
643     fprintf (FILE, "%s", TYPE_ASM_OP);                                  \
644     assemble_name (FILE, NAME);                                         \
645     putc (',', FILE);                                                   \
646     fprintf (FILE, TYPE_OPERAND_FMT, "function");                       \
647     putc ('\n', FILE);                                                  \
648     ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL));                      \
649                                                                         \
650     if (DEFAULT_ABI == ABI_AIX)                                         \
651       {                                                                 \
652         const char *desc_name, *orig_name;                              \
653                                                                         \
654         STRIP_NAME_ENCODING (orig_name, NAME);                          \
655         desc_name = orig_name;                                          \
656         while (*desc_name == '.')                                       \
657           desc_name++;                                                  \
658                                                                         \
659         if (TREE_PUBLIC (DECL))                                         \
660           fprintf (FILE, "\t.globl %s\n", desc_name);                   \
661                                                                         \
662         fprintf (FILE, "%s\n", MINIMAL_TOC_SECTION_ASM_OP);             \
663         fprintf (FILE, "%s:\n", desc_name);                             \
664         fprintf (FILE, "\t%s %s\n", init_ptr, orig_name);               \
665         fprintf (FILE, "\t%s _GLOBAL_OFFSET_TABLE_\n", init_ptr);       \
666         if (DEFAULT_ABI == ABI_AIX)                                     \
667           fprintf (FILE, "\t%s 0\n", init_ptr);                         \
668         fprintf (FILE, "\t.previous\n");                                \
669       }                                                                 \
670     ASM_OUTPUT_LABEL (FILE, NAME);                                      \
671   } while (0)
672
673 /* A C compound statement that outputs the assembler code for a thunk function,
674     used to implement C++ virtual function calls with multiple inheritance.  The
675     thunk acts as a wrapper around a virtual function, adjusting the implicit
676     object parameter before handing control off to the real function.
677
678     First, emit code to add the integer DELTA to the location that contains the
679     incoming first argument.  Assume that this argument contains a pointer, and
680     is the one used to pass the this' pointer in C++.  This is the incoming
681     argument *before* the function prologue, e.g. %o0' on a sparc.  The
682     addition must preserve the values of all other incoming arguments.
683
684     After the addition, emit code to jump to FUNCTION, which is a
685     FUNCTION_DECL'.  This is a direct pure jump, not a call, and does not touch
686     the return address.  Hence returning from FUNCTION will return to whoever
687     called the current thunk'.
688
689     The effect must be as if FUNCTION had been called directly with the adjusted
690     first argument.  This macro is responsible for emitting all of the code for
691     a thunk function; FUNCTION_PROLOGUE' and FUNCTION_EPILOGUE' are not
692     invoked.
693
694     The THUNK_FNDECL is redundant.  (DELTA and FUNCTION have already been
695     extracted from it.)  It might possibly be useful on some targets, but
696     probably not.
697
698     If you do not define this macro, the target-independent code in the C++
699     frontend will generate a less efficient heavyweight thunk that calls
700     FUNCTION instead of jumping to it.  The generic approach does not support
701     varargs.  */
702
703 #define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
704   output_mi_thunk (FILE, THUNK_FNDECL, DELTA, FUNCTION)
705
706 /* How to renumber registers for dbx and gdb.  */
707
708 #define DBX_REGISTER_NUMBER(REGNO) (REGNO)
709
710 /* The USER_LABEL_PREFIX stuff is affected by the -fleading-underscore
711    flag.  The LOCAL_LABEL_PREFIX variable is used by dbxelf.h.  */
712
713 #define LOCAL_LABEL_PREFIX "."
714 #define USER_LABEL_PREFIX ""
715
716 /* svr4.h overrides ASM_OUTPUT_INTERNAL_LABEL.  */
717
718 #define ASM_OUTPUT_INTERNAL_LABEL_PREFIX(FILE,PREFIX)   \
719   asm_fprintf (FILE, "%L%s", PREFIX)
720
721 #define ASM_OUTPUT_LABEL(FILE,NAME)     \
722   (assemble_name (FILE, NAME), fputs (":\n", FILE))
723
724 /* This is how to output a command to make the user-level label named NAME
725    defined for reference from other files.  */
726
727 #define ASM_GLOBALIZE_LABEL(FILE,NAME)  \
728   do { fputs ("\t.globl ", FILE);       \
729        assemble_name (FILE, NAME); putc ('\n', FILE);} while (0)
730
731 /* This is how to allocate empty space in some section.  Use .space
732    instead of .zero because the Solaris PowerPC assembler doesn't
733    like it, and gas accepts either syntax.  */
734
735 /* Override elfos.h definition.  */
736 #undef  SKIP_ASM_OP
737 #define SKIP_ASM_OP     "\t.space\t"
738
739 /* This says how to output assembler code to declare an
740    uninitialized internal linkage data object.  Under SVR4,
741    the linker seems to want the alignment of data objects
742    to depend on their types.  We do exactly that here.  */
743
744 #define LOCAL_ASM_OP    "\t.local\t"
745
746 #define LCOMM_ASM_OP    "\t.lcomm\t"
747
748 /* Override elfos.h definition.  */
749 #undef  ASM_OUTPUT_ALIGNED_LOCAL
750 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN)               \
751 do {                                                                    \
752   if (rs6000_sdata != SDATA_NONE && (SIZE) > 0                          \
753       && (SIZE) <= g_switch_value)                                      \
754     {                                                                   \
755       sbss_section ();                                                  \
756       ASM_OUTPUT_ALIGN (FILE, exact_log2 (ALIGN / BITS_PER_UNIT));      \
757       ASM_OUTPUT_LABEL (FILE, NAME);                                    \
758       ASM_OUTPUT_SKIP (FILE, SIZE);                                     \
759       if (!flag_inhibit_size_directive && (SIZE) > 0)                   \
760         {                                                               \
761           fprintf (FILE, "%s", SIZE_ASM_OP);                            \
762           assemble_name (FILE, NAME);                                   \
763           fprintf (FILE, ",%d\n",  SIZE);                               \
764         }                                                               \
765     }                                                                   \
766   else                                                                  \
767     {                                                                   \
768       fprintf (FILE, "%s", LCOMM_ASM_OP);                               \
769       assemble_name ((FILE), (NAME));                                   \
770       fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT);    \
771     }                                                                   \
772 } while (0)
773
774 /* Describe how to emit uninitialized external linkage items.  */
775 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN)           \
776 do {                                                                    \
777   ASM_GLOBALIZE_LABEL (FILE, NAME);                                     \
778   ASM_OUTPUT_ALIGNED_LOCAL (FILE, NAME, SIZE, ALIGN);                   \
779 } while (0)
780
781 /* Switch  Recognition by gcc.c.  Add -G xx support.  */
782
783 /* Override svr4.h definition.  */
784 #undef  SWITCH_TAKES_ARG
785 #define SWITCH_TAKES_ARG(CHAR)                                          \
786   ((CHAR) == 'D' || (CHAR) == 'U' || (CHAR) == 'o'                      \
787    || (CHAR) == 'e' || (CHAR) == 'T' || (CHAR) == 'u'                   \
788    || (CHAR) == 'I' || (CHAR) == 'm' || (CHAR) == 'x'                   \
789    || (CHAR) == 'L' || (CHAR) == 'A' || (CHAR) == 'V'                   \
790    || (CHAR) == 'B' || (CHAR) == 'b' || (CHAR) == 'G')
791
792 /* Output .file.  */
793 /* Override elfos.h definition.  */
794 #undef  ASM_FILE_START
795 #define ASM_FILE_START(FILE)                                            \
796 do {                                                                    \
797   output_file_directive ((FILE), main_input_filename);                  \
798   rs6000_file_start (FILE, TARGET_CPU_DEFAULT);                         \
799 } while (0)
800
801
802 extern int fixuplabelno;
803
804 /* This is how to output an assembler line defining an `int' constant.
805    For -mrelocatable, we mark all addresses that need to be fixed up
806    in the .fixup section.  */
807 /* Override rs6000.h definition.  */
808 #undef  ASM_OUTPUT_INT
809 #define ASM_OUTPUT_INT(FILE,VALUE)                                      \
810 do {                                                                    \
811   static int recurse = 0;                                               \
812   if (TARGET_RELOCATABLE                                                \
813       && in_section != in_toc                                           \
814       && in_section != in_text                                          \
815       && in_section != in_ctors                                         \
816       && in_section != in_dtors                                         \
817       && !recurse                                                       \
818       && GET_CODE (VALUE) != CONST_INT                                  \
819       && GET_CODE (VALUE) != CONST_DOUBLE                               \
820       && CONSTANT_P (VALUE))                                            \
821     {                                                                   \
822       char buf[256];                                                    \
823                                                                         \
824       recurse = 1;                                                      \
825       ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno);           \
826       fixuplabelno++;                                                   \
827       ASM_OUTPUT_LABEL (FILE, buf);                                     \
828       fprintf (FILE, "\t.long (");                                      \
829       output_addr_const (FILE, (VALUE));                                \
830       fprintf (FILE, ")@fixup\n");                                      \
831       fprintf (FILE, "\t.section\t\".fixup\",\"aw\"\n");                \
832       ASM_OUTPUT_ALIGN (FILE, 2);                                       \
833       fprintf (FILE, "\t.long\t");                                      \
834       assemble_name (FILE, buf);                                        \
835       fprintf (FILE, "\n\t.previous\n");                                \
836       recurse = 0;                                                      \
837     }                                                                   \
838   /* Remove initial .'s to turn a -mcall-aixdesc function               \
839      address into the address of the descriptor, not the function       \
840      itself.  */                                                        \
841   else if (GET_CODE (VALUE) == SYMBOL_REF                               \
842            && XSTR (VALUE, 0)[0] == '.'                                 \
843            && DEFAULT_ABI == ABI_AIX)                                   \
844     {                                                                   \
845       const char *name = XSTR (VALUE, 0);                               \
846       while (*name == '.')                                              \
847         name++;                                                         \
848                                                                         \
849       fprintf (FILE, "\t.long %s\n", name);                             \
850     }                                                                   \
851   else                                                                  \
852     {                                                                   \
853       fprintf (FILE, "\t.long ");                                       \
854       output_addr_const (FILE, (VALUE));                                \
855       fprintf (FILE, "\n");                                             \
856     }                                                                   \
857 } while (0)
858
859 /* This is how to output an assembler line defining an address 
860    constant for the dwarf call unwinding information.
861    For -mrelocatable, we mark all addresses that need to be fixed up
862    in the .fixup section.  */
863
864 #define ASM_OUTPUT_DWARF_ADDR(FILE,LABEL)                               \
865 do {                                                                    \
866   if (TARGET_RELOCATABLE)                                               \
867     {                                                                   \
868       char buf[256];                                                    \
869                                                                         \
870       ASM_GENERATE_INTERNAL_LABEL (buf, "LCP", fixuplabelno);           \
871       fixuplabelno++;                                                   \
872       ASM_OUTPUT_LABEL (FILE, buf);                                     \
873       fprintf (FILE, "\t.%dbyte\t", POINTER_SIZE / BITS_PER_UNIT);      \
874       assemble_name (FILE, LABEL);                                      \
875       fprintf (FILE, "\n");                                             \
876       fprintf (FILE, "\t.section \".fixup\",\"aw\"\n");                 \
877       ASM_OUTPUT_ALIGN (FILE, 2);                                       \
878       fprintf (FILE, "\t.long\t");                                      \
879       assemble_name (FILE, buf);                                        \
880       fprintf (FILE, "\n\t.previous\n");                                \
881     }                                                                   \
882   else                                                                  \
883     {                                                                   \
884       fprintf (FILE, "\t.%dbyte\t", POINTER_SIZE / BITS_PER_UNIT);      \
885       assemble_name (FILE, LABEL);                                      \
886     }                                                                   \
887 } while (0)
888
889 /* This is the end of what might become sysv4.h.  */
890
891 /* Allow stabs and dwarf, for now, make stabs the default debugging type,
892    not dwarf since G++ doesn't support dwarf.  */
893 #undef  PREFERRED_DEBUGGING_TYPE
894 #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
895
896 #define DBX_DEBUGGING_INFO
897
898 /* If we are referencing a function that is static or is known to be
899    in this file, make the SYMBOL_REF special.  We can use this to indicate
900    that we can branch to this function without emitting a no-op after the
901    call.  For real AIX calling sequences, we also replace the
902    function name with the real name (1 or 2 leading .'s), rather than
903    the function descriptor name.  This saves a lot of overriding code
904    to read the prefixes.  */
905
906 #undef  ENCODE_SECTION_INFO
907 #define ENCODE_SECTION_INFO(DECL) rs6000_encode_section_info (DECL)
908
909 /* The ELF version doesn't encode [DS] or whatever at the end of symbols.  */
910
911 #define RS6000_OUTPUT_BASENAME(FILE, NAME)      \
912     assemble_name (FILE, NAME)
913
914 /* This macro gets just the user-specified name
915    out of the string in a SYMBOL_REF.  Discard
916    a leading * or @.  */
917 #define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME)                            \
918 do {                                                                    \
919   const char *_name = SYMBOL_NAME;                                      \
920   while (*_name == '*' || *_name == '@')                                \
921     _name++;                                                            \
922   (VAR) = _name;                                                        \
923 } while (0)
924
925 /* This is how to output a reference to a user-level label named NAME.
926    `assemble_name' uses this.  */
927
928 /* Override elfos.h definition.  */
929 #undef  ASM_OUTPUT_LABELREF
930 #define ASM_OUTPUT_LABELREF(FILE,NAME)          \
931 do {                                            \
932   const char *_name = NAME;                     \
933   if (*_name == '@')                            \
934     _name++;                                    \
935                                                 \
936   if (*_name == '*')                            \
937     fprintf (FILE, "%s", _name + 1);            \
938   else                                          \
939     asm_fprintf (FILE, "%U%s", _name);          \
940 } while (0)
941
942 /* Switch into a generic section.
943
944    We make the section read-only and executable for a function decl,
945    read-only for a const data decl, and writable for a non-const data decl.
946
947    If the section has already been defined, we must not
948    emit the attributes here. The SVR4 assembler does not
949    recognize section redefinitions.
950    If DECL is NULL, no attributes are emitted.
951
952    Note, Solaris as doesn't like @nobits, and gas can handle .sbss without
953    needing @nobits.  */
954
955 /* Override elfos.h definition.  */
956 #undef  ASM_OUTPUT_SECTION_NAME
957 #define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC)                \
958 do {                                                                    \
959   static struct section_info                                            \
960     {                                                                   \
961       struct section_info *next;                                        \
962       char *name;                                                       \
963       enum sect_enum {SECT_RW, SECT_RO, SECT_EXEC} type;                \
964     } *sections;                                                        \
965   struct section_info *s;                                               \
966   const char *mode;                                                     \
967   enum sect_enum type;                                                  \
968                                                                         \
969   for (s = sections; s; s = s->next)                                    \
970     if (!strcmp (NAME, s->name))                                        \
971       break;                                                            \
972                                                                         \
973   if (DECL && TREE_CODE (DECL) == FUNCTION_DECL)                        \
974     type = SECT_EXEC, mode = "ax";                                      \
975   else if (DECL && DECL_READONLY_SECTION (DECL, RELOC) && !TARGET_RELOCATABLE && !flag_pic) \
976     type = SECT_RO, mode = "a";                                         \
977   else                                                                  \
978     type = SECT_RW, mode = "aw";                                        \
979                                                                         \
980   if (s == 0)                                                           \
981     {                                                                   \
982       s = (struct section_info *) xmalloc (sizeof (struct section_info));  \
983       s->name = xmalloc ((strlen (NAME) + 1) * sizeof (*NAME));         \
984       strcpy (s->name, NAME);                                           \
985       s->type = type;                                                   \
986       s->next = sections;                                               \
987       sections = s;                                                     \
988       fprintf (FILE, "\t.section\t\"%s\",\"%s\"\n", NAME, mode);        \
989     }                                                                   \
990   else                                                                  \
991     {                                                                   \
992       if (DECL && s->type != type)                                      \
993         error_with_decl (DECL, "%s causes a section type conflict");    \
994                                                                         \
995       fprintf (FILE, "\t.section\t\"%s\"\n", NAME);                     \
996     }                                                                   \
997 } while (0)
998
999 /* Override elfos.h definition.  */
1000 #undef  ASM_OUTPUT_CONSTRUCTOR
1001 #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME)                               \
1002   do {                                                                  \
1003     if (DEFAULT_ABI != ABI_SOLARIS)                                     \
1004       {                                                                 \
1005         ctors_section ();                                               \
1006         fprintf (FILE, "%s", INT_ASM_OP);                               \
1007         assemble_name (FILE, NAME);                                     \
1008       }                                                                 \
1009     else                                                                \
1010       {                                                                 \
1011         init_section ();                                                \
1012         fputs ("\tbl ", FILE);                                          \
1013         assemble_name (FILE, NAME);                                     \
1014       }                                                                 \
1015     fputs ("\n", FILE);                                                 \
1016   } while (0)
1017
1018 /* A C statement (sans semicolon) to output an element in the table of
1019    global destructors.  */
1020 /* Override elfos.h definition.  */
1021 #undef  ASM_OUTPUT_DESTRUCTOR
1022 #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME)                                \
1023   do {                                                                  \
1024     if (DEFAULT_ABI != ABI_SOLARIS)                                     \
1025       {                                                                 \
1026         dtors_section ();                                               \
1027         fprintf (FILE, "%s", INT_ASM_OP);                               \
1028         assemble_name (FILE, NAME);                                     \
1029       }                                                                 \
1030     else                                                                \
1031       {                                                                 \
1032         fini_section ();                                                \
1033         fputs ("\tbl ", FILE);                                          \
1034         assemble_name (FILE, NAME);                                     \
1035       }                                                                 \
1036     fputs ("\n", FILE);                                                 \
1037   } while (0)
1038
1039 /* But, to make this work, we have to output the stabs for the function
1040    name *first*...  */
1041
1042 #define DBX_FUNCTION_FIRST
1043
1044 /* This is the end of what might become sysv4dbx.h.  */
1045
1046 /* Override rs6000.h definition.  */
1047 #undef  TARGET_VERSION
1048 #define TARGET_VERSION fprintf (stderr, " (PowerPC System V.4)");
1049 \f
1050 #define CPP_PREDEFINES \
1051   "-DPPC -Dunix -D__svr4__ -Asystem=unix -Asystem=svr4 -Acpu=powerpc -Amachine=powerpc"
1052
1053 /* Pass various options to the assembler.  */
1054 /* Override svr4.h definition.  */
1055 #undef  ASM_SPEC
1056 #define ASM_SPEC "%(asm_cpu) \
1057 %{.s: %{mregnames} %{mno-regnames}} %{.S: %{mregnames} %{mno-regnames}} \
1058 %{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} \
1059 %{mrelocatable} %{mrelocatable-lib} %{fpic:-K PIC} %{fPIC:-K PIC} \
1060 %{memb} %{!memb: %{msdata: -memb} %{msdata=eabi: -memb}} \
1061 %{mlittle} %{mlittle-endian} %{mbig} %{mbig-endian} \
1062 %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: \
1063     %{mcall-solaris: -mlittle -msolaris} \
1064     %{mcall-linux: -mbig} }}}}"
1065
1066 #define CC1_ENDIAN_BIG_SPEC ""
1067
1068 #define CC1_ENDIAN_LITTLE_SPEC "\
1069 %{!mstrict-align: %{!mno-strict-align: \
1070         -mstrict-align \
1071 }}"
1072
1073 #define CC1_ENDIAN_DEFAULT_SPEC "%(cc1_endian_big_spec)"
1074
1075 /* Pass -G xxx to the compiler and set correct endian mode.  */
1076 #define CC1_SPEC "%{G*} \
1077 %{mlittle: %(cc1_endian_little)} %{!mlittle: %{mlittle-endian: %(cc1_endian_little)}} \
1078 %{mbig: %(cc1_endian_big)} %{!mbig: %{mbig-endian: %(cc1_endian_big)}} \
1079 %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: \
1080     %{mcall-aixdesc: -mbig %(cc1_endian_big) } \
1081     %{mcall-solaris: -mlittle %(cc1_endian_little) } \
1082     %{mcall-linux: -mbig %(cc1_endian_big) } \
1083     %{!mcall-aixdesc: %{!mcall-solaris: %{!mcall-linux: \
1084             %(cc1_endian_default) \
1085     }}} \
1086 }}}} \
1087 %{mcall-solaris: -mregnames } \
1088 %{mno-sdata: -msdata=none } \
1089 %{meabi: %{!mcall-*: -mcall-sysv }} \
1090 %{!meabi: %{!mno-eabi: \
1091     %{mrelocatable: -meabi } \
1092     %{mcall-solaris: -mno-eabi } \
1093     %{mcall-linux: -mno-eabi }}} \
1094 %{msdata: -msdata=default} \
1095 %{mno-sdata: -msdata=none} \
1096 %{profile: -p}"
1097
1098 /* Don't put -Y P,<path> for cross compilers.  */
1099 #ifndef CROSS_COMPILE
1100 #define LINK_PATH_SPEC "\
1101 %{!R*:%{L*:-R %*}} \
1102 %{!nostdlib: %{!YP,*: \
1103     %{compat-bsd: \
1104         %{p:-Y P,/usr/ucblib:/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \
1105         %{!p:-Y P,/usr/ucblib:/usr/ccs/lib:/usr/lib}} \
1106         %{!R*: %{!L*: -R /usr/ucblib}} \
1107     %{!compat-bsd: \
1108         %{p:-Y P,/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \
1109         %{!p:-Y P,/usr/ccs/lib:/usr/lib}}}}"
1110
1111 #else
1112 #define LINK_PATH_SPEC ""
1113 #endif
1114
1115 /* Default starting address if specified.  */
1116 #define LINK_START_SPEC "\
1117 %{mads: %(link_start_ads) } \
1118 %{myellowknife: %(link_start_yellowknife) } \
1119 %{mmvme: %(link_start_mvme) } \
1120 %{msim: %(link_start_sim) } \
1121 %{mcall-linux: %(link_start_linux) } \
1122 %{mcall-solaris: %(link_start_solaris) } \
1123 %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mcall-linux: %{!mcall-solaris: %(link_start_default) }}}}}}"
1124
1125 #define LINK_START_DEFAULT_SPEC ""
1126
1127 /* Override svr4.h definition.  */
1128 #undef  LINK_SPEC
1129 #define LINK_SPEC "\
1130 %{h*} %{v:-V} %{G*} \
1131 %{Wl,*:%*} %{YP,*} %{R*} \
1132 %{Qy:} %{!Qn:-Qy} \
1133 %(link_shlib) \
1134 %{!Wl,-T*: %{!T*: %(link_start) }} \
1135 %(link_target) \
1136 %(link_os)"
1137
1138 /* For now, turn off shared libraries by default.  */
1139 #ifndef SHARED_LIB_SUPPORT
1140 #define NO_SHARED_LIB_SUPPORT
1141 #endif
1142
1143 #ifndef NO_SHARED_LIB_SUPPORT
1144 /* Shared libraries are default.  */
1145 #define LINK_SHLIB_SPEC "\
1146 %{!static: %(link_path) %{!R*:%{L*:-R %*}}} \
1147 %{mshlib: } \
1148 %{static:-dn -Bstatic} \
1149 %{shared:-G -dy -z text} \
1150 %{symbolic:-Bsymbolic -G -dy -z text}"
1151
1152 #else
1153 /* Shared libraries are not default.  */
1154 #define LINK_SHLIB_SPEC "\
1155 %{mshlib: %(link_path) } \
1156 %{!mshlib: %{!shared: %{!symbolic: -dn -Bstatic}}} \
1157 %{static: } \
1158 %{shared:-G -dy -z text %(link_path) } \
1159 %{symbolic:-Bsymbolic -G -dy -z text %(link_path) }"
1160 #endif
1161
1162 /* Override the default target of the linker.  */
1163 #define LINK_TARGET_SPEC "\
1164 %{mlittle: -oformat elf32-powerpcle } %{mlittle-endian: -oformat elf32-powerpcle } \
1165 %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: \
1166     %{mcall-solaris: -oformat elf32-powerpcle} \
1167   }}}}"
1168
1169 /* Any specific OS flags.  */
1170 #define LINK_OS_SPEC "\
1171 %{mads: %(link_os_ads) } \
1172 %{myellowknife: %(link_os_yellowknife) } \
1173 %{mmvme: %(link_os_mvme) } \
1174 %{msim: %(link_os_sim) } \
1175 %{mcall-linux: %(link_os_linux) } \
1176 %{mcall-solaris: %(link_os_solaris) } \
1177 %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mcall-linux: %{!mcall-solaris: %(link_os_default) }}}}}}"
1178
1179 #define LINK_OS_DEFAULT_SPEC ""
1180
1181 #define CPP_SYSV_SPEC \
1182 "%{mrelocatable*: -D_RELOCATABLE} \
1183 %{fpic: -D__PIC__=1 -D__pic__=1} \
1184 %{!fpic: %{fPIC: -D__PIC__=2 -D__pic__=2}} \
1185 %{mlong-double-128: -D__LONG_DOUBLE_128__=1} \
1186 %{!mlong-double-64: %(cpp_longdouble_default)} \
1187 %{mcall-sysv: -D_CALL_SYSV} \
1188 %{mcall-aix: -D_CALL_AIX} %{mcall-aixdesc: -D_CALL_AIX -D_CALL_AIXDESC} \
1189 %{!mcall-sysv: %{!mcall-aix: %{!mcall-aixdesc: %(cpp_sysv_default) }}} \
1190 %{msoft-float: -D_SOFT_FLOAT} \
1191 %{!msoft-float: %{!mhard-float: \
1192     %{mcpu=401: -D_SOFT_FLOAT} \
1193     %{mcpu=403: -D_SOFT_FLOAT} \
1194     %{mcpu=ec603e: -D_SOFT_FLOAT} \
1195     %{mcpu=801: -D_SOFT_FLOAT} \
1196     %{mcpu=821: -D_SOFT_FLOAT} \
1197     %{mcpu=823: -D_SOFT_FLOAT} \
1198     %{mcpu=860: -D_SOFT_FLOAT} \
1199     %{!mcpu*: %(cpp_float_default) }}}"
1200
1201 /* Whether floating point is disabled by default.  */
1202 #define CPP_FLOAT_DEFAULT_SPEC ""
1203
1204 /* Whether 'long double' is 128 bits by default.  */
1205 #define CPP_LONGDOUBLE_DEFAULT_SPEC ""
1206
1207 #define CPP_SYSV_DEFAULT_SPEC "-D_CALL_SYSV"
1208
1209 #define CPP_ENDIAN_BIG_SPEC "-D_BIG_ENDIAN -D__BIG_ENDIAN__ -Amachine=bigendian"
1210
1211 #define CPP_ENDIAN_LITTLE_SPEC "-D_LITTLE_ENDIAN -D__LITTLE_ENDIAN__ -Amachine=littleendian"
1212
1213 #define CPP_ENDIAN_SOLARIS_SPEC "-D__LITTLE_ENDIAN__ -Amachine=littleendian"
1214
1215 /* For solaris, don't define _LITTLE_ENDIAN, it conflicts with a header file.  */
1216 #define CPP_ENDIAN_SPEC \
1217 "%{mlittle: %(cpp_endian_little) } \
1218 %{mlittle-endian: %(cpp_endian_little) } \
1219 %{mbig: %(cpp_endian_big) } \
1220 %{mbig-endian: %(cpp_endian_big) } \
1221 %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: \
1222     %{mcall-solaris: %(cpp_endian_solaris) } \
1223     %{mcall-linux: %(cpp_endian_big) } \
1224     %{mcall-aixdesc:  %(cpp_endian_big) } \
1225     %{!mcall-solaris: %{!mcall-linux: %{!mcall-aixdesc: %(cpp_endian_default) }}}}}}}"
1226
1227 #define CPP_ENDIAN_DEFAULT_SPEC "%(cpp_endian_big)"
1228
1229 /* Override rs6000.h definition.  */
1230 #undef  CPP_SPEC
1231 #define CPP_SPEC "%{posix: -D_POSIX_SOURCE} %(cpp_sysv) %(cpp_endian) %(cpp_cpu) \
1232 %{mads: %(cpp_os_ads) } \
1233 %{myellowknife: %(cpp_os_yellowknife) } \
1234 %{mmvme: %(cpp_os_mvme) } \
1235 %{msim: %(cpp_os_sim) } \
1236 %{mcall-linux: %(cpp_os_linux) } \
1237 %{mcall-solaris: %(cpp_os_solaris) } \
1238 %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mcall-linux: %{!mcall-solaris: %(cpp_os_default) }}}}}}"
1239
1240 #define CPP_OS_DEFAULT_SPEC ""
1241
1242 /* Override svr4.h definition.  */
1243 #undef  STARTFILE_SPEC
1244 #define STARTFILE_SPEC "\
1245 %{mads: %(startfile_ads) } \
1246 %{myellowknife: %(startfile_yellowknife) } \
1247 %{mmvme: %(startfile_mvme) } \
1248 %{msim: %(startfile_sim) } \
1249 %{mcall-linux: %(startfile_linux) } \
1250 %{mcall-solaris: %(startfile_solaris) } \
1251 %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mcall-linux: %{!mcall-solaris: %(startfile_default) }}}}}}"
1252
1253 #define STARTFILE_DEFAULT_SPEC ""
1254
1255 /* Override svr4.h definition.  */
1256 #undef  LIB_SPEC
1257 #define LIB_SPEC "\
1258 %{mads: %(lib_ads) } \
1259 %{myellowknife: %(lib_yellowknife) } \
1260 %{mmvme: %(lib_mvme) } \
1261 %{msim: %(lib_sim) } \
1262 %{mcall-linux: %(lib_linux) } \
1263 %{mcall-solaris: %(lib_solaris) } \
1264 %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mcall-linux: %{!mcall-solaris: %(lib_default) }}}}}}"
1265
1266 #define LIB_DEFAULT_SPEC ""
1267
1268 /* Override svr4.h definition.  */
1269 #undef  ENDFILE_SPEC
1270 #define ENDFILE_SPEC "\
1271 %{mads: %(endfile_ads)} \
1272 %{myellowknife: %(endfile_yellowknife)} \
1273 %{mmvme: %(endfile_mvme)} \
1274 %{msim: %(endfile_sim)} \
1275 %{mcall-linux: %(endfile_linux) } \
1276 %{mcall-solaris: %(endfile_solaris)} \
1277 %{mvxworks: %(endfile_vxworks) } \
1278 %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mcall-linux: %{!mcall-solaris: %{!mvxworks: %(endfile_default) }}}}}}}"
1279
1280 #define ENDFILE_DEFAULT_SPEC ""
1281
1282 /* Motorola ADS support.  */
1283 #define LIB_ADS_SPEC "--start-group -lads -lc --end-group"
1284
1285 #define STARTFILE_ADS_SPEC "ecrti.o%s crt0.o%s crtbegin.o%s"
1286
1287 #define ENDFILE_ADS_SPEC "crtend.o%s ecrtn.o%s"
1288
1289 #define LINK_START_ADS_SPEC "-T ads.ld%s"
1290
1291 #define LINK_OS_ADS_SPEC ""
1292
1293 #define CPP_OS_ADS_SPEC ""
1294
1295 /* Motorola Yellowknife support.  */
1296 #define LIB_YELLOWKNIFE_SPEC "--start-group -lyk -lc --end-group"
1297
1298 #define STARTFILE_YELLOWKNIFE_SPEC "ecrti.o%s crt0.o%s crtbegin.o%s"
1299
1300 #define ENDFILE_YELLOWKNIFE_SPEC "crtend.o%s ecrtn.o%s"
1301
1302 #define LINK_START_YELLOWKNIFE_SPEC "-T yellowknife.ld%s"
1303
1304 #define LINK_OS_YELLOWKNIFE_SPEC ""
1305
1306 #define CPP_OS_YELLOWKNIFE_SPEC ""
1307
1308 /* Motorola MVME support.  */
1309 #define LIB_MVME_SPEC "--start-group -lmvme -lc --end-group"
1310
1311 #define STARTFILE_MVME_SPEC "ecrti.o%s crt0.o%s crtbegin.o%s"
1312
1313 #define ENDFILE_MVME_SPEC "crtend.o%s ecrtn.o%s"
1314
1315 #define LINK_START_MVME_SPEC "-Ttext 0x40000"
1316
1317 #define LINK_OS_MVME_SPEC ""
1318
1319 #define CPP_OS_MVME_SPEC ""
1320
1321 /* PowerPC simulator based on netbsd system calls support.  */
1322 #define LIB_SIM_SPEC "--start-group -lsim -lc --end-group"
1323
1324 #define STARTFILE_SIM_SPEC "ecrti.o%s sim-crt0.o%s crtbegin.o%s"
1325
1326 #define ENDFILE_SIM_SPEC "crtend.o%s ecrtn.o%s"
1327
1328 #define LINK_START_SIM_SPEC ""
1329
1330 #define LINK_OS_SIM_SPEC "-m elf32ppcsim"
1331
1332 #define CPP_OS_SIM_SPEC ""
1333
1334 /* GNU/Linux support.  */
1335 #ifdef USE_GNULIBC_1
1336 #define LIB_LINUX_SPEC "%{mnewlib: --start-group -llinux -lc --end-group } \
1337 %{!mnewlib: -lc }"
1338 #else
1339 #define LIB_LINUX_SPEC "%{mnewlib: --start-group -llinux -lc --end-group } \
1340 %{!mnewlib: %{shared:-lc} %{!shared: %{pthread:-lpthread } \
1341 %{profile:-lc_p} %{!profile:-lc}}}"
1342 #endif
1343
1344 #define STARTFILE_LINUX_SPEC "\
1345 %{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} \
1346 %{mnewlib: ecrti.o%s} %{!mnewlib: crti.o%s} \
1347 %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
1348
1349 #define ENDFILE_LINUX_SPEC "%{!shared:crtend.o%s} %{shared:crtendS.o%s} \
1350 %{mnewlib: ecrtn.o%s} %{!mnewlib: crtn.o%s}"
1351
1352 #define LINK_START_LINUX_SPEC ""
1353
1354 #define LINK_OS_LINUX_SPEC "-m elf32ppclinux %{!shared: %{!static: \
1355   %{rdynamic:-export-dynamic} \
1356   %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}"
1357
1358 #ifdef USE_GNULIBC_1
1359 #define CPP_OS_LINUX_SPEC "-D__unix__ -D__linux__               \
1360 %{!undef:                                                       \
1361   %{!ansi:                                                      \
1362     %{!std=*:-Dunix -D__unix -Dlinux -D__linux}                 \
1363     %{std=gnu*:-Dunix -D__unix -Dlinux -D__linux}}}             \
1364 -Asystem=unix -Asystem=posix"
1365 #else
1366 #define CPP_OS_LINUX_SPEC "-D__unix__ -D__linux__               \
1367 %{!undef:                                                       \
1368   %{!ansi:                                                      \
1369     %{!std=*:-Dunix -D__unix -Dlinux -D__linux}                 \
1370     %{std=gnu*:-Dunix -D__unix -Dlinux -D__linux}}}             \
1371 -Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT}"
1372 #endif
1373
1374 /* Solaris support.  */
1375 /* For Solaris, Gcc automatically adds in one of the files
1376    /usr/ccs/lib/values-Xc.o, /usr/ccs/lib/values-Xa.o, or
1377    /usr/ccs/lib/values-Xt.o for each final link step (depending upon the other
1378    gcc options selected, such as -traditional and -ansi).  These files each
1379    contain one (initialized) copy of a special variable called `_lib_version'.
1380    Each one of these files has `_lib_version' initialized to a different (enum)
1381    value.  The SVR4 library routines query the value of `_lib_version' at run
1382    to decide how they should behave.  Specifically, they decide (based upon the
1383    value of `_lib_version') if they will act in a strictly ANSI conforming
1384    manner or not.  */
1385
1386 #define LIB_SOLARIS_SPEC "\
1387 %{mnewlib: --start-group -lsolaris -lc --end-group } \
1388 %{!mnewlib: \
1389     %{ansi:values-Xc.o%s} \
1390     %{!ansi: \
1391         %{traditional:values-Xt.o%s} \
1392         %{!traditional:values-Xa.o%s}} \
1393         %{compat-bsd:-lucb -lsocket -lnsl -lelf -laio} \
1394     %{solaris-cclib: /opt/SUNWspro/SC4.0/lib/libabi.a} \
1395     %{!shared: %{!symbolic: -lc }}}"
1396
1397 #define STARTFILE_SOLARIS_SPEC "\
1398 %{!msolaris-cclib: scrti.o%s scrt0.o%s} \
1399 %{msolaris-cclib: /opt/SUNWspro/SC4.0/lib/crti.o%s /opt/SUNWspro/SC4.0/lib/crt1.o%s} \
1400 %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
1401
1402 #define ENDFILE_SOLARIS_SPEC "\
1403 %{!shared:crtend.o%s} %{shared:crtendS.o%s} \
1404 %{!msolaris-cclib: scrtn.o%s} \
1405 %{msolaris-cclib: /opt/SUNWspro/SC4.0/lib/crtn.o%s}"
1406
1407 #define LINK_START_SOLARIS_SPEC ""
1408
1409 #define LINK_OS_SOLARIS_SPEC ""
1410
1411 #define CPP_OS_SOLARIS_SPEC "-D__ppc -D__sun__=1 -D__unix__ -D__svr4__  -D__SVR4__ \
1412 %{!undef:%{!ansi:%{!std=*:-Dsun=1 -Dunix -DSVR4 -D__EXTENSIONS__} \
1413                %{std=gnu*:-Dsun=1 -Dunix -DSVR4 -D__EXTENSIONS__}}} \
1414 -Amachine=prep"
1415
1416 /* VxWorks support.  */
1417 /* VxWorks does all the library stuff itself.  */
1418 #define LIB_VXWORKS_SPEC ""
1419
1420 /* VxWorks provides the functionality of crt0.o and friends itself.  */
1421
1422 #define STARTFILE_VXWORKS_SPEC ""
1423
1424 #define ENDFILE_VXWORKS_SPEC ""
1425
1426 /* Because it uses ld -r, vxworks has no start/end files, nor starting
1427    address.  */
1428
1429 #define LINK_START_VXWORKS_SPEC ""
1430
1431 #define LINK_OS_VXWORKS_SPEC "-r"
1432
1433 #define CPP_OS_VXWORKS_SPEC "\
1434 -DCPU_FAMILY=PPC \
1435 %{!mcpu*: \
1436   %{mpowerpc*: -DCPU=PPC603} \
1437   %{!mno-powerpc: -DCPU=PPC603}} \
1438 %{mcpu=powerpc: -DCPU=PPC603} \
1439 %{mcpu=401: -DCPU=PPC403} \
1440 %{mcpu=403: -DCPU=PPC403} \
1441 %{mcpu=601: -DCPU=PPC601} \
1442 %{mcpu=602: -DCPU=PPC603} \
1443 %{mcpu=603: -DCPU=PPC603} \
1444 %{mcpu=603e: -DCPU=PPC603} \
1445 %{mcpu=ec603e: -DCPU=PPC603} \
1446 %{mcpu=604: -DCPU=PPC604} \
1447 %{mcpu=604e: -DCPU=PPC604} \
1448 %{mcpu=620: -DCPU=PPC604} \
1449 %{mcpu=740: -DCPU=PPC603} \
1450 %{mcpu=750: -DCPU=PPC603} \
1451 %{mcpu=801: -DCPU=PPC603} \
1452 %{mcpu=821: -DCPU=PPC603} \
1453 %{mcpu=823: -DCPU=PPC603} \
1454 %{mcpu=860: -DCPU=PPC603}"
1455
1456 /* Define any extra SPECS that the compiler needs to generate.  */
1457 /* Override rs6000.h definition.  */
1458 #undef  SUBTARGET_EXTRA_SPECS
1459 #define SUBTARGET_EXTRA_SPECS                                           \
1460   { "cpp_sysv",                 CPP_SYSV_SPEC },                        \
1461   { "cpp_sysv_default",         CPP_SYSV_DEFAULT_SPEC },                \
1462   { "cpp_endian_default",       CPP_ENDIAN_DEFAULT_SPEC },              \
1463   { "cpp_endian",               CPP_ENDIAN_SPEC },                      \
1464   { "lib_ads",                  LIB_ADS_SPEC },                         \
1465   { "lib_yellowknife",          LIB_YELLOWKNIFE_SPEC },                 \
1466   { "lib_mvme",                 LIB_MVME_SPEC },                        \
1467   { "lib_sim",                  LIB_SIM_SPEC },                         \
1468   { "lib_linux",                LIB_LINUX_SPEC },                       \
1469   { "lib_solaris",              LIB_SOLARIS_SPEC },                     \
1470   { "lib_vxworks",              LIB_VXWORKS_SPEC },                     \
1471   { "lib_default",              LIB_DEFAULT_SPEC },                     \
1472   { "startfile_ads",            STARTFILE_ADS_SPEC },                   \
1473   { "startfile_yellowknife",    STARTFILE_YELLOWKNIFE_SPEC },           \
1474   { "startfile_mvme",           STARTFILE_MVME_SPEC },                  \
1475   { "startfile_sim",            STARTFILE_SIM_SPEC },                   \
1476   { "startfile_linux",          STARTFILE_LINUX_SPEC },                 \
1477   { "startfile_solaris",        STARTFILE_SOLARIS_SPEC },               \
1478   { "startfile_vxworks",        STARTFILE_VXWORKS_SPEC },               \
1479   { "startfile_default",        STARTFILE_DEFAULT_SPEC },               \
1480   { "endfile_ads",              ENDFILE_ADS_SPEC },                     \
1481   { "endfile_yellowknife",      ENDFILE_YELLOWKNIFE_SPEC },             \
1482   { "endfile_mvme",             ENDFILE_MVME_SPEC },                    \
1483   { "endfile_sim",              ENDFILE_SIM_SPEC },                     \
1484   { "endfile_linux",            ENDFILE_LINUX_SPEC },                   \
1485   { "endfile_solaris",          ENDFILE_SOLARIS_SPEC },                 \
1486   { "endfile_vxworks",          ENDFILE_VXWORKS_SPEC },                 \
1487   { "endfile_default",          ENDFILE_DEFAULT_SPEC },                 \
1488   { "link_path",                LINK_PATH_SPEC },                       \
1489   { "link_shlib",               LINK_SHLIB_SPEC },                      \
1490   { "link_target",              LINK_TARGET_SPEC },                     \
1491   { "link_start",               LINK_START_SPEC },                      \
1492   { "link_start_ads",           LINK_START_ADS_SPEC },                  \
1493   { "link_start_yellowknife",   LINK_START_YELLOWKNIFE_SPEC },          \
1494   { "link_start_mvme",          LINK_START_MVME_SPEC },                 \
1495   { "link_start_sim",           LINK_START_SIM_SPEC },                  \
1496   { "link_start_linux",         LINK_START_LINUX_SPEC },                \
1497   { "link_start_solaris",       LINK_START_SOLARIS_SPEC },              \
1498   { "link_start_vxworks",       LINK_START_VXWORKS_SPEC },              \
1499   { "link_start_default",       LINK_START_DEFAULT_SPEC },              \
1500   { "link_os",                  LINK_OS_SPEC },                         \
1501   { "link_os_ads",              LINK_OS_ADS_SPEC },                     \
1502   { "link_os_yellowknife",      LINK_OS_YELLOWKNIFE_SPEC },             \
1503   { "link_os_mvme",             LINK_OS_MVME_SPEC },                    \
1504   { "link_os_sim",              LINK_OS_SIM_SPEC },                     \
1505   { "link_os_linux",            LINK_OS_LINUX_SPEC },                   \
1506   { "link_os_solaris",          LINK_OS_SOLARIS_SPEC },                 \
1507   { "link_os_vxworks",          LINK_OS_VXWORKS_SPEC },                 \
1508   { "link_os_default",          LINK_OS_DEFAULT_SPEC },                 \
1509   { "cc1_endian_big",           CC1_ENDIAN_BIG_SPEC },                  \
1510   { "cc1_endian_little",        CC1_ENDIAN_LITTLE_SPEC },               \
1511   { "cc1_endian_default",       CC1_ENDIAN_DEFAULT_SPEC },              \
1512   { "cpp_endian_big",           CPP_ENDIAN_BIG_SPEC },                  \
1513   { "cpp_endian_little",        CPP_ENDIAN_LITTLE_SPEC },               \
1514   { "cpp_endian_solaris",       CPP_ENDIAN_SOLARIS_SPEC },              \
1515   { "cpp_float_default",        CPP_FLOAT_DEFAULT_SPEC },               \
1516   { "cpp_longdouble_default",   CPP_LONGDOUBLE_DEFAULT_SPEC },          \
1517   { "cpp_os_ads",               CPP_OS_ADS_SPEC },                      \
1518   { "cpp_os_yellowknife",       CPP_OS_YELLOWKNIFE_SPEC },              \
1519   { "cpp_os_mvme",              CPP_OS_MVME_SPEC },                     \
1520   { "cpp_os_sim",               CPP_OS_SIM_SPEC },                      \
1521   { "cpp_os_linux",             CPP_OS_LINUX_SPEC },                    \
1522   { "cpp_os_solaris",           CPP_OS_SOLARIS_SPEC },                  \
1523   { "cpp_os_vxworks",           CPP_OS_VXWORKS_SPEC },                  \
1524   { "cpp_os_default",           CPP_OS_DEFAULT_SPEC },
1525
1526 /* Define this macro as a C expression for the initializer of an
1527    array of string to tell the driver program which options are
1528    defaults for this target and thus do not need to be handled
1529    specially when using `MULTILIB_OPTIONS'.
1530
1531    Do not define this macro if `MULTILIB_OPTIONS' is not defined in
1532    the target makefile fragment or if none of the options listed in
1533    `MULTILIB_OPTIONS' are set by default.  *Note Target Fragment::.  */
1534
1535 #define MULTILIB_DEFAULTS { "mbig", "mcall-sysv" }
1536
1537 /* Define this macro if the code for function profiling should come
1538    before the function prologue.  Normally, the profiling code comes
1539    after.  */
1540 #define PROFILE_BEFORE_PROLOGUE 1
1541
1542 /* Function name to call to do profiling.  */
1543 #define RS6000_MCOUNT "_mcount"
1544
1545 /* Define this macro (to a value of 1) if you want to support the
1546    Win32 style pragmas #pragma pack(push,<n>)' and #pragma
1547    pack(pop)'.  The pack(push,<n>) pragma specifies the maximum
1548    alignment (in bytes) of fields within a structure, in much the
1549    same way as the __aligned__' and __packed__' __attribute__'s
1550    do.  A pack value of zero resets the behaviour to the default.
1551    Successive invocations of this pragma cause the previous values to
1552    be stacked, so that invocations of #pragma pack(pop)' will return
1553    to the previous value.  */
1554
1555 #define HANDLE_PRAGMA_PACK_PUSH_POP 1
1556
1557 /* Define library calls for quad FP operations.  These are all part of the
1558    PowerPC 32bit ABI.  */
1559 #define ADDTF3_LIBCALL "_q_add"
1560 #define DIVTF3_LIBCALL "_q_div"
1561 #define EXTENDDFTF2_LIBCALL "_q_dtoq"
1562 #define EQTF2_LIBCALL "_q_feq"
1563 #define GETF2_LIBCALL "_q_fge"
1564 #define GTTF2_LIBCALL "_q_fgt"
1565 #define LETF2_LIBCALL "_q_fle"
1566 #define LTTF2_LIBCALL "_q_flt"
1567 #define NETF2_LIBCALL "_q_fne"
1568 #define FLOATSITF2_LIBCALL "_q_itoq"
1569 #define MULTF3_LIBCALL "_q_mul"
1570 #define NEGTF2_LIBCALL "_q_neg"
1571 #define TRUNCTFDF2_LIBCALL "_q_qtod"
1572 #define FIX_TRUNCTFSI2_LIBCALL "_q_qtoi"
1573 #define TRUNCTFSF2_LIBCALL "_q_qtos"
1574 #define FIXUNS_TRUNCTFSI2_LIBCALL "_q_qtou"
1575 #define SQRTTF_LIBCALL "_q_sqrt"
1576 #define EXTENDSFTF2_LIBCALL "_q_stoq"
1577 #define SUBTF3_LIBCALL "_q_sub"
1578 #define FLOATUNSSITF2_LIBCALL "_q_utoq"
1579
1580 #define INIT_TARGET_OPTABS                                              \
1581   do {                                                                  \
1582     if (TARGET_HARD_FLOAT)                                              \
1583       {                                                                 \
1584         add_optab->handlers[(int) TFmode].libfunc                       \
1585           = init_one_libfunc (ADDTF3_LIBCALL);                          \
1586         sub_optab->handlers[(int) TFmode].libfunc                       \
1587           = init_one_libfunc (SUBTF3_LIBCALL);                          \
1588         neg_optab->handlers[(int) TFmode].libfunc                       \
1589           = init_one_libfunc (NEGTF2_LIBCALL);                          \
1590         smul_optab->handlers[(int) TFmode].libfunc                      \
1591           = init_one_libfunc (MULTF3_LIBCALL);                          \
1592         flodiv_optab->handlers[(int) TFmode].libfunc                    \
1593           = init_one_libfunc (DIVTF3_LIBCALL);                          \
1594         eqtf2_libfunc = init_one_libfunc (EQTF2_LIBCALL);               \
1595         netf2_libfunc = init_one_libfunc (NETF2_LIBCALL);               \
1596         gttf2_libfunc = init_one_libfunc (GTTF2_LIBCALL);               \
1597         getf2_libfunc = init_one_libfunc (GETF2_LIBCALL);               \
1598         lttf2_libfunc = init_one_libfunc (LTTF2_LIBCALL);               \
1599         letf2_libfunc = init_one_libfunc (LETF2_LIBCALL);               \
1600         trunctfsf2_libfunc = init_one_libfunc (TRUNCTFSF2_LIBCALL);     \
1601         trunctfdf2_libfunc = init_one_libfunc (TRUNCTFDF2_LIBCALL);     \
1602         extendsftf2_libfunc = init_one_libfunc (EXTENDSFTF2_LIBCALL);   \
1603         extenddftf2_libfunc = init_one_libfunc (EXTENDDFTF2_LIBCALL);   \
1604         floatsitf_libfunc = init_one_libfunc (FLOATSITF2_LIBCALL);      \
1605         fixtfsi_libfunc = init_one_libfunc (FIX_TRUNCTFSI2_LIBCALL);    \
1606         fixunstfsi_libfunc                                              \
1607           = init_one_libfunc (FIXUNS_TRUNCTFSI2_LIBCALL);               \
1608         if (TARGET_PPC_GPOPT || TARGET_POWER2)                          \
1609           sqrt_optab->handlers[(int) TFmode].libfunc                    \
1610             = init_one_libfunc (SQRTTF_LIBCALL);                        \
1611       }                                                                 \
1612   } while (0)