Annotation of GNUtools/cc/config/i386/osfrose.h, revision 1.1.1.1

1.1       root        1: /* Definitions of target machine for GNU compiler.
                      2:    Intel 386 (OSF/1 with OSF/rose) version.
                      3:    Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
                      4: 
                      5: This file is part of GNU CC.
                      6: 
                      7: GNU CC is free software; you can redistribute it and/or modify
                      8: it under the terms of the GNU General Public License as published by
                      9: the Free Software Foundation; either version 2, or (at your option)
                     10: any later version.
                     11: 
                     12: GNU CC is distributed in the hope that it will be useful,
                     13: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15: GNU General Public License for more details.
                     16: 
                     17: You should have received a copy of the GNU General Public License
                     18: along with GNU CC; see the file COPYING.  If not, write to
                     19: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     20: 
                     21: #include "halfpic.h"
                     22: #include "i386/gstabs.h"
                     23: 
                     24: /* Get perform_* macros to build libgcc.a.  */
                     25: #include "i386/perform.h"
                     26: 
                     27: #define OSF_OS
                     28: 
                     29: #undef  WORD_SWITCH_TAKES_ARG
                     30: #define WORD_SWITCH_TAKES_ARG(STR)                                     \
                     31:  (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) || !strcmp (STR, "pic-names"))
                     32: 
                     33: /* This defines which switch letters take arguments.  On svr4, most of
                     34:    the normal cases (defined in gcc.c) apply, and we also have -h* and
                     35:    -z* options (for the linker).  */
                     36: 
                     37: #define SWITCH_TAKES_ARG(CHAR) \
                     38:   (   (CHAR) == 'D' \
                     39:    || (CHAR) == 'U' \
                     40:    || (CHAR) == 'o' \
                     41:    || (CHAR) == 'e' \
                     42:    || (CHAR) == 'T' \
                     43:    || (CHAR) == 'u' \
                     44:    || (CHAR) == 'I' \
                     45:    || (CHAR) == 'm' \
                     46:    || (CHAR) == 'L' \
                     47:    || (CHAR) == 'A' \
                     48:    || (CHAR) == 'h' \
                     49:    || (CHAR) == 'z')
                     50: 
                     51: #define MASK_HALF_PIC          0x40000000      /* Mask for half-pic code */
                     52: #define MASK_HALF_PIC_DEBUG    0x20000000      /* Debug flag */
                     53: #define MASK_ELF               0x10000000      /* ELF not rose */
                     54: #define MASK_NO_IDENT          0x08000000      /* suppress .ident */
                     55: #define MASK_NO_UNDERSCORES    0x04000000      /* suppress leading _ */
                     56: #define MASK_LARGE_ALIGN       0x02000000      /* align to >word boundaries */
                     57: #define MASK_NO_MCOUNT         0x01000000      /* profiling uses mcount_ptr */
                     58: 
                     59: #define TARGET_HALF_PIC                (target_flags & MASK_HALF_PIC)
                     60: #define TARGET_DEBUG           (target_flags & MASK_HALF_PIC_DEBUG)
                     61: #define HALF_PIC_DEBUG         TARGET_DEBUG
                     62: #define TARGET_ELF             (target_flags & MASK_ELF)
                     63: #define TARGET_ROSE            ((target_flags & MASK_ELF) == 0)
                     64: #define TARGET_IDENT           ((target_flags & MASK_NO_IDENT) == 0)
                     65: #define TARGET_UNDERSCORES     ((target_flags & MASK_NO_UNDERSCORES) == 0)
                     66: #define TARGET_LARGE_ALIGN     (target_flags & MASK_LARGE_ALIGN)
                     67: #define TARGET_MCOUNT          ((target_flags & MASK_NO_MCOUNT) == 0)
                     68: 
                     69: #undef SUBTARGET_SWITCHES
                     70: #define SUBTARGET_SWITCHES \
                     71:      { "half-pic",      MASK_HALF_PIC},                                \
                     72:      { "no-half-pic",  -MASK_HALF_PIC},                                \
                     73:      { "debug-half-pic", MASK_HALF_PIC_DEBUG},                         \
                     74:      { "debugb",        MASK_HALF_PIC_DEBUG},                          \
                     75:      { "elf",           MASK_ELF},                                     \
                     76:      { "rose",         -MASK_ELF},                                     \
                     77:      { "ident",                -MASK_NO_IDENT},                                \
                     78:      { "no-ident",      MASK_NO_IDENT},                                \
                     79:      { "underscores",  -MASK_NO_UNDERSCORES},                          \
                     80:      { "no-underscores", MASK_NO_UNDERSCORES},                         \
                     81:      { "large-align",   MASK_LARGE_ALIGN},                             \
                     82:      { "no-large-align",-MASK_LARGE_ALIGN},                            \
                     83:      { "mcount",       -MASK_NO_MCOUNT},                               \
                     84:      { "no-mcount",     MASK_NO_MCOUNT},
                     85: 
                     86: /* OSF/rose uses stabs, not dwarf.  */
                     87: #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
                     88: 
                     89: #ifndef DWARF_DEBUGGING_INFO
                     90: #define DWARF_DEBUGGING_INFO   /* enable dwarf debugging for testing */
                     91: #endif
                     92: 
                     93: /* Handle #pragma weak and #pragma pack.  */
                     94: 
                     95: #define HANDLE_SYSV_PRAGMA
                     96: 
                     97: /* Change default predefines.  */
                     98: #undef CPP_PREDEFINES
                     99: #define CPP_PREDEFINES "-DOSF -DOSF1 -Dunix -Di386 -Asystem(unix) -Asystem(xpg4) -Acpu(i386) -Amachine(i386)"
                    100: 
                    101: #undef  CPP_SPEC
                    102: #define CPP_SPEC "\
                    103: %{!melf: -D__ROSE__ %{!pic-none: -D__SHARED__}} \
                    104: %{melf: -D__ELF__ %{fpic: -D__SHARED__}} \
                    105: %{mno-underscores: -D__NO_UNDERSCORES__} \
                    106: %{melf: %{!munderscores: -D__NO_UNDERSCORES__}} \
                    107: %{.S:  %{!ansi:%{!traditional:%{!traditional-cpp:%{!ftraditional: -traditional}}}}} \
                    108: %{.S:  -D__LANGUAGE_ASSEMBLY %{!ansi:-DLANGUAGE_ASSEMBLY}} \
                    109: %{.cc: -D__LANGUAGE_C_PLUS_PLUS} \
                    110: %{.cxx:        -D__LANGUAGE_C_PLUS_PLUS} \
                    111: %{.C:  -D__LANGUAGE_C_PLUS_PLUS} \
                    112: %{.m:  -D__LANGUAGE_OBJECTIVE_C} \
                    113: %{!.S: -D__LANGUAGE_C %{!ansi:-DLANGUAGE_C}}"
                    114: 
                    115: /* Turn on -pic-extern by default.  */
                    116: #undef  CC1_SPEC
                    117: #define CC1_SPEC "\
                    118: %{!melf: %{!mrose: -mrose }} \
                    119: %{melf: %{!munderscores: %{!mno-underscores: -mno-underscores }}} \
                    120: %{gline:%{!g:%{!g0:%{!g1:%{!g2: -g1}}}}} \
                    121: %{!melf: %{pic-none: -mno-half-pic} \
                    122:         %{pic-extern: } %{pic-lib: } %{pic-calls: } %{pic-names*: } \
                    123:         %{!pic-none: -mhalf-pic }}"
                    124: 
                    125: #undef ASM_SPEC
                    126: #define ASM_SPEC       "%{v*: -v}"
                    127: 
                    128: #undef  LINK_SPEC
                    129: #define LINK_SPEC      "%{v*: -v} \
                    130: %{!melf:       %{!noshrlib: %{pic-none: -noshrlib} %{!pic-none: -warn_nopic}} \
                    131:                %{nostdlib} %{noshrlib} %{glue}} \
                    132: %{melf:                %{dy} %{dn} %{glue: } \
                    133:                %{h*} %{z*} \
                    134:                %{static:-dn -Bstatic} \
                    135:                %{shared:-G -dy} \
                    136:                %{symbolic:-Bsymbolic -G -dy} \
                    137:                %{G:-G} \
                    138:                %{!dy: %{!dn: %{!static: %{!shared: %{!symbolic: \
                    139:                        %{noshrlib: -dn } %{pic-none: -dn } \
                    140:                        %{!noshrlib: %{!pic-none: -dy}}}}}}}}"
                    141: 
                    142: #undef  LIB_SPEC
                    143: #define LIB_SPEC "-lc"
                    144: 
                    145: #undef  LIBG_SPEC
                    146: #define LIBG_SPEC ""
                    147: 
                    148: #undef  STARTFILE_SPEC
                    149: #define STARTFILE_SPEC "%{pg:gcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}}"
                    150: 
                    151: #undef TARGET_VERSION_INTERNAL
                    152: #undef TARGET_VERSION
                    153: 
                    154: #define I386_VERSION " 80386, OSF/rose objects"
                    155: 
                    156: #define TARGET_VERSION_INTERNAL(STREAM) fputs (I386_VERSION, STREAM)
                    157: #define TARGET_VERSION TARGET_VERSION_INTERNAL (stderr)
                    158: 
                    159: #undef  MD_EXEC_PREFIX
                    160: #define MD_EXEC_PREFIX         "/usr/ccs/gcc/"
                    161: 
                    162: #undef  MD_STARTFILE_PREFIX
                    163: #define MD_STARTFILE_PREFIX    "/usr/ccs/lib/"
                    164: 
                    165: /* Specify size_t, ptrdiff_t, and wchar_t types.  */
                    166: #undef SIZE_TYPE
                    167: #undef PTRDIFF_TYPE
                    168: #undef WCHAR_TYPE
                    169: #undef WCHAR_TYPE_SIZE
                    170: 
                    171: #define SIZE_TYPE      "long unsigned int"
                    172: #define PTRDIFF_TYPE   "int"
                    173: #define WCHAR_TYPE     "unsigned int"
                    174: #define WCHAR_TYPE_SIZE BITS_PER_WORD
                    175: 
                    176: /* Temporarily turn off long double being 96 bits.  */
                    177: #undef LONG_DOUBLE_TYPE_SIZE
                    178: 
                    179: /* This macro generates the assembly code for function entry.
                    180:    FILE is a stdio stream to output the code to.
                    181:    SIZE is an int: how many units of temporary storage to allocate.
                    182:    Refer to the array `regs_ever_live' to determine which registers
                    183:    to save; `regs_ever_live[I]' is nonzero if register number I
                    184:    is ever used in the function.  This macro is responsible for
                    185:    knowing which registers should not be saved even if used.
                    186: 
                    187:    We override it here to allow for the new profiling code to go before
                    188:    the prologue and the old mcount code to go after the prologue (and
                    189:    after %ebx has been set up for ELF shared library support).  */
                    190: 
                    191: #define OSF_PROFILE_BEFORE_PROLOGUE                                    \
                    192:   (!TARGET_MCOUNT                                                      \
                    193:    && !current_function_needs_context                                  \
                    194:    && (!flag_pic                                                       \
                    195:        || !frame_pointer_needed                                                \
                    196:        || (!current_function_uses_pic_offset_table                     \
                    197:           && !current_function_uses_const_pool)))
                    198: 
                    199: #undef FUNCTION_PROLOGUE
                    200: #define FUNCTION_PROLOGUE(FILE, SIZE)                                  \
                    201: do                                                                     \
                    202:   {                                                                    \
                    203:     char *prefix = (TARGET_UNDERSCORES) ? "_" : "";                    \
                    204:     char *lprefix = LPREFIX;                                           \
                    205:     int labelno = profile_label_no;                                    \
                    206:                                                                        \
                    207:     if (profile_flag && OSF_PROFILE_BEFORE_PROLOGUE)                   \
                    208:       {                                                                        \
                    209:        if (!flag_pic && !HALF_PIC_P ())                                \
                    210:          {                                                             \
                    211:            fprintf (FILE, "\tmovl $%sP%d,%%edx\n", lprefix, labelno);  \
                    212:            fprintf (FILE, "\tcall *%s_mcount_ptr\n", prefix);          \
                    213:          }                                                             \
                    214:                                                                        \
                    215:        else if (HALF_PIC_P ())                                         \
                    216:          {                                                             \
                    217:            rtx symref;                                                 \
                    218:                                                                        \
                    219:            HALF_PIC_EXTERNAL ("_mcount_ptr");                          \
                    220:            symref = HALF_PIC_PTR (gen_rtx (SYMBOL_REF, Pmode,          \
                    221:                                            "_mcount_ptr"));            \
                    222:                                                                        \
                    223:            fprintf (FILE, "\tmovl $%sP%d,%%edx\n", lprefix, labelno);  \
                    224:            fprintf (FILE, "\tmovl %s%s,%%eax\n", prefix,               \
                    225:                     XSTR (symref, 0));                                 \
                    226:            fprintf (FILE, "\tcall *(%%eax)\n");                        \
                    227:          }                                                             \
                    228:                                                                        \
                    229:        else                                                            \
                    230:          {                                                             \
                    231:            static int call_no = 0;                                     \
                    232:                                                                        \
                    233:            fprintf (FILE, "\tcall %sPc%d\n", lprefix, call_no);        \
                    234:            fprintf (FILE, "%sPc%d:\tpopl %%eax\n", lprefix, call_no);  \
                    235:            fprintf (FILE, "\taddl $_GLOBAL_OFFSET_TABLE_+[.-%sPc%d],%%eax\n", \
                    236:                     lprefix, call_no++);                               \
                    237:            fprintf (FILE, "\tleal $%sP%d@GOTOFF(%%eax),%%edx\n",       \
                    238:                     lprefix, labelno);                                 \
                    239:            fprintf (FILE, "\tmovl %s_mcount_ptr@GOT(%%eax),%%eax\n",   \
                    240:                     prefix);                                           \
                    241:            fprintf (FILE, "\tcall *(%%eax)\n");                        \
                    242:          }                                                             \
                    243:       }                                                                        \
                    244:                                                                        \
                    245:     function_prologue (FILE, SIZE);                                    \
                    246:   }                                                                    \
                    247: while (0)
                    248: 
                    249: /* A C statement or compound statement to output to FILE some assembler code to
                    250:    call the profiling subroutine `mcount'.  Before calling, the assembler code
                    251:    must load the address of a counter variable into a register where `mcount'
                    252:    expects to find the address.  The name of this variable is `LP' followed by
                    253:    the number LABELNO, so you would generate the name using `LP%d' in a
                    254:    `fprintf'.
                    255:  
                    256:    The details of how the address should be passed to `mcount' are determined
                    257:    by your operating system environment, not by GNU CC.  To figure them out,
                    258:    compile a small program for profiling using the system's installed C
                    259:    compiler and look at the assembler code that results. */
                    260: 
                    261: #undef  FUNCTION_PROFILER
                    262: #define FUNCTION_PROFILER(FILE, LABELNO)                               \
                    263: do                                                                     \
                    264:   {                                                                    \
                    265:     if (!OSF_PROFILE_BEFORE_PROLOGUE)                                  \
                    266:       {                                                                        \
                    267:        char *prefix = (TARGET_UNDERSCORES) ? "_" : "";                 \
                    268:        char *lprefix = LPREFIX;                                        \
                    269:        int labelno = LABELNO;                                          \
                    270:                                                                        \
                    271:        /* Note that OSF/rose blew it in terms of calling mcount,       \
                    272:           since OSF/rose prepends a leading underscore, but mcount's   \
                    273:           doesn't.  At present, we keep this kludge for ELF as well    \
                    274:           to allow old kernels to build profiling.  */                 \
                    275:                                                                        \
                    276:        if (flag_pic                                                    \
                    277:            && !current_function_uses_pic_offset_table                  \
                    278:            && !current_function_uses_const_pool)                       \
                    279:          abort ();                                                     \
                    280:                                                                        \
                    281:        if (TARGET_MCOUNT && flag_pic)                                  \
                    282:          {                                                             \
                    283:            fprintf (FILE, "\tleal %sP%d@GOTOFF(%%ebx),%%edx\n",        \
                    284:                     lprefix, labelno);                                 \
                    285:            fprintf (FILE, "\tcall *%smcount@GOT(%%ebx)\n", prefix);    \
                    286:          }                                                             \
                    287:                                                                        \
                    288:        else if (TARGET_MCOUNT && HALF_PIC_P ())                        \
                    289:          {                                                             \
                    290:            rtx symdef;                                                 \
                    291:                                                                        \
                    292:            HALF_PIC_EXTERNAL ("mcount");                               \
                    293:            symdef = HALF_PIC_PTR (gen_rtx (SYMBOL_REF, Pmode, "mcount")); \
                    294:            fprintf (FILE, "\tmovl $%sP%d,%%edx\n", lprefix, labelno);  \
                    295:            fprintf (FILE, "\tcall *%s%s\n", prefix, XSTR (symdef, 0)); \
                    296:          }                                                             \
                    297:                                                                        \
                    298:        else if (TARGET_MCOUNT)                                         \
                    299:          {                                                             \
                    300:            fprintf (FILE, "\tmovl $%sP%d,%%edx\n", lprefix, labelno);  \
                    301:            fprintf (FILE, "\tcall %smcount\n", prefix);                \
                    302:          }                                                             \
                    303:                                                                        \
                    304:        else if (flag_pic && frame_pointer_needed)                      \
                    305:          {                                                             \
                    306:            fprintf (FILE, "\tmovl 4(%%ebp),%%ecx\n");                  \
                    307:            fprintf (FILE, "\tpushl %%ecx\n");                          \
                    308:            fprintf (FILE, "\tleal $%sP%d@GOTOFF(%%ebx),%%edx\n",       \
                    309:                     lprefix, labelno);                                 \
                    310:            fprintf (FILE, "\tmovl _mcount_ptr@GOT(%%eax),%%eax\n");    \
                    311:            fprintf (FILE, "\tcall *(%%eax)\n");                        \
                    312:            fprintf (FILE, "\tpopl %%eax\n");                           \
                    313:          }                                                             \
                    314:                                                                        \
                    315:        else if (frame_pointer_needed)                                  \
                    316:          {                                                             \
                    317:            fprintf (FILE, "\tmovl 4(%%ebp),%%ecx\n");                  \
                    318:            fprintf (FILE, "\tpushl %%ecx\n");                          \
                    319:            fprintf (FILE, "\tmovl $%sP%d,%%edx\n", lprefix, labelno);  \
                    320:            fprintf (FILE, "\tcall *_mcount_ptr\n");                    \
                    321:            fprintf (FILE, "\tpopl %%eax\n");                           \
                    322:          }                                                             \
                    323:                                                                        \
                    324:        else                                                            \
                    325:          abort ();                                                     \
                    326:       }                                                                        \
                    327:   }                                                                    \
                    328: while (0)
                    329: 
                    330: /* A C statement or compound statement to output to FILE some
                    331:    assembler code to initialize basic-block profiling for the current
                    332:    object module.  This code should call the subroutine
                    333:    `__bb_init_func' once per object module, passing it as its sole
                    334:    argument the address of a block allocated in the object module.
                    335: 
                    336:    The name of the block is a local symbol made with this statement:
                    337: 
                    338:        ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 0);
                    339: 
                    340:    Of course, since you are writing the definition of
                    341:    `ASM_GENERATE_INTERNAL_LABEL' as well as that of this macro, you
                    342:    can take a short cut in the definition of this macro and use the
                    343:    name that you know will result.
                    344: 
                    345:    The first word of this block is a flag which will be nonzero if the
                    346:    object module has already been initialized.  So test this word
                    347:    first, and do not call `__bb_init_func' if the flag is nonzero.  */
                    348: 
                    349: #undef FUNCTION_BLOCK_PROFILER
                    350: #define FUNCTION_BLOCK_PROFILER(STREAM, LABELNO)                       \
                    351: do                                                                     \
                    352:   {                                                                    \
                    353:     if (!flag_pic)                                                     \
                    354:       {                                                                        \
                    355:        fprintf (STREAM, "\tcmpl $0,%sPBX0\n", LPREFIX);                \
                    356:        fprintf (STREAM, "\tjne 0f\n");                                 \
                    357:        fprintf (STREAM, "\tpushl $%sPBX0\n", LPREFIX);                 \
                    358:        fprintf (STREAM, "\tcall %s__bb_init_func\n",                   \
                    359:                 (TARGET_UNDERSCORES) ? "_" : "");                      \
                    360:        fprintf (STREAM, "0:\n");                                       \
                    361:       }                                                                        \
                    362:     else                                                               \
                    363:       {                                                                        \
                    364:        fprintf (STREAM, "\tpushl %eax\n");                             \
                    365:        fprintf (STREAM, "\tmovl %sPBX0@GOT(%ebx),%eax\n");             \
                    366:        fprintf (STREAM, "\tcmpl $0,(%eax)\n");                         \
                    367:        fprintf (STREAM, "\tjne 0f\n");                                 \
                    368:        fprintf (STREAM, "\tpushl %eax\n");                             \
                    369:        fprintf (STREAM, "\tcall %s__bb_init_func@PLT\n",               \
                    370:                 (TARGET_UNDERSCORES) ? "_" : "");                      \
                    371:        fprintf (STREAM, "0:\n");                                       \
                    372:        fprintf (STREAM, "\tpopl %eax\n");                              \
                    373:       }                                                                        \
                    374:   }                                                                    \
                    375: while (0)
                    376: 
                    377: /* A C statement or compound statement to increment the count
                    378:    associated with the basic block number BLOCKNO.  Basic blocks are
                    379:    numbered separately from zero within each compilation.  The count
                    380:    associated with block number BLOCKNO is at index BLOCKNO in a
                    381:    vector of words; the name of this array is a local symbol made
                    382:    with this statement:
                    383: 
                    384:        ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 2);
                    385: 
                    386:    Of course, since you are writing the definition of
                    387:    `ASM_GENERATE_INTERNAL_LABEL' as well as that of this macro, you
                    388:    can take a short cut in the definition of this macro and use the
                    389:    name that you know will result.  */
                    390: 
                    391: #undef BLOCK_PROFILER
                    392: #define BLOCK_PROFILER(STREAM, BLOCKNO)                                        \
                    393: do                                                                     \
                    394:   {                                                                    \
                    395:     if (!flag_pic)                                                     \
                    396:       fprintf (STREAM, "\tincl %sPBX2+%d\n", LPREFIX, (BLOCKNO)*4);    \
                    397:     else                                                               \
                    398:       {                                                                        \
                    399:        fprintf (STREAM, "\tpushl %eax\n");                             \
                    400:        fprintf (STREAM, "\tmovl %sPBX2@GOT(%ebx),%eax\n", LPREFIX);    \
                    401:        fprintf (STREAM, "\tincl %d(%eax)\n", (BLOCKNO)*4);             \
                    402:        fprintf (STREAM, "\tpopl %eax\n");                              \
                    403:       }                                                                        \
                    404:   }                                                                    \
                    405: while (0)
                    406: 
                    407: /* A C function or functions which are needed in the library to
                    408:    support block profiling.  When support goes into libc, undo
                    409:    the #if 0.  */
                    410: 
                    411: #if 0
                    412: #undef BLOCK_PROFILING_CODE
                    413: #define        BLOCK_PROFILING_CODE
                    414: #endif
                    415: 
                    416: /* Prefix for internally generated assembler labels.  If we aren't using
                    417:    underscores, we are using prefix `.'s to identify labels that should
                    418:    be ignored, as in `i386/gas.h' [email protected]  */
                    419: #undef LPREFIX
                    420: #define        LPREFIX ((TARGET_UNDERSCORES) ? "L" : ".L")
                    421: 
                    422: /* This is how to store into the string BUF
                    423:    the symbol_ref name of an internal numbered label where
                    424:    PREFIX is the class of label and NUM is the number within the class.
                    425:    This is suitable for output with `assemble_name'.  */
                    426: 
                    427: #undef ASM_GENERATE_INTERNAL_LABEL
                    428: #define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER)                 \
                    429:     sprintf ((BUF), "*%s%s%d", (TARGET_UNDERSCORES) ? "" : ".",                \
                    430:             (PREFIX), (NUMBER))
                    431: 
                    432: /* This is how to output an internal numbered label where
                    433:    PREFIX is the class of label and NUM is the number within the class.  */
                    434: 
                    435: #undef ASM_OUTPUT_INTERNAL_LABEL
                    436: #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM)                     \
                    437:   fprintf (FILE, "%s%s%d:\n", (TARGET_UNDERSCORES) ? "" : ".",         \
                    438:           PREFIX, NUM)
                    439: 
                    440: /* This is how to output a reference to a user-level label named NAME.  */
                    441: 
                    442: #undef ASM_OUTPUT_LABELREF
                    443: #define ASM_OUTPUT_LABELREF(FILE,NAME)                                 \
                    444:   fprintf (FILE, "%s%s", (TARGET_UNDERSCORES) ? "_" : "", NAME)
                    445: 
                    446: /* This is how to output an element of a case-vector that is relative.
                    447:    This is only used for PIC code.  See comments by the `casesi' insn in
                    448:    i386.md for an explanation of the expression this outputs. */
                    449: 
                    450: #undef ASM_OUTPUT_ADDR_DIFF_ELT
                    451: #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \
                    452:   fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, VALUE)
                    453: 
                    454: /* A C expression to output text to align the location counter in the
                    455:    way that is desirable at a point in the code that is reached only
                    456:    by jumping.
                    457: 
                    458:    This macro need not be defined if you don't want any special
                    459:    alignment to be done at such a time.  Most machine descriptions do
                    460:    not currently define the macro.  */
                    461: 
                    462: #undef ASM_OUTPUT_ALIGN_CODE
                    463: #define ASM_OUTPUT_ALIGN_CODE(STREAM)                                  \
                    464:   fprintf (STREAM, "\t.align\t%d\n",                                   \
                    465:           (TARGET_486 && TARGET_LARGE_ALIGN) ? 4 : 2)
                    466: 
                    467: /* A C expression to output text to align the location counter in the
                    468:    way that is desirable at the beginning of a loop.
                    469: 
                    470:    This macro need not be defined if you don't want any special
                    471:    alignment to be done at such a time.  Most machine descriptions do
                    472:    not currently define the macro.  */
                    473: 
                    474: #undef ASM_OUTPUT_LOOP_ALIGN
                    475: #define ASM_OUTPUT_LOOP_ALIGN(STREAM) \
                    476:   fprintf (STREAM, "\t.align\t2\n")
                    477: 
                    478: /* A C statement to output to the stdio stream STREAM an assembler
                    479:    command to advance the location counter to a multiple of 2 to the
                    480:    POWER bytes.  POWER will be a C expression of type `int'.  */
                    481: 
                    482: #undef ASM_OUTPUT_ALIGN
                    483: #define ASM_OUTPUT_ALIGN(STREAM, POWER)                                        \
                    484:   fprintf (STREAM, "\t.align\t%d\n",                                   \
                    485:           (!TARGET_LARGE_ALIGN && (POWER) > 2) ? 2 : (POWER))
                    486: 
                    487: /* A C expression that is 1 if the RTX X is a constant which is a
                    488:    valid address.  On most machines, this can be defined as
                    489:    `CONSTANT_P (X)', but a few machines are more restrictive in
                    490:    which constant addresses are supported.
                    491: 
                    492:    `CONSTANT_P' accepts integer-values expressions whose values are
                    493:    not explicitly known, such as `symbol_ref', `label_ref', and
                    494:    `high' expressions and `const' arithmetic expressions, in
                    495:    addition to `const_int' and `const_double' expressions.  */
                    496: 
                    497: #define CONSTANT_ADDRESS_P_ORIG(X)                                     \
                    498:   (GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF             \
                    499:    || GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST               \
                    500:    || GET_CODE (X) == HIGH)
                    501: 
                    502: #undef CONSTANT_ADDRESS_P
                    503: #define CONSTANT_ADDRESS_P(X)                                           \
                    504:   ((CONSTANT_ADDRESS_P_ORIG (X)) && (!HALF_PIC_P () || !HALF_PIC_ADDRESS_P (X)))
                    505: 
                    506: /* Nonzero if the constant value X is a legitimate general operand.
                    507:    It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
                    508: 
                    509: #undef LEGITIMATE_CONSTANT_P
                    510: #define LEGITIMATE_CONSTANT_P(X)                                       \
                    511:   (!HALF_PIC_P ()                                                      \
                    512:    || GET_CODE (X) == CONST_DOUBLE                                     \
                    513:    || GET_CODE (X) == CONST_INT                                                \
                    514:    || !HALF_PIC_ADDRESS_P (X))
                    515: 
                    516: /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
                    517:    that is a valid memory address for an instruction.
                    518:    The MODE argument is the machine mode for the MEM expression
                    519:    that wants to use this address. */
                    520: 
                    521: #define GO_IF_LEGITIMATE_ADDRESS_ORIG(MODE, X, ADDR)                   \
                    522: {                                                                      \
                    523:   if (CONSTANT_ADDRESS_P (X)                                           \
                    524:       && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (X)))                 \
                    525:     goto ADDR;                                                         \
                    526:   GO_IF_INDEXING (X, ADDR);                                            \
                    527:   if (GET_CODE (X) == PLUS && CONSTANT_ADDRESS_P (XEXP (X, 1)))                \
                    528:     {                                                                  \
                    529:       rtx x0 = XEXP (X, 0);                                            \
                    530:       if (! flag_pic || ! SYMBOLIC_CONST (XEXP (X, 1)))                        \
                    531:        { GO_IF_INDEXING (x0, ADDR); }                                  \
                    532:       else if (x0 == pic_offset_table_rtx)                             \
                    533:        goto ADDR;                                                      \
                    534:       else if (GET_CODE (x0) == PLUS)                                  \
                    535:        {                                                               \
                    536:          if (XEXP (x0, 0) == pic_offset_table_rtx)                     \
                    537:            { GO_IF_INDEXABLE_BASE (XEXP (x0, 1), ADDR); }              \
                    538:          if (XEXP (x0, 1) == pic_offset_table_rtx)                     \
                    539:            { GO_IF_INDEXABLE_BASE (XEXP (x0, 0), ADDR); }              \
                    540:        }                                                               \
                    541:     }                                                                  \
                    542: }
                    543: 
                    544: #undef GO_IF_LEGITIMATE_ADDRESS
                    545: #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR)                                \
                    546: {                                                                      \
                    547:   if (! HALF_PIC_P ())                                                 \
                    548:     {                                                                  \
                    549:       GO_IF_LEGITIMATE_ADDRESS_ORIG(MODE, X, ADDR);                    \
                    550:     }                                                                  \
                    551:   else                                                                 \
                    552:     {                                                                  \
                    553:       if (CONSTANT_P (X) && ! HALF_PIC_ADDRESS_P (X))                  \
                    554:        goto ADDR;                                                      \
                    555:                                                                        \
                    556:       GO_IF_INDEXING (X, ADDR);                                                \
                    557:       if (GET_CODE (X) == PLUS)                                                \
                    558:        {                                                               \
                    559:          rtx x1 = XEXP (X, 1);                                         \
                    560:                                                                        \
                    561:          if (CONSTANT_P (x1) && ! HALF_PIC_ADDRESS_P (x1))             \
                    562:            {                                                           \
                    563:              rtx x0 = XEXP (X, 0);                                     \
                    564:              GO_IF_INDEXING (x0, ADDR);                                \
                    565:            }                                                           \
                    566:        }                                                               \
                    567:     }                                                                  \
                    568: }
                    569: 
                    570: /* Sometimes certain combinations of command options do not make sense
                    571:    on a particular target machine.  You can define a macro
                    572:    `OVERRIDE_OPTIONS' to take account of this.  This macro, if
                    573:    defined, is executed once just after all the command options have
                    574:    been parsed.  */
                    575: 
                    576: #undef  SUBTARGET_OVERRIDE_OPTIONS
                    577: #define SUBTARGET_OVERRIDE_OPTIONS                                     \
                    578: {                                                                      \
                    579:   /*                                                                   \
                    580:   if (TARGET_ELF && TARGET_HALF_PIC)                                   \
                    581:     {                                                                  \
                    582:       target_flags &= ~MASK_HALF_PIC;                                  \
                    583:       flag_pic = 1;                                                    \
                    584:     }                                                                  \
                    585:   */                                                                   \
                    586:                                                                        \
                    587:   if (TARGET_ROSE && flag_pic)                                         \
                    588:     {                                                                  \
                    589:       target_flags |= MASK_HALF_PIC;                                   \
                    590:       flag_pic = 0;                                                    \
                    591:     }                                                                  \
                    592:                                                                        \
                    593:   if (TARGET_HALF_PIC)                                                 \
                    594:     half_pic_init ();                                                  \
                    595: }
                    596: 
                    597: /* Define this macro if references to a symbol must be treated
                    598:    differently depending on something about the variable or
                    599:    function named by the symbol (such as what section it is in).
                    600: 
                    601:    The macro definition, if any, is executed immediately after the
                    602:    rtl for DECL has been created and stored in `DECL_RTL (DECL)'. 
                    603:    The value of the rtl will be a `mem' whose address is a
                    604:    `symbol_ref'.
                    605: 
                    606:    The usual thing for this macro to do is to a flag in the
                    607:    `symbol_ref' (such as `SYMBOL_REF_FLAG') or to store a modified
                    608:    name string in the `symbol_ref' (if one bit is not enough
                    609:    information).
                    610: 
                    611:    The best way to modify the name string is by adding text to the
                    612:    beginning, with suitable punctuation to prevent any ambiguity. 
                    613:    Allocate the new name in `saveable_obstack'.  You will have to
                    614:    modify `ASM_OUTPUT_LABELREF' to remove and decode the added text
                    615:    and output the name accordingly.
                    616: 
                    617:    You can also check the information stored in the `symbol_ref' in
                    618:    the definition of `GO_IF_LEGITIMATE_ADDRESS' or
                    619:    `PRINT_OPERAND_ADDRESS'. */
                    620: 
                    621: #undef ENCODE_SECTION_INFO
                    622: #define ENCODE_SECTION_INFO(DECL)                                      \
                    623: do                                                                     \
                    624:   {                                                                    \
                    625:    if (HALF_PIC_P ())                                                  \
                    626:       HALF_PIC_ENCODE (DECL);                                          \
                    627:                                                                        \
                    628:    else if (flag_pic)                                                  \
                    629:      {                                                                 \
                    630:        rtx rtl = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd'            \
                    631:                  ? TREE_CST_RTL (DECL) : DECL_RTL (DECL));             \
                    632:        SYMBOL_REF_FLAG (XEXP (rtl, 0))                                 \
                    633:         = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd'                   \
                    634:            || ! TREE_PUBLIC (DECL));                                   \
                    635:       }                                                                        \
                    636:   }                                                                    \
                    637: while (0)
                    638: 
                    639: 
                    640: /* On most machines, read-only variables, constants, and jump tables
                    641:    are placed in the text section.  If this is not the case on your
                    642:    machine, this macro should be defined to be the name of a function
                    643:    (either `data_section' or a function defined in `EXTRA_SECTIONS')
                    644:    that switches to the section to be used for read-only items.
                    645: 
                    646:    If these items should be placed in the text section, this macro
                    647:    should not be defined.  */
                    648: 
                    649: #if 0
                    650: #undef READONLY_DATA_SECTION
                    651: #define READONLY_DATA_SECTION()                                                \
                    652: do                                                                     \
                    653:   {                                                                    \
                    654:     if (TARGET_ELF)                                                    \
                    655:       {                                                                        \
                    656:        if (in_section != in_rodata)                                    \
                    657:          {                                                             \
                    658:            fprintf (asm_out_file, "\t.section \"rodata\"\n");          \
                    659:            in_section = in_rodata;                                     \
                    660:          }                                                             \
                    661:       }                                                                        \
                    662:     else                                                               \
                    663:       text_section ();                                                 \
                    664:   }                                                                    \
                    665: while (0)
                    666: #endif
                    667: 
                    668: /* A list of names for sections other than the standard two, which are
                    669:    `in_text' and `in_data'.  You need not define this macro on a
                    670:    system with no other sections (that GCC needs to use).  */
                    671: 
                    672: #undef EXTRA_SECTIONS
                    673: #define        EXTRA_SECTIONS in_rodata, in_data1
                    674: 
                    675: /* Given a decl node or constant node, choose the section to output it in
                    676:    and select that section.  */
                    677: 
                    678: #undef SELECT_RTX_SECTION
                    679: #define SELECT_RTX_SECTION(MODE, RTX)                                  \
                    680: do                                                                     \
                    681:   {                                                                    \
                    682:     if (MODE == Pmode && HALF_PIC_P () && HALF_PIC_ADDRESS_P (RTX))    \
                    683:       data_section ();                                                 \
                    684:     else                                                               \
                    685:       readonly_data_section ();                                                \
                    686:   }                                                                    \
                    687: while (0)
                    688: 
                    689: #undef SELECT_SECTION
                    690: #define SELECT_SECTION(DECL, RELOC)                                    \
                    691: {                                                                      \
                    692:   if (RELOC && HALF_PIC_P ())                                          \
                    693:     data_section ();                                                   \
                    694:                                                                        \
                    695:   else if (TREE_CODE (DECL) == STRING_CST)                             \
                    696:     {                                                                  \
                    697:       if (flag_writable_strings)                                       \
                    698:        data_section ();                                                \
                    699:       else                                                             \
                    700:        readonly_data_section ();                                       \
                    701:     }                                                                  \
                    702:                                                                        \
                    703:   else if (TREE_CODE (DECL) != VAR_DECL)                               \
                    704:     readonly_data_section ();                                          \
                    705:                                                                        \
                    706:   else if (!TREE_READONLY (DECL))                                      \
                    707:     data_section ();                                                   \
                    708:                                                                        \
                    709:   else                                                                 \
                    710:     readonly_data_section ();                                          \
                    711: }
                    712: 
                    713: 
                    714: /* Define the strings used for the special svr4 .type and .size directives.
                    715:    These strings generally do not vary from one system running svr4 to
                    716:    another, but if a given system (e.g. m88k running svr) needs to use
                    717:    different pseudo-op names for these, they may be overridden in the
                    718:    file which includes this one.  */
                    719: 
                    720: #define TYPE_ASM_OP    ".type"
                    721: #define SIZE_ASM_OP    ".size"
                    722: #define WEAK_ASM_OP    ".weak"
                    723: #define SET_ASM_OP     ".set"
                    724: 
                    725: /* The following macro defines the format used to output the second
                    726:    operand of the .type assembler directive.  Different svr4 assemblers
                    727:    expect various different forms for this operand.  The one given here
                    728:    is just a default.  You may need to override it in your machine-
                    729:    specific tm.h file (depending upon the particulars of your assembler).  */
                    730: 
                    731: #define TYPE_OPERAND_FMT       "@%s"
                    732: 
                    733: /* A C statement (sans semicolon) to output to the stdio stream
                    734:    STREAM any text necessary for declaring the name NAME of an
                    735:    initialized variable which is being defined.  This macro must
                    736:    output the label definition (perhaps using `ASM_OUTPUT_LABEL'). 
                    737:    The argument DECL is the `VAR_DECL' tree node representing the
                    738:    variable.
                    739: 
                    740:    If this macro is not defined, then the variable name is defined
                    741:    in the usual manner as a label (by means of `ASM_OUTPUT_LABEL').  */
                    742: 
                    743: #undef ASM_DECLARE_OBJECT_NAME
                    744: #define ASM_DECLARE_OBJECT_NAME(STREAM, NAME, DECL)                         \
                    745: do                                                                          \
                    746:  {                                                                          \
                    747:    ASM_OUTPUT_LABEL(STREAM,NAME);                                           \
                    748:    HALF_PIC_DECLARE (NAME);                                                 \
                    749:    if (TARGET_ELF)                                                          \
                    750:      {                                                                      \
                    751:        fprintf (STREAM, "\t%s\t ", TYPE_ASM_OP);                            \
                    752:        assemble_name (STREAM, NAME);                                        \
                    753:        putc (',', STREAM);                                                  \
                    754:        fprintf (STREAM, TYPE_OPERAND_FMT, "object");                        \
                    755:        putc ('\n', STREAM);                                                 \
                    756:        size_directive_output = 0;                                           \
                    757:        if (!flag_inhibit_size_directive && DECL_SIZE (DECL))                \
                    758:         {                                                                   \
                    759:            size_directive_output = 1;                                       \
                    760:           fprintf (STREAM, "\t%s\t ", SIZE_ASM_OP);                         \
                    761:           assemble_name (STREAM, NAME);                                     \
                    762:           fprintf (STREAM, ",%d\n",  int_size_in_bytes (TREE_TYPE (DECL))); \
                    763:         }                                                                   \
                    764:      }                                                                      \
                    765:  }                                                                          \
                    766: while (0)
                    767: 
                    768: /* Output the size directive for a decl in rest_of_decl_compilation
                    769:    in the case where we did not do so before the initializer.
                    770:    Once we find the error_mark_node, we know that the value of
                    771:    size_directive_output was set
                    772:    by ASM_DECLARE_OBJECT_NAME when it was run for the same decl.  */
                    773: 
                    774: #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END)        \
                    775: do {                                                                    \
                    776:      char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0);                  \
                    777:      if (TARGET_ELF                                                     \
                    778:         && !flag_inhibit_size_directive && DECL_SIZE (DECL)             \
                    779:          && ! AT_END && TOP_LEVEL                                       \
                    780:         && DECL_INITIAL (DECL) == error_mark_node                       \
                    781:         && !size_directive_output)                                      \
                    782:        {                                                                \
                    783:         fprintf (FILE, "\t%s\t ", SIZE_ASM_OP);                         \
                    784:         assemble_name (FILE, name);                                     \
                    785:         fprintf (FILE, ",%d\n",  int_size_in_bytes (TREE_TYPE (DECL))); \
                    786:        }                                                                \
                    787:    } while (0)
                    788: 
                    789: /* This is how to declare a function name. */
                    790: 
                    791: #undef ASM_DECLARE_FUNCTION_NAME
                    792: #define ASM_DECLARE_FUNCTION_NAME(STREAM,NAME,DECL)                    \
                    793: do                                                                     \
                    794:  {                                                                     \
                    795:    ASM_OUTPUT_LABEL(STREAM,NAME);                                      \
                    796:    HALF_PIC_DECLARE (NAME);                                            \
                    797:    if (TARGET_ELF)                                                     \
                    798:      {                                                                 \
                    799:        fprintf (STREAM, "\t%s\t ", TYPE_ASM_OP);                       \
                    800:        assemble_name (STREAM, NAME);                                   \
                    801:        putc (',', STREAM);                                             \
                    802:        fprintf (STREAM, TYPE_OPERAND_FMT, "function");                 \
                    803:        putc ('\n', STREAM);                                            \
                    804:        ASM_DECLARE_RESULT (STREAM, DECL_RESULT (DECL));                        \
                    805:      }                                                                 \
                    806:  }                                                                     \
                    807: while (0)
                    808: 
                    809: /* Write the extra assembler code needed to declare a function's result.
                    810:    Most svr4 assemblers don't require any special declaration of the
                    811:    result value, but there are exceptions.  */
                    812: 
                    813: #ifndef ASM_DECLARE_RESULT
                    814: #define ASM_DECLARE_RESULT(FILE, RESULT)
                    815: #endif
                    816: 
                    817: /* This is how to declare the size of a function.  */
                    818: 
                    819: #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL)                   \
                    820: do                                                                     \
                    821:   {                                                                    \
                    822:     if (TARGET_ELF && !flag_inhibit_size_directive)                    \
                    823:       {                                                                        \
                    824:         char label[256];                                               \
                    825:        static int labelno;                                             \
                    826:        labelno++;                                                      \
                    827:        ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno);            \
                    828:        ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno);               \
                    829:        fprintf (FILE, "\t%s\t ", SIZE_ASM_OP);                         \
                    830:        assemble_name (FILE, (FNAME));                                  \
                    831:         fprintf (FILE, ",");                                           \
                    832:        assemble_name (FILE, label);                                    \
                    833:         fprintf (FILE, "-");                                           \
                    834:        assemble_name (FILE, (FNAME));                                  \
                    835:        putc ('\n', FILE);                                              \
                    836:       }                                                                        \
                    837:   }                                                                    \
                    838: while (0)
                    839: 
                    840: /* Attach a special .ident directive to the end of the file to identify
                    841:    the version of GCC which compiled this code.  The format of the
                    842:    .ident string is patterned after the ones produced by native svr4
                    843:    C compilers.  */
                    844: 
                    845: #define IDENT_ASM_OP ".ident"
                    846: 
                    847: /* Allow #sccs in preprocessor.  */
                    848: 
                    849: #define SCCS_DIRECTIVE
                    850: 
                    851: /* This says what to print at the end of the assembly file */
                    852: #define ASM_FILE_END(STREAM)                                           \
                    853: do                                                                     \
                    854:   {                                                                    \
                    855:     if (HALF_PIC_P ())                                                 \
                    856:       HALF_PIC_FINISH (STREAM);                                                \
                    857:                                                                        \
                    858:     if (TARGET_IDENT)                                                  \
                    859:       {                                                                        \
                    860:        char *fstart = main_input_filename;                             \
                    861:        char *fname;                                                    \
                    862:                                                                        \
                    863:        if (!fstart)                                                    \
                    864:          fstart = "<no file>";                                         \
                    865:                                                                        \
                    866:        fname = fstart + strlen (fstart) - 1;                           \
                    867:        while (fname > fstart && *fname != '/')                         \
                    868:          fname--;                                                      \
                    869:                                                                        \
                    870:        if (*fname == '/')                                              \
                    871:          fname++;                                                      \
                    872:                                                                        \
                    873:        fprintf ((STREAM), "\t%s\t\"GCC: (GNU) %s %s -O%d",             \
                    874:                 IDENT_ASM_OP, version_string, fname, optimize);        \
                    875:                                                                        \
                    876:        if (write_symbols == PREFERRED_DEBUGGING_TYPE)                  \
                    877:          fprintf ((STREAM), " -g%d", (int)debug_info_level);           \
                    878:                                                                        \
                    879:        else if (write_symbols == DBX_DEBUG)                            \
                    880:          fprintf ((STREAM), " -gstabs%d", (int)debug_info_level);      \
                    881:                                                                        \
                    882:        else if (write_symbols == DWARF_DEBUG)                          \
                    883:          fprintf ((STREAM), " -gdwarf%d", (int)debug_info_level);      \
                    884:                                                                        \
                    885:        else if (write_symbols != NO_DEBUG)                             \
                    886:          fprintf ((STREAM), " -g??%d", (int)debug_info_level);         \
                    887:                                                                        \
                    888:        if (flag_omit_frame_pointer)                                    \
                    889:          fprintf ((STREAM), " -fomit-frame-pointer");                  \
                    890:                                                                        \
                    891:        if (flag_strength_reduce)                                       \
                    892:          fprintf ((STREAM), " -fstrength-reduce");                     \
                    893:                                                                        \
                    894:        if (flag_unroll_loops)                                          \
                    895:          fprintf ((STREAM), " -funroll-loops");                        \
                    896:                                                                        \
                    897:        if (flag_force_mem)                                             \
                    898:          fprintf ((STREAM), " -fforce-mem");                           \
                    899:                                                                        \
                    900:        if (flag_force_addr)                                            \
                    901:          fprintf ((STREAM), " -fforce-addr");                          \
                    902:                                                                        \
                    903:        if (flag_inline_functions)                                      \
                    904:          fprintf ((STREAM), " -finline-functions");                    \
                    905:                                                                        \
                    906:        if (flag_caller_saves)                                          \
                    907:          fprintf ((STREAM), " -fcaller-saves");                        \
                    908:                                                                        \
                    909:        if (flag_pic)                                                   \
                    910:          fprintf ((STREAM), (flag_pic > 1) ? " -fPIC" : " -fpic");     \
                    911:                                                                        \
                    912:        if (flag_inhibit_size_directive)                                \
                    913:          fprintf ((STREAM), " -finhibit-size-directive");              \
                    914:                                                                        \
                    915:        if (flag_gnu_linker)                                            \
                    916:          fprintf ((STREAM), " -fgnu-linker");                          \
                    917:                                                                        \
                    918:        if (profile_flag)                                               \
                    919:          fprintf ((STREAM), " -p");                                    \
                    920:                                                                        \
                    921:        if (profile_block_flag)                                         \
                    922:          fprintf ((STREAM), " -a");                                    \
                    923:                                                                        \
                    924:        if (TARGET_IEEE_FP)                                             \
                    925:          fprintf ((STREAM), " -mieee-fp");                             \
                    926:                                                                        \
                    927:        if (TARGET_HALF_PIC)                                            \
                    928:          fprintf ((STREAM), " -mhalf-pic");                            \
                    929:                                                                        \
                    930:        fprintf ((STREAM), (TARGET_486) ? " -m486" : " -m386");         \
                    931:        fprintf ((STREAM), (TARGET_ELF) ? " -melf\"\n" : " -mrose\"\n"); \
                    932:       }                                                                        \
                    933:   }                                                                    \
                    934: while (0)
                    935: 
                    936: /* Tell collect that the object format is OSF/rose.  */
                    937: #define OBJECT_FORMAT_ROSE
                    938: 
                    939: /* Tell collect where the appropriate binaries are.  */
                    940: #define REAL_LD_FILE_NAME      "/usr/ccs/gcc/gld"
                    941: #define REAL_NM_FILE_NAME      "/usr/ccs/bin/nm"
                    942: #define REAL_STRIP_FILE_NAME   "/usr/ccs/bin/strip"
                    943: 
                    944: /* Use atexit for static constructors/destructors, instead of defining
                    945:    our own exit function.  */
                    946: #define HAVE_ATEXIT
                    947: 
                    948: /* Define this macro meaning that gcc should find the library 'libgcc.a'
                    949:    by hand, rather than passing the argument '-lgcc' to tell the linker
                    950:    to do the search */
                    951: #define LINK_LIBGCC_SPECIAL
                    952: 
                    953: /* A C statement to output assembler commands which will identify the object
                    954:   file as having been compile with GNU CC. We don't need or want this for
                    955:   OSF1. GDB doesn't need it and kdb doesn't like it */
                    956: #define ASM_IDENTIFY_GCC(FILE)
                    957: 
                    958: /* Identify the front-end which produced this file.  To keep symbol
                    959:    space down, and not confuse kdb, only do this if the language is
                    960:    not C.  */
                    961: 
                    962: #define ASM_IDENTIFY_LANGUAGE(STREAM)                                  \
                    963: {                                                                      \
                    964:   if (strcmp (lang_identify (), "c") != 0)                             \
                    965:     output_lang_identify (STREAM);                                     \
                    966: }
                    967: 
                    968: /* This is how to output an assembler line defining a `double' constant.
                    969:    Use "word" pseudos to avoid printing NaNs, infinity, etc.  */
                    970: 
                    971: /* This is how to output an assembler line defining a `double' constant.  */
                    972: #undef ASM_OUTPUT_DOUBLE
                    973: #define        ASM_OUTPUT_DOUBLE(STREAM, VALUE)                                \
                    974: do                                                                     \
                    975:   {                                                                    \
                    976:     long value_long[2];                                                        \
                    977:     char dstr[30];                                                     \
                    978:     REAL_VALUE_TO_TARGET_DOUBLE (VALUE, value_long);                   \
                    979:     REAL_VALUE_TO_DECIMAL (VALUE, "%.20g", dstr);                      \
                    980:     if (sizeof (int) == sizeof (long))                                 \
                    981:       fprintf (STREAM, "\t.long\t0x%08x\t\t# %s\n\t.long\t0x%08x\n",   \
                    982:           value_long[0], dstr, value_long[1]);                         \
                    983:      else                                                              \
                    984:       fprintf (STREAM, "\t.long\t0x%08lx\t\t# %s\n\t.long\t0x%08lx\n", \
                    985:           value_long[0], dstr, value_long[1]);                         \
                    986:   }                                                                    \
                    987: while (0)
                    988: 
                    989: /* This is how to output an assembler line defining a `float' constant.  */
                    990: #undef ASM_OUTPUT_FLOAT
                    991: #define        ASM_OUTPUT_FLOAT(STREAM, VALUE)                                 \
                    992: do                                                                     \
                    993:   {                                                                    \
                    994:     long value_long;                                                   \
                    995:     char dstr[30];                                                     \
                    996:     REAL_VALUE_TO_TARGET_SINGLE (VALUE, value_long);                   \
                    997:     REAL_VALUE_TO_DECIMAL (VALUE, "%.12g", dstr);                      \
                    998:     if (sizeof (int) == sizeof (long))                                 \
                    999:       fprintf (STREAM, "\t.long\t0x%08x\t\t# %s (float)\n",            \
                   1000:           value_long, dstr);                                           \
                   1001:     else                                                               \
                   1002:       fprintf (STREAM, "\t.long\t0x%08lx\t\t# %s (float)\n",           \
                   1003:           value_long, dstr);                                           \
                   1004:   }                                                                    \
                   1005: while (0)
                   1006: 
                   1007: /* This is how to output an assembler line for a `long double' constant.  */
                   1008: #undef ASM_OUTPUT_LONG_DOUBLE
                   1009: #define ASM_OUTPUT_LONG_DOUBLE(FILE,VALUE)                             \
                   1010: do { long l[3];                                                                \
                   1011:      char dstr[30];                                                    \
                   1012:      REAL_VALUE_TO_TARGET_LONG_DOUBLE (VALUE, l);                      \
                   1013:      REAL_VALUE_TO_DECIMAL (VALUE, "%.20g", dstr);                     \
                   1014:      if (sizeof (int) == sizeof (long))                                        \
                   1015:       fprintf (FILE,                                                   \
                   1016:       "\t.long\t0x%08x\t\t# %s\n\t.long\t0x%08x\n\t.long\t0x%08x\n",   \
                   1017:       l[0], dstr, l[1], l[2]);                                                 \
                   1018:      else                                                              \
                   1019:       fprintf (FILE,                                                   \
                   1020:       "\t.long\t0x%08lx\t\t# %s\n\t.long\t0x%08lx\n\t.long\t0x%08lx\n",        \
                   1021:       l[0], dstr, l[1], l[2]);                                                 \
                   1022:    } while (0)
                   1023: 
                   1024: /* Generate calls to memcpy, etc., not bcopy, etc. */
                   1025: #define TARGET_MEM_FUNCTIONS
                   1026: 
                   1027: /* Don't default to pcc-struct-return, because gcc is the only compiler, and
                   1028:    we want to retain compatibility with older gcc versions.  */
                   1029: #define DEFAULT_PCC_STRUCT_RETURN 0
                   1030: 
                   1031: /* Map i386 registers to the numbers dwarf expects.  Of course this is different
                   1032:    from what stabs expects.  */
                   1033: 
                   1034: #define DWARF_DBX_REGISTER_NUMBER(n) \
                   1035: ((n) == 0 ? 0 \
                   1036:  : (n) == 1 ? 2 \
                   1037:  : (n) == 2 ? 1 \
                   1038:  : (n) == 3 ? 3 \
                   1039:  : (n) == 4 ? 6 \
                   1040:  : (n) == 5 ? 7 \
                   1041:  : (n) == 6 ? 5 \
                   1042:  : (n) == 7 ? 4 \
                   1043:  : ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG) ? (n)+3 \
                   1044:  : (-1))
                   1045: 
                   1046: /* Now what stabs expects in the register.  */
                   1047: #define STABS_DBX_REGISTER_NUMBER(n) \
                   1048: ((n) == 0 ? 0 : \
                   1049:  (n) == 1 ? 2 : \
                   1050:  (n) == 2 ? 1 : \
                   1051:  (n) == 3 ? 3 : \
                   1052:  (n) == 4 ? 6 : \
                   1053:  (n) == 5 ? 7 : \
                   1054:  (n) == 6 ? 4 : \
                   1055:  (n) == 7 ? 5 : \
                   1056:  (n) + 4)
                   1057: 
                   1058: #undef DBX_REGISTER_NUMBER
                   1059: #define DBX_REGISTER_NUMBER(n) ((write_symbols == DWARF_DEBUG)         \
                   1060:                                ? DWARF_DBX_REGISTER_NUMBER(n)          \
                   1061:                                : STABS_DBX_REGISTER_NUMBER(n))

unix.superglobalmegacorp.com

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