|
|
1.1 root 1: /* svr4.h -- operating system specific defines to be used when
2: targeting GCC for some generic System V Release 4 system.
1.1.1.7 ! root 3: Copyright (C) 1991, 1994 Free Software Foundation, Inc.
! 4: Contributed by Ron Guilmette ([email protected]).
1.1 root 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:
1.1.1.4 root 41: /* Define a symbol indicating that we are using svr4.h. */
42: #define USING_SVR4_H
43:
1.1 root 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) \
1.1.1.5 root 71: (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) \
72: && strcmp (STR, "Tdata") && strcmp (STR, "Ttext") \
73: && strcmp (STR, "Tbss"))
1.1 root 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:
1.1.1.3 root 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:
1.1 root 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:
1.1.1.2 root 124: /* Provide a LIB_SPEC appropriate for svr4. Here we tack on the default
1.1 root 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
1.1.1.2 root 161: #define LINK_SPEC "%{h*} %{V} %{v:%{!V:-V}} \
162: %{b} %{Wl,*:%*} \
1.1 root 163: %{static:-dn -Bstatic} \
164: %{shared:-G -dy} \
165: %{symbolic:-Bsymbolic -G -dy} \
1.1.1.2 root 166: %{G:-G} \
1.1 root 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
1.1.1.2 root 181: conforming manner or not.
1.1 root 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:
1.1.1.2 root 194: /* Attach a special .ident directive to the end of the file to identify
1.1 root 195: the version of GCC which compiled this code. The format of the
1.1.1.2 root 196: .ident string is patterned after the ones produced by native svr4
1.1 root 197: C compilers. */
198:
1.1.1.4 root 199: #define IDENT_ASM_OP ".ident"
200:
1.1 root 201: #define ASM_FILE_END(FILE) \
202: do { \
1.1.1.4 root 203: fprintf ((FILE), "\t%s\t\"GCC: (GNU) %s\"\n", \
204: IDENT_ASM_OP, version_string); \
1.1 root 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) \
1.1.1.4 root 214: fprintf (FILE, "\t%s\t\"%s\"\n", IDENT_ASM_OP, NAME);
1.1 root 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:
1.1.1.4 root 228: /* Handle #pragma weak and #pragma pack. */
229:
230: #define HANDLE_SYSV_PRAGMA
231:
1.1 root 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:
1.1.1.7 ! root 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: #ifndef PREFERRED_DEBUGGING_TYPE
! 255: #define PREFERRED_DEBUGGING_TYPE DWARF_DEBUG
! 256: #endif
! 257:
! 258: /* Make LBRAC and RBRAC addresses relative to the start of the
! 259: function. The native Solaris stabs debugging format works this
! 260: way, gdb expects it, and it reduces the number of relocation
! 261: entries. */
! 262:
! 263: #define DBX_BLOCKS_FUNCTION_RELATIVE 1
! 264:
! 265: /* When using stabs, gcc2_compiled must be a stabs entry, not an
! 266: ordinary symbol, or gdb won't see it. Furthermore, since gdb reads
! 267: the input piecemeal, starting with each N_SO, it's a lot easier if
! 268: the gcc2 flag symbol is *after* the N_SO rather than before it. So
! 269: we emit an N_OPT stab there. */
! 270:
! 271: #define ASM_IDENTIFY_GCC(FILE) \
! 272: do \
! 273: { \
! 274: if (write_symbols != DBX_DEBUG) \
! 275: fputs ("gcc2_compiled.:\n", FILE); \
! 276: } \
! 277: while (0)
! 278:
! 279: #define ASM_IDENTIFY_GCC_AFTER_SOURCE(FILE) \
! 280: do \
! 281: { \
! 282: if (write_symbols == DBX_DEBUG) \
! 283: fputs ("\t.stabs\t\"gcc2_compiled.\", 0x3c, 0, 0, 0\n", FILE); \
! 284: } \
! 285: while (0)
! 286:
! 287: /* Like block addresses, stabs line numbers are relative to the
! 288: current function. */
! 289:
! 290: #define ASM_OUTPUT_SOURCE_LINE(file, line) \
! 291: do \
! 292: { \
! 293: static int sym_lineno = 1; \
! 294: fprintf (file, ".stabn 68,0,%d,.LM%d-%s\n.LM%d:\n", \
! 295: line, sym_lineno, \
! 296: XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0), \
! 297: sym_lineno); \
! 298: sym_lineno += 1; \
! 299: } \
! 300: while (0)
! 301:
! 302: /* In order for relative line numbers to work, we must output the
! 303: stabs entry for the function name first. */
! 304:
! 305: #define DBX_FUNCTION_FIRST
! 306:
1.1 root 307: /* Define the actual types of some ANSI-mandated types. (These
308: definitions should work for most SVR4 systems). */
309:
310: #undef SIZE_TYPE
311: #define SIZE_TYPE "unsigned int"
312:
313: #undef PTRDIFF_TYPE
314: #define PTRDIFF_TYPE "int"
315:
316: #undef WCHAR_TYPE
317: #define WCHAR_TYPE "long int"
318:
319: #undef WCHAR_TYPE_SIZE
320: #define WCHAR_TYPE_SIZE BITS_PER_WORD
321:
1.1.1.3 root 322: /* This causes trouble, because it requires the host machine
323: to support ANSI C. */
324: /* #define MULTIBYTE_CHARS */
1.1.1.2 root 325:
1.1 root 326: #undef ASM_BYTE_OP
1.1.1.3 root 327: #define ASM_BYTE_OP ".byte"
328:
329: #undef SET_ASM_OP
330: #define SET_ASM_OP ".set"
1.1 root 331:
332: /* This is how to begin an assembly language file. Most svr4 assemblers want
333: at least a .file directive to come first, and some want to see a .version
334: directive come right after that. Here we just establish a default
335: which generates only the .file directive. If you need a .version
336: directive for any specific target, you should override this definition
337: in the target-specific file which includes this one. */
338:
339: #undef ASM_FILE_START
340: #define ASM_FILE_START(FILE) \
341: output_file_directive ((FILE), main_input_filename)
342:
343: /* This is how to allocate empty space in some section. The .zero
344: pseudo-op is used for this on most svr4 assemblers. */
345:
1.1.1.3 root 346: #define SKIP_ASM_OP ".zero"
347:
1.1 root 348: #undef ASM_OUTPUT_SKIP
1.1.1.3 root 349: #define ASM_OUTPUT_SKIP(FILE,SIZE) \
350: fprintf (FILE, "\t%s\t%u\n", SKIP_ASM_OP, (SIZE))
1.1 root 351:
352: /* This is how to output a reference to a user-level label named NAME.
353: `assemble_name' uses this.
354:
355: For System V Release 4 the convention is *not* to prepend a leading
356: underscore onto user-level symbol names. */
357:
358: #undef ASM_OUTPUT_LABELREF
359: #define ASM_OUTPUT_LABELREF(FILE,NAME) fprintf (FILE, "%s", NAME)
360:
1.1.1.3 root 361: /* This is how to output an internal numbered label where
362: PREFIX is the class of label and NUM is the number within the class.
363:
364: For most svr4 systems, the convention is that any symbol which begins
365: with a period is not put into the linker symbol table by the assembler. */
366:
367: #undef ASM_OUTPUT_INTERNAL_LABEL
368: #define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM) \
369: do { \
370: fprintf (FILE, ".%s%d:\n", PREFIX, NUM); \
371: } while (0)
372:
373: /* This is how to store into the string LABEL
374: the symbol_ref name of an internal numbered label where
375: PREFIX is the class of label and NUM is the number within the class.
376: This is suitable for output with `assemble_name'.
377:
378: For most svr4 systems, the convention is that any symbol which begins
379: with a period is not put into the linker symbol table by the assembler. */
380:
381: #undef ASM_GENERATE_INTERNAL_LABEL
382: #define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
383: do { \
384: sprintf (LABEL, "*.%s%d", PREFIX, NUM); \
385: } while (0)
386:
1.1.1.5 root 387: /* Output the label which precedes a jumptable. Note that for all svr4
1.1.1.4 root 388: systems where we actually generate jumptables (which is to say every
389: svr4 target except i386, where we use casesi instead) we put the jump-
390: tables into the .rodata section and since other stuff could have been
391: put into the .rodata section prior to any given jumptable, we have to
392: make sure that the location counter for the .rodata section gets pro-
393: perly re-aligned prior to the actual beginning of the jump table. */
394:
395: #define ALIGN_ASM_OP ".align"
396:
397: #ifndef ASM_OUTPUT_BEFORE_CASE_LABEL
398: #define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE,PREFIX,NUM,TABLE) \
399: ASM_OUTPUT_ALIGN ((FILE), 2);
400: #endif
401:
402: #undef ASM_OUTPUT_CASE_LABEL
403: #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,JUMPTABLE) \
404: do { \
405: ASM_OUTPUT_BEFORE_CASE_LABEL (FILE, PREFIX, NUM, JUMPTABLE) \
406: ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); \
407: } while (0)
408:
1.1 root 409: /* The standard SVR4 assembler seems to require that certain builtin
410: library routines (e.g. .udiv) be explicitly declared as .globl
411: in each assembly file where they are referenced. */
412:
413: #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \
414: ASM_GLOBALIZE_LABEL (FILE, XSTR (FUN, 0))
415:
416: /* This says how to output assembler code to declare an
417: uninitialized external linkage data object. Under SVR4,
418: the linker seems to want the alignment of data objects
419: to depend on their types. We do exactly that here. */
420:
1.1.1.3 root 421: #define COMMON_ASM_OP ".comm"
422:
1.1 root 423: #undef ASM_OUTPUT_ALIGNED_COMMON
424: #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \
425: do { \
1.1.1.3 root 426: fprintf ((FILE), "\t%s\t", COMMON_ASM_OP); \
1.1 root 427: assemble_name ((FILE), (NAME)); \
428: fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \
429: } while (0)
430:
431: /* This says how to output assembler code to declare an
432: uninitialized internal linkage data object. Under SVR4,
433: the linker seems to want the alignment of data objects
434: to depend on their types. We do exactly that here. */
435:
1.1.1.3 root 436: #define LOCAL_ASM_OP ".local"
1.1 root 437:
438: #undef ASM_OUTPUT_ALIGNED_LOCAL
439: #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
440: do { \
1.1.1.3 root 441: fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP); \
442: assemble_name ((FILE), (NAME)); \
443: fprintf ((FILE), "\n"); \
444: ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \
1.1 root 445: } while (0)
446:
447: /* This is the pseudo-op used to generate a 32-bit word of data with a
448: specific value in some section. This is the same for all known svr4
449: assemblers. */
450:
1.1.1.2 root 451: #define INT_ASM_OP ".long"
1.1 root 452:
453: /* This is the pseudo-op used to generate a contiguous sequence of byte
454: values from a double-quoted string WITHOUT HAVING A TERMINATING NUL
455: AUTOMATICALLY APPENDED. This is the same for most svr4 assemblers. */
456:
457: #undef ASCII_DATA_ASM_OP
458: #define ASCII_DATA_ASM_OP ".ascii"
459:
460: /* Support const sections and the ctors and dtors sections for g++.
461: Note that there appears to be two different ways to support const
462: sections at the moment. You can either #define the symbol
463: READONLY_DATA_SECTION (giving it some code which switches to the
464: readonly data section) or else you can #define the symbols
465: EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS, SELECT_SECTION, and
466: SELECT_RTX_SECTION. We do both here just to be on the safe side. */
467:
468: #define USE_CONST_SECTION 1
469:
1.1.1.2 root 470: #define CONST_SECTION_ASM_OP ".section\t.rodata"
471: #define CTORS_SECTION_ASM_OP ".section\t.ctors,\"a\",@progbits"
472: #define DTORS_SECTION_ASM_OP ".section\t.dtors,\"a\",@progbits"
1.1 root 473:
474: /* On svr4, we *do* have support for the .init section, and we can put
475: stuff in there to be executed before `main'. We let crtstuff.c and
476: other files know this by defining the following symbol. The definition
477: says how to change sections to the .init section. This is the same
478: for all know svr4 assemblers. */
479:
1.1.1.2 root 480: #define INIT_SECTION_ASM_OP ".section\t.init"
1.1 root 481:
482: /* A default list of other sections which we might be "in" at any given
483: time. For targets that use additional sections (e.g. .tdesc) you
484: should override this definition in the target-specific file which
485: includes this file. */
486:
487: #undef EXTRA_SECTIONS
488: #define EXTRA_SECTIONS in_const, in_ctors, in_dtors
489:
490: /* A default list of extra section function definitions. For targets
491: that use additional sections (e.g. .tdesc) you should override this
492: definition in the target-specific file which includes this file. */
493:
494: #undef EXTRA_SECTION_FUNCTIONS
495: #define EXTRA_SECTION_FUNCTIONS \
496: CONST_SECTION_FUNCTION \
497: CTORS_SECTION_FUNCTION \
498: DTORS_SECTION_FUNCTION
499:
500: #define READONLY_DATA_SECTION() const_section ()
501:
1.1.1.6 root 502: extern void text_section ();
1.1 root 503:
504: #define CONST_SECTION_FUNCTION \
505: void \
506: const_section () \
507: { \
508: if (!USE_CONST_SECTION) \
509: text_section(); \
510: else if (in_section != in_const) \
511: { \
512: fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP); \
513: in_section = in_const; \
514: } \
515: }
516:
517: #define CTORS_SECTION_FUNCTION \
518: void \
519: ctors_section () \
520: { \
521: if (in_section != in_ctors) \
522: { \
1.1.1.3 root 523: fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP); \
1.1 root 524: in_section = in_ctors; \
525: } \
526: }
527:
528: #define DTORS_SECTION_FUNCTION \
529: void \
530: dtors_section () \
531: { \
532: if (in_section != in_dtors) \
533: { \
1.1.1.3 root 534: fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP); \
1.1 root 535: in_section = in_dtors; \
536: } \
537: }
538:
1.1.1.7 ! root 539: /* Switch into a generic section.
! 540: This is currently only used to support section attributes. */
! 541:
! 542: #define ASM_OUTPUT_SECTION(FILE, NAME) \
! 543: fprintf (FILE, ".section\t%s,\"a\",@progbits\n", NAME)
! 544:
1.1 root 545: /* A C statement (sans semicolon) to output an element in the table of
546: global constructors. */
547: #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
548: do { \
549: ctors_section (); \
1.1.1.2 root 550: fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
1.1 root 551: assemble_name (FILE, NAME); \
552: fprintf (FILE, "\n"); \
553: } while (0)
554:
555: /* A C statement (sans semicolon) to output an element in the table of
556: global destructors. */
557: #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
558: do { \
559: dtors_section (); \
1.1.1.2 root 560: fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
1.1 root 561: assemble_name (FILE, NAME); \
562: fprintf (FILE, "\n"); \
563: } while (0)
564:
565: /* A C statement or statements to switch to the appropriate
566: section for output of DECL. DECL is either a `VAR_DECL' node
567: or a constant of some sort. RELOC indicates whether forming
568: the initial value of DECL requires link-time relocations. */
569:
570: #define SELECT_SECTION(DECL,RELOC) \
571: { \
572: if (TREE_CODE (DECL) == STRING_CST) \
573: { \
574: if (! flag_writable_strings) \
575: const_section (); \
576: else \
577: data_section (); \
578: } \
579: else if (TREE_CODE (DECL) == VAR_DECL) \
580: { \
581: if ((flag_pic && RELOC) \
1.1.1.7 ! root 582: || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL) \
! 583: || !DECL_INITIAL (DECL) \
! 584: || (DECL_INITIAL (DECL) != error_mark_node \
! 585: && !TREE_CONSTANT (DECL_INITIAL (DECL)))) \
1.1 root 586: data_section (); \
587: else \
588: const_section (); \
589: } \
590: else \
591: const_section (); \
592: }
593:
594: /* A C statement or statements to switch to the appropriate
595: section for output of RTX in mode MODE. RTX is some kind
596: of constant in RTL. The argument MODE is redundant except
597: in the case of a `const_int' rtx. Currently, these always
598: go into the const section. */
599:
600: #undef SELECT_RTX_SECTION
601: #define SELECT_RTX_SECTION(MODE,RTX) const_section()
602:
603: /* Define the strings used for the special svr4 .type and .size directives.
604: These strings generally do not vary from one system running svr4 to
605: another, but if a given system (e.g. m88k running svr) needs to use
606: different pseudo-op names for these, they may be overridden in the
607: file which includes this one. */
608:
1.1.1.2 root 609: #define TYPE_ASM_OP ".type"
610: #define SIZE_ASM_OP ".size"
1.1.1.3 root 611: #define WEAK_ASM_OP ".weak"
1.1 root 612:
613: /* The following macro defines the format used to output the second
614: operand of the .type assembler directive. Different svr4 assemblers
615: expect various different forms for this operand. The one given here
616: is just a default. You may need to override it in your machine-
617: specific tm.h file (depending upon the particulars of your assembler). */
618:
619: #define TYPE_OPERAND_FMT "@%s"
620:
1.1.1.3 root 621: /* Write the extra assembler code needed to declare a function's result.
622: Most svr4 assemblers don't require any special declaration of the
623: result value, but there are exceptions. */
624:
625: #ifndef ASM_DECLARE_RESULT
626: #define ASM_DECLARE_RESULT(FILE, RESULT)
627: #endif
628:
1.1 root 629: /* These macros generate the special .type and .size directives which
630: are used to set the corresponding fields of the linker symbol table
1.1.1.3 root 631: entries in an ELF object file under SVR4. These macros also output
632: the starting labels for the relevant functions/objects. */
1.1 root 633:
1.1.1.3 root 634: /* Write the extra assembler code needed to declare a function properly.
635: Some svr4 assemblers need to also have something extra said about the
636: function's return value. We allow for that here. */
1.1 root 637:
638: #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
639: do { \
1.1.1.2 root 640: fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
1.1 root 641: assemble_name (FILE, NAME); \
642: putc (',', FILE); \
643: fprintf (FILE, TYPE_OPERAND_FMT, "function"); \
644: putc ('\n', FILE); \
1.1.1.3 root 645: ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
1.1 root 646: ASM_OUTPUT_LABEL(FILE, NAME); \
647: } while (0)
648:
649: /* Write the extra assembler code needed to declare an object properly. */
650:
651: #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
652: do { \
1.1.1.2 root 653: fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
1.1 root 654: assemble_name (FILE, NAME); \
655: putc (',', FILE); \
656: fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
657: putc ('\n', FILE); \
1.1.1.6 root 658: size_directive_output = 0; \
659: if (!flag_inhibit_size_directive && DECL_SIZE (DECL)) \
1.1 root 660: { \
1.1.1.6 root 661: size_directive_output = 1; \
1.1.1.2 root 662: fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
1.1 root 663: assemble_name (FILE, NAME); \
1.1.1.6 root 664: fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \
1.1 root 665: } \
666: ASM_OUTPUT_LABEL(FILE, NAME); \
667: } while (0)
668:
1.1.1.6 root 669: /* Output the size directive for a decl in rest_of_decl_compilation
670: in the case where we did not do so before the initializer.
671: Once we find the error_mark_node, we know that the value of
672: size_directive_output was set
673: by ASM_DECLARE_OBJECT_NAME when it was run for the same decl. */
674:
675: #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \
676: do { \
677: char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
678: if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \
679: && ! AT_END && TOP_LEVEL \
680: && DECL_INITIAL (DECL) == error_mark_node \
681: && !size_directive_output) \
682: { \
1.1.1.7 ! root 683: size_directive_output = 1; \
1.1.1.6 root 684: fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
685: assemble_name (FILE, name); \
686: fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \
687: } \
688: } while (0)
689:
1.1 root 690: /* This is how to declare the size of a function. */
691:
692: #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \
693: do { \
694: if (!flag_inhibit_size_directive) \
695: { \
696: char label[256]; \
697: static int labelno; \
698: labelno++; \
699: ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno); \
700: ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno); \
1.1.1.2 root 701: fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
1.1 root 702: assemble_name (FILE, (FNAME)); \
703: fprintf (FILE, ","); \
704: assemble_name (FILE, label); \
705: fprintf (FILE, "-"); \
1.1.1.3 root 706: assemble_name (FILE, (FNAME)); \
1.1 root 707: putc ('\n', FILE); \
708: } \
709: } while (0)
710:
711: /* A table of bytes codes used by the ASM_OUTPUT_ASCII and
712: ASM_OUTPUT_LIMITED_STRING macros. Each byte in the table
713: corresponds to a particular byte value [0..255]. For any
714: given byte value, if the value in the corresponding table
715: position is zero, the given character can be output directly.
716: If the table value is 1, the byte must be output as a \ooo
717: octal escape. If the tables value is anything else, then the
718: byte value should be output as a \ followed by the value
719: in the table. Note that we can use standard UN*X escape
720: sequences for many control characters, but we don't use
721: \a to represent BEL because some svr4 assemblers (e.g. on
1.1.1.7 ! root 722: the i386) don't know about that. Also, we don't use \v
! 723: since some versions of gas, such as 2.2 did not accept it. */
1.1 root 724:
725: #define ESCAPES \
1.1.1.7 ! root 726: "\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
1.1 root 727: \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\
728: \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\
729: \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\
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: \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\
732: \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\
733: \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"
734:
735: /* Some svr4 assemblers have a limit on the number of characters which
736: can appear in the operand of a .string directive. If your assembler
737: has such a limitation, you should define STRING_LIMIT to reflect that
738: limit. Note that at least some svr4 assemblers have a limit on the
739: actual number of bytes in the double-quoted string, and that they
1.1.1.2 root 740: count each character in an escape sequence as one byte. Thus, an
1.1 root 741: escape sequence like \377 would count as four bytes.
742:
743: If your target assembler doesn't support the .string directive, you
744: should define this to zero.
745: */
746:
747: #define STRING_LIMIT ((unsigned) 256)
748:
749: #define STRING_ASM_OP ".string"
750:
751: /* The routine used to output NUL terminated strings. We use a special
752: version of this for most svr4 targets because doing so makes the
753: generated assembly code more compact (and thus faster to assemble)
754: as well as more readable, especially for targets like the i386
755: (where the only alternative is to output character sequences as
756: comma separated lists of numbers). */
757:
758: #define ASM_OUTPUT_LIMITED_STRING(FILE, STR) \
759: do \
760: { \
761: register unsigned char *_limited_str = (unsigned char *) (STR); \
762: register unsigned ch; \
763: fprintf ((FILE), "\t%s\t\"", STRING_ASM_OP); \
764: for (; ch = *_limited_str; _limited_str++) \
765: { \
766: register int escape; \
767: switch (escape = ESCAPES[ch]) \
768: { \
769: case 0: \
770: putc (ch, (FILE)); \
771: break; \
772: case 1: \
773: fprintf ((FILE), "\\%03o", ch); \
774: break; \
775: default: \
776: putc ('\\', (FILE)); \
777: putc (escape, (FILE)); \
778: break; \
779: } \
780: } \
781: fprintf ((FILE), "\"\n"); \
782: } \
783: while (0)
784:
785: /* The routine used to output sequences of byte values. We use a special
786: version of this for most svr4 targets because doing so makes the
787: generated assembly code more compact (and thus faster to assemble)
788: as well as more readable. Note that if we find subparts of the
789: character sequence which end with NUL (and which are shorter than
790: STRING_LIMIT) we output those using ASM_OUTPUT_LIMITED_STRING. */
791:
792: #undef ASM_OUTPUT_ASCII
793: #define ASM_OUTPUT_ASCII(FILE, STR, LENGTH) \
794: do \
795: { \
796: register unsigned char *_ascii_bytes = (unsigned char *) (STR); \
797: register unsigned char *limit = _ascii_bytes + (LENGTH); \
798: register unsigned bytes_in_chunk = 0; \
799: for (; _ascii_bytes < limit; _ascii_bytes++) \
800: { \
801: register unsigned char *p; \
802: if (bytes_in_chunk >= 60) \
803: { \
804: fprintf ((FILE), "\"\n"); \
805: bytes_in_chunk = 0; \
806: } \
807: for (p = _ascii_bytes; p < limit && *p != '\0'; p++) \
808: continue; \
809: if (p < limit && (p - _ascii_bytes) <= STRING_LIMIT) \
810: { \
811: if (bytes_in_chunk > 0) \
812: { \
813: fprintf ((FILE), "\"\n"); \
814: bytes_in_chunk = 0; \
815: } \
816: ASM_OUTPUT_LIMITED_STRING ((FILE), _ascii_bytes); \
817: _ascii_bytes = p; \
818: } \
819: else \
820: { \
821: register int escape; \
822: register unsigned ch; \
823: if (bytes_in_chunk == 0) \
824: fprintf ((FILE), "\t%s\t\"", ASCII_DATA_ASM_OP); \
825: switch (escape = ESCAPES[ch = *_ascii_bytes]) \
826: { \
827: case 0: \
828: putc (ch, (FILE)); \
829: bytes_in_chunk++; \
830: break; \
831: case 1: \
832: fprintf ((FILE), "\\%03o", ch); \
833: bytes_in_chunk += 4; \
834: break; \
835: default: \
836: putc ('\\', (FILE)); \
837: putc (escape, (FILE)); \
838: bytes_in_chunk += 2; \
839: break; \
840: } \
841: } \
842: } \
843: if (bytes_in_chunk > 0) \
844: fprintf ((FILE), "\"\n"); \
845: } \
846: while (0)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.