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