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