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