|
|
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.
3: Copyright (C) 1991 Free Software Foundation, Inc.
4:
5: Written by Ron Guilmette ([email protected]).
6:
7: This file is part of GNU CC.
8:
9: GNU CC is free software; you can redistribute it and/or modify
10: it under the terms of the GNU General Public License as published by
11: the Free Software Foundation; either version 2, or (at your option)
12: any later version.
13:
14: GNU CC is distributed in the hope that it will be useful,
15: but WITHOUT ANY WARRANTY; without even the implied warranty of
16: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17: GNU General Public License for more details.
18:
19: You should have received a copy of the GNU General Public License
20: along with GNU CC; see the file COPYING. If not, write to
21: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
22:
23: To use this file, make up a file with a name like:
24:
25: ?????svr4.h
26:
27: where ????? is replaced by the name of the basic hardware that you
28: are targeting for. Then, in the file ?????svr4.h, put something
29: like:
30:
31: #include "?????.h"
32: #include "svr4.h"
33:
34: followed by any really system-specific defines (or overrides of
35: defines) which you find that you need. For example, CPP_PREDEFINES
36: is defined here with only the defined -Dunix and -DSVR4. You should
37: probably override that in your target-specific ?????svr4.h file
38: with a set of defines that includes these, but also contains an
39: appropriate define for the type of hardware that you are targeting.
40: */
41:
1.1.1.4 ! root 42: /* Define a symbol indicating that we are using svr4.h. */
! 43: #define USING_SVR4_H
! 44:
1.1 root 45: /* For the sake of libgcc2.c, indicate target supports atexit. */
46: #define HAVE_ATEXIT
47:
48: /* Cpp, assembler, linker, library, and startfile spec's. */
49:
50: /* This defines which switch letters take arguments. On svr4, most of
51: the normal cases (defined in gcc.c) apply, and we also have -h* and
52: -z* options (for the linker). Note however that there is no such
53: thing as a -T option for svr4. */
54:
55: #define SWITCH_TAKES_ARG(CHAR) \
56: ( (CHAR) == 'D' \
57: || (CHAR) == 'U' \
58: || (CHAR) == 'o' \
59: || (CHAR) == 'e' \
60: || (CHAR) == 'u' \
61: || (CHAR) == 'I' \
62: || (CHAR) == 'm' \
63: || (CHAR) == 'L' \
64: || (CHAR) == 'A' \
65: || (CHAR) == 'h' \
66: || (CHAR) == 'z')
67:
68: /* This defines which multi-letter switches take arguments. On svr4,
69: there are no such switches except those implemented by GCC itself. */
70:
71: #define WORD_SWITCH_TAKES_ARG(STR) \
1.1.1.2 root 72: (!strcmp (STR, "include") || !strcmp (STR, "imacros") \
73: || !strcmp (STR, "aux-info"))
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:
247: /* Define the actual types of some ANSI-mandated types. (These
248: definitions should work for most SVR4 systems). */
249:
250: #undef SIZE_TYPE
251: #define SIZE_TYPE "unsigned int"
252:
253: #undef PTRDIFF_TYPE
254: #define PTRDIFF_TYPE "int"
255:
256: #undef WCHAR_TYPE
257: #define WCHAR_TYPE "long int"
258:
259: #undef WCHAR_TYPE_SIZE
260: #define WCHAR_TYPE_SIZE BITS_PER_WORD
261:
1.1.1.3 root 262: /* This causes trouble, because it requires the host machine
263: to support ANSI C. */
264: /* #define MULTIBYTE_CHARS */
1.1.1.2 root 265:
1.1 root 266: #undef ASM_BYTE_OP
1.1.1.3 root 267: #define ASM_BYTE_OP ".byte"
268:
269: #undef SET_ASM_OP
270: #define SET_ASM_OP ".set"
1.1 root 271:
272: /* This is how to begin an assembly language file. Most svr4 assemblers want
273: at least a .file directive to come first, and some want to see a .version
274: directive come right after that. Here we just establish a default
275: which generates only the .file directive. If you need a .version
276: directive for any specific target, you should override this definition
277: in the target-specific file which includes this one. */
278:
279: #undef ASM_FILE_START
280: #define ASM_FILE_START(FILE) \
281: output_file_directive ((FILE), main_input_filename)
282:
283: /* This is how to allocate empty space in some section. The .zero
284: pseudo-op is used for this on most svr4 assemblers. */
285:
1.1.1.3 root 286: #define SKIP_ASM_OP ".zero"
287:
1.1 root 288: #undef ASM_OUTPUT_SKIP
1.1.1.3 root 289: #define ASM_OUTPUT_SKIP(FILE,SIZE) \
290: fprintf (FILE, "\t%s\t%u\n", SKIP_ASM_OP, (SIZE))
1.1 root 291:
292: /* This is how to output a reference to a user-level label named NAME.
293: `assemble_name' uses this.
294:
295: For System V Release 4 the convention is *not* to prepend a leading
296: underscore onto user-level symbol names. */
297:
298: #undef ASM_OUTPUT_LABELREF
299: #define ASM_OUTPUT_LABELREF(FILE,NAME) fprintf (FILE, "%s", NAME)
300:
1.1.1.3 root 301: /* This is how to output an internal numbered label where
302: PREFIX is the class of label and NUM is the number within the class.
303:
304: For most svr4 systems, the convention is that any symbol which begins
305: with a period is not put into the linker symbol table by the assembler. */
306:
307: #undef ASM_OUTPUT_INTERNAL_LABEL
308: #define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM) \
309: do { \
310: fprintf (FILE, ".%s%d:\n", PREFIX, NUM); \
311: } while (0)
312:
313: /* This is how to store into the string LABEL
314: the symbol_ref name of an internal numbered label where
315: PREFIX is the class of label and NUM is the number within the class.
316: This is suitable for output with `assemble_name'.
317:
318: For most svr4 systems, the convention is that any symbol which begins
319: with a period is not put into the linker symbol table by the assembler. */
320:
321: #undef ASM_GENERATE_INTERNAL_LABEL
322: #define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
323: do { \
324: sprintf (LABEL, "*.%s%d", PREFIX, NUM); \
325: } while (0)
326:
1.1.1.4 ! root 327: /* Output the label which preceeds a jumptable. Note that for all svr4
! 328: systems where we actually generate jumptables (which is to say every
! 329: svr4 target except i386, where we use casesi instead) we put the jump-
! 330: tables into the .rodata section and since other stuff could have been
! 331: put into the .rodata section prior to any given jumptable, we have to
! 332: make sure that the location counter for the .rodata section gets pro-
! 333: perly re-aligned prior to the actual beginning of the jump table. */
! 334:
! 335: #define ALIGN_ASM_OP ".align"
! 336:
! 337: #ifndef ASM_OUTPUT_BEFORE_CASE_LABEL
! 338: #define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE,PREFIX,NUM,TABLE) \
! 339: ASM_OUTPUT_ALIGN ((FILE), 2);
! 340: #endif
! 341:
! 342: #undef ASM_OUTPUT_CASE_LABEL
! 343: #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,JUMPTABLE) \
! 344: do { \
! 345: ASM_OUTPUT_BEFORE_CASE_LABEL (FILE, PREFIX, NUM, JUMPTABLE) \
! 346: ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); \
! 347: } while (0)
! 348:
1.1 root 349: /* The standard SVR4 assembler seems to require that certain builtin
350: library routines (e.g. .udiv) be explicitly declared as .globl
351: in each assembly file where they are referenced. */
352:
353: #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \
354: ASM_GLOBALIZE_LABEL (FILE, XSTR (FUN, 0))
355:
356: /* This says how to output assembler code to declare an
357: uninitialized external linkage data object. Under SVR4,
358: the linker seems to want the alignment of data objects
359: to depend on their types. We do exactly that here. */
360:
1.1.1.3 root 361: #define COMMON_ASM_OP ".comm"
362:
1.1 root 363: #undef ASM_OUTPUT_ALIGNED_COMMON
364: #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \
365: do { \
1.1.1.3 root 366: fprintf ((FILE), "\t%s\t", COMMON_ASM_OP); \
1.1 root 367: assemble_name ((FILE), (NAME)); \
368: fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \
369: } while (0)
370:
371: /* This says how to output assembler code to declare an
372: uninitialized internal linkage data object. Under SVR4,
373: the linker seems to want the alignment of data objects
374: to depend on their types. We do exactly that here. */
375:
1.1.1.3 root 376: #define LOCAL_ASM_OP ".local"
1.1 root 377:
378: #undef ASM_OUTPUT_ALIGNED_LOCAL
379: #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
380: do { \
1.1.1.3 root 381: fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP); \
382: assemble_name ((FILE), (NAME)); \
383: fprintf ((FILE), "\n"); \
384: ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \
1.1 root 385: } while (0)
386:
387: /* This is the pseudo-op used to generate a 32-bit word of data with a
388: specific value in some section. This is the same for all known svr4
389: assemblers. */
390:
1.1.1.2 root 391: #define INT_ASM_OP ".long"
1.1 root 392:
393: /* This is the pseudo-op used to generate a contiguous sequence of byte
394: values from a double-quoted string WITHOUT HAVING A TERMINATING NUL
395: AUTOMATICALLY APPENDED. This is the same for most svr4 assemblers. */
396:
397: #undef ASCII_DATA_ASM_OP
398: #define ASCII_DATA_ASM_OP ".ascii"
399:
400: /* Support const sections and the ctors and dtors sections for g++.
401: Note that there appears to be two different ways to support const
402: sections at the moment. You can either #define the symbol
403: READONLY_DATA_SECTION (giving it some code which switches to the
404: readonly data section) or else you can #define the symbols
405: EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS, SELECT_SECTION, and
406: SELECT_RTX_SECTION. We do both here just to be on the safe side. */
407:
408: #define USE_CONST_SECTION 1
409:
1.1.1.2 root 410: #define CONST_SECTION_ASM_OP ".section\t.rodata"
411: #define CTORS_SECTION_ASM_OP ".section\t.ctors,\"a\",@progbits"
412: #define DTORS_SECTION_ASM_OP ".section\t.dtors,\"a\",@progbits"
1.1 root 413:
414: /* On svr4, we *do* have support for the .init section, and we can put
415: stuff in there to be executed before `main'. We let crtstuff.c and
416: other files know this by defining the following symbol. The definition
417: says how to change sections to the .init section. This is the same
418: for all know svr4 assemblers. */
419:
1.1.1.2 root 420: #define INIT_SECTION_ASM_OP ".section\t.init"
1.1 root 421:
422: /* A default list of other sections which we might be "in" at any given
423: time. For targets that use additional sections (e.g. .tdesc) you
424: should override this definition in the target-specific file which
425: includes this file. */
426:
427: #undef EXTRA_SECTIONS
428: #define EXTRA_SECTIONS in_const, in_ctors, in_dtors
429:
430: /* A default list of extra section function definitions. For targets
431: that use additional sections (e.g. .tdesc) you should override this
432: definition in the target-specific file which includes this file. */
433:
434: #undef EXTRA_SECTION_FUNCTIONS
435: #define EXTRA_SECTION_FUNCTIONS \
436: CONST_SECTION_FUNCTION \
437: CTORS_SECTION_FUNCTION \
438: DTORS_SECTION_FUNCTION
439:
440: #define READONLY_DATA_SECTION() const_section ()
441:
442: extern void text_section();
443:
444: #define CONST_SECTION_FUNCTION \
445: void \
446: const_section () \
447: { \
448: if (!USE_CONST_SECTION) \
449: text_section(); \
450: else if (in_section != in_const) \
451: { \
452: fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP); \
453: in_section = in_const; \
454: } \
455: }
456:
457: #define CTORS_SECTION_FUNCTION \
458: void \
459: ctors_section () \
460: { \
461: if (in_section != in_ctors) \
462: { \
1.1.1.3 root 463: fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP); \
1.1 root 464: in_section = in_ctors; \
465: } \
466: }
467:
468: #define DTORS_SECTION_FUNCTION \
469: void \
470: dtors_section () \
471: { \
472: if (in_section != in_dtors) \
473: { \
1.1.1.3 root 474: fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP); \
1.1 root 475: in_section = in_dtors; \
476: } \
477: }
478:
479: /* A C statement (sans semicolon) to output an element in the table of
480: global constructors. */
481: #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
482: do { \
483: ctors_section (); \
1.1.1.2 root 484: fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
1.1 root 485: assemble_name (FILE, NAME); \
486: fprintf (FILE, "\n"); \
487: } while (0)
488:
489: /* A C statement (sans semicolon) to output an element in the table of
490: global destructors. */
491: #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
492: do { \
493: dtors_section (); \
1.1.1.2 root 494: fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
1.1 root 495: assemble_name (FILE, NAME); \
496: fprintf (FILE, "\n"); \
497: } while (0)
498:
499: /* A C statement or statements to switch to the appropriate
500: section for output of DECL. DECL is either a `VAR_DECL' node
501: or a constant of some sort. RELOC indicates whether forming
502: the initial value of DECL requires link-time relocations. */
503:
504: #define SELECT_SECTION(DECL,RELOC) \
505: { \
506: if (TREE_CODE (DECL) == STRING_CST) \
507: { \
508: if (! flag_writable_strings) \
509: const_section (); \
510: else \
511: data_section (); \
512: } \
513: else if (TREE_CODE (DECL) == VAR_DECL) \
514: { \
515: if ((flag_pic && RELOC) \
516: || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL)) \
517: data_section (); \
518: else \
519: const_section (); \
520: } \
521: else \
522: const_section (); \
523: }
524:
525: /* A C statement or statements to switch to the appropriate
526: section for output of RTX in mode MODE. RTX is some kind
527: of constant in RTL. The argument MODE is redundant except
528: in the case of a `const_int' rtx. Currently, these always
529: go into the const section. */
530:
531: #undef SELECT_RTX_SECTION
532: #define SELECT_RTX_SECTION(MODE,RTX) const_section()
533:
534: /* Define the strings used for the special svr4 .type and .size directives.
535: These strings generally do not vary from one system running svr4 to
536: another, but if a given system (e.g. m88k running svr) needs to use
537: different pseudo-op names for these, they may be overridden in the
538: file which includes this one. */
539:
1.1.1.2 root 540: #define TYPE_ASM_OP ".type"
541: #define SIZE_ASM_OP ".size"
1.1.1.3 root 542: #define WEAK_ASM_OP ".weak"
1.1 root 543:
544: /* The following macro defines the format used to output the second
545: operand of the .type assembler directive. Different svr4 assemblers
546: expect various different forms for this operand. The one given here
547: is just a default. You may need to override it in your machine-
548: specific tm.h file (depending upon the particulars of your assembler). */
549:
550: #define TYPE_OPERAND_FMT "@%s"
551:
1.1.1.3 root 552: /* Write the extra assembler code needed to declare a function's result.
553: Most svr4 assemblers don't require any special declaration of the
554: result value, but there are exceptions. */
555:
556: #ifndef ASM_DECLARE_RESULT
557: #define ASM_DECLARE_RESULT(FILE, RESULT)
558: #endif
559:
1.1 root 560: /* These macros generate the special .type and .size directives which
561: are used to set the corresponding fields of the linker symbol table
1.1.1.3 root 562: entries in an ELF object file under SVR4. These macros also output
563: the starting labels for the relevant functions/objects. */
1.1 root 564:
1.1.1.3 root 565: /* Write the extra assembler code needed to declare a function properly.
566: Some svr4 assemblers need to also have something extra said about the
567: function's return value. We allow for that here. */
1.1 root 568:
569: #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
570: do { \
1.1.1.2 root 571: fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
1.1 root 572: assemble_name (FILE, NAME); \
573: putc (',', FILE); \
574: fprintf (FILE, TYPE_OPERAND_FMT, "function"); \
575: putc ('\n', FILE); \
1.1.1.3 root 576: ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
1.1 root 577: ASM_OUTPUT_LABEL(FILE, NAME); \
578: } while (0)
579:
580: /* Write the extra assembler code needed to declare an object properly. */
581:
582: #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
583: do { \
1.1.1.2 root 584: fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
1.1 root 585: assemble_name (FILE, NAME); \
586: putc (',', FILE); \
587: fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
588: putc ('\n', FILE); \
589: if (!flag_inhibit_size_directive) \
590: { \
1.1.1.2 root 591: fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
1.1 root 592: assemble_name (FILE, NAME); \
593: fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (decl))); \
594: } \
595: ASM_OUTPUT_LABEL(FILE, NAME); \
596: } while (0)
597:
598: /* This is how to declare the size of a function. */
599:
600: #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \
601: do { \
602: if (!flag_inhibit_size_directive) \
603: { \
604: char label[256]; \
605: static int labelno; \
606: labelno++; \
607: ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno); \
608: ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno); \
1.1.1.2 root 609: fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
1.1 root 610: assemble_name (FILE, (FNAME)); \
611: fprintf (FILE, ","); \
612: assemble_name (FILE, label); \
613: fprintf (FILE, "-"); \
1.1.1.3 root 614: assemble_name (FILE, (FNAME)); \
1.1 root 615: putc ('\n', FILE); \
616: } \
617: } while (0)
618:
619: /* A table of bytes codes used by the ASM_OUTPUT_ASCII and
620: ASM_OUTPUT_LIMITED_STRING macros. Each byte in the table
621: corresponds to a particular byte value [0..255]. For any
622: given byte value, if the value in the corresponding table
623: position is zero, the given character can be output directly.
624: If the table value is 1, the byte must be output as a \ooo
625: octal escape. If the tables value is anything else, then the
626: byte value should be output as a \ followed by the value
627: in the table. Note that we can use standard UN*X escape
628: sequences for many control characters, but we don't use
629: \a to represent BEL because some svr4 assemblers (e.g. on
630: the i386) don't know about that. */
631:
632: #define ESCAPES \
633: "\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\
634: \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\
635: \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\
636: \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\
637: \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\
638: \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\
639: \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\
640: \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"
641:
642: /* Some svr4 assemblers have a limit on the number of characters which
643: can appear in the operand of a .string directive. If your assembler
644: has such a limitation, you should define STRING_LIMIT to reflect that
645: limit. Note that at least some svr4 assemblers have a limit on the
646: actual number of bytes in the double-quoted string, and that they
1.1.1.2 root 647: count each character in an escape sequence as one byte. Thus, an
1.1 root 648: escape sequence like \377 would count as four bytes.
649:
650: If your target assembler doesn't support the .string directive, you
651: should define this to zero.
652: */
653:
654: #define STRING_LIMIT ((unsigned) 256)
655:
656: #define STRING_ASM_OP ".string"
657:
658: /* The routine used to output NUL terminated strings. We use a special
659: version of this for most svr4 targets because doing so makes the
660: generated assembly code more compact (and thus faster to assemble)
661: as well as more readable, especially for targets like the i386
662: (where the only alternative is to output character sequences as
663: comma separated lists of numbers). */
664:
665: #define ASM_OUTPUT_LIMITED_STRING(FILE, STR) \
666: do \
667: { \
668: register unsigned char *_limited_str = (unsigned char *) (STR); \
669: register unsigned ch; \
670: fprintf ((FILE), "\t%s\t\"", STRING_ASM_OP); \
671: for (; ch = *_limited_str; _limited_str++) \
672: { \
673: register int escape; \
674: switch (escape = ESCAPES[ch]) \
675: { \
676: case 0: \
677: putc (ch, (FILE)); \
678: break; \
679: case 1: \
680: fprintf ((FILE), "\\%03o", ch); \
681: break; \
682: default: \
683: putc ('\\', (FILE)); \
684: putc (escape, (FILE)); \
685: break; \
686: } \
687: } \
688: fprintf ((FILE), "\"\n"); \
689: } \
690: while (0)
691:
692: /* The routine used to output sequences of byte values. We use a special
693: version of this for most svr4 targets because doing so makes the
694: generated assembly code more compact (and thus faster to assemble)
695: as well as more readable. Note that if we find subparts of the
696: character sequence which end with NUL (and which are shorter than
697: STRING_LIMIT) we output those using ASM_OUTPUT_LIMITED_STRING. */
698:
699: #undef ASM_OUTPUT_ASCII
700: #define ASM_OUTPUT_ASCII(FILE, STR, LENGTH) \
701: do \
702: { \
703: register unsigned char *_ascii_bytes = (unsigned char *) (STR); \
704: register unsigned char *limit = _ascii_bytes + (LENGTH); \
705: register unsigned bytes_in_chunk = 0; \
706: for (; _ascii_bytes < limit; _ascii_bytes++) \
707: { \
708: register unsigned char *p; \
709: if (bytes_in_chunk >= 60) \
710: { \
711: fprintf ((FILE), "\"\n"); \
712: bytes_in_chunk = 0; \
713: } \
714: for (p = _ascii_bytes; p < limit && *p != '\0'; p++) \
715: continue; \
716: if (p < limit && (p - _ascii_bytes) <= STRING_LIMIT) \
717: { \
718: if (bytes_in_chunk > 0) \
719: { \
720: fprintf ((FILE), "\"\n"); \
721: bytes_in_chunk = 0; \
722: } \
723: ASM_OUTPUT_LIMITED_STRING ((FILE), _ascii_bytes); \
724: _ascii_bytes = p; \
725: } \
726: else \
727: { \
728: register int escape; \
729: register unsigned ch; \
730: if (bytes_in_chunk == 0) \
731: fprintf ((FILE), "\t%s\t\"", ASCII_DATA_ASM_OP); \
732: switch (escape = ESCAPES[ch = *_ascii_bytes]) \
733: { \
734: case 0: \
735: putc (ch, (FILE)); \
736: bytes_in_chunk++; \
737: break; \
738: case 1: \
739: fprintf ((FILE), "\\%03o", ch); \
740: bytes_in_chunk += 4; \
741: break; \
742: default: \
743: putc ('\\', (FILE)); \
744: putc (escape, (FILE)); \
745: bytes_in_chunk += 2; \
746: break; \
747: } \
748: } \
749: } \
750: if (bytes_in_chunk > 0) \
751: fprintf ((FILE), "\"\n"); \
752: } \
753: while (0)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.