summaryrefslogtreecommitdiffstats
path: root/gcc/config/i860/fx2800.h
blob: b12cb123742786988d740c8f05798e23a4bb02c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
/* Target definitions for GNU compiler for Alliant FX/2800
   running Concentrix 2.2
   Copyright (C) 1991, 1996, 1998, 1999, 2000 Free Software Foundation, Inc.
   Contributed by Howard Chu (hyc@hanauma.jpl.nasa.gov).

This file is part of GNU CC.

GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING.  If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */

/* The Alliant fx2800 running Concentrix 2.x is weird.  This is basically
   a BSD 4.3 based operating system, but it uses svr4 ELF format object
   files and it somehow puts BSD stabs records into the ELF files for
   symbolic debug information.  The assembler is "mostly an SVR4 assembler
   with some Alliant additions. We based it on the `Intel 80860 Assembly
   Language Specification' from AT&T." */

/* This file consists of three sections. The first section establishes
   definitions unique to the Alliant FX/2800. The next section reconciles
   differences between Alliant and i860v4.h, and the last overrides the
   remaining differences with svr4.h */

#undef TARGET_VERSION
#define TARGET_VERSION fprintf (stderr, " (i860 Alliant)");

/* atexit is not present prior to Concentrix 2.2. Uncomment the following
   if you're on 2.1 or older. */
 
/* #define NEED_ATEXIT */

#define I860_STRICT_ABI_PROLOGUES

/* There is no avoiding this; -L does not exist at all (in Concentrix 2.2).  */
#define LINK_LIBGCC_SPECIAL 1

/* Most of the Alliant-specific definitions here are to get stab info that
   Alliant's dbx can understand. */

#define DBX_DEBUGGING_INFO
#define DEFAULT_GDB_EXTENSIONS 0
#define DBX_NO_XREFS
#define DBX_NO_EXTRA_TAGS

/* Alliant dbx also needs to see the function stab before anything
   else in the function. */

#define DBX_FUNCTION_FIRST
#define DBX_LBRAC_FIRST

/* Alliant dbx also needs to see the end of a function somewhere. */

#define DBX_OUTPUT_FUNCTION_END(file,decl)	\
	fprintf (file, ".stab \"\",.,0x%x,0,0\n", N_EFUN)

/* Alliant dbx has predefined types, so they must be emitted with the
   proper type numbers. The defined types are:

     Type #	C, Fortran, Pascal Types
	--	------------------------
	 1	char, integer*1
	 2	short, 	integer*2
	 3	int, long, integer*4, integer
	 4	logical*1, byte
	 5	logical*2
	 6	logical*4, logical
	 7	float, real*4, 	real
	 8	double, real*8,	double
	 9	single complex, complex*8, complex
	10	double complex, doublecomplex
	11	character
	12	void
	13	nil
	14	boolean
	15	unsigned char, ubyte
	16	unsigned short, uword
	17	unsigned, unsigned int, unsigned long, ulong
	18	quad, logical*8
	19	long long, integer*8
	20	unsigned long long, uquad*8
    21-100	reserved for future predefined types
	100	long redefine same as 3
	101	unsigned long same as 17
	--	--------------------
	102	First user program type

   Since long and unsigned long are int references, they must be handled
   as special cases. The Alliant compiler doesn't use types 18-20, so it
   sets long & unsigned long in 18 & 19, not in 100 & 101 as shown above. */

#define DBX_OUTPUT_STANDARD_TYPES(syms)	\
{ static const char *const dtyps[] = {					\
	"", "char", "short int", "int", "logical*1",			\
	"logical*2", "logical*4", "float", "double", "complex",		\
	"doublecomplex", "character", "void", "nil", "boolean",		\
	"unsigned char", "short unsigned int", "unsigned int",		\
	"logical*8", "long long int", "long long unsigned int",""};	\
									\
  tree decl;								\
  int i;								\
									\
  for (i=1;*dtyps[i];i++)						\
    for (decl = syms; decl; decl = TREE_CHAIN(decl))			\
	if ((TREE_CODE (decl) == TYPE_DECL) && DECL_NAME(decl) &&	\
	    !strcmp(IDENTIFIER_POINTER(DECL_NAME(decl)), dtyps[i])) {	\
		TYPE_SYMTAB_ADDRESS (TREE_TYPE (decl)) = i;		\
		typevec[i] = TYPE_DEFINED;				\
		dbxout_symbol (decl, 0);				\
		break;							\
	}								\
									\
  for (decl = syms; decl; decl = TREE_CHAIN(decl))			\
    if ((TREE_CODE (decl) == TYPE_DECL) && DECL_NAME(decl) &&		\
	!strcmp(IDENTIFIER_POINTER(DECL_NAME(decl)),"long int")) {	\
      TYPE_SYMTAB_ADDRESS (TREE_TYPE (decl)) = i;			\
      typevec[i] = TYPE_DEFINED;					\
      fprintf(asmfile,".stab \"long int:t%d=3\",0,0x%x,0,0\n",		\
		i++,N_LSYM);						\
      TREE_ASM_WRITTEN (decl) = 1;					\
      break;								\
    }									\
									\
  for (decl = syms; decl; decl = TREE_CHAIN(decl))			\
    if ((TREE_CODE (decl) == TYPE_DECL) && DECL_NAME(decl) && !strcmp(	\
	IDENTIFIER_POINTER(DECL_NAME(decl)),"long unsigned int")) {	\
      TYPE_SYMTAB_ADDRESS (TREE_TYPE (decl)) = i;			\
      typevec[i] = TYPE_DEFINED;					\
      fprintf(asmfile,".stab \"long unsigned int:t%d=17\",0,0x%x,0,0\n",\
		i++,N_LSYM);						\
      TREE_ASM_WRITTEN (decl) = 1;					\
      break;								\
    }									\
  next_type_number = i; };

/* Alliant dbx doesn't understand split names... */

#define DBX_CONTIN_LENGTH 0

/* The syntax for stabs records is also different; there is only a single
   ".stab" directive instead of the 3 directives in BSD, and the order of
   arguments is slightly changed. */

#define ASM_STABS_OP	"\t.stab "
#define ASM_STABN_OP	"\t.stab "
#define ASM_STABD_OP	"\t.stab "

#define DBX_MEMPARM_STABS_LETTER 'k'
#define DBX_REGPARM_STABS_LETTER 'r'

#undef  ASM_OUTPUT_SOURCE_LINE
#define ASM_OUTPUT_SOURCE_LINE(file,num)		\
	fprintf (file, "\t.stab \"\",.,0x%x,0,%d\n",	\
		N_SLINE,num)

#if 0	/* Alliant dbx only reads first N_SO, so it
	   ignores the filename if dir is present. */
#define DBX_OUTPUT_MAIN_SOURCE_DIRECTORY(file,name)		\
	fprintf (file, ".stab \"%s/\",.Ltext0,0x%x,0,0\n",	\
		name, N_SO)
#else
#define DBX_OUTPUT_MAIN_SOURCE_DIRECTORY(file,name)
#endif

#define DBX_OUTPUT_MAIN_SOURCE_FILENAME(file,name)		\
	fprintf (file, ".stab ");				\
	output_quoted_string (file, name);			\
	fprintf (file, ",.Ltext0,0x%x,0,0\n", N_SO);		\
	text_section ();					\
	ASM_OUTPUT_INTERNAL_LABEL (file, "Ltext", 0)

#define DBX_OUTPUT_SOURCE_FILENAME(file,name)			\
  do {	fprintf (file, ".stab ");				\
	output_quoted_string (file, name);			\
	fprintf (file, ",.Ltext0,0x%x,0,0\n", N_SOL);		\
  } while (0)

#define DBX_OUTPUT_CONSTANT_SYMBOL(file,name,ival)		\
	fprintf (file, ".stab \"%s:c=i%d\",0,0x%x,0,0\n",	\
		name, ival, N_LSYM)

#define DBX_FINISH_SYMBOL(decl)	\
	int line = 0;						\
	fprintf (asmfile, "\",");				\
	if (current_sym_addr)					\
	  output_addr_const (asmfile, current_sym_addr);	\
	else							\
	  fprintf (asmfile, "%d", current_sym_value);		\
	if (decl != 0 && TREE_CODE(decl) == FUNCTION_DECL)	\
	  line=DECL_SOURCE_LINE (decl);				\
	fprintf (asmfile, ",0x%x,%d,%d\n", current_sym_code,	\
	  line!=0?64:0,line)

#define DBX_OUTPUT_CATCH(file,decl,name)		\
  fprintf (file, ".stab \"%s:C1\",",			\
	   IDENTIFIER_POINTER (DECL_NAME (decl)));	\
  assemble_name (file, name);				\
  fprintf (file, ",0x%x,0,0\n", N_CATCH)

#define DBX_OUTPUT_LBRAC(file,name)	\
  if (depth > 1) {			\
    fprintf (file, ".stab \"\",");	\
    assemble_name (file, name);		\
    fprintf (file, ",0x%x,0,%d\n", N_LBRAC, depth); }

#define DBX_OUTPUT_RBRAC(file,name)	\
  if (depth > 1) {			\
    fprintf (file, ".stab \"\",");	\
    assemble_name (file, name);		\
    fprintf (file, ",0x%x,0,%d\n", N_RBRAC, depth); }

#define DBX_OUTPUT_ENUM(file,type)				\
  fprintf (file, "e3");						\
  CHARS(2);							\
  for (tem = TYPE_VALUES (type); tem; tem = TREE_CHAIN (tem))	\
    {								\
      fprintf (asmfile, "%s:%d,",				\
	       IDENTIFIER_POINTER (TREE_PURPOSE (tem)),		\
	       TREE_INT_CST_LOW (TREE_VALUE (tem)));		\
      CHARS (11 + IDENTIFIER_LENGTH (TREE_PURPOSE (tem)));	\
      if (TREE_CHAIN (tem) != 0)				\
	CONTIN;							\
    }								\
  putc (';', asmfile);						\
  CHARS (1);

/* Undefine some things defined in i860.h because the native C compiler
   on the FX/2800 emits code to do these operations inline.  For GCC,
   we will use the default implementation of these things... i.e.
   generating calls to libgcc routines.  */

#undef DIVSI3_LIBCALL
#undef UDIVSI3_LIBCALL
#undef REMSI3_LIBCALL
#undef UREMSI3_LIBCALL

/* Global pointer needs to be 8 byte aligned? Link error if not... */

#define DATA_ALIGNMENT(dummy,align)	\
	((TREE_PUBLIC (decl) &&	\
	 (POINTER_TYPE_P (TREE_TYPE (decl)))) ? 64: align)

#undef FUNCTION_PROFILER
#define FUNCTION_PROFILER(FILE, LABELNO)	\
	fprintf (FILE, "\tcall __mcount_\n\tnop\n")

/* Overrides for i860v4.h begin here */

/* Provide a set of pre-definitions and pre-assertions appropriate for
   the i860 running Concentrix 2.x.  */

#undef CPP_PREDEFINES 
#define CPP_PREDEFINES "-Di860 -Dunix -DBSD4_3 -Dalliant -Asystem=unix -Asystem=bsd -Acpu=i860 -Amachine=i860"

#undef I860_REG_PREFIX
#undef ASM_COMMENT_START
#define ASM_COMMENT_START "//"

/* Use definitions of ASM_OUTPUT_{DOUBLE,FLOAT} as given in i860.h */

#undef ASM_OUTPUT_DOUBLE
#define ASM_OUTPUT_DOUBLE(FILE,VALUE) \
  fprintf(FILE, "\t.double %.20e\n", (VALUE))
#undef ASM_OUTPUT_FLOAT
#define ASM_OUTPUT_FLOAT(FILE,VALUE) \
  fprintf(FILE, "\t.float %.12e\n", (VALUE))

#undef ASM_FILE_START
#define ASM_FILE_START(FILE)
#undef ASM_OUTPUT_FUNCTION_PREFIX
#define ASM_OUTPUT_FUNCTION_PREFIX(FILE,NAME) \
  fputs("\tnop\n", (FILE));			\
  current_function_original_name = (NAME)
#undef ASM_OUTPUT_PROLOGUE_SUFFIX

/* Overrides for svr4.h begin here */

#undef SWITCH_TAKES_ARG
#undef WORD_SWITCH_TAKES_ARG

#undef ASM_SPEC
#undef ASM_FINAL_SPEC
#undef MD_STARTFILE_PREFIX
#undef MD_EXEC_PREFIX

/* Generate an error message if -p option is selected. Concentrix 2.x
   does not support prof format profiling, only gprof is supported. */

#define CPP_SPEC	"%{p:%e-p option not supported: use -pg instead}"

/* Provide an appropriate LIB_SPEC. The crtend.o file provides part of the
   support for getting C++ file-scope static objects constructed before
   entering `main'. */

#undef LIB_SPEC
#define LIB_SPEC \
	"%{g*:-lg} %{!pg:-lc}%{pg:-lc_p} crtend.o%s"

/* Tell linker to strip local symbols, since assembler may not. */

#undef LINK_SPEC
#define LINK_SPEC	"-X"

/* Get the correct startup file for regular or profiled code. Also
   use the crtbegin.o file for C++ ... */

#undef STARTFILE_SPEC
#define STARTFILE_SPEC \
	"%{!pg:crt0.o%s}%{pg:gcrt0.o%s} crtbegin.o%s"

#undef SCCS_DIRECTIVE
#undef NO_DOLLAR_IN_LABEL
#undef TARGET_MEM_FUNCTIONS

#undef DWARF_DEBUGGING_INFO

/* The prefix to add to user-visible assembler symbols. */

#undef USER_LABEL_PREFIX
#define USER_LABEL_PREFIX "_"

#undef ASM_OUTPUT_EXTERNAL_LIBCALL

/* ??? Is this used anywhere?  */
#undef BSS_ASM_OP
#define BSS_ASM_OP	"\t.lcomm "

#undef ASM_FILE_END
#define ASM_FILE_END(FILE)					\
do {				 				\
     if (current_function_original_name != NULL) {		\
       const char *long_op = integer_asm_op (4, FALSE);		\
       tdesc_section();						\
       fprintf ((FILE), "%s __ETEXT\n", long_op);		\
       fprintf ((FILE), "%s 0\n", long_op);			\
       fputs ("\t.long\t__ETEXT\n", (FILE));			\
       fputs ("\t.long\t0\n", (FILE));				\
       text_section();						\
       fputs("__ETEXT:\n", (FILE));				\
     }								\
     if (!flag_no_ident)					\
	fprintf ((FILE), "\t.ident\t\"GCC: (GNU) %s\"\n",	\
		 version_string);				\
   } while (0)
OpenPOWER on IntegriCloud