|
|
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.