Annotation of gcc/config/fx2800.h, revision 1.1.1.2

1.1.1.2 ! root        1: /* Target definitions for GNU compiler for Alliant FX/2800
        !             2:    running Concentrix 2.2
        !             3: 
1.1       root        4:    Copyright (C) 1991 Free Software Foundation, Inc.
                      5: 
1.1.1.2 ! root        6:    Written by Howard Chu ([email protected]).
1.1       root        7: 
                      8: This file is part of GNU CC.
                      9: 
                     10: GNU CC is free software; you can redistribute it and/or modify
                     11: it under the terms of the GNU General Public License as published by
                     12: the Free Software Foundation; either version 2, or (at your option)
                     13: any later version.
                     14: 
                     15: GNU CC is distributed in the hope that it will be useful,
                     16: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: GNU General Public License for more details.
                     19: 
                     20: You should have received a copy of the GNU General Public License
                     21: along with GNU CC; see the file COPYING.  If not, write to
                     22: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     23: 
1.1.1.2 ! root       24: #define OUTPUT_TDESC
1.1       root       25: 
                     26: #include "i860v4.h"
                     27: 
1.1.1.2 ! root       28: /* The Alliant fx2800 running Concentrix 2.x is weird.  This is basically
        !            29:    a BSD 4.3 based operating system, but it uses svr4 ELF format object
        !            30:    files and it somehow puts BSD stabs records into the ELF files for
        !            31:    symbolic debug information.  The assembler is "mostly an SVR4 assembler
        !            32:    with some Alliant additions. We based it on the `Intel 80860 Assembly
        !            33:    Language Specification' from AT&T." */
        !            34: 
        !            35: /* This file consists of three sections. The first section establishes
        !            36:    definitions unique to the Alliant FX/2800. The next section reconciles
        !            37:    differences between Alliant and i860v4.h, and the last overrides the
        !            38:    remaining differences with svr4.h */
        !            39: 
        !            40: #undef TARGET_VERSION
        !            41: #define TARGET_VERSION fprintf (stderr, " (i860 Alliant)");
        !            42: 
        !            43: /* atexit is not present prior to Concentrix 2.2. Uncomment the following
        !            44:    if you're on 2.1 or older. */
        !            45:  
        !            46: /* #undef HAVE_ATEXIT */
1.1       root       47: 
1.1.1.2 ! root       48: #define I860_STRICT_ABI_PROLOGUES
1.1       root       49: 
1.1.1.2 ! root       50: /* Most of the Alliant-specific definitions here are to get stab info that
        !            51:    Alliant's dbx can understand. */
        !            52: 
        !            53: #define DBX_DEBUGGING_INFO
        !            54: #define DEFAULT_GDB_EXTENSIONS 0
        !            55: #define DBX_NO_XREFS
        !            56: #define DBX_NO_EXTRA_TAGS
        !            57: 
        !            58: /* Alliant dbx also needs to see the function stab before anything
        !            59:    else in the function. */
        !            60: 
        !            61: #define DBX_FUNCTION_FIRST
        !            62: #define DBX_LBRAC_FIRST
        !            63: 
        !            64: /* Alliant dbx also needs to see the end of a function somewhere. */
        !            65: 
        !            66: #define DBX_OUTPUT_FUNCTION_END(file,decl)     \
        !            67:        fprintf (file, ".stab \"\",.,0x%x,0,0\n", N_EFUN)
        !            68: 
        !            69: /* Alliant dbx has predefined types, so they must be emitted with the
        !            70:    proper type numbers. The defined types are:
        !            71: 
        !            72:      Type #    C, Fortran, Pascal Types
        !            73:        --      ------------------------
        !            74:         1      char, integer*1
        !            75:         2      short,  integer*2
        !            76:         3      int, long, integer*4, integer
        !            77:         4      logical*1, byte
        !            78:         5      logical*2
        !            79:         6      logical*4, logical
        !            80:         7      float, real*4,  real
        !            81:         8      double, real*8, double
        !            82:         9      single complex, complex*8, complex
        !            83:        10      double complex, doublecomplex
        !            84:        11      character
        !            85:        12      void
        !            86:        13      nil
        !            87:        14      boolean
        !            88:        15      unsigned char, ubyte
        !            89:        16      unsigned short, uword
        !            90:        17      unsigned, unsigned int, unsigned long, ulong
        !            91:        18      quad, logical*8
        !            92:        19      long long, integer*8
        !            93:        20      unsigned long long, uquad*8
        !            94:     21-100     reserved for future predefined types
        !            95:        100     long redefine same as 3
        !            96:        101     unsigned long same as 17
        !            97:        --      --------------------
        !            98:        102     First user program type
        !            99: 
        !           100:    Since long and unsigned long are int references, they must be handled
        !           101:    as special cases. The Alliant compiler doesn't use types 18-20, so it
        !           102:    sets long & unsigned long in 18 & 19, not in 100 & 101 as shown above. */
        !           103: 
        !           104: #define DBX_OUTPUT_STANDARD_TYPES(syms)        \
        !           105: { char *dtyps[]={"", "char", "short int", "int", "logical*1",          \
        !           106:        "logical*2", "logical*4", "float", "double", "complex",         \
        !           107:        "doublecomplex", "character", "void", "nil", "boolean",         \
        !           108:        "unsigned char", "short unsigned int", "unsigned int",          \
        !           109:        "logical*8", "long long int", "long long unsigned int",""};     \
        !           110:                                                                        \
        !           111:   tree decl;                                                           \
        !           112:   int i;                                                               \
        !           113:                                                                        \
        !           114:   for (i=1;*dtyps[i];i++)                                              \
        !           115:     for (decl = syms; decl; decl = TREE_CHAIN(decl))                   \
        !           116:        if ((TREE_CODE (decl) == TYPE_DECL) &&                          \
        !           117:            !strcmp(IDENTIFIER_POINTER(DECL_NAME(decl)), dtyps[i])) {   \
        !           118:                TYPE_SYMTAB_ADDRESS (TREE_TYPE (decl)) = i;             \
        !           119:                typevec[i] = TYPE_DEFINED;                              \
        !           120:                dbxout_symbol (decl, 0);                                \
        !           121:                break;                                                  \
        !           122:        }                                                               \
        !           123:                                                                        \
        !           124:   for (decl = syms; decl; decl = TREE_CHAIN(decl))                     \
        !           125:     if ((TREE_CODE (decl) == TYPE_DECL) &&                             \
        !           126:        !strcmp(IDENTIFIER_POINTER(DECL_NAME(decl)),"long int")) {      \
        !           127:       TYPE_SYMTAB_ADDRESS (TREE_TYPE (decl)) = i;                      \
        !           128:       typevec[i] = TYPE_DEFINED;                                       \
        !           129:       fprintf(asmfile,".stab \"long int:t%d=3\",0,0x%x,0,0\n",         \
        !           130:                i++,N_LSYM);                                            \
        !           131:       TREE_ASM_WRITTEN (decl) = 1;                                     \
        !           132:       break;                                                           \
        !           133:     }                                                                  \
        !           134:                                                                        \
        !           135:   for (decl = syms; decl; decl = TREE_CHAIN(decl))                     \
        !           136:     if ((TREE_CODE (decl) == TYPE_DECL) && !strcmp(                    \
        !           137:        IDENTIFIER_POINTER(DECL_NAME(decl)),"long unsigned int")) {     \
        !           138:       TYPE_SYMTAB_ADDRESS (TREE_TYPE (decl)) = i;                      \
        !           139:       typevec[i] = TYPE_DEFINED;                                       \
        !           140:       fprintf(asmfile,".stab \"long unsigned int:t%d=17\",0,0x%x,0,0\n",\
        !           141:                i++,N_LSYM);                                            \
        !           142:       TREE_ASM_WRITTEN (decl) = 1;                                     \
        !           143:       break;                                                           \
        !           144:     }                                                                  \
        !           145:   next_type_number = i; };
        !           146: 
        !           147: /* Alliant dbx doesn't understand split names... */
        !           148: 
        !           149: #define DBX_CONTIN_LENGTH 0
        !           150: 
        !           151: /* The syntax for stabs records is also different; there is only a single
        !           152:    ".stab" directive instead of the 3 directives in BSD, and the order of
        !           153:    arguments is slightly changed. */
        !           154: 
        !           155: #define ASM_STABS_OP   ".stab"
        !           156: #define ASM_STABN_OP   ".stab"
        !           157: #define ASM_STABD_OP   ".stab"
        !           158: 
        !           159: #define DBX_MEMPARM_STABS_LETTER 'k'
        !           160: #define DBX_REGPARM_STABS_LETTER 'r'
        !           161: 
        !           162: #define ASM_OUTPUT_SOURCE_LINE(file,num)               \
        !           163:        fprintf (file, "\t.stab \"\",.,0x%x,0,%d\n",    \
        !           164:                N_SLINE,num)
        !           165: 
        !           166: #if 0  /* Alliant dbx only reads first N_SO, so it
        !           167:           ignores the filename if dir is present. */
        !           168: #define DBX_OUTPUT_MAIN_SOURCE_DIRECTORY(file,name)            \
        !           169:        fprintf (file, ".stab \"%s/\",.Ltext0,0x%x,0,0\n",      \
        !           170:                name, N_SO)
        !           171: #else
        !           172: #define DBX_OUTPUT_MAIN_SOURCE_DIRECTORY(file,name)
        !           173: #endif
        !           174: 
        !           175: #define DBX_OUTPUT_MAIN_SOURCE_FILENAME(file,name)             \
        !           176:        fprintf (file, ".stab \"%s\",.Ltext0,0x%x,0,0\n",       \
        !           177:                name, N_SO);                                    \
        !           178:        text_section ();                                        \
        !           179:        ASM_OUTPUT_INTERNAL_LABEL (file, "Ltext", 0)
        !           180: 
        !           181: #define DBX_OUTPUT_SOURCE_FILENAME(file,name)                  \
        !           182:        fprintf (file, ".stab \"%s\",.Ltext0,0x%x,0,0\n",       \
        !           183:                name, N_SOL);
        !           184: 
        !           185: #define DBX_OUTPUT_CONSTANT_SYMBOL(file,name,ival)             \
        !           186:        fprintf (file, ".stab \"%s:c=i%d\",0,0x%x,0,0\n",       \
        !           187:                name, ival, N_LSYM)
        !           188: 
        !           189: #define DBX_FINISH_SYMBOL(decl)        \
        !           190:        int line = 0;                                           \
        !           191:        fprintf (asmfile, "\",");                               \
        !           192:        if (current_sym_addr)                                   \
        !           193:          output_addr_const (asmfile, current_sym_addr);        \
        !           194:        else                                                    \
        !           195:          fprintf (asmfile, "%d", current_sym_value);           \
        !           196:        if (decl != 0 && TREE_CODE(decl) == FUNCTION_DECL)      \
        !           197:          line=DECL_SOURCE_LINE (decl);                         \
        !           198:        fprintf (asmfile, ",0x%x,%d,%d\n", current_sym_code,    \
        !           199:          line!=0?64:0,line)
        !           200: 
        !           201: #define DBX_OUTPUT_CATCH(file,decl,name)               \
        !           202:   fprintf (file, ".stab \"%s:C1\",",                   \
        !           203:           IDENTIFIER_POINTER (DECL_NAME (decl)));      \
        !           204:   assemble_name (file, name);                          \
        !           205:   fprintf (file, ",0x%x,0,0\n", N_CATCH)
        !           206: 
        !           207: #define DBX_OUTPUT_LBRAC(file,name)    \
        !           208:   if (depth > 1) {                     \
        !           209:     fprintf (file, ".stab \"\",");     \
        !           210:     assemble_name (file, name);                \
        !           211:     fprintf (file, ",0x%x,0,%d\n", N_LBRAC, depth); }
        !           212: 
        !           213: #define DBX_OUTPUT_RBRAC(file,name)    \
        !           214:   if (depth > 1) {                     \
        !           215:     fprintf (file, ".stab \"\",");     \
        !           216:     assemble_name (file, name);                \
        !           217:     fprintf (file, ",0x%x,0,%d\n", N_RBRAC, depth); }
        !           218: 
        !           219: #define DBX_OUTPUT_ENUM(file,type)                             \
        !           220:   fprintf (file, "e3");                                                \
        !           221:   CHARS(2);                                                    \
        !           222:   for (tem = TYPE_VALUES (type); tem; tem = TREE_CHAIN (tem))  \
        !           223:     {                                                          \
        !           224:       fprintf (asmfile, "%s:%d,",                              \
        !           225:               IDENTIFIER_POINTER (TREE_PURPOSE (tem)),         \
        !           226:               TREE_INT_CST_LOW (TREE_VALUE (tem)));            \
        !           227:       CHARS (11 + IDENTIFIER_LENGTH (TREE_PURPOSE (tem)));     \
        !           228:       if (TREE_CHAIN (tem) != 0)                               \
        !           229:        CONTIN;                                                 \
        !           230:     }                                                          \
        !           231:   putc (';', asmfile);                                         \
        !           232:   CHARS (1);
1.1       root      233: 
                    234: /* Undefine some things defined in i860.h because the native C compiler
                    235:    on the FX/2800 emits code to do these operations inline.  For GCC,
                    236:    we will use the default implementation of these things... i.e.
1.1.1.2 ! root      237:    generating calls to libgcc1 routines.  */
1.1       root      238: 
                    239: #undef DIVSI3_LIBCALL
                    240: #undef UDIVSI3_LIBCALL
                    241: #undef REMSI3_LIBCALL
                    242: #undef UREMSI3_LIBCALL
1.1.1.2 ! root      243: 
        !           244: /* The Alliant compiler's mod function gives the wrong result after a
        !           245:    shift operation. This bug typically hits in hash functions. */
        !           246: 
        !           247: #define perform_umodsi3(a, b)  a %= b; if (a == b) a=0; return a
        !           248: #define perform_modsi3(a, b)   a %= b; if (a == b) a=0; return a
        !           249: 
        !           250: /* Global pointer needs to be 8 byte aligned? Link error if not... */
        !           251: 
        !           252: #define DATA_ALIGNMENT(dummy,align)    \
        !           253:        ((TREE_PUBLIC (decl) && \
        !           254:         (TREE_CODE (TREE_TYPE (decl))==POINTER_TYPE)) ? 64:align)
        !           255: 
        !           256: #undef FUNCTION_PROFILER
        !           257: #define FUNCTION_PROFILER(FILE, LABELNO)       \
        !           258:        fprintf (FILE, "\tcall __mcount_\n\tnop\n")
        !           259: 
        !           260: /* Overrides for i860v4.h begin here */
        !           261: 
        !           262: /* Provide a set of pre-definitions and pre-assertions appropriate for
        !           263:    the i860 running Concentrix 2.x.  */
        !           264: 
        !           265: #undef CPP_PREDEFINES 
        !           266: #define CPP_PREDEFINES "-Di860 -Dunix -DBSD4_3 -Dalliant -Asystem(unix) -Acpu(i860) -Amachine(i860)"
        !           267: 
        !           268: #undef I860_REG_PREFIX
        !           269: #undef ASM_COMMENT_START
        !           270: #define ASM_COMMENT_START "//"
        !           271: 
        !           272: /* Use definitions of ASM_OUTPUT_{DOUBLE,FLOAT} as given in i860.h */
        !           273: 
        !           274: #undef ASM_OUTPUT_DOUBLE
        !           275: #define ASM_OUTPUT_DOUBLE(FILE,VALUE) \
        !           276:   fprintf(FILE, "\t.double %.20e\n", (VALUE))
        !           277: #undef ASM_OUTPUT_FLOAT
        !           278: #define ASM_OUTPUT_FLOAT(FILE,VALUE) \
        !           279:   fprintf(FILE, "\t.float %.12e\n", (VALUE))
        !           280: 
        !           281: #undef ASM_FILE_START
        !           282: #define ASM_FILE_START(FILE)
        !           283: #undef ASM_OUTPUT_FUNCTION_PREFIX
        !           284: #define ASM_OUTPUT_FUNCTION_PREFIX(FILE,NAME) \
        !           285:   fputs("\tnop\n", (FILE));                    \
        !           286:   current_function_original_name = (NAME)
        !           287: #undef ASM_OUTPUT_PROLOGUE_SUFFIX
        !           288: 
        !           289: /* Overrides for svr4.h begin here */
        !           290: 
        !           291: #undef SVR4
        !           292: 
        !           293: #undef SWITCH_TAKES_ARG
        !           294: #undef WORD_SWITCH_TAKES_ARG
        !           295: 
        !           296: #undef ASM_SPEC
        !           297: #undef ASM_FINAL_SPEC
        !           298: #undef MD_STARTFILE_PREFIX
        !           299: #undef MD_EXEC_PREFIX
        !           300: 
        !           301: /* Generate an error message if -p option is selected. Concentrix 2.x
        !           302:    does not support prof format profiling, only gprof is supported. */
        !           303: 
        !           304: #define CPP_SPEC       "%{p:%e-p option not supported: use -pg instead}"
        !           305: 
        !           306: /* Provide an appropriate LIB_SPEC. The crtend.o file provides part of the
        !           307:    support for getting C++ file-scope static objects constructed before
        !           308:    entering `main'. */
        !           309: 
        !           310: #undef LIB_SPEC
        !           311: #define LIB_SPEC \
        !           312:        "%{g*:-lg} %{!pg:-lc}%{pg:-lc_p} crtend.o%s"
        !           313: 
        !           314: /* Tell linker to strip local symbols, since assembler may not. */
        !           315: 
        !           316: #undef LINK_SPEC
        !           317: #define LINK_SPEC      "-X"
        !           318: 
        !           319: /* Get the correct startup file for regular or profiled code. Also
        !           320:    use the crtbegin.o file for C++ ... */
        !           321: 
        !           322: #undef STARTFILE_SPEC
        !           323: #define STARTFILE_SPEC \
        !           324:        "%{!pg:crt0.o%s}%{pg:gcrt0.o%s} crtbegin.o%s"
        !           325: 
        !           326: #undef SCCS_DIRECTIVE
        !           327: #undef NO_DOLLAR_IN_LABEL
        !           328: #undef TARGET_MEM_FUNCTIONS
        !           329: 
        !           330: #undef DWARF_DEBUGGING_INFO
        !           331: 
        !           332: #undef ASM_OUTPUT_LABELREF
        !           333: #define ASM_OUTPUT_LABELREF(FILE,NAME) fprintf (FILE, "_%s", NAME)
        !           334: #undef ASM_OUTPUT_EXTERNAL_LIBCALL
        !           335: 
        !           336: #undef BSS_ASM_OP
        !           337: #define BSS_ASM_OP     "\t.lcomm"

unix.superglobalmegacorp.com

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