OSDN Git Service

Add support for -gstabs on SVR4 configurations.
[pf3gnuchains/gcc-fork.git] / gcc / config / svr4.h
1 /* svr4.h  --  operating system specific defines to be used when
2    targeting GCC for some generic System V Release 4 system.
3    Copyright (C) 1991, 1994 Free Software Foundation, Inc.
4    Contributed by Ron Guilmette (rfg@netcom.com).
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, 675 Mass Ave, Cambridge, MA 02139, USA.
21
22    To use this file, make up a file with a name like:
23
24         ?????svr4.h
25
26    where ????? is replaced by the name of the basic hardware that you
27    are targeting for.  Then, in the file ?????svr4.h, put something
28    like:
29
30         #include "?????.h"
31         #include "svr4.h"
32
33    followed by any really system-specific defines (or overrides of
34    defines) which you find that you need.  For example, CPP_PREDEFINES
35    is defined here with only the defined -Dunix and -DSVR4.  You should
36    probably override that in your target-specific ?????svr4.h file
37    with a set of defines that includes these, but also contains an
38    appropriate define for the type of hardware that you are targeting.
39 */
40
41 /* Define a symbol indicating that we are using svr4.h.  */
42 #define USING_SVR4_H
43
44 /* For the sake of libgcc2.c, indicate target supports atexit.  */
45 #define HAVE_ATEXIT
46
47 /* Cpp, assembler, linker, library, and startfile spec's.  */
48
49 /* This defines which switch letters take arguments.  On svr4, most of
50    the normal cases (defined in gcc.c) apply, and we also have -h* and
51    -z* options (for the linker).  Note however that there is no such
52    thing as a -T option for svr4.  */
53
54 #define SWITCH_TAKES_ARG(CHAR) \
55   (   (CHAR) == 'D' \
56    || (CHAR) == 'U' \
57    || (CHAR) == 'o' \
58    || (CHAR) == 'e' \
59    || (CHAR) == 'u' \
60    || (CHAR) == 'I' \
61    || (CHAR) == 'm' \
62    || (CHAR) == 'L' \
63    || (CHAR) == 'A' \
64    || (CHAR) == 'h' \
65    || (CHAR) == 'z')
66
67 /* This defines which multi-letter switches take arguments.  On svr4,
68    there are no such switches except those implemented by GCC itself.  */
69
70 #define WORD_SWITCH_TAKES_ARG(STR)                      \
71  (DEFAULT_WORD_SWITCH_TAKES_ARG (STR)                   \
72   && strcmp (STR, "Tdata") && strcmp (STR, "Ttext")     \
73   && strcmp (STR, "Tbss"))
74
75 /* You should redefine CPP_PREDEFINES in any file which includes this one.
76    The definition should be appropriate for the type of target system
77    involved, and it should include any -A (assertion) options which are
78    appropriate for the given target system.  */
79 #undef CPP_PREDEFINES
80
81 /* Provide an ASM_SPEC appropriate for svr4.  Here we try to support as
82    many of the specialized svr4 assembler options as seems reasonable,
83    given that there are certain options which we can't (or shouldn't)
84    support directly due to the fact that they conflict with other options 
85    for other svr4 tools (e.g. ld) or with other options for GCC itself.
86    For example, we don't support the -o (output file) or -R (remove
87    input file) options because GCC already handles these things.  We
88    also don't support the -m (run m4) option for the assembler because
89    that conflicts with the -m (produce load map) option of the svr4
90    linker.  We do however allow passing arbitrary options to the svr4
91    assembler via the -Wa, option.
92
93    Note that gcc doesn't allow a space to follow -Y in a -Ym,* or -Yd,*
94    option.
95 */
96
97 #undef ASM_SPEC
98 #define ASM_SPEC \
99   "%{V} %{v:%{!V:-V}} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*}"
100
101 /* svr4 assemblers need the `-' (indicating input from stdin) to come after
102    the -o option (and its argument) for some reason.  If we try to put it
103    before the -o option, the assembler will try to read the file named as
104    the output file in the -o option as an input file (after it has already
105    written some stuff to it) and the binary stuff contained therein will
106    cause totally confuse the assembler, resulting in many spurious error
107    messages.  */
108
109 #undef ASM_FINAL_SPEC
110 #define ASM_FINAL_SPEC "%{pipe:-}"
111
112 /* Under svr4, the normal location of the `ld' and `as' programs is the
113    /usr/ccs/bin directory.  */
114
115 #undef MD_EXEC_PREFIX
116 #define MD_EXEC_PREFIX "/usr/ccs/bin/"
117
118 /* Under svr4, the normal location of the various *crt*.o files is the
119    /usr/ccs/lib directory.  */
120
121 #undef MD_STARTFILE_PREFIX
122 #define MD_STARTFILE_PREFIX "/usr/ccs/lib/"
123
124 /* Provide a LIB_SPEC appropriate for svr4.  Here we tack on the default
125    standard C library (unless we are building a shared library) followed by
126    our own magical crtend.o file (see crtstuff.c) which provides part of
127    the support for getting C++ file-scope static object constructed before
128    entering `main', followed by the normal svr3/svr4 "finalizer" file,
129    which is either `gcrtn.o' or `crtn.o'.  */
130
131 #undef  LIB_SPEC
132 #define LIB_SPEC \
133   "%{!shared:%{!symbolic:-lc}} \
134   crtend.o%s \
135   %{!shared:%{!symbolic:%{pg:gcrtn.o}%{!pg:crtn.o%s}}}"
136
137 /* Provide a LINK_SPEC appropriate for svr4.  Here we provide support
138    for the special GCC options -static, -shared, and -symbolic which
139    allow us to link things in one of these three modes by applying the
140    appropriate combinations of options at link-time.  We also provide
141    support here for as many of the other svr4 linker options as seems
142    reasonable, given that some of them conflict with options for other
143    svr4 tools (e.g. the assembler).  In particular, we do support the
144    -h*, -z*, -V, -b, -t, -Qy, -Qn, and -YP* options here, and the -e*,
145    -l*, -o*, -r, -s, -u*, and -L* options are directly supported
146    by gcc.c itself.  We don't directly support the -m (generate load
147    map) option because that conflicts with the -m (run m4) option of
148    the svr4 assembler.  We also don't directly support the svr4 linker's
149    -I* or -M* options because these conflict with existing GCC options.
150    We do however allow passing arbitrary options to the svr4 linker
151    via the -Wl, option.  We don't support the svr4 linker's -a option
152    at all because it is totally useless and because it conflicts with
153    GCC's own -a option.
154
155    Note that gcc doesn't allow a space to follow -Y in a -YP,* option.
156
157    When the -G link option is used (-shared and -symbolic) a final link is
158    not being done.  */
159
160 #undef  LINK_SPEC
161 #define LINK_SPEC "%{h*} %{V} %{v:%{!V:-V}} \
162                    %{b} %{Wl,*:%*} \
163                    %{static:-dn -Bstatic} \
164                    %{shared:-G -dy} \
165                    %{symbolic:-Bsymbolic -G -dy} \
166                    %{G:-G} \
167                    %{YP,*} \
168                    %{!YP,*:%{p:-Y P,/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \
169                     %{!p:-Y P,/usr/ccs/lib:/usr/lib}} \
170                    %{Qy:} %{!Qn:-Qy}"
171
172 /* Gcc automatically adds in one of the files /usr/ccs/lib/values-Xc.o,
173    /usr/ccs/lib/values-Xa.o, or /usr/ccs/lib/values-Xt.o for each final
174    link step (depending upon the other gcc options selected, such as
175    -traditional and -ansi).  These files each contain one (initialized)
176    copy of a special variable called `_lib_version'.  Each one of these
177    files has `_lib_version' initialized to a different (enum) value.
178    The SVR4 library routines query the value of `_lib_version' at run
179    to decide how they should behave.  Specifically, they decide (based
180    upon the value of `_lib_version') if they will act in a strictly ANSI
181    conforming manner or not.
182 */
183
184 #undef  STARTFILE_SPEC
185 #define STARTFILE_SPEC "%{!shared: \
186                          %{!symbolic: \
187                           %{pg:gcrt1.o%s}%{!pg:%{p:mcrt1.o%s}%{!p:crt1.o%s}} \
188                           %{pg:gcrti.o%s}%{!pg:crti.o%s} \
189                           %{ansi:values-Xc.o%s} \
190                           %{!ansi: \
191                            %{traditional:values-Xt.o%s} \
192                            %{!traditional:values-Xa.o%s}}}} crtbegin.o%s"
193
194 /* Attach a special .ident directive to the end of the file to identify
195    the version of GCC which compiled this code.  The format of the
196    .ident string is patterned after the ones produced by native svr4
197    C compilers.  */
198
199 #define IDENT_ASM_OP ".ident"
200
201 #define ASM_FILE_END(FILE)                                      \
202 do {                                                            \
203      fprintf ((FILE), "\t%s\t\"GCC: (GNU) %s\"\n",              \
204               IDENT_ASM_OP, version_string);                    \
205    } while (0)
206
207 /* Allow #sccs in preprocessor.  */
208
209 #define SCCS_DIRECTIVE
210
211 /* Output #ident as a .ident.  */
212
213 #define ASM_OUTPUT_IDENT(FILE, NAME) \
214   fprintf (FILE, "\t%s\t\"%s\"\n", IDENT_ASM_OP, NAME);
215
216 /* Use periods rather than dollar signs in special g++ assembler names.  */
217
218 #define NO_DOLLAR_IN_LABEL
219
220 /* Writing `int' for a bitfield forces int alignment for the structure.  */
221
222 #define PCC_BITFIELD_TYPE_MATTERS 1
223
224 /* Implicit library calls should use memcpy, not bcopy, etc.  */
225
226 #define TARGET_MEM_FUNCTIONS
227
228 /* Handle #pragma weak and #pragma pack.  */
229
230 #define HANDLE_SYSV_PRAGMA
231
232 /* System V Release 4 uses DWARF debugging info.  */
233
234 #define DWARF_DEBUGGING_INFO
235
236 /* The numbers used to denote specific machine registers in the System V
237    Release 4 DWARF debugging information are quite likely to be totally
238    different from the numbers used in BSD stabs debugging information
239    for the same kind of target machine.  Thus, we undefine the macro
240    DBX_REGISTER_NUMBER here as an extra inducement to get people to
241    provide proper machine-specific definitions of DBX_REGISTER_NUMBER
242    (which is also used to provide DWARF registers numbers in dwarfout.c)
243    in their tm.h files which include this file.  */
244
245 #undef DBX_REGISTER_NUMBER
246
247 /* gas on SVR4 supports the use of .stabs.  Permit -gstabs to be used
248    in general, although it will only work when using gas.  */
249
250 #define DBX_DEBUGGING_INFO
251
252 /* Use DWARF debugging info by default.  */
253
254 #define PREFERRED_DEBUGGING_TYPE DWARF_DEBUG
255
256 /* Make LBRAC and RBRAC addresses relative to the start of the
257    function.  The native Solaris stabs debugging format works this
258    way, gdb expects it, and it reduces the number of relocation
259    entries.  */
260
261 #define DBX_BLOCKS_FUNCTION_RELATIVE 1
262
263 /* When using stabs, gcc2_compiled must be a stabs entry, not an
264    ordinary symbol, or gdb won't see it.  Furthermore, since gdb reads
265    the input piecemeal, starting with each N_SO, it's a lot easier if
266    the gcc2 flag symbol is *after* the N_SO rather than before it.  So
267    we emit an N_OPT stab there.  */
268
269 #define ASM_IDENTIFY_GCC(FILE)                                          \
270 do                                                                      \
271   {                                                                     \
272     if (write_symbols != DBX_DEBUG)                                     \
273       fputs ("gcc2_compiled.:\n", FILE);                                \
274   }                                                                     \
275 while (0)
276
277 #define ASM_IDENTIFY_GCC_AFTER_SOURCE(FILE)                             \
278 do                                                                      \
279   {                                                                     \
280     if (write_symbols == DBX_DEBUG)                                     \
281       fputs ("\t.stabs\t\"gcc2_compiled.\", 0x3c, 0, 0, 0\n", FILE);    \
282   }                                                                     \
283 while (0)
284
285 /* Like block addresses, stabs line numbers are relative to the
286    current function.  */
287
288 #define ASM_OUTPUT_SOURCE_LINE(file, line)                              \
289 do                                                                      \
290   {                                                                     \
291     static int sym_lineno = 1;                                          \
292     fprintf (file, ".stabn 68,0,%d,.LM%d-%s\n.LM%d:\n",                 \
293              line, sym_lineno,                                          \
294              XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0),      \
295              sym_lineno);                                               \
296     sym_lineno += 1;                                                    \
297   }                                                                     \
298 while (0)
299
300 /* In order for relative line numbers to work, we must output the
301    stabs entry for the function name first.  */
302
303 #define DBX_FUNCTION_FIRST
304
305 /* Define the actual types of some ANSI-mandated types.  (These
306    definitions should work for most SVR4 systems).  */
307
308 #undef SIZE_TYPE
309 #define SIZE_TYPE "unsigned int"
310
311 #undef PTRDIFF_TYPE
312 #define PTRDIFF_TYPE "int"
313
314 #undef WCHAR_TYPE
315 #define WCHAR_TYPE "long int"
316
317 #undef WCHAR_TYPE_SIZE
318 #define WCHAR_TYPE_SIZE BITS_PER_WORD
319
320 /* This causes trouble, because it requires the host machine
321    to support ANSI C.  */
322 /* #define MULTIBYTE_CHARS */
323
324 #undef ASM_BYTE_OP
325 #define ASM_BYTE_OP     ".byte"
326
327 #undef SET_ASM_OP
328 #define SET_ASM_OP      ".set"
329
330 /* This is how to begin an assembly language file.  Most svr4 assemblers want
331    at least a .file directive to come first, and some want to see a .version
332    directive come right after that.  Here we just establish a default
333    which generates only the .file directive.  If you need a .version
334    directive for any specific target, you should override this definition
335    in the target-specific file which includes this one.  */
336
337 #undef ASM_FILE_START
338 #define ASM_FILE_START(FILE)                                    \
339   output_file_directive ((FILE), main_input_filename)
340
341 /* This is how to allocate empty space in some section.  The .zero
342    pseudo-op is used for this on most svr4 assemblers.  */
343
344 #define SKIP_ASM_OP     ".zero"
345
346 #undef ASM_OUTPUT_SKIP
347 #define ASM_OUTPUT_SKIP(FILE,SIZE) \
348   fprintf (FILE, "\t%s\t%u\n", SKIP_ASM_OP, (SIZE))
349
350 /* This is how to output a reference to a user-level label named NAME.
351    `assemble_name' uses this.
352
353    For System V Release 4 the convention is *not* to prepend a leading
354    underscore onto user-level symbol names.  */
355
356 #undef ASM_OUTPUT_LABELREF
357 #define ASM_OUTPUT_LABELREF(FILE,NAME) fprintf (FILE, "%s", NAME)
358
359 /* This is how to output an internal numbered label where
360    PREFIX is the class of label and NUM is the number within the class.
361
362    For most svr4 systems, the convention is that any symbol which begins
363    with a period is not put into the linker symbol table by the assembler.  */
364
365 #undef ASM_OUTPUT_INTERNAL_LABEL
366 #define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM)                    \
367 do {                                                                    \
368   fprintf (FILE, ".%s%d:\n", PREFIX, NUM);                              \
369 } while (0)
370
371 /* This is how to store into the string LABEL
372    the symbol_ref name of an internal numbered label where
373    PREFIX is the class of label and NUM is the number within the class.
374    This is suitable for output with `assemble_name'.
375
376    For most svr4 systems, the convention is that any symbol which begins
377    with a period is not put into the linker symbol table by the assembler.  */
378
379 #undef ASM_GENERATE_INTERNAL_LABEL
380 #define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM)                 \
381 do {                                                                    \
382   sprintf (LABEL, "*.%s%d", PREFIX, NUM);                               \
383 } while (0)
384
385 /* Output the label which precedes a jumptable.  Note that for all svr4
386    systems where we actually generate jumptables (which is to say every
387    svr4 target except i386, where we use casesi instead) we put the jump-
388    tables into the .rodata section and since other stuff could have been
389    put into the .rodata section prior to any given jumptable, we have to
390    make sure that the location counter for the .rodata section gets pro-
391    perly re-aligned prior to the actual beginning of the jump table.  */
392
393 #define ALIGN_ASM_OP ".align"
394
395 #ifndef ASM_OUTPUT_BEFORE_CASE_LABEL
396 #define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE,PREFIX,NUM,TABLE) \
397   ASM_OUTPUT_ALIGN ((FILE), 2);
398 #endif
399
400 #undef ASM_OUTPUT_CASE_LABEL
401 #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,JUMPTABLE)                \
402   do {                                                                  \
403     ASM_OUTPUT_BEFORE_CASE_LABEL (FILE, PREFIX, NUM, JUMPTABLE)         \
404     ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM);                      \
405   } while (0)
406
407 /* The standard SVR4 assembler seems to require that certain builtin
408    library routines (e.g. .udiv) be explicitly declared as .globl
409    in each assembly file where they are referenced.  */
410
411 #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN)                          \
412   ASM_GLOBALIZE_LABEL (FILE, XSTR (FUN, 0))
413
414 /* This says how to output assembler code to declare an
415    uninitialized external linkage data object.  Under SVR4,
416    the linker seems to want the alignment of data objects
417    to depend on their types.  We do exactly that here.  */
418
419 #define COMMON_ASM_OP   ".comm"
420
421 #undef ASM_OUTPUT_ALIGNED_COMMON
422 #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN)              \
423 do {                                                                    \
424   fprintf ((FILE), "\t%s\t", COMMON_ASM_OP);                            \
425   assemble_name ((FILE), (NAME));                                       \
426   fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT);        \
427 } while (0)
428
429 /* This says how to output assembler code to declare an
430    uninitialized internal linkage data object.  Under SVR4,
431    the linker seems to want the alignment of data objects
432    to depend on their types.  We do exactly that here.  */
433
434 #define LOCAL_ASM_OP    ".local"
435
436 #undef ASM_OUTPUT_ALIGNED_LOCAL
437 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN)               \
438 do {                                                                    \
439   fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP);                             \
440   assemble_name ((FILE), (NAME));                                       \
441   fprintf ((FILE), "\n");                                               \
442   ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN);                  \
443 } while (0)
444
445 /* This is the pseudo-op used to generate a 32-bit word of data with a
446    specific value in some section.  This is the same for all known svr4
447    assemblers.  */
448
449 #define INT_ASM_OP              ".long"
450
451 /* This is the pseudo-op used to generate a contiguous sequence of byte
452    values from a double-quoted string WITHOUT HAVING A TERMINATING NUL
453    AUTOMATICALLY APPENDED.  This is the same for most svr4 assemblers.  */
454
455 #undef ASCII_DATA_ASM_OP
456 #define ASCII_DATA_ASM_OP       ".ascii"
457
458 /* Support const sections and the ctors and dtors sections for g++.
459    Note that there appears to be two different ways to support const
460    sections at the moment.  You can either #define the symbol
461    READONLY_DATA_SECTION (giving it some code which switches to the
462    readonly data section) or else you can #define the symbols
463    EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS, SELECT_SECTION, and
464    SELECT_RTX_SECTION.  We do both here just to be on the safe side.  */
465
466 #define USE_CONST_SECTION       1
467
468 #define CONST_SECTION_ASM_OP    ".section\t.rodata"
469 #define CTORS_SECTION_ASM_OP    ".section\t.ctors,\"a\",@progbits"
470 #define DTORS_SECTION_ASM_OP    ".section\t.dtors,\"a\",@progbits"
471
472 /* On svr4, we *do* have support for the .init section, and we can put
473    stuff in there to be executed before `main'.  We let crtstuff.c and
474    other files know this by defining the following symbol.  The definition
475    says how to change sections to the .init section.  This is the same
476    for all know svr4 assemblers.  */
477
478 #define INIT_SECTION_ASM_OP     ".section\t.init"
479
480 /* A default list of other sections which we might be "in" at any given
481    time.  For targets that use additional sections (e.g. .tdesc) you
482    should override this definition in the target-specific file which
483    includes this file.  */
484
485 #undef EXTRA_SECTIONS
486 #define EXTRA_SECTIONS in_const, in_ctors, in_dtors
487
488 /* A default list of extra section function definitions.  For targets
489    that use additional sections (e.g. .tdesc) you should override this
490    definition in the target-specific file which includes this file.  */
491
492 #undef EXTRA_SECTION_FUNCTIONS
493 #define EXTRA_SECTION_FUNCTIONS                                         \
494   CONST_SECTION_FUNCTION                                                \
495   CTORS_SECTION_FUNCTION                                                \
496   DTORS_SECTION_FUNCTION
497
498 #define READONLY_DATA_SECTION() const_section ()
499
500 extern void text_section ();
501
502 #define CONST_SECTION_FUNCTION                                          \
503 void                                                                    \
504 const_section ()                                                        \
505 {                                                                       \
506   if (!USE_CONST_SECTION)                                               \
507     text_section();                                                     \
508   else if (in_section != in_const)                                      \
509     {                                                                   \
510       fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP);             \
511       in_section = in_const;                                            \
512     }                                                                   \
513 }
514
515 #define CTORS_SECTION_FUNCTION                                          \
516 void                                                                    \
517 ctors_section ()                                                        \
518 {                                                                       \
519   if (in_section != in_ctors)                                           \
520     {                                                                   \
521       fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP);             \
522       in_section = in_ctors;                                            \
523     }                                                                   \
524 }
525
526 #define DTORS_SECTION_FUNCTION                                          \
527 void                                                                    \
528 dtors_section ()                                                        \
529 {                                                                       \
530   if (in_section != in_dtors)                                           \
531     {                                                                   \
532       fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP);             \
533       in_section = in_dtors;                                            \
534     }                                                                   \
535 }
536
537 /* Switch into a generic section.
538    This is currently only used to support section attributes.  */
539
540 #define ASM_OUTPUT_SECTION(FILE, NAME) \
541   fprintf (FILE, ".section\t%s,\"a\",@progbits\n", NAME)
542
543 /* A C statement (sans semicolon) to output an element in the table of
544    global constructors.  */
545 #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME)                               \
546   do {                                                                  \
547     ctors_section ();                                                   \
548     fprintf (FILE, "\t%s\t ", INT_ASM_OP);                              \
549     assemble_name (FILE, NAME);                                         \
550     fprintf (FILE, "\n");                                               \
551   } while (0)
552
553 /* A C statement (sans semicolon) to output an element in the table of
554    global destructors.  */
555 #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME)                                \
556   do {                                                                  \
557     dtors_section ();                                                   \
558     fprintf (FILE, "\t%s\t ", INT_ASM_OP);                              \
559     assemble_name (FILE, NAME);                                         \
560     fprintf (FILE, "\n");                                               \
561   } while (0)
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 #define SELECT_SECTION(DECL,RELOC)                                      \
569 {                                                                       \
570   if (TREE_CODE (DECL) == STRING_CST)                                   \
571     {                                                                   \
572       if (! flag_writable_strings)                                      \
573         const_section ();                                               \
574       else                                                              \
575         data_section ();                                                \
576     }                                                                   \
577   else if (TREE_CODE (DECL) == VAR_DECL)                                \
578     {                                                                   \
579       if ((flag_pic && RELOC)                                           \
580           || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL)          \
581           || !DECL_INITIAL (DECL)                                       \
582           || (DECL_INITIAL (DECL) != error_mark_node                    \
583               && !TREE_CONSTANT (DECL_INITIAL (DECL))))                 \
584         data_section ();                                                \
585       else                                                              \
586         const_section ();                                               \
587     }                                                                   \
588   else                                                                  \
589     const_section ();                                                   \
590 }
591
592 /* A C statement or statements to switch to the appropriate
593    section for output of RTX in mode MODE.  RTX is some kind
594    of constant in RTL.  The argument MODE is redundant except
595    in the case of a `const_int' rtx.  Currently, these always
596    go into the const section.  */
597
598 #undef SELECT_RTX_SECTION
599 #define SELECT_RTX_SECTION(MODE,RTX) const_section()
600
601 /* Define the strings used for the special svr4 .type and .size directives.
602    These strings generally do not vary from one system running svr4 to
603    another, but if a given system (e.g. m88k running svr) needs to use
604    different pseudo-op names for these, they may be overridden in the
605    file which includes this one.  */
606
607 #define TYPE_ASM_OP     ".type"
608 #define SIZE_ASM_OP     ".size"
609 #define WEAK_ASM_OP     ".weak"
610
611 /* The following macro defines the format used to output the second
612    operand of the .type assembler directive.  Different svr4 assemblers
613    expect various different forms for this operand.  The one given here
614    is just a default.  You may need to override it in your machine-
615    specific tm.h file (depending upon the particulars of your assembler).  */
616
617 #define TYPE_OPERAND_FMT        "@%s"
618
619 /* Write the extra assembler code needed to declare a function's result.
620    Most svr4 assemblers don't require any special declaration of the
621    result value, but there are exceptions.  */
622
623 #ifndef ASM_DECLARE_RESULT
624 #define ASM_DECLARE_RESULT(FILE, RESULT)
625 #endif
626
627 /* These macros generate the special .type and .size directives which
628    are used to set the corresponding fields of the linker symbol table
629    entries in an ELF object file under SVR4.  These macros also output
630    the starting labels for the relevant functions/objects.  */
631
632 /* Write the extra assembler code needed to declare a function properly.
633    Some svr4 assemblers need to also have something extra said about the
634    function's return value.  We allow for that here.  */
635
636 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)                     \
637   do {                                                                  \
638     fprintf (FILE, "\t%s\t ", TYPE_ASM_OP);                             \
639     assemble_name (FILE, NAME);                                         \
640     putc (',', FILE);                                                   \
641     fprintf (FILE, TYPE_OPERAND_FMT, "function");                       \
642     putc ('\n', FILE);                                                  \
643     ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL));                      \
644     ASM_OUTPUT_LABEL(FILE, NAME);                                       \
645   } while (0)
646
647 /* Write the extra assembler code needed to declare an object properly.  */
648
649 #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)                       \
650   do {                                                                  \
651     fprintf (FILE, "\t%s\t ", TYPE_ASM_OP);                             \
652     assemble_name (FILE, NAME);                                         \
653     putc (',', FILE);                                                   \
654     fprintf (FILE, TYPE_OPERAND_FMT, "object");                         \
655     putc ('\n', FILE);                                                  \
656     size_directive_output = 0;                                          \
657     if (!flag_inhibit_size_directive && DECL_SIZE (DECL))               \
658       {                                                                 \
659         size_directive_output = 1;                                      \
660         fprintf (FILE, "\t%s\t ", SIZE_ASM_OP);                         \
661         assemble_name (FILE, NAME);                                     \
662         fprintf (FILE, ",%d\n",  int_size_in_bytes (TREE_TYPE (DECL))); \
663       }                                                                 \
664     ASM_OUTPUT_LABEL(FILE, NAME);                                       \
665   } while (0)
666
667 /* Output the size directive for a decl in rest_of_decl_compilation
668    in the case where we did not do so before the initializer.
669    Once we find the error_mark_node, we know that the value of
670    size_directive_output was set
671    by ASM_DECLARE_OBJECT_NAME when it was run for the same decl.  */
672
673 #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END)         \
674 do {                                                                     \
675      char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0);                   \
676      if (!flag_inhibit_size_directive && DECL_SIZE (DECL)                \
677          && ! AT_END && TOP_LEVEL                                        \
678          && DECL_INITIAL (DECL) == error_mark_node                       \
679          && !size_directive_output)                                      \
680        {                                                                 \
681          size_directive_output = 1;                                      \
682          fprintf (FILE, "\t%s\t ", SIZE_ASM_OP);                         \
683          assemble_name (FILE, name);                                     \
684          fprintf (FILE, ",%d\n",  int_size_in_bytes (TREE_TYPE (DECL))); \
685        }                                                                 \
686    } while (0)
687
688 /* This is how to declare the size of a function.  */
689
690 #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL)                    \
691   do {                                                                  \
692     if (!flag_inhibit_size_directive)                                   \
693       {                                                                 \
694         char label[256];                                                \
695         static int labelno;                                             \
696         labelno++;                                                      \
697         ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno);            \
698         ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno);               \
699         fprintf (FILE, "\t%s\t ", SIZE_ASM_OP);                         \
700         assemble_name (FILE, (FNAME));                                  \
701         fprintf (FILE, ",");                                            \
702         assemble_name (FILE, label);                                    \
703         fprintf (FILE, "-");                                            \
704         assemble_name (FILE, (FNAME));                                  \
705         putc ('\n', FILE);                                              \
706       }                                                                 \
707   } while (0)
708
709 /* A table of bytes codes used by the ASM_OUTPUT_ASCII and
710    ASM_OUTPUT_LIMITED_STRING macros.  Each byte in the table
711    corresponds to a particular byte value [0..255].  For any
712    given byte value, if the value in the corresponding table
713    position is zero, the given character can be output directly.
714    If the table value is 1, the byte must be output as a \ooo
715    octal escape.  If the tables value is anything else, then the
716    byte value should be output as a \ followed by the value
717    in the table.  Note that we can use standard UN*X escape
718    sequences for many control characters, but we don't use
719    \a to represent BEL because some svr4 assemblers (e.g. on
720    the i386) don't know about that.   */
721
722 #define ESCAPES \
723 "\1\1\1\1\1\1\1\1btnvfr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
724 \0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
725 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\
726 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\
727 \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
728 \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
729 \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
730 \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1"
731
732 /* Some svr4 assemblers have a limit on the number of characters which
733    can appear in the operand of a .string directive.  If your assembler
734    has such a limitation, you should define STRING_LIMIT to reflect that
735    limit.  Note that at least some svr4 assemblers have a limit on the
736    actual number of bytes in the double-quoted string, and that they
737    count each character in an escape sequence as one byte.  Thus, an
738    escape sequence like \377 would count as four bytes.
739
740    If your target assembler doesn't support the .string directive, you
741    should define this to zero.
742 */
743
744 #define STRING_LIMIT    ((unsigned) 256)
745
746 #define STRING_ASM_OP   ".string"
747
748 /* The routine used to output NUL terminated strings.  We use a special
749    version of this for most svr4 targets because doing so makes the
750    generated assembly code more compact (and thus faster to assemble)
751    as well as more readable, especially for targets like the i386
752    (where the only alternative is to output character sequences as
753    comma separated lists of numbers).   */
754
755 #define ASM_OUTPUT_LIMITED_STRING(FILE, STR)                            \
756   do                                                                    \
757     {                                                                   \
758       register unsigned char *_limited_str = (unsigned char *) (STR);   \
759       register unsigned ch;                                             \
760       fprintf ((FILE), "\t%s\t\"", STRING_ASM_OP);                      \
761       for (; ch = *_limited_str; _limited_str++)                        \
762         {                                                               \
763           register int escape;                                          \
764           switch (escape = ESCAPES[ch])                                 \
765             {                                                           \
766             case 0:                                                     \
767               putc (ch, (FILE));                                        \
768               break;                                                    \
769             case 1:                                                     \
770               fprintf ((FILE), "\\%03o", ch);                           \
771               break;                                                    \
772             default:                                                    \
773               putc ('\\', (FILE));                                      \
774               putc (escape, (FILE));                                    \
775               break;                                                    \
776             }                                                           \
777         }                                                               \
778       fprintf ((FILE), "\"\n");                                         \
779     }                                                                   \
780   while (0)
781
782 /* The routine used to output sequences of byte values.  We use a special
783    version of this for most svr4 targets because doing so makes the
784    generated assembly code more compact (and thus faster to assemble)
785    as well as more readable.  Note that if we find subparts of the
786    character sequence which end with NUL (and which are shorter than
787    STRING_LIMIT) we output those using ASM_OUTPUT_LIMITED_STRING.  */
788
789 #undef ASM_OUTPUT_ASCII
790 #define ASM_OUTPUT_ASCII(FILE, STR, LENGTH)                             \
791   do                                                                    \
792     {                                                                   \
793       register unsigned char *_ascii_bytes = (unsigned char *) (STR);   \
794       register unsigned char *limit = _ascii_bytes + (LENGTH);          \
795       register unsigned bytes_in_chunk = 0;                             \
796       for (; _ascii_bytes < limit; _ascii_bytes++)                      \
797         {                                                               \
798           register unsigned char *p;                                    \
799           if (bytes_in_chunk >= 60)                                     \
800             {                                                           \
801               fprintf ((FILE), "\"\n");                                 \
802               bytes_in_chunk = 0;                                       \
803             }                                                           \
804           for (p = _ascii_bytes; p < limit && *p != '\0'; p++)          \
805             continue;                                                   \
806           if (p < limit && (p - _ascii_bytes) <= STRING_LIMIT)          \
807             {                                                           \
808               if (bytes_in_chunk > 0)                                   \
809                 {                                                       \
810                   fprintf ((FILE), "\"\n");                             \
811                   bytes_in_chunk = 0;                                   \
812                 }                                                       \
813               ASM_OUTPUT_LIMITED_STRING ((FILE), _ascii_bytes);         \
814               _ascii_bytes = p;                                         \
815             }                                                           \
816           else                                                          \
817             {                                                           \
818               register int escape;                                      \
819               register unsigned ch;                                     \
820               if (bytes_in_chunk == 0)                                  \
821                 fprintf ((FILE), "\t%s\t\"", ASCII_DATA_ASM_OP);        \
822               switch (escape = ESCAPES[ch = *_ascii_bytes])             \
823                 {                                                       \
824                 case 0:                                                 \
825                   putc (ch, (FILE));                                    \
826                   bytes_in_chunk++;                                     \
827                   break;                                                \
828                 case 1:                                                 \
829                   fprintf ((FILE), "\\%03o", ch);                       \
830                   bytes_in_chunk += 4;                                  \
831                   break;                                                \
832                 default:                                                \
833                   putc ('\\', (FILE));                                  \
834                   putc (escape, (FILE));                                \
835                   bytes_in_chunk += 2;                                  \
836                   break;                                                \
837                 }                                                       \
838             }                                                           \
839         }                                                               \
840       if (bytes_in_chunk > 0)                                           \
841         fprintf ((FILE), "\"\n");                                       \
842     }                                                                   \
843   while (0)