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