1 /* Target definitions for GNU compiler for Alliant FX/2800
4 Copyright (C) 1991 Free Software Foundation, Inc.
6 Written by Howard Chu (hyc@hanauma.jpl.nasa.gov).
8 This file is part of GNU CC.
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)
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.
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. */
26 #include "i860/sysv4.h"
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." */
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 */
41 #define TARGET_VERSION fprintf (stderr, " (i860 Alliant)");
43 /* atexit is not present prior to Concentrix 2.2. Uncomment the following
44 if you're on 2.1 or older. */
46 /* #undef HAVE_ATEXIT */
48 #define I860_STRICT_ABI_PROLOGUES
50 /* There is no avoiding this; -L does not exist at all (in Concentrix 2.2). */
51 #define LINK_LIBGCC_SPECIAL 1
53 /* Most of the Alliant-specific definitions here are to get stab info that
54 Alliant's dbx can understand. */
56 #define DBX_DEBUGGING_INFO
57 #define DEFAULT_GDB_EXTENSIONS 0
59 #define DBX_NO_EXTRA_TAGS
61 /* Alliant dbx also needs to see the function stab before anything
62 else in the function. */
64 #define DBX_FUNCTION_FIRST
65 #define DBX_LBRAC_FIRST
67 /* Alliant dbx also needs to see the end of a function somewhere. */
69 #define DBX_OUTPUT_FUNCTION_END(file,decl) \
70 fprintf (file, ".stab \"\",.,0x%x,0,0\n", N_EFUN)
72 /* Alliant dbx has predefined types, so they must be emitted with the
73 proper type numbers. The defined types are:
75 Type # C, Fortran, Pascal Types
76 -- ------------------------
79 3 int, long, integer*4, integer
84 8 double, real*8, double
85 9 single complex, complex*8, complex
86 10 double complex, doublecomplex
91 15 unsigned char, ubyte
92 16 unsigned short, uword
93 17 unsigned, unsigned int, unsigned long, ulong
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
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. */
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",""}; \
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); \
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", \
134 TREE_ASM_WRITTEN (decl) = 1; \
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",\
145 TREE_ASM_WRITTEN (decl) = 1; \
148 next_type_number = i; };
150 /* Alliant dbx doesn't understand split names... */
152 #define DBX_CONTIN_LENGTH 0
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. */
158 #define ASM_STABS_OP ".stab"
159 #define ASM_STABN_OP ".stab"
160 #define ASM_STABD_OP ".stab"
162 #define DBX_MEMPARM_STABS_LETTER 'k'
163 #define DBX_REGPARM_STABS_LETTER 'r'
165 #define ASM_OUTPUT_SOURCE_LINE(file,num) \
166 fprintf (file, "\t.stab \"\",.,0x%x,0,%d\n", \
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", \
175 #define DBX_OUTPUT_MAIN_SOURCE_DIRECTORY(file,name)
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); \
183 ASM_OUTPUT_INTERNAL_LABEL (file, "Ltext", 0)
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); \
191 #define DBX_OUTPUT_CONSTANT_SYMBOL(file,name,ival) \
192 fprintf (file, ".stab \"%s:c=i%d\",0,0x%x,0,0\n", \
195 #define DBX_FINISH_SYMBOL(decl) \
197 fprintf (asmfile, "\","); \
198 if (current_sym_addr) \
199 output_addr_const (asmfile, current_sym_addr); \
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, \
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)
213 #define DBX_OUTPUT_LBRAC(file,name) \
215 fprintf (file, ".stab \"\","); \
216 assemble_name (file, name); \
217 fprintf (file, ",0x%x,0,%d\n", N_LBRAC, depth); }
219 #define DBX_OUTPUT_RBRAC(file,name) \
221 fprintf (file, ".stab \"\","); \
222 assemble_name (file, name); \
223 fprintf (file, ",0x%x,0,%d\n", N_RBRAC, depth); }
225 #define DBX_OUTPUT_ENUM(file,type) \
226 fprintf (file, "e3"); \
228 for (tem = TYPE_VALUES (type); tem; tem = TREE_CHAIN (tem)) \
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) \
237 putc (';', asmfile); \
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. */
245 #undef DIVSI3_LIBCALL
246 #undef UDIVSI3_LIBCALL
247 #undef REMSI3_LIBCALL
248 #undef UREMSI3_LIBCALL
250 /* The Alliant compiler's mod function gives the wrong result after a
251 shift operation. This bug typically hits in hash functions. */
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
256 /* Global pointer needs to be 8 byte aligned? Link error if not... */
258 #define DATA_ALIGNMENT(dummy,align) \
259 ((TREE_PUBLIC (decl) && \
260 (TREE_CODE (TREE_TYPE (decl))==POINTER_TYPE)) ? 64:align)
262 #undef FUNCTION_PROFILER
263 #define FUNCTION_PROFILER(FILE, LABELNO) \
264 fprintf (FILE, "\tcall __mcount_\n\tnop\n")
266 /* Overrides for i860v4.h begin here */
268 /* Provide a set of pre-definitions and pre-assertions appropriate for
269 the i860 running Concentrix 2.x. */
271 #undef CPP_PREDEFINES
272 #define CPP_PREDEFINES "-Di860 -Dunix -DBSD4_3 -Dalliant -Asystem(unix) -Asystem(bsd) -Acpu(i860) -Amachine(i860)"
274 #undef I860_REG_PREFIX
275 #undef ASM_COMMENT_START
276 #define ASM_COMMENT_START "//"
278 /* Use definitions of ASM_OUTPUT_{DOUBLE,FLOAT} as given in i860.h */
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))
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
295 /* Overrides for svr4.h begin here */
299 #undef SWITCH_TAKES_ARG
300 #undef WORD_SWITCH_TAKES_ARG
303 #undef ASM_FINAL_SPEC
304 #undef MD_STARTFILE_PREFIX
305 #undef MD_EXEC_PREFIX
307 /* Generate an error message if -p option is selected. Concentrix 2.x
308 does not support prof format profiling, only gprof is supported. */
310 #define CPP_SPEC "%{p:%e-p option not supported: use -pg instead}"
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
318 "%{g*:-lg} %{!pg:-lc}%{pg:-lc_p} crtend.o%s"
320 /* Tell linker to strip local symbols, since assembler may not. */
323 #define LINK_SPEC "-X"
325 /* Get the correct startup file for regular or profiled code. Also
326 use the crtbegin.o file for C++ ... */
328 #undef STARTFILE_SPEC
329 #define STARTFILE_SPEC \
330 "%{!pg:crt0.o%s}%{pg:gcrt0.o%s} crtbegin.o%s"
332 #undef SCCS_DIRECTIVE
333 #undef NO_DOLLAR_IN_LABEL
334 #undef TARGET_MEM_FUNCTIONS
336 #undef DWARF_DEBUGGING_INFO
338 #undef ASM_OUTPUT_LABELREF
339 #define ASM_OUTPUT_LABELREF(FILE,NAME) fprintf (FILE, "_%s", NAME)
340 #undef ASM_OUTPUT_EXTERNAL_LIBCALL
343 #define BSS_ASM_OP "\t.lcomm"