|
|
1.1.1.8 ! root 1: /* Operating system specific defines to be used when targeting GCC for some ! 2: generic System V Release 4 system. ! 3: Copyright (C) 1991, 1994, 1995 Free Software Foundation, Inc. ! 4: Contributed by Ron Guilmette ([email protected]). 1.1 root 5: 6: This file is part of GNU CC. 7: 8: GNU CC is free software; you can redistribute it and/or modify 9: it under the terms of the GNU General Public License as published by 10: the Free Software Foundation; either version 2, or (at your option) 11: any later version. 12: 13: GNU CC is distributed in the hope that it will be useful, 14: but WITHOUT ANY WARRANTY; without even the implied warranty of 15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16: GNU General Public License for more details. 17: 18: You should have received a copy of the GNU General Public License 19: along with GNU CC; see the file COPYING. If not, write to 1.1.1.8 ! root 20: the Free Software Foundation, 59 Temple Place - Suite 330, ! 21: Boston, MA 02111-1307, USA. 1.1 root 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: 1.1.1.4 root 42: /* Define a symbol indicating that we are using svr4.h. */ 43: #define USING_SVR4_H 44: 1.1 root 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) \ 1.1.1.5 root 72: (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) \ 73: && strcmp (STR, "Tdata") && strcmp (STR, "Ttext") \ 74: && strcmp (STR, "Tbss")) 1.1 root 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: 1.1.1.3 root 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: 1.1 root 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: 1.1.1.2 root 125: /* Provide a LIB_SPEC appropriate for svr4. Here we tack on the default 1.1.1.8 ! root 126: standard C library (unless we are building a shared library). */ ! 127: ! 128: #undef LIB_SPEC ! 129: #define LIB_SPEC "%{!shared:%{!symbolic:-lc}}" ! 130: ! 131: /* Provide a LIBGCC_SPEC appropriate for svr4. We also want to exclude ! 132: libgcc when -symbolic. */ ! 133: ! 134: #undef LIBGCC_SPEC ! 135: #define LIBGCC_SPEC "%{!shared:%{!symbolic:-lgcc}}" ! 136: ! 137: /* Provide an ENDFILE_SPEC appropriate for svr4. Here we tack on our own ! 138: magical crtend.o file (see crtstuff.c) which provides part of the ! 139: support for getting C++ file-scope static object constructed before 1.1 root 140: entering `main', followed by the normal svr3/svr4 "finalizer" file, 141: which is either `gcrtn.o' or `crtn.o'. */ 142: 1.1.1.8 ! root 143: #undef ENDFILE_SPEC ! 144: #define ENDFILE_SPEC "crtend.o%s %{pg:gcrtn.o}%{!pg:crtn.o%s}" 1.1 root 145: 146: /* Provide a LINK_SPEC appropriate for svr4. Here we provide support 147: for the special GCC options -static, -shared, and -symbolic which 148: allow us to link things in one of these three modes by applying the 149: appropriate combinations of options at link-time. We also provide 150: support here for as many of the other svr4 linker options as seems 151: reasonable, given that some of them conflict with options for other 152: svr4 tools (e.g. the assembler). In particular, we do support the 153: -h*, -z*, -V, -b, -t, -Qy, -Qn, and -YP* options here, and the -e*, 154: -l*, -o*, -r, -s, -u*, and -L* options are directly supported 155: by gcc.c itself. We don't directly support the -m (generate load 156: map) option because that conflicts with the -m (run m4) option of 157: the svr4 assembler. We also don't directly support the svr4 linker's 158: -I* or -M* options because these conflict with existing GCC options. 159: We do however allow passing arbitrary options to the svr4 linker 160: via the -Wl, option. We don't support the svr4 linker's -a option 161: at all because it is totally useless and because it conflicts with 162: GCC's own -a option. 163: 164: Note that gcc doesn't allow a space to follow -Y in a -YP,* option. 165: 166: When the -G link option is used (-shared and -symbolic) a final link is 167: not being done. */ 168: 169: #undef LINK_SPEC 1.1.1.2 root 170: #define LINK_SPEC "%{h*} %{V} %{v:%{!V:-V}} \ 171: %{b} %{Wl,*:%*} \ 1.1 root 172: %{static:-dn -Bstatic} \ 1.1.1.8 ! root 173: %{shared:-G -dy -z text %{!h*:%{o*:-h %*}}} \ ! 174: %{symbolic:-Bsymbolic -G -dy -z text %{!h*:%{o*:-h %*}}} \ 1.1.1.2 root 175: %{G:-G} \ 1.1 root 176: %{YP,*} \ 177: %{!YP,*:%{p:-Y P,/usr/ccs/lib/libp:/usr/lib/libp:/usr/ccs/lib:/usr/lib} \ 178: %{!p:-Y P,/usr/ccs/lib:/usr/lib}} \ 179: %{Qy:} %{!Qn:-Qy}" 180: 181: /* Gcc automatically adds in one of the files /usr/ccs/lib/values-Xc.o, 182: /usr/ccs/lib/values-Xa.o, or /usr/ccs/lib/values-Xt.o for each final 183: link step (depending upon the other gcc options selected, such as 184: -traditional and -ansi). These files each contain one (initialized) 185: copy of a special variable called `_lib_version'. Each one of these 186: files has `_lib_version' initialized to a different (enum) value. 187: The SVR4 library routines query the value of `_lib_version' at run 188: to decide how they should behave. Specifically, they decide (based 189: upon the value of `_lib_version') if they will act in a strictly ANSI 1.1.1.2 root 190: conforming manner or not. 1.1 root 191: */ 192: 193: #undef STARTFILE_SPEC 194: #define STARTFILE_SPEC "%{!shared: \ 195: %{!symbolic: \ 1.1.1.8 ! root 196: %{pg:gcrt1.o%s}%{!pg:%{p:mcrt1.o%s}%{!p:crt1.o%s}}}}\ ! 197: %{pg:gcrti.o%s}%{!pg:crti.o%s} \ ! 198: %{ansi:values-Xc.o%s} \ ! 199: %{!ansi: \ ! 200: %{traditional:values-Xt.o%s} \ ! 201: %{!traditional:values-Xa.o%s}} \ ! 202: crtbegin.o%s" 1.1 root 203: 1.1.1.2 root 204: /* Attach a special .ident directive to the end of the file to identify 1.1 root 205: the version of GCC which compiled this code. The format of the 1.1.1.2 root 206: .ident string is patterned after the ones produced by native svr4 1.1 root 207: C compilers. */ 208: 1.1.1.4 root 209: #define IDENT_ASM_OP ".ident" 210: 1.1 root 211: #define ASM_FILE_END(FILE) \ 212: do { \ 1.1.1.4 root 213: fprintf ((FILE), "\t%s\t\"GCC: (GNU) %s\"\n", \ 214: IDENT_ASM_OP, version_string); \ 1.1 root 215: } while (0) 216: 217: /* Allow #sccs in preprocessor. */ 218: 219: #define SCCS_DIRECTIVE 220: 221: /* Output #ident as a .ident. */ 222: 223: #define ASM_OUTPUT_IDENT(FILE, NAME) \ 1.1.1.4 root 224: fprintf (FILE, "\t%s\t\"%s\"\n", IDENT_ASM_OP, NAME); 1.1 root 225: 226: /* Use periods rather than dollar signs in special g++ assembler names. */ 227: 228: #define NO_DOLLAR_IN_LABEL 229: 230: /* Writing `int' for a bitfield forces int alignment for the structure. */ 231: 232: #define PCC_BITFIELD_TYPE_MATTERS 1 233: 234: /* Implicit library calls should use memcpy, not bcopy, etc. */ 235: 236: #define TARGET_MEM_FUNCTIONS 237: 1.1.1.4 root 238: /* Handle #pragma weak and #pragma pack. */ 239: 240: #define HANDLE_SYSV_PRAGMA 241: 1.1 root 242: /* System V Release 4 uses DWARF debugging info. */ 243: 244: #define DWARF_DEBUGGING_INFO 245: 246: /* The numbers used to denote specific machine registers in the System V 247: Release 4 DWARF debugging information are quite likely to be totally 248: different from the numbers used in BSD stabs debugging information 249: for the same kind of target machine. Thus, we undefine the macro 250: DBX_REGISTER_NUMBER here as an extra inducement to get people to 251: provide proper machine-specific definitions of DBX_REGISTER_NUMBER 252: (which is also used to provide DWARF registers numbers in dwarfout.c) 253: in their tm.h files which include this file. */ 254: 255: #undef DBX_REGISTER_NUMBER 256: 1.1.1.7 root 257: /* gas on SVR4 supports the use of .stabs. Permit -gstabs to be used 258: in general, although it will only work when using gas. */ 259: 260: #define DBX_DEBUGGING_INFO 261: 262: /* Use DWARF debugging info by default. */ 263: 264: #ifndef PREFERRED_DEBUGGING_TYPE 265: #define PREFERRED_DEBUGGING_TYPE DWARF_DEBUG 266: #endif 267: 268: /* Make LBRAC and RBRAC addresses relative to the start of the 269: function. The native Solaris stabs debugging format works this 270: way, gdb expects it, and it reduces the number of relocation 271: entries. */ 272: 273: #define DBX_BLOCKS_FUNCTION_RELATIVE 1 274: 275: /* When using stabs, gcc2_compiled must be a stabs entry, not an 1.1.1.8 ! root 276: ordinary symbol, or gdb won't see it. The stabs entry must be ! 277: before the N_SO in order for gdb to find it. */ 1.1.1.7 root 278: 279: #define ASM_IDENTIFY_GCC(FILE) \ 280: do \ 281: { \ 282: if (write_symbols != DBX_DEBUG) \ 283: fputs ("gcc2_compiled.:\n", FILE); \ 1.1.1.8 ! root 284: else \ 1.1.1.7 root 285: fputs ("\t.stabs\t\"gcc2_compiled.\", 0x3c, 0, 0, 0\n", FILE); \ 286: } \ 287: while (0) 288: 289: /* Like block addresses, stabs line numbers are relative to the 290: current function. */ 291: 292: #define ASM_OUTPUT_SOURCE_LINE(file, line) \ 293: do \ 294: { \ 295: static int sym_lineno = 1; \ 1.1.1.8 ! root 296: fprintf (file, ".stabn 68,0,%d,.LM%d-", \ ! 297: line, sym_lineno); \ ! 298: assemble_name (file, \ ! 299: XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));\ ! 300: fprintf (file, "\n.LM%d:\n", sym_lineno); \ 1.1.1.7 root 301: sym_lineno += 1; \ 302: } \ 303: while (0) 304: 305: /* In order for relative line numbers to work, we must output the 306: stabs entry for the function name first. */ 307: 308: #define DBX_FUNCTION_FIRST 309: 1.1.1.8 ! root 310: /* Generate a blank trailing N_SO to mark the end of the .o file, since ! 311: we can't depend upon the linker to mark .o file boundaries with ! 312: embedded stabs. */ ! 313: ! 314: #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \ ! 315: fprintf (FILE, \ ! 316: "\t.text\n\t.stabs \"\",%d,0,0,.Letext\n.Letext:\n", N_SO) ! 317: 1.1 root 318: /* Define the actual types of some ANSI-mandated types. (These 319: definitions should work for most SVR4 systems). */ 320: 321: #undef SIZE_TYPE 322: #define SIZE_TYPE "unsigned int" 323: 324: #undef PTRDIFF_TYPE 325: #define PTRDIFF_TYPE "int" 326: 327: #undef WCHAR_TYPE 328: #define WCHAR_TYPE "long int" 329: 330: #undef WCHAR_TYPE_SIZE 331: #define WCHAR_TYPE_SIZE BITS_PER_WORD 332: 1.1.1.3 root 333: /* This causes trouble, because it requires the host machine 334: to support ANSI C. */ 335: /* #define MULTIBYTE_CHARS */ 1.1.1.2 root 336: 1.1 root 337: #undef ASM_BYTE_OP 1.1.1.3 root 338: #define ASM_BYTE_OP ".byte" 339: 340: #undef SET_ASM_OP 341: #define SET_ASM_OP ".set" 1.1 root 342: 343: /* This is how to begin an assembly language file. Most svr4 assemblers want 344: at least a .file directive to come first, and some want to see a .version 345: directive come right after that. Here we just establish a default 346: which generates only the .file directive. If you need a .version 347: directive for any specific target, you should override this definition 348: in the target-specific file which includes this one. */ 349: 350: #undef ASM_FILE_START 351: #define ASM_FILE_START(FILE) \ 352: output_file_directive ((FILE), main_input_filename) 353: 354: /* This is how to allocate empty space in some section. The .zero 355: pseudo-op is used for this on most svr4 assemblers. */ 356: 1.1.1.3 root 357: #define SKIP_ASM_OP ".zero" 358: 1.1 root 359: #undef ASM_OUTPUT_SKIP 1.1.1.3 root 360: #define ASM_OUTPUT_SKIP(FILE,SIZE) \ 361: fprintf (FILE, "\t%s\t%u\n", SKIP_ASM_OP, (SIZE)) 1.1 root 362: 363: /* This is how to output a reference to a user-level label named NAME. 364: `assemble_name' uses this. 365: 366: For System V Release 4 the convention is *not* to prepend a leading 367: underscore onto user-level symbol names. */ 368: 369: #undef ASM_OUTPUT_LABELREF 370: #define ASM_OUTPUT_LABELREF(FILE,NAME) fprintf (FILE, "%s", NAME) 371: 1.1.1.3 root 372: /* This is how to output an internal numbered label where 373: PREFIX is the class of label and NUM is the number within the class. 374: 375: For most svr4 systems, the convention is that any symbol which begins 376: with a period is not put into the linker symbol table by the assembler. */ 377: 378: #undef ASM_OUTPUT_INTERNAL_LABEL 379: #define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM) \ 380: do { \ 381: fprintf (FILE, ".%s%d:\n", PREFIX, NUM); \ 382: } while (0) 383: 384: /* This is how to store into the string LABEL 385: the symbol_ref name of an internal numbered label where 386: PREFIX is the class of label and NUM is the number within the class. 387: This is suitable for output with `assemble_name'. 388: 389: For most svr4 systems, the convention is that any symbol which begins 390: with a period is not put into the linker symbol table by the assembler. */ 391: 392: #undef ASM_GENERATE_INTERNAL_LABEL 393: #define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \ 394: do { \ 395: sprintf (LABEL, "*.%s%d", PREFIX, NUM); \ 396: } while (0) 397: 1.1.1.5 root 398: /* Output the label which precedes a jumptable. Note that for all svr4 1.1.1.4 root 399: systems where we actually generate jumptables (which is to say every 400: svr4 target except i386, where we use casesi instead) we put the jump- 401: tables into the .rodata section and since other stuff could have been 402: put into the .rodata section prior to any given jumptable, we have to 403: make sure that the location counter for the .rodata section gets pro- 404: perly re-aligned prior to the actual beginning of the jump table. */ 405: 406: #define ALIGN_ASM_OP ".align" 407: 408: #ifndef ASM_OUTPUT_BEFORE_CASE_LABEL 409: #define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE,PREFIX,NUM,TABLE) \ 410: ASM_OUTPUT_ALIGN ((FILE), 2); 411: #endif 412: 413: #undef ASM_OUTPUT_CASE_LABEL 414: #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,JUMPTABLE) \ 415: do { \ 416: ASM_OUTPUT_BEFORE_CASE_LABEL (FILE, PREFIX, NUM, JUMPTABLE) \ 417: ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM); \ 418: } while (0) 419: 1.1 root 420: /* The standard SVR4 assembler seems to require that certain builtin 421: library routines (e.g. .udiv) be explicitly declared as .globl 422: in each assembly file where they are referenced. */ 423: 424: #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \ 425: ASM_GLOBALIZE_LABEL (FILE, XSTR (FUN, 0)) 426: 427: /* This says how to output assembler code to declare an 428: uninitialized external linkage data object. Under SVR4, 429: the linker seems to want the alignment of data objects 430: to depend on their types. We do exactly that here. */ 431: 1.1.1.3 root 432: #define COMMON_ASM_OP ".comm" 433: 1.1 root 434: #undef ASM_OUTPUT_ALIGNED_COMMON 435: #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ 436: do { \ 1.1.1.3 root 437: fprintf ((FILE), "\t%s\t", COMMON_ASM_OP); \ 1.1 root 438: assemble_name ((FILE), (NAME)); \ 439: fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \ 440: } while (0) 441: 442: /* This says how to output assembler code to declare an 443: uninitialized internal linkage data object. Under SVR4, 444: the linker seems to want the alignment of data objects 445: to depend on their types. We do exactly that here. */ 446: 1.1.1.3 root 447: #define LOCAL_ASM_OP ".local" 1.1 root 448: 449: #undef ASM_OUTPUT_ALIGNED_LOCAL 450: #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ 451: do { \ 1.1.1.3 root 452: fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP); \ 453: assemble_name ((FILE), (NAME)); \ 454: fprintf ((FILE), "\n"); \ 455: ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \ 1.1 root 456: } while (0) 457: 458: /* This is the pseudo-op used to generate a 32-bit word of data with a 459: specific value in some section. This is the same for all known svr4 460: assemblers. */ 461: 1.1.1.2 root 462: #define INT_ASM_OP ".long" 1.1 root 463: 464: /* This is the pseudo-op used to generate a contiguous sequence of byte 465: values from a double-quoted string WITHOUT HAVING A TERMINATING NUL 466: AUTOMATICALLY APPENDED. This is the same for most svr4 assemblers. */ 467: 468: #undef ASCII_DATA_ASM_OP 469: #define ASCII_DATA_ASM_OP ".ascii" 470: 471: /* Support const sections and the ctors and dtors sections for g++. 472: Note that there appears to be two different ways to support const 473: sections at the moment. You can either #define the symbol 474: READONLY_DATA_SECTION (giving it some code which switches to the 475: readonly data section) or else you can #define the symbols 476: EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS, SELECT_SECTION, and 477: SELECT_RTX_SECTION. We do both here just to be on the safe side. */ 478: 479: #define USE_CONST_SECTION 1 480: 1.1.1.2 root 481: #define CONST_SECTION_ASM_OP ".section\t.rodata" 1.1 root 482: 1.1.1.8 ! root 483: /* Define the pseudo-ops used to switch to the .ctors and .dtors sections. ! 484: ! 485: Note that we want to give these sections the SHF_WRITE attribute ! 486: because these sections will actually contain data (i.e. tables of ! 487: addresses of functions in the current root executable or shared library ! 488: file) and, in the case of a shared library, the relocatable addresses ! 489: will have to be properly resolved/relocated (and then written into) by ! 490: the dynamic linker when it actually attaches the given shared library ! 491: to the executing process. (Note that on SVR4, you may wish to use the ! 492: `-z text' option to the ELF linker, when building a shared library, as ! 493: an additional check that you are doing everything right. But if you do ! 494: use the `-z text' option when building a shared library, you will get ! 495: errors unless the .ctors and .dtors sections are marked as writable ! 496: via the SHF_WRITE attribute.) */ ! 497: ! 498: #define CTORS_SECTION_ASM_OP ".section\t.ctors,\"aw\"" ! 499: #define DTORS_SECTION_ASM_OP ".section\t.dtors,\"aw\"" ! 500: ! 501: /* On svr4, we *do* have support for the .init and .fini sections, and we ! 502: can put stuff in there to be executed before and after `main'. We let ! 503: crtstuff.c and other files know this by defining the following symbols. ! 504: The definitions say how to change sections to the .init and .fini ! 505: sections. This is the same for all known svr4 assemblers. */ 1.1 root 506: 1.1.1.2 root 507: #define INIT_SECTION_ASM_OP ".section\t.init" 1.1.1.8 ! root 508: #define FINI_SECTION_ASM_OP ".section\t.fini" 1.1 root 509: 510: /* A default list of other sections which we might be "in" at any given 511: time. For targets that use additional sections (e.g. .tdesc) you 512: should override this definition in the target-specific file which 513: includes this file. */ 514: 515: #undef EXTRA_SECTIONS 516: #define EXTRA_SECTIONS in_const, in_ctors, in_dtors 517: 518: /* A default list of extra section function definitions. For targets 519: that use additional sections (e.g. .tdesc) you should override this 520: definition in the target-specific file which includes this file. */ 521: 522: #undef EXTRA_SECTION_FUNCTIONS 523: #define EXTRA_SECTION_FUNCTIONS \ 524: CONST_SECTION_FUNCTION \ 525: CTORS_SECTION_FUNCTION \ 526: DTORS_SECTION_FUNCTION 527: 528: #define READONLY_DATA_SECTION() const_section () 529: 1.1.1.6 root 530: extern void text_section (); 1.1 root 531: 532: #define CONST_SECTION_FUNCTION \ 533: void \ 534: const_section () \ 535: { \ 536: if (!USE_CONST_SECTION) \ 537: text_section(); \ 538: else if (in_section != in_const) \ 539: { \ 540: fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP); \ 541: in_section = in_const; \ 542: } \ 543: } 544: 545: #define CTORS_SECTION_FUNCTION \ 546: void \ 547: ctors_section () \ 548: { \ 549: if (in_section != in_ctors) \ 550: { \ 1.1.1.3 root 551: fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP); \ 1.1 root 552: in_section = in_ctors; \ 553: } \ 554: } 555: 556: #define DTORS_SECTION_FUNCTION \ 557: void \ 558: dtors_section () \ 559: { \ 560: if (in_section != in_dtors) \ 561: { \ 1.1.1.3 root 562: fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP); \ 1.1 root 563: in_section = in_dtors; \ 564: } \ 565: } 566: 1.1.1.7 root 567: /* Switch into a generic section. 1.1.1.8 ! root 568: This is currently only used to support section attributes. ! 569: ! 570: We make the section read-only and executable for a function decl, ! 571: read-only for a const data decl, and writable for a non-const data decl. */ ! 572: #define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME) \ ! 573: fprintf (FILE, ".section\t%s,\"%s\",@progbits\n", NAME, \ ! 574: (DECL) && TREE_CODE (DECL) == FUNCTION_DECL ? "ax" : \ ! 575: (DECL) && TREE_READONLY (DECL) ? "a" : "aw") 1.1.1.7 root 576: 577: 1.1 root 578: /* A C statement (sans semicolon) to output an element in the table of 579: global constructors. */ 580: #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \ 581: do { \ 582: ctors_section (); \ 1.1.1.2 root 583: fprintf (FILE, "\t%s\t ", INT_ASM_OP); \ 1.1 root 584: assemble_name (FILE, NAME); \ 585: fprintf (FILE, "\n"); \ 586: } while (0) 587: 588: /* A C statement (sans semicolon) to output an element in the table of 589: global destructors. */ 590: #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \ 591: do { \ 592: dtors_section (); \ 1.1.1.2 root 593: fprintf (FILE, "\t%s\t ", INT_ASM_OP); \ 1.1 root 594: assemble_name (FILE, NAME); \ 595: fprintf (FILE, "\n"); \ 596: } while (0) 597: 598: /* A C statement or statements to switch to the appropriate 599: section for output of DECL. DECL is either a `VAR_DECL' node 600: or a constant of some sort. RELOC indicates whether forming 601: the initial value of DECL requires link-time relocations. */ 602: 603: #define SELECT_SECTION(DECL,RELOC) \ 604: { \ 605: if (TREE_CODE (DECL) == STRING_CST) \ 606: { \ 607: if (! flag_writable_strings) \ 608: const_section (); \ 609: else \ 610: data_section (); \ 611: } \ 612: else if (TREE_CODE (DECL) == VAR_DECL) \ 613: { \ 614: if ((flag_pic && RELOC) \ 1.1.1.7 root 615: || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL) \ 616: || !DECL_INITIAL (DECL) \ 617: || (DECL_INITIAL (DECL) != error_mark_node \ 618: && !TREE_CONSTANT (DECL_INITIAL (DECL)))) \ 1.1 root 619: data_section (); \ 620: else \ 621: const_section (); \ 622: } \ 623: else \ 624: const_section (); \ 625: } 626: 627: /* A C statement or statements to switch to the appropriate 628: section for output of RTX in mode MODE. RTX is some kind 629: of constant in RTL. The argument MODE is redundant except 630: in the case of a `const_int' rtx. Currently, these always 631: go into the const section. */ 632: 633: #undef SELECT_RTX_SECTION 634: #define SELECT_RTX_SECTION(MODE,RTX) const_section() 635: 636: /* Define the strings used for the special svr4 .type and .size directives. 637: These strings generally do not vary from one system running svr4 to 638: another, but if a given system (e.g. m88k running svr) needs to use 639: different pseudo-op names for these, they may be overridden in the 640: file which includes this one. */ 641: 1.1.1.2 root 642: #define TYPE_ASM_OP ".type" 643: #define SIZE_ASM_OP ".size" 1.1.1.8 ! root 644: ! 645: /* This is how we tell the assembler that a symbol is weak. */ ! 646: ! 647: #define ASM_WEAKEN_LABEL(FILE,NAME) \ ! 648: do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \ ! 649: fputc ('\n', FILE); } while (0) 1.1 root 650: 651: /* The following macro defines the format used to output the second 652: operand of the .type assembler directive. Different svr4 assemblers 653: expect various different forms for this operand. The one given here 654: is just a default. You may need to override it in your machine- 655: specific tm.h file (depending upon the particulars of your assembler). */ 656: 657: #define TYPE_OPERAND_FMT "@%s" 658: 1.1.1.3 root 659: /* Write the extra assembler code needed to declare a function's result. 660: Most svr4 assemblers don't require any special declaration of the 661: result value, but there are exceptions. */ 662: 663: #ifndef ASM_DECLARE_RESULT 664: #define ASM_DECLARE_RESULT(FILE, RESULT) 665: #endif 666: 1.1 root 667: /* These macros generate the special .type and .size directives which 668: are used to set the corresponding fields of the linker symbol table 1.1.1.3 root 669: entries in an ELF object file under SVR4. These macros also output 670: the starting labels for the relevant functions/objects. */ 1.1 root 671: 1.1.1.3 root 672: /* Write the extra assembler code needed to declare a function properly. 673: Some svr4 assemblers need to also have something extra said about the 674: function's return value. We allow for that here. */ 1.1 root 675: 676: #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ 677: do { \ 1.1.1.2 root 678: fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \ 1.1 root 679: assemble_name (FILE, NAME); \ 680: putc (',', FILE); \ 681: fprintf (FILE, TYPE_OPERAND_FMT, "function"); \ 682: putc ('\n', FILE); \ 1.1.1.3 root 683: ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \ 1.1 root 684: ASM_OUTPUT_LABEL(FILE, NAME); \ 685: } while (0) 686: 687: /* Write the extra assembler code needed to declare an object properly. */ 688: 689: #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \ 690: do { \ 1.1.1.2 root 691: fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \ 1.1 root 692: assemble_name (FILE, NAME); \ 693: putc (',', FILE); \ 694: fprintf (FILE, TYPE_OPERAND_FMT, "object"); \ 695: putc ('\n', FILE); \ 1.1.1.6 root 696: size_directive_output = 0; \ 697: if (!flag_inhibit_size_directive && DECL_SIZE (DECL)) \ 1.1 root 698: { \ 1.1.1.6 root 699: size_directive_output = 1; \ 1.1.1.2 root 700: fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \ 1.1 root 701: assemble_name (FILE, NAME); \ 1.1.1.6 root 702: fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \ 1.1 root 703: } \ 704: ASM_OUTPUT_LABEL(FILE, NAME); \ 705: } while (0) 706: 1.1.1.6 root 707: /* Output the size directive for a decl in rest_of_decl_compilation 708: in the case where we did not do so before the initializer. 709: Once we find the error_mark_node, we know that the value of 710: size_directive_output was set 711: by ASM_DECLARE_OBJECT_NAME when it was run for the same decl. */ 712: 713: #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \ 714: do { \ 715: char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \ 716: if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \ 717: && ! AT_END && TOP_LEVEL \ 718: && DECL_INITIAL (DECL) == error_mark_node \ 719: && !size_directive_output) \ 720: { \ 1.1.1.7 root 721: size_directive_output = 1; \ 1.1.1.6 root 722: fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \ 723: assemble_name (FILE, name); \ 724: fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \ 725: } \ 726: } while (0) 727: 1.1 root 728: /* This is how to declare the size of a function. */ 729: 730: #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \ 731: do { \ 732: if (!flag_inhibit_size_directive) \ 733: { \ 734: char label[256]; \ 735: static int labelno; \ 736: labelno++; \ 737: ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno); \ 738: ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno); \ 1.1.1.2 root 739: fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \ 1.1 root 740: assemble_name (FILE, (FNAME)); \ 741: fprintf (FILE, ","); \ 742: assemble_name (FILE, label); \ 743: fprintf (FILE, "-"); \ 1.1.1.3 root 744: assemble_name (FILE, (FNAME)); \ 1.1 root 745: putc ('\n', FILE); \ 746: } \ 747: } while (0) 748: 749: /* A table of bytes codes used by the ASM_OUTPUT_ASCII and 750: ASM_OUTPUT_LIMITED_STRING macros. Each byte in the table 751: corresponds to a particular byte value [0..255]. For any 752: given byte value, if the value in the corresponding table 753: position is zero, the given character can be output directly. 754: If the table value is 1, the byte must be output as a \ooo 755: octal escape. If the tables value is anything else, then the 756: byte value should be output as a \ followed by the value 757: in the table. Note that we can use standard UN*X escape 758: sequences for many control characters, but we don't use 759: \a to represent BEL because some svr4 assemblers (e.g. on 1.1.1.7 root 760: the i386) don't know about that. Also, we don't use \v 761: since some versions of gas, such as 2.2 did not accept it. */ 1.1 root 762: 763: #define ESCAPES \ 1.1.1.7 root 764: "\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ 1.1 root 765: \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\ 766: \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\ 767: \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\ 768: \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\ 769: \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\ 770: \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\ 771: \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" 772: 773: /* Some svr4 assemblers have a limit on the number of characters which 774: can appear in the operand of a .string directive. If your assembler 775: has such a limitation, you should define STRING_LIMIT to reflect that 776: limit. Note that at least some svr4 assemblers have a limit on the 777: actual number of bytes in the double-quoted string, and that they 1.1.1.2 root 778: count each character in an escape sequence as one byte. Thus, an 1.1 root 779: escape sequence like \377 would count as four bytes. 780: 781: If your target assembler doesn't support the .string directive, you 782: should define this to zero. 783: */ 784: 785: #define STRING_LIMIT ((unsigned) 256) 786: 787: #define STRING_ASM_OP ".string" 788: 789: /* The routine used to output NUL terminated strings. We use a special 790: version of this for most svr4 targets because doing so makes the 791: generated assembly code more compact (and thus faster to assemble) 792: as well as more readable, especially for targets like the i386 793: (where the only alternative is to output character sequences as 794: comma separated lists of numbers). */ 795: 796: #define ASM_OUTPUT_LIMITED_STRING(FILE, STR) \ 797: do \ 798: { \ 799: register unsigned char *_limited_str = (unsigned char *) (STR); \ 800: register unsigned ch; \ 801: fprintf ((FILE), "\t%s\t\"", STRING_ASM_OP); \ 802: for (; ch = *_limited_str; _limited_str++) \ 803: { \ 804: register int escape; \ 805: switch (escape = ESCAPES[ch]) \ 806: { \ 807: case 0: \ 808: putc (ch, (FILE)); \ 809: break; \ 810: case 1: \ 811: fprintf ((FILE), "\\%03o", ch); \ 812: break; \ 813: default: \ 814: putc ('\\', (FILE)); \ 815: putc (escape, (FILE)); \ 816: break; \ 817: } \ 818: } \ 819: fprintf ((FILE), "\"\n"); \ 820: } \ 821: while (0) 822: 823: /* The routine used to output sequences of byte values. We use a special 824: version of this for most svr4 targets because doing so makes the 825: generated assembly code more compact (and thus faster to assemble) 826: as well as more readable. Note that if we find subparts of the 827: character sequence which end with NUL (and which are shorter than 828: STRING_LIMIT) we output those using ASM_OUTPUT_LIMITED_STRING. */ 829: 830: #undef ASM_OUTPUT_ASCII 831: #define ASM_OUTPUT_ASCII(FILE, STR, LENGTH) \ 832: do \ 833: { \ 834: register unsigned char *_ascii_bytes = (unsigned char *) (STR); \ 835: register unsigned char *limit = _ascii_bytes + (LENGTH); \ 836: register unsigned bytes_in_chunk = 0; \ 837: for (; _ascii_bytes < limit; _ascii_bytes++) \ 838: { \ 839: register unsigned char *p; \ 840: if (bytes_in_chunk >= 60) \ 841: { \ 842: fprintf ((FILE), "\"\n"); \ 843: bytes_in_chunk = 0; \ 844: } \ 845: for (p = _ascii_bytes; p < limit && *p != '\0'; p++) \ 846: continue; \ 847: if (p < limit && (p - _ascii_bytes) <= STRING_LIMIT) \ 848: { \ 849: if (bytes_in_chunk > 0) \ 850: { \ 851: fprintf ((FILE), "\"\n"); \ 852: bytes_in_chunk = 0; \ 853: } \ 854: ASM_OUTPUT_LIMITED_STRING ((FILE), _ascii_bytes); \ 855: _ascii_bytes = p; \ 856: } \ 857: else \ 858: { \ 859: register int escape; \ 860: register unsigned ch; \ 861: if (bytes_in_chunk == 0) \ 862: fprintf ((FILE), "\t%s\t\"", ASCII_DATA_ASM_OP); \ 863: switch (escape = ESCAPES[ch = *_ascii_bytes]) \ 864: { \ 865: case 0: \ 866: putc (ch, (FILE)); \ 867: bytes_in_chunk++; \ 868: break; \ 869: case 1: \ 870: fprintf ((FILE), "\\%03o", ch); \ 871: bytes_in_chunk += 4; \ 872: break; \ 873: default: \ 874: putc ('\\', (FILE)); \ 875: putc (escape, (FILE)); \ 876: bytes_in_chunk += 2; \ 877: break; \ 878: } \ 879: } \ 880: } \ 881: if (bytes_in_chunk > 0) \ 882: fprintf ((FILE), "\"\n"); \ 883: } \ 884: while (0) 1.1.1.8 ! root 885: ! 886: /* All SVR4 targets use the ELF object file format. */ ! 887: #define OBJECT_FORMAT_ELF
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.