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