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

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

unix.superglobalmegacorp.com

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