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