|
|
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: /* Define a symbol so that libgcc* can know what sort of operating
43: environment and assembler syntax we are targeting for. */
44: #ifndef SVR4
45: #define SVR4
46: #endif
47:
48: /* For the sake of libgcc2.c, indicate target supports atexit. */
49: #define HAVE_ATEXIT
50:
51: /* Cpp, assembler, linker, library, and startfile spec's. */
52:
53: /* This defines which switch letters take arguments. On svr4, most of
54: the normal cases (defined in gcc.c) apply, and we also have -h* and
55: -z* options (for the linker). Note however that there is no such
56: thing as a -T option for svr4. */
57:
58: #define SWITCH_TAKES_ARG(CHAR) \
59: ( (CHAR) == 'D' \
60: || (CHAR) == 'U' \
61: || (CHAR) == 'o' \
62: || (CHAR) == 'e' \
63: || (CHAR) == 'u' \
64: || (CHAR) == 'I' \
65: || (CHAR) == 'm' \
66: || (CHAR) == 'L' \
67: || (CHAR) == 'A' \
68: || (CHAR) == 'h' \
69: || (CHAR) == 'z')
70:
71: /* This defines which multi-letter switches take arguments. On svr4,
72: there are no such switches except those implemented by GCC itself. */
73:
74: #define WORD_SWITCH_TAKES_ARG(STR) \
1.1.1.2 ! root 75: (!strcmp (STR, "include") || !strcmp (STR, "imacros") \
! 76: || !strcmp (STR, "aux-info"))
1.1 root 77:
78: /* You should redefine CPP_PREDEFINES in any file which includes this one.
79: The definition should be appropriate for the type of target system
80: involved, and it should include any -A (assertion) options which are
81: appropriate for the given target system. */
82: #undef CPP_PREDEFINES
83:
84: /* Provide an ASM_SPEC appropriate for svr4. Here we try to support as
85: many of the specialized svr4 assembler options as seems reasonable,
86: given that there are certain options which we can't (or shouldn't)
87: support directly due to the fact that they conflict with other options
88: for other svr4 tools (e.g. ld) or with other options for GCC itself.
89: For example, we don't support the -o (output file) or -R (remove
90: input file) options because GCC already handles these things. We
91: also don't support the -m (run m4) option for the assembler because
92: that conflicts with the -m (produce load map) option of the svr4
93: linker. We do however allow passing arbitrary options to the svr4
94: assembler via the -Wa, option.
95:
96: Note that gcc doesn't allow a space to follow -Y in a -Ym,* or -Yd,*
97: option.
98: */
99:
100: #undef ASM_SPEC
101: #define ASM_SPEC \
102: "%{V} %{v:%{!V:-V}} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*}"
103:
104: /* svr4 assemblers need the `-' (indicating input from stdin) to come after
105: the -o option (and its argument) for some reason. If we try to put it
106: before the -o option, the assembler will try to read the file named as
107: the output file in the -o option as an input file (after it has already
108: written some stuff to it) and the binary stuff contained therein will
109: cause totally confuse the assembler, resulting in many spurious error
110: messages. */
111:
112: #undef ASM_FINAL_SPEC
113: #define ASM_FINAL_SPEC "%{pipe:-}"
114:
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.2 ! root 253: #define MULTIBYTE_CHARS
! 254:
1.1 root 255: #undef ASM_BYTE_OP
256: #define ASM_BYTE_OP "\t.byte"
257:
258: /* This is how to begin an assembly language file. Most svr4 assemblers want
259: at least a .file directive to come first, and some want to see a .version
260: directive come right after that. Here we just establish a default
261: which generates only the .file directive. If you need a .version
262: directive for any specific target, you should override this definition
263: in the target-specific file which includes this one. */
264:
265: #undef ASM_FILE_START
266: #define ASM_FILE_START(FILE) \
267: output_file_directive ((FILE), main_input_filename)
268:
269: /* This is how to allocate empty space in some section. The .zero
270: pseudo-op is used for this on most svr4 assemblers. */
271:
272: #undef ASM_OUTPUT_SKIP
273: #define ASM_OUTPUT_SKIP(FILE,SIZE) fprintf (FILE, "\t.zero\t%u\n", (SIZE))
274:
275: /* This is how to output a reference to a user-level label named NAME.
276: `assemble_name' uses this.
277:
278: For System V Release 4 the convention is *not* to prepend a leading
279: underscore onto user-level symbol names. */
280:
281: #undef ASM_OUTPUT_LABELREF
282: #define ASM_OUTPUT_LABELREF(FILE,NAME) fprintf (FILE, "%s", NAME)
283:
284: /* The standard SVR4 assembler seems to require that certain builtin
285: library routines (e.g. .udiv) be explicitly declared as .globl
286: in each assembly file where they are referenced. */
287:
288: #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \
289: ASM_GLOBALIZE_LABEL (FILE, XSTR (FUN, 0))
290:
291: /* This says how to output assembler code to declare an
292: uninitialized external linkage data object. Under SVR4,
293: the linker seems to want the alignment of data objects
294: to depend on their types. We do exactly that here. */
295:
296: #undef ASM_OUTPUT_ALIGNED_COMMON
297: #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \
298: do { \
299: fputs ("\t.comm\t", (FILE)); \
300: assemble_name ((FILE), (NAME)); \
301: fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \
302: } while (0)
303:
304: /* This says how to output assembler code to declare an
305: uninitialized internal linkage data object. Under SVR4,
306: the linker seems to want the alignment of data objects
307: to depend on their types. We do exactly that here. */
308:
1.1.1.2 ! root 309: #define BSS_ASM_OP ".bss"
1.1 root 310:
311: #undef ASM_OUTPUT_ALIGNED_LOCAL
312: #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
313: do { \
1.1.1.2 ! root 314: fprintf ((FILE), "\t%s\t%s,%u,%u\n", \
1.1 root 315: BSS_ASM_OP, (NAME), (SIZE), (ALIGN) / BITS_PER_UNIT); \
316: } while (0)
317:
318: /* This is the pseudo-op used to generate a 32-bit word of data with a
319: specific value in some section. This is the same for all known svr4
320: assemblers. */
321:
1.1.1.2 ! root 322: #define INT_ASM_OP ".long"
1.1 root 323:
324: /* This is the pseudo-op used to generate a contiguous sequence of byte
325: values from a double-quoted string WITHOUT HAVING A TERMINATING NUL
326: AUTOMATICALLY APPENDED. This is the same for most svr4 assemblers. */
327:
328: #undef ASCII_DATA_ASM_OP
329: #define ASCII_DATA_ASM_OP ".ascii"
330:
331: /* Support const sections and the ctors and dtors sections for g++.
332: Note that there appears to be two different ways to support const
333: sections at the moment. You can either #define the symbol
334: READONLY_DATA_SECTION (giving it some code which switches to the
335: readonly data section) or else you can #define the symbols
336: EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS, SELECT_SECTION, and
337: SELECT_RTX_SECTION. We do both here just to be on the safe side. */
338:
339: #define USE_CONST_SECTION 1
340:
1.1.1.2 ! root 341: #define CONST_SECTION_ASM_OP ".section\t.rodata"
! 342: #define CTORS_SECTION_ASM_OP ".section\t.ctors,\"a\",@progbits"
! 343: #define DTORS_SECTION_ASM_OP ".section\t.dtors,\"a\",@progbits"
1.1 root 344:
345: /* On svr4, we *do* have support for the .init section, and we can put
346: stuff in there to be executed before `main'. We let crtstuff.c and
347: other files know this by defining the following symbol. The definition
348: says how to change sections to the .init section. This is the same
349: for all know svr4 assemblers. */
350:
1.1.1.2 ! root 351: #define INIT_SECTION_ASM_OP ".section\t.init"
1.1 root 352:
353: /* A default list of other sections which we might be "in" at any given
354: time. For targets that use additional sections (e.g. .tdesc) you
355: should override this definition in the target-specific file which
356: includes this file. */
357:
358: #undef EXTRA_SECTIONS
359: #define EXTRA_SECTIONS in_const, in_ctors, in_dtors
360:
361: /* A default list of extra section function definitions. For targets
362: that use additional sections (e.g. .tdesc) you should override this
363: definition in the target-specific file which includes this file. */
364:
365: #undef EXTRA_SECTION_FUNCTIONS
366: #define EXTRA_SECTION_FUNCTIONS \
367: CONST_SECTION_FUNCTION \
368: CTORS_SECTION_FUNCTION \
369: DTORS_SECTION_FUNCTION
370:
371: #define READONLY_DATA_SECTION() const_section ()
372:
373: extern void text_section();
374:
375: #define CONST_SECTION_FUNCTION \
376: void \
377: const_section () \
378: { \
379: if (!USE_CONST_SECTION) \
380: text_section(); \
381: else if (in_section != in_const) \
382: { \
383: fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP); \
384: in_section = in_const; \
385: } \
386: }
387:
388: #define CTORS_SECTION_FUNCTION \
389: void \
390: ctors_section () \
391: { \
392: if (in_section != in_ctors) \
393: { \
394: fprintf (asm_out_file, CTORS_SECTION_ASM_OP); \
395: in_section = in_ctors; \
396: } \
397: }
398:
399: #define DTORS_SECTION_FUNCTION \
400: void \
401: dtors_section () \
402: { \
403: if (in_section != in_dtors) \
404: { \
405: fprintf (asm_out_file, DTORS_SECTION_ASM_OP); \
406: in_section = in_dtors; \
407: } \
408: }
409:
410: /* A C statement (sans semicolon) to output an element in the table of
411: global constructors. */
412: #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
413: do { \
414: ctors_section (); \
1.1.1.2 ! root 415: fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
1.1 root 416: assemble_name (FILE, NAME); \
417: fprintf (FILE, "\n"); \
418: } while (0)
419:
420: /* A C statement (sans semicolon) to output an element in the table of
421: global destructors. */
422: #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
423: do { \
424: dtors_section (); \
1.1.1.2 ! root 425: fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
1.1 root 426: assemble_name (FILE, NAME); \
427: fprintf (FILE, "\n"); \
428: } while (0)
429:
430: /* A C statement or statements to switch to the appropriate
431: section for output of DECL. DECL is either a `VAR_DECL' node
432: or a constant of some sort. RELOC indicates whether forming
433: the initial value of DECL requires link-time relocations. */
434:
435: #define SELECT_SECTION(DECL,RELOC) \
436: { \
437: if (TREE_CODE (DECL) == STRING_CST) \
438: { \
439: if (! flag_writable_strings) \
440: const_section (); \
441: else \
442: data_section (); \
443: } \
444: else if (TREE_CODE (DECL) == VAR_DECL) \
445: { \
446: if ((flag_pic && RELOC) \
447: || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL)) \
448: data_section (); \
449: else \
450: const_section (); \
451: } \
452: else \
453: const_section (); \
454: }
455:
456: /* A C statement or statements to switch to the appropriate
457: section for output of RTX in mode MODE. RTX is some kind
458: of constant in RTL. The argument MODE is redundant except
459: in the case of a `const_int' rtx. Currently, these always
460: go into the const section. */
461:
462: #undef SELECT_RTX_SECTION
463: #define SELECT_RTX_SECTION(MODE,RTX) const_section()
464:
465: /* Define the strings used for the special svr4 .type and .size directives.
466: These strings generally do not vary from one system running svr4 to
467: another, but if a given system (e.g. m88k running svr) needs to use
468: different pseudo-op names for these, they may be overridden in the
469: file which includes this one. */
470:
1.1.1.2 ! root 471: #define TYPE_ASM_OP ".type"
! 472: #define SIZE_ASM_OP ".size"
1.1 root 473:
474: /* The following macro defines the format used to output the second
475: operand of the .type assembler directive. Different svr4 assemblers
476: expect various different forms for this operand. The one given here
477: is just a default. You may need to override it in your machine-
478: specific tm.h file (depending upon the particulars of your assembler). */
479:
480: #define TYPE_OPERAND_FMT "@%s"
481:
482: /* These macros generate the special .type and .size directives which
483: are used to set the corresponding fields of the linker symbol table
484: entries in an ELF object file under SVR4. */
485:
486: /* Write the extra assembler code needed to declare a function properly. */
487:
488: #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
489: do { \
1.1.1.2 ! root 490: fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
1.1 root 491: assemble_name (FILE, NAME); \
492: putc (',', FILE); \
493: fprintf (FILE, TYPE_OPERAND_FMT, "function"); \
494: putc ('\n', FILE); \
495: ASM_OUTPUT_LABEL(FILE, NAME); \
496: } while (0)
497:
498: /* Write the extra assembler code needed to declare an object properly. */
499:
500: #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
501: do { \
1.1.1.2 ! root 502: fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
1.1 root 503: assemble_name (FILE, NAME); \
504: putc (',', FILE); \
505: fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
506: putc ('\n', FILE); \
507: if (!flag_inhibit_size_directive) \
508: { \
1.1.1.2 ! root 509: fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
1.1 root 510: assemble_name (FILE, NAME); \
511: fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (decl))); \
512: } \
513: ASM_OUTPUT_LABEL(FILE, NAME); \
514: } while (0)
515:
516: /* This is how to declare the size of a function. */
517:
518: #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \
519: do { \
520: if (!flag_inhibit_size_directive) \
521: { \
522: char label[256]; \
523: static int labelno; \
524: labelno++; \
525: ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno); \
526: ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno); \
1.1.1.2 ! root 527: fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
1.1 root 528: assemble_name (FILE, (FNAME)); \
529: fprintf (FILE, ","); \
530: assemble_name (FILE, label); \
531: fprintf (FILE, "-"); \
532: ASM_OUTPUT_LABELREF (FILE, (FNAME)); \
533: putc ('\n', FILE); \
534: } \
535: } while (0)
536:
537: /* A table of bytes codes used by the ASM_OUTPUT_ASCII and
538: ASM_OUTPUT_LIMITED_STRING macros. Each byte in the table
539: corresponds to a particular byte value [0..255]. For any
540: given byte value, if the value in the corresponding table
541: position is zero, the given character can be output directly.
542: If the table value is 1, the byte must be output as a \ooo
543: octal escape. If the tables value is anything else, then the
544: byte value should be output as a \ followed by the value
545: in the table. Note that we can use standard UN*X escape
546: sequences for many control characters, but we don't use
547: \a to represent BEL because some svr4 assemblers (e.g. on
548: the i386) don't know about that. */
549:
550: #define ESCAPES \
551: "\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\
552: \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\
553: \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\
554: \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\
555: \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\
556: \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\
557: \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\
558: \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"
559:
560: /* Some svr4 assemblers have a limit on the number of characters which
561: can appear in the operand of a .string directive. If your assembler
562: has such a limitation, you should define STRING_LIMIT to reflect that
563: limit. Note that at least some svr4 assemblers have a limit on the
564: actual number of bytes in the double-quoted string, and that they
1.1.1.2 ! root 565: count each character in an escape sequence as one byte. Thus, an
1.1 root 566: escape sequence like \377 would count as four bytes.
567:
568: If your target assembler doesn't support the .string directive, you
569: should define this to zero.
570: */
571:
572: #define STRING_LIMIT ((unsigned) 256)
573:
574: #define STRING_ASM_OP ".string"
575:
576: /* The routine used to output NUL terminated strings. We use a special
577: version of this for most svr4 targets because doing so makes the
578: generated assembly code more compact (and thus faster to assemble)
579: as well as more readable, especially for targets like the i386
580: (where the only alternative is to output character sequences as
581: comma separated lists of numbers). */
582:
583: #define ASM_OUTPUT_LIMITED_STRING(FILE, STR) \
584: do \
585: { \
586: register unsigned char *_limited_str = (unsigned char *) (STR); \
587: register unsigned ch; \
588: fprintf ((FILE), "\t%s\t\"", STRING_ASM_OP); \
589: for (; ch = *_limited_str; _limited_str++) \
590: { \
591: register int escape; \
592: switch (escape = ESCAPES[ch]) \
593: { \
594: case 0: \
595: putc (ch, (FILE)); \
596: break; \
597: case 1: \
598: fprintf ((FILE), "\\%03o", ch); \
599: break; \
600: default: \
601: putc ('\\', (FILE)); \
602: putc (escape, (FILE)); \
603: break; \
604: } \
605: } \
606: fprintf ((FILE), "\"\n"); \
607: } \
608: while (0)
609:
610: /* The routine used to output sequences of byte values. We use a special
611: version of this for most svr4 targets because doing so makes the
612: generated assembly code more compact (and thus faster to assemble)
613: as well as more readable. Note that if we find subparts of the
614: character sequence which end with NUL (and which are shorter than
615: STRING_LIMIT) we output those using ASM_OUTPUT_LIMITED_STRING. */
616:
617: #undef ASM_OUTPUT_ASCII
618: #define ASM_OUTPUT_ASCII(FILE, STR, LENGTH) \
619: do \
620: { \
621: register unsigned char *_ascii_bytes = (unsigned char *) (STR); \
622: register unsigned char *limit = _ascii_bytes + (LENGTH); \
623: register unsigned bytes_in_chunk = 0; \
624: for (; _ascii_bytes < limit; _ascii_bytes++) \
625: { \
626: register unsigned char *p; \
627: if (bytes_in_chunk >= 60) \
628: { \
629: fprintf ((FILE), "\"\n"); \
630: bytes_in_chunk = 0; \
631: } \
632: for (p = _ascii_bytes; p < limit && *p != '\0'; p++) \
633: continue; \
634: if (p < limit && (p - _ascii_bytes) <= STRING_LIMIT) \
635: { \
636: if (bytes_in_chunk > 0) \
637: { \
638: fprintf ((FILE), "\"\n"); \
639: bytes_in_chunk = 0; \
640: } \
641: ASM_OUTPUT_LIMITED_STRING ((FILE), _ascii_bytes); \
642: _ascii_bytes = p; \
643: } \
644: else \
645: { \
646: register int escape; \
647: register unsigned ch; \
648: if (bytes_in_chunk == 0) \
649: fprintf ((FILE), "\t%s\t\"", ASCII_DATA_ASM_OP); \
650: switch (escape = ESCAPES[ch = *_ascii_bytes]) \
651: { \
652: case 0: \
653: putc (ch, (FILE)); \
654: bytes_in_chunk++; \
655: break; \
656: case 1: \
657: fprintf ((FILE), "\\%03o", ch); \
658: bytes_in_chunk += 4; \
659: break; \
660: default: \
661: putc ('\\', (FILE)); \
662: putc (escape, (FILE)); \
663: bytes_in_chunk += 2; \
664: break; \
665: } \
666: } \
667: } \
668: if (bytes_in_chunk > 0) \
669: fprintf ((FILE), "\"\n"); \
670: } \
671: while (0)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.