Annotation of gcc/config/svr4.h, revision 1.1.1.9

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.9 ! root      276:    ordinary symbol, or gdb won't see it.  Furthermore, since gdb reads
        !           277:    the input piecemeal, starting with each N_SO, it's a lot easier if
        !           278:    the gcc2 flag symbol is *after* the N_SO rather than before it.  So
        !           279:    we emit an N_OPT stab there.  */
1.1.1.7   root      280: 
                    281: #define ASM_IDENTIFY_GCC(FILE)                                         \
                    282: do                                                                     \
                    283:   {                                                                    \
                    284:     if (write_symbols != DBX_DEBUG)                                    \
                    285:       fputs ("gcc2_compiled.:\n", FILE);                               \
1.1.1.9 ! root      286:   }                                                                    \
        !           287: while (0)
        !           288: 
        !           289: #define ASM_IDENTIFY_GCC_AFTER_SOURCE(FILE)                            \
        !           290: do                                                                     \
        !           291:   {                                                                    \
        !           292:     if (write_symbols == DBX_DEBUG)                                    \
1.1.1.7   root      293:       fputs ("\t.stabs\t\"gcc2_compiled.\", 0x3c, 0, 0, 0\n", FILE);   \
                    294:   }                                                                    \
                    295: while (0)
                    296: 
                    297: /* Like block addresses, stabs line numbers are relative to the
                    298:    current function.  */
                    299: 
                    300: #define ASM_OUTPUT_SOURCE_LINE(file, line)                             \
                    301: do                                                                     \
                    302:   {                                                                    \
                    303:     static int sym_lineno = 1;                                         \
1.1.1.8   root      304:     fprintf (file, ".stabn 68,0,%d,.LM%d-",                            \
                    305:             line, sym_lineno);                                         \
                    306:     assemble_name (file,                                               \
                    307:                   XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));\
                    308:     fprintf (file, "\n.LM%d:\n", sym_lineno);                          \
1.1.1.7   root      309:     sym_lineno += 1;                                                   \
                    310:   }                                                                    \
                    311: while (0)
                    312: 
                    313: /* In order for relative line numbers to work, we must output the
                    314:    stabs entry for the function name first.  */
                    315: 
                    316: #define DBX_FUNCTION_FIRST
                    317: 
1.1.1.8   root      318: /* Generate a blank trailing N_SO to mark the end of the .o file, since
                    319:    we can't depend upon the linker to mark .o file boundaries with
                    320:    embedded stabs.  */
                    321: 
                    322: #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME)                        \
                    323:   fprintf (FILE,                                                       \
                    324:           "\t.text\n\t.stabs \"\",%d,0,0,.Letext\n.Letext:\n", N_SO)
                    325: 
1.1       root      326: /* Define the actual types of some ANSI-mandated types.  (These
                    327:    definitions should work for most SVR4 systems).  */
                    328: 
                    329: #undef SIZE_TYPE
                    330: #define SIZE_TYPE "unsigned int"
                    331: 
                    332: #undef PTRDIFF_TYPE
                    333: #define PTRDIFF_TYPE "int"
                    334: 
                    335: #undef WCHAR_TYPE
                    336: #define WCHAR_TYPE "long int"
                    337: 
                    338: #undef WCHAR_TYPE_SIZE
                    339: #define WCHAR_TYPE_SIZE BITS_PER_WORD
                    340: 
1.1.1.3   root      341: /* This causes trouble, because it requires the host machine
                    342:    to support ANSI C.  */
                    343: /* #define MULTIBYTE_CHARS */
1.1.1.2   root      344: 
1.1       root      345: #undef ASM_BYTE_OP
1.1.1.3   root      346: #define ASM_BYTE_OP    ".byte"
                    347: 
                    348: #undef SET_ASM_OP
                    349: #define SET_ASM_OP     ".set"
1.1       root      350: 
                    351: /* This is how to begin an assembly language file.  Most svr4 assemblers want
                    352:    at least a .file directive to come first, and some want to see a .version
                    353:    directive come right after that.  Here we just establish a default
                    354:    which generates only the .file directive.  If you need a .version
                    355:    directive for any specific target, you should override this definition
                    356:    in the target-specific file which includes this one.  */
                    357: 
                    358: #undef ASM_FILE_START
                    359: #define ASM_FILE_START(FILE)                                    \
                    360:   output_file_directive ((FILE), main_input_filename)
                    361: 
                    362: /* This is how to allocate empty space in some section.  The .zero
                    363:    pseudo-op is used for this on most svr4 assemblers.  */
                    364: 
1.1.1.3   root      365: #define SKIP_ASM_OP    ".zero"
                    366: 
1.1       root      367: #undef ASM_OUTPUT_SKIP
1.1.1.3   root      368: #define ASM_OUTPUT_SKIP(FILE,SIZE) \
                    369:   fprintf (FILE, "\t%s\t%u\n", SKIP_ASM_OP, (SIZE))
1.1       root      370: 
                    371: /* This is how to output a reference to a user-level label named NAME.
                    372:    `assemble_name' uses this.
                    373: 
                    374:    For System V Release 4 the convention is *not* to prepend a leading
                    375:    underscore onto user-level symbol names.  */
                    376: 
                    377: #undef ASM_OUTPUT_LABELREF
                    378: #define ASM_OUTPUT_LABELREF(FILE,NAME) fprintf (FILE, "%s", NAME)
                    379: 
1.1.1.3   root      380: /* This is how to output an internal numbered label where
                    381:    PREFIX is the class of label and NUM is the number within the class.
                    382: 
                    383:    For most svr4 systems, the convention is that any symbol which begins
                    384:    with a period is not put into the linker symbol table by the assembler.  */
                    385: 
                    386: #undef ASM_OUTPUT_INTERNAL_LABEL
                    387: #define ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM)                   \
                    388: do {                                                                   \
                    389:   fprintf (FILE, ".%s%d:\n", PREFIX, NUM);                             \
                    390: } while (0)
                    391: 
                    392: /* This is how to store into the string LABEL
                    393:    the symbol_ref name of an internal numbered label where
                    394:    PREFIX is the class of label and NUM is the number within the class.
                    395:    This is suitable for output with `assemble_name'.
                    396: 
                    397:    For most svr4 systems, the convention is that any symbol which begins
                    398:    with a period is not put into the linker symbol table by the assembler.  */
                    399: 
                    400: #undef ASM_GENERATE_INTERNAL_LABEL
                    401: #define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM)                        \
                    402: do {                                                                   \
                    403:   sprintf (LABEL, "*.%s%d", PREFIX, NUM);                              \
                    404: } while (0)
                    405: 
1.1.1.5   root      406: /* Output the label which precedes a jumptable.  Note that for all svr4
1.1.1.4   root      407:    systems where we actually generate jumptables (which is to say every
                    408:    svr4 target except i386, where we use casesi instead) we put the jump-
                    409:    tables into the .rodata section and since other stuff could have been
                    410:    put into the .rodata section prior to any given jumptable, we have to
                    411:    make sure that the location counter for the .rodata section gets pro-
                    412:    perly re-aligned prior to the actual beginning of the jump table.  */
                    413: 
                    414: #define ALIGN_ASM_OP ".align"
                    415: 
                    416: #ifndef ASM_OUTPUT_BEFORE_CASE_LABEL
                    417: #define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE,PREFIX,NUM,TABLE) \
                    418:   ASM_OUTPUT_ALIGN ((FILE), 2);
                    419: #endif
                    420: 
                    421: #undef ASM_OUTPUT_CASE_LABEL
                    422: #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,JUMPTABLE)               \
                    423:   do {                                                                 \
                    424:     ASM_OUTPUT_BEFORE_CASE_LABEL (FILE, PREFIX, NUM, JUMPTABLE)                \
                    425:     ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM);                     \
                    426:   } while (0)
                    427: 
1.1       root      428: /* The standard SVR4 assembler seems to require that certain builtin
                    429:    library routines (e.g. .udiv) be explicitly declared as .globl
                    430:    in each assembly file where they are referenced.  */
                    431: 
                    432: #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN)                         \
                    433:   ASM_GLOBALIZE_LABEL (FILE, XSTR (FUN, 0))
                    434: 
                    435: /* This says how to output assembler code to declare an
                    436:    uninitialized external linkage data object.  Under SVR4,
                    437:    the linker seems to want the alignment of data objects
                    438:    to depend on their types.  We do exactly that here.  */
                    439: 
1.1.1.3   root      440: #define COMMON_ASM_OP  ".comm"
                    441: 
1.1       root      442: #undef ASM_OUTPUT_ALIGNED_COMMON
                    443: #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN)             \
                    444: do {                                                                   \
1.1.1.3   root      445:   fprintf ((FILE), "\t%s\t", COMMON_ASM_OP);                           \
1.1       root      446:   assemble_name ((FILE), (NAME));                                      \
                    447:   fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT);       \
                    448: } while (0)
                    449: 
                    450: /* This says how to output assembler code to declare an
                    451:    uninitialized internal linkage data object.  Under SVR4,
                    452:    the linker seems to want the alignment of data objects
                    453:    to depend on their types.  We do exactly that here.  */
                    454: 
1.1.1.3   root      455: #define LOCAL_ASM_OP   ".local"
1.1       root      456: 
                    457: #undef ASM_OUTPUT_ALIGNED_LOCAL
                    458: #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN)              \
                    459: do {                                                                   \
1.1.1.3   root      460:   fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP);                            \
                    461:   assemble_name ((FILE), (NAME));                                      \
                    462:   fprintf ((FILE), "\n");                                              \
                    463:   ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN);                 \
1.1       root      464: } while (0)
                    465: 
                    466: /* This is the pseudo-op used to generate a 32-bit word of data with a
                    467:    specific value in some section.  This is the same for all known svr4
                    468:    assemblers.  */
                    469: 
1.1.1.2   root      470: #define INT_ASM_OP             ".long"
1.1       root      471: 
                    472: /* This is the pseudo-op used to generate a contiguous sequence of byte
                    473:    values from a double-quoted string WITHOUT HAVING A TERMINATING NUL
                    474:    AUTOMATICALLY APPENDED.  This is the same for most svr4 assemblers.  */
                    475: 
                    476: #undef ASCII_DATA_ASM_OP
                    477: #define ASCII_DATA_ASM_OP      ".ascii"
                    478: 
                    479: /* Support const sections and the ctors and dtors sections for g++.
                    480:    Note that there appears to be two different ways to support const
                    481:    sections at the moment.  You can either #define the symbol
                    482:    READONLY_DATA_SECTION (giving it some code which switches to the
                    483:    readonly data section) or else you can #define the symbols
                    484:    EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS, SELECT_SECTION, and
                    485:    SELECT_RTX_SECTION.  We do both here just to be on the safe side.  */
                    486: 
                    487: #define USE_CONST_SECTION      1
                    488: 
1.1.1.2   root      489: #define CONST_SECTION_ASM_OP   ".section\t.rodata"
1.1       root      490: 
1.1.1.8   root      491: /* Define the pseudo-ops used to switch to the .ctors and .dtors sections.
                    492: 
                    493:    Note that we want to give these sections the SHF_WRITE attribute
                    494:    because these sections will actually contain data (i.e. tables of
                    495:    addresses of functions in the current root executable or shared library
                    496:    file) and, in the case of a shared library, the relocatable addresses
                    497:    will have to be properly resolved/relocated (and then written into) by
                    498:    the dynamic linker when it actually attaches the given shared library
                    499:    to the executing process.  (Note that on SVR4, you may wish to use the
                    500:    `-z text' option to the ELF linker, when building a shared library, as
                    501:    an additional check that you are doing everything right.  But if you do
                    502:    use the `-z text' option when building a shared library, you will get
                    503:    errors unless the .ctors and .dtors sections are marked as writable
                    504:    via the SHF_WRITE attribute.)  */
                    505: 
                    506: #define CTORS_SECTION_ASM_OP   ".section\t.ctors,\"aw\""
                    507: #define DTORS_SECTION_ASM_OP   ".section\t.dtors,\"aw\""
                    508: 
                    509: /* On svr4, we *do* have support for the .init and .fini sections, and we
                    510:    can put stuff in there to be executed before and after `main'.  We let
                    511:    crtstuff.c and other files know this by defining the following symbols.
                    512:    The definitions say how to change sections to the .init and .fini
                    513:    sections.  This is the same for all known svr4 assemblers.  */
1.1       root      514: 
1.1.1.2   root      515: #define INIT_SECTION_ASM_OP    ".section\t.init"
1.1.1.8   root      516: #define FINI_SECTION_ASM_OP    ".section\t.fini"
1.1       root      517: 
                    518: /* A default list of other sections which we might be "in" at any given
                    519:    time.  For targets that use additional sections (e.g. .tdesc) you
                    520:    should override this definition in the target-specific file which
                    521:    includes this file.  */
                    522: 
                    523: #undef EXTRA_SECTIONS
                    524: #define EXTRA_SECTIONS in_const, in_ctors, in_dtors
                    525: 
                    526: /* A default list of extra section function definitions.  For targets
                    527:    that use additional sections (e.g. .tdesc) you should override this
                    528:    definition in the target-specific file which includes this file.  */
                    529: 
                    530: #undef EXTRA_SECTION_FUNCTIONS
                    531: #define EXTRA_SECTION_FUNCTIONS                                                \
                    532:   CONST_SECTION_FUNCTION                                               \
                    533:   CTORS_SECTION_FUNCTION                                               \
                    534:   DTORS_SECTION_FUNCTION
                    535: 
                    536: #define READONLY_DATA_SECTION() const_section ()
                    537: 
1.1.1.6   root      538: extern void text_section ();
1.1       root      539: 
                    540: #define CONST_SECTION_FUNCTION                                         \
                    541: void                                                                   \
                    542: const_section ()                                                       \
                    543: {                                                                      \
                    544:   if (!USE_CONST_SECTION)                                              \
                    545:     text_section();                                                    \
                    546:   else if (in_section != in_const)                                     \
                    547:     {                                                                  \
                    548:       fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP);            \
                    549:       in_section = in_const;                                           \
                    550:     }                                                                  \
                    551: }
                    552: 
                    553: #define CTORS_SECTION_FUNCTION                                         \
                    554: void                                                                   \
                    555: ctors_section ()                                                       \
                    556: {                                                                      \
                    557:   if (in_section != in_ctors)                                          \
                    558:     {                                                                  \
1.1.1.3   root      559:       fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP);            \
1.1       root      560:       in_section = in_ctors;                                           \
                    561:     }                                                                  \
                    562: }
                    563: 
                    564: #define DTORS_SECTION_FUNCTION                                         \
                    565: void                                                                   \
                    566: dtors_section ()                                                       \
                    567: {                                                                      \
                    568:   if (in_section != in_dtors)                                          \
                    569:     {                                                                  \
1.1.1.3   root      570:       fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP);            \
1.1       root      571:       in_section = in_dtors;                                           \
                    572:     }                                                                  \
                    573: }
                    574: 
1.1.1.7   root      575: /* Switch into a generic section.
1.1.1.8   root      576:    This is currently only used to support section attributes.
                    577: 
                    578:    We make the section read-only and executable for a function decl,
                    579:    read-only for a const data decl, and writable for a non-const data decl.  */
                    580: #define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME) \
                    581:   fprintf (FILE, ".section\t%s,\"%s\",@progbits\n", NAME, \
                    582:           (DECL) && TREE_CODE (DECL) == FUNCTION_DECL ? "ax" : \
                    583:           (DECL) && TREE_READONLY (DECL) ? "a" : "aw")
1.1.1.7   root      584: 
                    585: 
1.1       root      586: /* A C statement (sans semicolon) to output an element in the table of
                    587:    global constructors.  */
                    588: #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME)                              \
                    589:   do {                                                                 \
                    590:     ctors_section ();                                                  \
1.1.1.2   root      591:     fprintf (FILE, "\t%s\t ", INT_ASM_OP);                             \
1.1       root      592:     assemble_name (FILE, NAME);                                                \
                    593:     fprintf (FILE, "\n");                                              \
                    594:   } while (0)
                    595: 
                    596: /* A C statement (sans semicolon) to output an element in the table of
                    597:    global destructors.  */
                    598: #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME)                                       \
                    599:   do {                                                                 \
                    600:     dtors_section ();                                                  \
1.1.1.2   root      601:     fprintf (FILE, "\t%s\t ", INT_ASM_OP);                             \
1.1       root      602:     assemble_name (FILE, NAME);                                        \
                    603:     fprintf (FILE, "\n");                                              \
                    604:   } while (0)
                    605: 
                    606: /* A C statement or statements to switch to the appropriate
                    607:    section for output of DECL.  DECL is either a `VAR_DECL' node
                    608:    or a constant of some sort.  RELOC indicates whether forming
                    609:    the initial value of DECL requires link-time relocations.  */
                    610: 
                    611: #define SELECT_SECTION(DECL,RELOC)                                     \
                    612: {                                                                      \
                    613:   if (TREE_CODE (DECL) == STRING_CST)                                  \
                    614:     {                                                                  \
                    615:       if (! flag_writable_strings)                                     \
                    616:        const_section ();                                               \
                    617:       else                                                             \
                    618:        data_section ();                                                \
                    619:     }                                                                  \
                    620:   else if (TREE_CODE (DECL) == VAR_DECL)                               \
                    621:     {                                                                  \
                    622:       if ((flag_pic && RELOC)                                          \
1.1.1.7   root      623:          || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL)          \
                    624:          || !DECL_INITIAL (DECL)                                       \
                    625:          || (DECL_INITIAL (DECL) != error_mark_node                    \
                    626:              && !TREE_CONSTANT (DECL_INITIAL (DECL))))                 \
1.1       root      627:        data_section ();                                                \
                    628:       else                                                             \
                    629:        const_section ();                                               \
                    630:     }                                                                  \
                    631:   else                                                                 \
                    632:     const_section ();                                                  \
                    633: }
                    634: 
                    635: /* A C statement or statements to switch to the appropriate
                    636:    section for output of RTX in mode MODE.  RTX is some kind
                    637:    of constant in RTL.  The argument MODE is redundant except
                    638:    in the case of a `const_int' rtx.  Currently, these always
                    639:    go into the const section.  */
                    640: 
                    641: #undef SELECT_RTX_SECTION
                    642: #define SELECT_RTX_SECTION(MODE,RTX) const_section()
                    643: 
                    644: /* Define the strings used for the special svr4 .type and .size directives.
                    645:    These strings generally do not vary from one system running svr4 to
                    646:    another, but if a given system (e.g. m88k running svr) needs to use
                    647:    different pseudo-op names for these, they may be overridden in the
                    648:    file which includes this one.  */
                    649: 
1.1.1.2   root      650: #define TYPE_ASM_OP    ".type"
                    651: #define SIZE_ASM_OP    ".size"
1.1.1.8   root      652: 
                    653: /* This is how we tell the assembler that a symbol is weak.  */
                    654: 
                    655: #define ASM_WEAKEN_LABEL(FILE,NAME) \
                    656:   do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \
                    657:        fputc ('\n', FILE); } while (0)
1.1       root      658: 
                    659: /* The following macro defines the format used to output the second
                    660:    operand of the .type assembler directive.  Different svr4 assemblers
                    661:    expect various different forms for this operand.  The one given here
                    662:    is just a default.  You may need to override it in your machine-
                    663:    specific tm.h file (depending upon the particulars of your assembler).  */
                    664: 
                    665: #define TYPE_OPERAND_FMT       "@%s"
                    666: 
1.1.1.3   root      667: /* Write the extra assembler code needed to declare a function's result.
                    668:    Most svr4 assemblers don't require any special declaration of the
                    669:    result value, but there are exceptions.  */
                    670: 
                    671: #ifndef ASM_DECLARE_RESULT
                    672: #define ASM_DECLARE_RESULT(FILE, RESULT)
                    673: #endif
                    674: 
1.1       root      675: /* These macros generate the special .type and .size directives which
                    676:    are used to set the corresponding fields of the linker symbol table
1.1.1.3   root      677:    entries in an ELF object file under SVR4.  These macros also output
                    678:    the starting labels for the relevant functions/objects.  */
1.1       root      679: 
1.1.1.3   root      680: /* Write the extra assembler code needed to declare a function properly.
                    681:    Some svr4 assemblers need to also have something extra said about the
                    682:    function's return value.  We allow for that here.  */
1.1       root      683: 
                    684: #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)                    \
                    685:   do {                                                                 \
1.1.1.2   root      686:     fprintf (FILE, "\t%s\t ", TYPE_ASM_OP);                            \
1.1       root      687:     assemble_name (FILE, NAME);                                                \
                    688:     putc (',', FILE);                                                  \
                    689:     fprintf (FILE, TYPE_OPERAND_FMT, "function");                      \
                    690:     putc ('\n', FILE);                                                 \
1.1.1.3   root      691:     ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL));                     \
1.1       root      692:     ASM_OUTPUT_LABEL(FILE, NAME);                                      \
                    693:   } while (0)
                    694: 
                    695: /* Write the extra assembler code needed to declare an object properly.  */
                    696: 
                    697: #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)                      \
                    698:   do {                                                                 \
1.1.1.2   root      699:     fprintf (FILE, "\t%s\t ", TYPE_ASM_OP);                            \
1.1       root      700:     assemble_name (FILE, NAME);                                                \
                    701:     putc (',', FILE);                                                  \
                    702:     fprintf (FILE, TYPE_OPERAND_FMT, "object");                                \
                    703:     putc ('\n', FILE);                                                 \
1.1.1.6   root      704:     size_directive_output = 0;                                         \
                    705:     if (!flag_inhibit_size_directive && DECL_SIZE (DECL))              \
1.1       root      706:       {                                                                        \
1.1.1.6   root      707:        size_directive_output = 1;                                      \
1.1.1.2   root      708:        fprintf (FILE, "\t%s\t ", SIZE_ASM_OP);                         \
1.1       root      709:        assemble_name (FILE, NAME);                                     \
1.1.1.6   root      710:        fprintf (FILE, ",%d\n",  int_size_in_bytes (TREE_TYPE (DECL))); \
1.1       root      711:       }                                                                        \
                    712:     ASM_OUTPUT_LABEL(FILE, NAME);                                      \
                    713:   } while (0)
                    714: 
1.1.1.6   root      715: /* Output the size directive for a decl in rest_of_decl_compilation
                    716:    in the case where we did not do so before the initializer.
                    717:    Once we find the error_mark_node, we know that the value of
                    718:    size_directive_output was set
                    719:    by ASM_DECLARE_OBJECT_NAME when it was run for the same decl.  */
                    720: 
                    721: #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END)        \
                    722: do {                                                                    \
                    723:      char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0);                  \
                    724:      if (!flag_inhibit_size_directive && DECL_SIZE (DECL)               \
                    725:          && ! AT_END && TOP_LEVEL                                       \
                    726:         && DECL_INITIAL (DECL) == error_mark_node                       \
                    727:         && !size_directive_output)                                      \
                    728:        {                                                                \
1.1.1.7   root      729:         size_directive_output = 1;                                      \
1.1.1.6   root      730:         fprintf (FILE, "\t%s\t ", SIZE_ASM_OP);                         \
                    731:         assemble_name (FILE, name);                                     \
                    732:         fprintf (FILE, ",%d\n",  int_size_in_bytes (TREE_TYPE (DECL))); \
                    733:        }                                                                \
                    734:    } while (0)
                    735: 
1.1       root      736: /* This is how to declare the size of a function.  */
                    737: 
                    738: #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL)                   \
                    739:   do {                                                                 \
                    740:     if (!flag_inhibit_size_directive)                                  \
                    741:       {                                                                        \
                    742:         char label[256];                                               \
                    743:        static int labelno;                                             \
                    744:        labelno++;                                                      \
                    745:        ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno);            \
                    746:        ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno);               \
1.1.1.2   root      747:        fprintf (FILE, "\t%s\t ", SIZE_ASM_OP);                         \
1.1       root      748:        assemble_name (FILE, (FNAME));                                  \
                    749:         fprintf (FILE, ",");                                           \
                    750:        assemble_name (FILE, label);                                    \
                    751:         fprintf (FILE, "-");                                           \
1.1.1.3   root      752:        assemble_name (FILE, (FNAME));                                  \
1.1       root      753:        putc ('\n', FILE);                                              \
                    754:       }                                                                        \
                    755:   } while (0)
                    756: 
                    757: /* A table of bytes codes used by the ASM_OUTPUT_ASCII and
                    758:    ASM_OUTPUT_LIMITED_STRING macros.  Each byte in the table
                    759:    corresponds to a particular byte value [0..255].  For any
                    760:    given byte value, if the value in the corresponding table
                    761:    position is zero, the given character can be output directly.
                    762:    If the table value is 1, the byte must be output as a \ooo
                    763:    octal escape.  If the tables value is anything else, then the
                    764:    byte value should be output as a \ followed by the value
                    765:    in the table.  Note that we can use standard UN*X escape
                    766:    sequences for many control characters, but we don't use
                    767:    \a to represent BEL because some svr4 assemblers (e.g. on
1.1.1.7   root      768:    the i386) don't know about that.  Also, we don't use \v
                    769:    since some versions of gas, such as 2.2 did not accept it.  */
1.1       root      770: 
                    771: #define ESCAPES \
1.1.1.7   root      772: "\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      773: \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\
                    774: \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\
                    775: \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\
                    776: \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\
                    777: \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\
                    778: \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\
                    779: \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"
                    780: 
                    781: /* Some svr4 assemblers have a limit on the number of characters which
                    782:    can appear in the operand of a .string directive.  If your assembler
                    783:    has such a limitation, you should define STRING_LIMIT to reflect that
                    784:    limit.  Note that at least some svr4 assemblers have a limit on the
                    785:    actual number of bytes in the double-quoted string, and that they
1.1.1.2   root      786:    count each character in an escape sequence as one byte.  Thus, an
1.1       root      787:    escape sequence like \377 would count as four bytes.
                    788: 
                    789:    If your target assembler doesn't support the .string directive, you
                    790:    should define this to zero.
                    791: */
                    792: 
                    793: #define STRING_LIMIT   ((unsigned) 256)
                    794: 
                    795: #define STRING_ASM_OP  ".string"
                    796: 
                    797: /* The routine used to output NUL terminated strings.  We use a special
                    798:    version of this for most svr4 targets because doing so makes the
                    799:    generated assembly code more compact (and thus faster to assemble)
                    800:    as well as more readable, especially for targets like the i386
                    801:    (where the only alternative is to output character sequences as
                    802:    comma separated lists of numbers).   */
                    803: 
                    804: #define ASM_OUTPUT_LIMITED_STRING(FILE, STR)                           \
                    805:   do                                                                   \
                    806:     {                                                                  \
                    807:       register unsigned char *_limited_str = (unsigned char *) (STR);  \
                    808:       register unsigned ch;                                            \
                    809:       fprintf ((FILE), "\t%s\t\"", STRING_ASM_OP);                     \
                    810:       for (; ch = *_limited_str; _limited_str++)                       \
                    811:         {                                                              \
                    812:          register int escape;                                          \
                    813:          switch (escape = ESCAPES[ch])                                 \
                    814:            {                                                           \
                    815:            case 0:                                                     \
                    816:              putc (ch, (FILE));                                        \
                    817:              break;                                                    \
                    818:            case 1:                                                     \
                    819:              fprintf ((FILE), "\\%03o", ch);                           \
                    820:              break;                                                    \
                    821:            default:                                                    \
                    822:              putc ('\\', (FILE));                                      \
                    823:              putc (escape, (FILE));                                    \
                    824:              break;                                                    \
                    825:            }                                                           \
                    826:         }                                                              \
                    827:       fprintf ((FILE), "\"\n");                                                \
                    828:     }                                                                  \
                    829:   while (0)
                    830: 
                    831: /* The routine used to output sequences of byte values.  We use a special
                    832:    version of this for most svr4 targets because doing so makes the
                    833:    generated assembly code more compact (and thus faster to assemble)
                    834:    as well as more readable.  Note that if we find subparts of the
                    835:    character sequence which end with NUL (and which are shorter than
                    836:    STRING_LIMIT) we output those using ASM_OUTPUT_LIMITED_STRING.  */
                    837: 
                    838: #undef ASM_OUTPUT_ASCII
                    839: #define ASM_OUTPUT_ASCII(FILE, STR, LENGTH)                            \
                    840:   do                                                                   \
                    841:     {                                                                  \
                    842:       register unsigned char *_ascii_bytes = (unsigned char *) (STR);  \
                    843:       register unsigned char *limit = _ascii_bytes + (LENGTH);         \
                    844:       register unsigned bytes_in_chunk = 0;                            \
                    845:       for (; _ascii_bytes < limit; _ascii_bytes++)                     \
                    846:         {                                                              \
                    847:          register unsigned char *p;                                    \
                    848:          if (bytes_in_chunk >= 60)                                     \
                    849:            {                                                           \
                    850:              fprintf ((FILE), "\"\n");                                 \
                    851:              bytes_in_chunk = 0;                                       \
                    852:            }                                                           \
                    853:          for (p = _ascii_bytes; p < limit && *p != '\0'; p++)          \
                    854:            continue;                                                   \
                    855:          if (p < limit && (p - _ascii_bytes) <= STRING_LIMIT)          \
                    856:            {                                                           \
                    857:              if (bytes_in_chunk > 0)                                   \
                    858:                {                                                       \
                    859:                  fprintf ((FILE), "\"\n");                             \
                    860:                  bytes_in_chunk = 0;                                   \
                    861:                }                                                       \
                    862:              ASM_OUTPUT_LIMITED_STRING ((FILE), _ascii_bytes);         \
                    863:              _ascii_bytes = p;                                         \
                    864:            }                                                           \
                    865:          else                                                          \
                    866:            {                                                           \
                    867:              register int escape;                                      \
                    868:              register unsigned ch;                                     \
                    869:              if (bytes_in_chunk == 0)                                  \
                    870:                fprintf ((FILE), "\t%s\t\"", ASCII_DATA_ASM_OP);        \
                    871:              switch (escape = ESCAPES[ch = *_ascii_bytes])             \
                    872:                {                                                       \
                    873:                case 0:                                                 \
                    874:                  putc (ch, (FILE));                                    \
                    875:                  bytes_in_chunk++;                                     \
                    876:                  break;                                                \
                    877:                case 1:                                                 \
                    878:                  fprintf ((FILE), "\\%03o", ch);                       \
                    879:                  bytes_in_chunk += 4;                                  \
                    880:                  break;                                                \
                    881:                default:                                                \
                    882:                  putc ('\\', (FILE));                                  \
                    883:                  putc (escape, (FILE));                                \
                    884:                  bytes_in_chunk += 2;                                  \
                    885:                  break;                                                \
                    886:                }                                                       \
                    887:            }                                                           \
                    888:        }                                                               \
                    889:       if (bytes_in_chunk > 0)                                          \
                    890:         fprintf ((FILE), "\"\n");                                      \
                    891:     }                                                                  \
                    892:   while (0)
1.1.1.8   root      893: 
                    894: /* All SVR4 targets use the ELF object file format.  */
                    895: #define OBJECT_FORMAT_ELF

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.