OSDN Git Service

Fix typos in comments.
[pf3gnuchains/gcc-fork.git] / gcc / config / i860 / fx2800.h
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 (hyc@hanauma.jpl.nasa.gov).
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"