Annotation of GNUtools/cc/config/svr4.h, revision 1.1

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

unix.superglobalmegacorp.com

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