|
|
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 "); \ ! 180: output_quoted_string (file, name); \ ! 181: fprintf (file, ",.Ltext0,0x%x,0,0\n", N_SO); \ ! 182: text_section (); \ ! 183: ASM_OUTPUT_INTERNAL_LABEL (file, "Ltext", 0) ! 184: ! 185: #define DBX_OUTPUT_SOURCE_FILENAME(file,name) \ ! 186: do { fprintf (file, ".stab "); \ ! 187: output_quoted_string (file, name); \ ! 188: fprintf (file, ",.Ltext0,0x%x,0,0\n", N_SOL); \ ! 189: } while (0) ! 190: ! 191: #define DBX_OUTPUT_CONSTANT_SYMBOL(file,name,ival) \ ! 192: fprintf (file, ".stab \"%s:c=i%d\",0,0x%x,0,0\n", \ ! 193: name, ival, N_LSYM) ! 194: ! 195: #define DBX_FINISH_SYMBOL(decl) \ ! 196: int line = 0; \ ! 197: fprintf (asmfile, "\","); \ ! 198: if (current_sym_addr) \ ! 199: output_addr_const (asmfile, current_sym_addr); \ ! 200: else \ ! 201: fprintf (asmfile, "%d", current_sym_value); \ ! 202: if (decl != 0 && TREE_CODE(decl) == FUNCTION_DECL) \ ! 203: line=DECL_SOURCE_LINE (decl); \ ! 204: fprintf (asmfile, ",0x%x,%d,%d\n", current_sym_code, \ ! 205: line!=0?64:0,line) ! 206: ! 207: #define DBX_OUTPUT_CATCH(file,decl,name) \ ! 208: fprintf (file, ".stab \"%s:C1\",", \ ! 209: IDENTIFIER_POINTER (DECL_NAME (decl))); \ ! 210: assemble_name (file, name); \ ! 211: fprintf (file, ",0x%x,0,0\n", N_CATCH) ! 212: ! 213: #define DBX_OUTPUT_LBRAC(file,name) \ ! 214: if (depth > 1) { \ ! 215: fprintf (file, ".stab \"\","); \ ! 216: assemble_name (file, name); \ ! 217: fprintf (file, ",0x%x,0,%d\n", N_LBRAC, depth); } ! 218: ! 219: #define DBX_OUTPUT_RBRAC(file,name) \ ! 220: if (depth > 1) { \ ! 221: fprintf (file, ".stab \"\","); \ ! 222: assemble_name (file, name); \ ! 223: fprintf (file, ",0x%x,0,%d\n", N_RBRAC, depth); } ! 224: ! 225: #define DBX_OUTPUT_ENUM(file,type) \ ! 226: fprintf (file, "e3"); \ ! 227: CHARS(2); \ ! 228: for (tem = TYPE_VALUES (type); tem; tem = TREE_CHAIN (tem)) \ ! 229: { \ ! 230: fprintf (asmfile, "%s:%d,", \ ! 231: IDENTIFIER_POINTER (TREE_PURPOSE (tem)), \ ! 232: TREE_INT_CST_LOW (TREE_VALUE (tem))); \ ! 233: CHARS (11 + IDENTIFIER_LENGTH (TREE_PURPOSE (tem))); \ ! 234: if (TREE_CHAIN (tem) != 0) \ ! 235: CONTIN; \ ! 236: } \ ! 237: putc (';', asmfile); \ ! 238: CHARS (1); ! 239: ! 240: /* Undefine some things defined in i860.h because the native C compiler ! 241: on the FX/2800 emits code to do these operations inline. For GCC, ! 242: we will use the default implementation of these things... i.e. ! 243: generating calls to libgcc1 routines. */ ! 244: ! 245: #undef DIVSI3_LIBCALL ! 246: #undef UDIVSI3_LIBCALL ! 247: #undef REMSI3_LIBCALL ! 248: #undef UREMSI3_LIBCALL ! 249: ! 250: /* The Alliant compiler's mod function gives the wrong result after a ! 251: shift operation. This bug typically hits in hash functions. */ ! 252: ! 253: #define perform_umodsi3(a, b) a %= b; if (a == b) a=0; return a ! 254: #define perform_modsi3(a, b) a %= b; if (a == b) a=0; return a ! 255: ! 256: /* Global pointer needs to be 8 byte aligned? Link error if not... */ ! 257: ! 258: #define DATA_ALIGNMENT(dummy,align) \ ! 259: ((TREE_PUBLIC (decl) && \ ! 260: (TREE_CODE (TREE_TYPE (decl))==POINTER_TYPE)) ? 64:align) ! 261: ! 262: #undef FUNCTION_PROFILER ! 263: #define FUNCTION_PROFILER(FILE, LABELNO) \ ! 264: fprintf (FILE, "\tcall __mcount_\n\tnop\n") ! 265: ! 266: /* Overrides for i860v4.h begin here */ ! 267: ! 268: /* Provide a set of pre-definitions and pre-assertions appropriate for ! 269: the i860 running Concentrix 2.x. */ ! 270: ! 271: #undef CPP_PREDEFINES ! 272: #define CPP_PREDEFINES "-Di860 -Dunix -DBSD4_3 -Dalliant -Asystem(unix) -Asystem(bsd) -Acpu(i860) -Amachine(i860)" ! 273: ! 274: #undef I860_REG_PREFIX ! 275: #undef ASM_COMMENT_START ! 276: #define ASM_COMMENT_START "//" ! 277: ! 278: /* Use definitions of ASM_OUTPUT_{DOUBLE,FLOAT} as given in i860.h */ ! 279: ! 280: #undef ASM_OUTPUT_DOUBLE ! 281: #define ASM_OUTPUT_DOUBLE(FILE,VALUE) \ ! 282: fprintf(FILE, "\t.double %.20e\n", (VALUE)) ! 283: #undef ASM_OUTPUT_FLOAT ! 284: #define ASM_OUTPUT_FLOAT(FILE,VALUE) \ ! 285: fprintf(FILE, "\t.float %.12e\n", (VALUE)) ! 286: ! 287: #undef ASM_FILE_START ! 288: #define ASM_FILE_START(FILE) ! 289: #undef ASM_OUTPUT_FUNCTION_PREFIX ! 290: #define ASM_OUTPUT_FUNCTION_PREFIX(FILE,NAME) \ ! 291: fputs("\tnop\n", (FILE)); \ ! 292: current_function_original_name = (NAME) ! 293: #undef ASM_OUTPUT_PROLOGUE_SUFFIX ! 294: ! 295: /* Overrides for svr4.h begin here */ ! 296: ! 297: #undef SVR4 ! 298: ! 299: #undef SWITCH_TAKES_ARG ! 300: #undef WORD_SWITCH_TAKES_ARG ! 301: ! 302: #undef ASM_SPEC ! 303: #undef ASM_FINAL_SPEC ! 304: #undef MD_STARTFILE_PREFIX ! 305: #undef MD_EXEC_PREFIX ! 306: ! 307: /* Generate an error message if -p option is selected. Concentrix 2.x ! 308: does not support prof format profiling, only gprof is supported. */ ! 309: ! 310: #define CPP_SPEC "%{p:%e-p option not supported: use -pg instead}" ! 311: ! 312: /* Provide an appropriate LIB_SPEC. The crtend.o file provides part of the ! 313: support for getting C++ file-scope static objects constructed before ! 314: entering `main'. */ ! 315: ! 316: #undef LIB_SPEC ! 317: #define LIB_SPEC \ ! 318: "%{g*:-lg} %{!pg:-lc}%{pg:-lc_p} crtend.o%s" ! 319: ! 320: /* Tell linker to strip local symbols, since assembler may not. */ ! 321: ! 322: #undef LINK_SPEC ! 323: #define LINK_SPEC "-X" ! 324: ! 325: /* Get the correct startup file for regular or profiled code. Also ! 326: use the crtbegin.o file for C++ ... */ ! 327: ! 328: #undef STARTFILE_SPEC ! 329: #define STARTFILE_SPEC \ ! 330: "%{!pg:crt0.o%s}%{pg:gcrt0.o%s} crtbegin.o%s" ! 331: ! 332: #undef SCCS_DIRECTIVE ! 333: #undef NO_DOLLAR_IN_LABEL ! 334: #undef TARGET_MEM_FUNCTIONS ! 335: ! 336: #undef DWARF_DEBUGGING_INFO ! 337: ! 338: #undef ASM_OUTPUT_LABELREF ! 339: #define ASM_OUTPUT_LABELREF(FILE,NAME) fprintf (FILE, "_%s", NAME) ! 340: #undef ASM_OUTPUT_EXTERNAL_LIBCALL ! 341: ! 342: #undef BSS_ASM_OP ! 343: #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.