sco5.h revision 117395
1/* Definitions for Intel 386 running SCO Unix System V 3.2 Version 5.
2   Copyright (C) 1992, 1995, 1996, 1997, 1998, 1999, 2000, 2002
3   Free Software Foundation, Inc.
4   Contributed by Kean Johnston (hug@netcom.com)
5
6This file is part of GNU CC.
7
8GNU CC is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 2, or (at your option)
11any later version.
12
13GNU CC is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with GNU CC; see the file COPYING.  If not, write to
20the Free Software Foundation, 59 Temple Place - Suite 330,
21Boston, MA 02111-1307, USA.  */
22
23#define TARGET_VERSION fprintf (stderr, " (i386, SCO OpenServer 5 Syntax)");
24
25#undef LPREFIX
26#define LPREFIX				".L"
27
28#undef ALIGN_ASM_OP
29#define ALIGN_ASM_OP			"\t.align\t"
30
31#undef ASCII_DATA_ASM_OP
32#define ASCII_DATA_ASM_OP		"\t.ascii\t"
33
34#undef IDENT_ASM_OP
35#define IDENT_ASM_OP			"\t.ident\t"
36
37#undef COMMON_ASM_OP
38#define COMMON_ASM_OP			"\t.comm\t"
39
40#undef SET_ASM_OP
41#define SET_ASM_OP			"\t.set\t"
42
43#undef LOCAL_ASM_OP
44#define LOCAL_ASM_OP			"\t.local\t"
45
46#undef ASM_SHORT
47#define ASM_SHORT			"\t.value\t"
48
49#undef ASM_LONG
50#define ASM_LONG			"\t.long\t"
51
52#undef ASM_QUAD
53
54#undef TYPE_ASM_OP
55#define TYPE_ASM_OP			"\t.type\t"
56
57#undef SIZE_ASM_OP
58#define SIZE_ASM_OP			"\t.size\t"
59
60#undef STRING_ASM_OP
61#define STRING_ASM_OP			"\t.string\t"
62
63#undef SKIP_ASM_OP
64#define SKIP_ASM_OP			"\t.zero\t"
65
66#undef GLOBAL_ASM_OP
67#define GLOBAL_ASM_OP			"\t.globl\t"
68
69#undef EH_FRAME_SECTION_ASM_OP
70#define EH_FRAME_SECTION_NAME_COFF	".ehfram"
71#define EH_FRAME_SECTION_NAME_ELF	".eh_frame"
72#define EH_FRAME_SECTION_NAME	\
73  ((TARGET_ELF) ? EH_FRAME_SECTION_NAME_ELF : EH_FRAME_SECTION_NAME_COFF)
74
75/* Avoid problems (long sectino names, forward assembler refs) with DWARF
76   exception unwinding when we're generating COFF */
77#define DWARF2_UNWIND_INFO	\
78  ((TARGET_ELF) ? 1 : 0 )
79
80#undef READONLY_DATA_SECTION_ASM_OP
81#define READONLY_DATA_SECTION_ASM_OP_COFF	"\t.section\t.rodata, \"x\""
82#define READONLY_DATA_SECTION_ASM_OP_ELF	"\t.section\t.rodata"
83#define READONLY_DATA_SECTION_ASM_OP		\
84  ((TARGET_ELF)					\
85   ? READONLY_DATA_SECTION_ASM_OP_ELF		\
86   : READONLY_DATA_SECTION_ASM_OP_COFF)
87
88#undef INIT_SECTION_ASM_OP
89#define INIT_SECTION_ASM_OP_ELF		"\t.section\t.init"
90/* Rename these for COFF because crt1.o will try to run them.  */
91#define INIT_SECTION_ASM_OP_COFF	"\t.section\t.ctor ,\"x\""
92#define INIT_SECTION_ASM_OP	\
93  ((TARGET_ELF) ? INIT_SECTION_ASM_OP_ELF : INIT_SECTION_ASM_OP_COFF)
94
95#undef CTORS_SECTION_ASM_OP
96#define CTORS_SECTION_ASM_OP_ELF	"\t.section\t.ctors,\"aw\""
97#define CTORS_SECTION_ASM_OP_COFF	INIT_SECTION_ASM_OP_COFF
98#define CTORS_SECTION_ASM_OP	\
99 ((TARGET_ELF) ? CTORS_SECTION_ASM_OP_ELF : CTORS_SECTION_ASM_OP_COFF)
100
101#undef DTORS_SECTION_ASM_OP
102#define DTORS_SECTION_ASM_OP_ELF	"\t.section\t.dtors, \"aw\""
103#define DTORS_SECTION_ASM_OP_COFF	FINI_SECTION_ASM_OP_COFF
104#define DTORS_SECTION_ASM_OP	\
105 ((TARGET_ELF) ? DTORS_SECTION_ASM_OP_ELF : DTORS_SECTION_ASM_OP_COFF)
106
107#undef FINI_SECTION_ASM_OP
108#define FINI_SECTION_ASM_OP_ELF		"\t.section\t.fini"
109#define FINI_SECTION_ASM_OP_COFF	"\t.section\t.dtor, \"x\""
110#define FINI_SECTION_ASM_OP	\
111 ((TARGET_ELF) ? FINI_SECTION_ASM_OP_ELF : FINI_SECTION_ASM_OP_COFF)
112
113#undef BSS_SECTION_ASM_OP
114#define BSS_SECTION_ASM_OP		"\t.data"
115
116#undef TEXT_SECTION_ASM_OP
117#define TEXT_SECTION_ASM_OP		"\t.text"
118
119#undef DATA_SECTION_ASM_OP
120#define DATA_SECTION_ASM_OP		"\t.data"
121
122#undef TYPE_OPERAND_FMT
123#define TYPE_OPERAND_FMT		"@%s"
124
125#undef APPLY_RESULT_SIZE
126#define APPLY_RESULT_SIZE						\
127(TARGET_ELF) ? size : 116
128
129#ifndef ASM_DECLARE_RESULT
130#define ASM_DECLARE_RESULT(FILE, RESULT)
131#endif
132
133#define SCO_DEFAULT_ASM_COFF(FILE,NAME)					\
134do {									\
135      ASM_OUTPUT_LABEL (FILE, NAME);					\
136  } while (0)
137
138#undef ASM_DECLARE_FUNCTION_NAME
139#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)			\
140  do {									\
141    if (TARGET_ELF) {							\
142      ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function");		\
143      ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL));			\
144      ASM_OUTPUT_LABEL (FILE, NAME);					\
145    } else								\
146      SCO_DEFAULT_ASM_COFF(FILE, NAME);					\
147} while (0)
148
149#undef ASM_DECLARE_FUNCTION_SIZE
150#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL)			\
151  do {									\
152    if (TARGET_ELF && !flag_inhibit_size_directive)			\
153      ASM_OUTPUT_MEASURED_SIZE (FILE, FNAME);				\
154  } while (0)
155
156#undef ASM_DECLARE_OBJECT_NAME
157#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)			\
158  do {									\
159    if (TARGET_ELF) {							\
160      HOST_WIDE_INT size;						\
161									\
162      ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");			\
163									\
164      size_directive_output = 0;					\
165      if (!flag_inhibit_size_directive					\
166	  && (DECL) && DECL_SIZE (DECL))				\
167	{								\
168	  size_directive_output = 1;					\
169	  size = int_size_in_bytes (TREE_TYPE (DECL));			\
170	  ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, size);			\
171	}								\
172									\
173      ASM_OUTPUT_LABEL (FILE, NAME);					\
174    } else								\
175      SCO_DEFAULT_ASM_COFF(FILE, NAME);					\
176  } while (0)
177
178#undef ASM_FILE_START_1
179#define ASM_FILE_START_1(FILE)
180
181#undef ASM_FILE_START
182#define ASM_FILE_START(FILE)						\
183do {									\
184  output_file_directive((FILE),main_input_filename);			\
185  fprintf ((FILE), "\t.version\t\"01.01\"\n");				\
186} while (0)
187
188#undef ASM_FINISH_DECLARE_OBJECT
189#define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END)	 \
190do {									 \
191  if (TARGET_ELF) {							 \
192     const char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0);		 \
193     HOST_WIDE_INT size;						 \
194     if (!flag_inhibit_size_directive && DECL_SIZE (DECL)		 \
195         && ! AT_END && TOP_LEVEL					 \
196	 && DECL_INITIAL (DECL) == error_mark_node			 \
197	 && !size_directive_output)					 \
198       {								 \
199	 size_directive_output = 1;					 \
200	 size = int_size_in_bytes (TREE_TYPE (DECL));			 \
201	 ASM_OUTPUT_SIZE_DIRECTIVE (FILE, name, size);			 \
202       }								 \
203    }									 \
204} while (0)
205
206#undef ASM_GENERATE_INTERNAL_LABEL
207#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM)			\
208do {									\
209  if (TARGET_ELF)							\
210    sprintf (LABEL, "*.%s%ld", (PREFIX), (long)(NUM));			\
211  else									\
212    sprintf (LABEL, ".%s%ld", (PREFIX), (long)(NUM));			\
213} while (0)
214
215#undef ASM_OUTPUT_ALIGNED_COMMON
216#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN)		\
217do {									\
218  fprintf ((FILE), "%s", COMMON_ASM_OP);				\
219  assemble_name ((FILE), (NAME));					\
220  if (TARGET_ELF)							\
221    fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT);	\
222  else									\
223    fprintf ((FILE), ",%u\n", (SIZE));					\
224} while (0)
225
226#undef ASM_OUTPUT_ALIGNED_LOCAL
227#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN)		\
228do {									\
229  if (TARGET_ELF) {							\
230    fprintf ((FILE), "%s", LOCAL_ASM_OP);				\
231    assemble_name ((FILE), (NAME));					\
232    fprintf ((FILE), "\n");						\
233    ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN);		\
234  } else {								\
235    int align = exact_log2 (ALIGN);					\
236    if (align > 2) align = 2;						\
237    if (TARGET_SVR3_SHLIB)						\
238      data_section ();							\
239    else								\
240      bss_section ();							\
241    ASM_OUTPUT_ALIGN ((FILE), align == -1 ? 2 : align);			\
242    fprintf ((FILE), "%s\t", "\t.lcomm");				\
243    assemble_name ((FILE), (NAME));					\
244    fprintf ((FILE), ",%u\n", (SIZE));					\
245   }									\
246} while (0)
247
248/* A C statement (sans semicolon) to output to the stdio stream
249   FILE the assembler definition of uninitialized global DECL named
250   NAME whose size is SIZE bytes and alignment is ALIGN bytes.
251   Try to use asm_output_aligned_bss to implement this macro.  */
252
253#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
254asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
255
256#undef ESCAPES
257#define ESCAPES \
258"\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
259\0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\
261\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\
262\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
263\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
264\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
265\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1"
266
267#undef STRING_LIMIT
268#define STRING_LIMIT	((unsigned) 256)
269
270#undef ASM_OUTPUT_LIMITED_STRING
271#define ASM_OUTPUT_LIMITED_STRING(FILE, STR)				\
272  do									\
273    {									\
274      register const unsigned char *_limited_str =			\
275        (const unsigned char *) (STR);					\
276      register unsigned ch;						\
277      fprintf ((FILE), "%s\"", STRING_ASM_OP);				\
278      for (; (ch = *_limited_str); _limited_str++)			\
279        {								\
280	  register int escape;						\
281	  switch (escape = ESCAPES[ch])					\
282	    {								\
283	    case 0:							\
284	      putc (ch, (FILE));					\
285	      break;							\
286	    case 1:							\
287	      fprintf ((FILE), "\\%03o", ch);				\
288	      break;							\
289	    default:							\
290	      putc ('\\', (FILE));					\
291	      putc (escape, (FILE));					\
292	      break;							\
293	    }								\
294        }								\
295      fprintf ((FILE), "\"\n");						\
296    }									\
297  while (0)
298
299
300#undef ASM_OUTPUT_ASCII
301#define ASM_OUTPUT_ASCII(FILE, STR, LENGTH)				\
302do {									\
303      register const unsigned char *_ascii_bytes =			\
304        (const unsigned char *) (STR);					\
305      register const unsigned char *limit = _ascii_bytes + (LENGTH);	\
306      register unsigned bytes_in_chunk = 0;				\
307      for (; _ascii_bytes < limit; _ascii_bytes++)			\
308        {								\
309	  register unsigned const char *p;				\
310	  if (bytes_in_chunk >= 64)					\
311	    {								\
312	      fputc ('\n', (FILE));					\
313	      bytes_in_chunk = 0;					\
314	    }								\
315	  for (p = _ascii_bytes; p < limit && *p != '\0'; p++)		\
316	    continue;							\
317	  if (p < limit && (p - _ascii_bytes) <= (long) STRING_LIMIT)	\
318	    {								\
319	      if (bytes_in_chunk > 0)					\
320		{							\
321		  fputc ('\n', (FILE));					\
322		  bytes_in_chunk = 0;					\
323		}							\
324	      ASM_OUTPUT_LIMITED_STRING ((FILE), _ascii_bytes);		\
325	      _ascii_bytes = p;						\
326	    }								\
327	  else								\
328	    {								\
329	      if (bytes_in_chunk == 0)					\
330		fputs ("\t.byte\t", (FILE));				\
331	      else							\
332		fputc (',', (FILE));					\
333	      fprintf ((FILE), "0x%02x", *_ascii_bytes);		\
334	      bytes_in_chunk += 5;					\
335	    }								\
336	}								\
337      if (bytes_in_chunk > 0)						\
338        fprintf ((FILE), "\n");						\
339} while (0)
340
341#undef ASM_OUTPUT_CASE_LABEL
342#define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,JUMPTABLE)		\
343do {									\
344  if (TARGET_ELF)							\
345    ASM_OUTPUT_ALIGN ((FILE), 2);					\
346  ASM_OUTPUT_INTERNAL_LABEL((FILE),(PREFIX),(NUM));			\
347} while (0)
348
349#undef ASM_OUTPUT_IDENT
350#define ASM_OUTPUT_IDENT(FILE, NAME) \
351  fprintf (FILE, "%s\"%s\"\n", IDENT_ASM_OP, NAME);
352
353#undef ASM_OUTPUT_EXTERNAL_LIBCALL
354#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN)				\
355  if (TARGET_ELF) (*targetm.asm_out.globalize_label) (FILE, XSTR (FUN, 0))
356
357#undef ASM_OUTPUT_INTERNAL_LABEL
358#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM)			\
359  fprintf (FILE, ".%s%d:\n", PREFIX, NUM)
360
361/* The prefix to add to user-visible assembler symbols.  */
362
363#undef USER_LABEL_PREFIX
364#define USER_LABEL_PREFIX ""
365
366/*
367 * We rename 'gcc_except_table' to the shorter name in preparation
368 * for the day when we're ready to do DWARF2 eh unwinding under COFF.
369 */
370/* #define EXCEPTION_SECTION()		named_section (NULL, ".gccexc", 1) */
371
372/* Switch into a generic section.  */
373#define TARGET_ASM_NAMED_SECTION default_elf_asm_named_section
374
375#undef ASM_OUTPUT_SKIP
376#define ASM_OUTPUT_SKIP(FILE,SIZE) \
377do {									\
378  if (TARGET_ELF)							\
379    fprintf (FILE, "%s%u\n", SKIP_ASM_OP, (SIZE));			\
380  else									\
381    fprintf ((FILE), "%s.,.+%u\n", SET_ASM_OP, (SIZE));		\
382} while (0)
383
384
385#undef CTOR_LIST_BEGIN
386#define CTOR_LIST_BEGIN							\
387do {									\
388  asm (CTORS_SECTION_ASM_OP);						\
389  if (TARGET_ELF)							\
390    STATIC func_ptr __CTOR_LIST__[1] = { (func_ptr) (-1) };		\
391  else									\
392    asm ("pushl $0");							\
393} while (0)
394
395#undef CTOR_LIST_END
396#define CTOR_LIST_END							\
397do {									\
398  if (TARGET_ELF) {							\
399    asm (CTORS_SECTION_ASM_OP);						\
400    STATIC func_ptr __CTOR_LIST__[1] = { (func_ptr) (0) };		\
401  } else {								\
402    CTOR_LIST_BEGIN;							\
403  }									\
404} while (0)
405
406#undef DBX_BLOCKS_FUNCTION_RELATIVE
407#define DBX_BLOCKS_FUNCTION_RELATIVE 1
408
409#undef DBX_FUNCTION_FIRST
410#define DBX_FUNCTION_FIRST 1
411
412#undef DBX_REGISTER_NUMBER
413#define DBX_REGISTER_NUMBER(n) \
414  ((TARGET_ELF) ? svr4_dbx_register_map[n] : dbx_register_map[n])
415
416#define DWARF2_DEBUGGING_INFO 1
417#define DWARF_DEBUGGING_INFO 1
418#define SDB_DEBUGGING_INFO 1
419#define DBX_DEBUGGING_INFO 1
420
421#undef PREFERRED_DEBUGGING_TYPE
422#define PREFERRED_DEBUGGING_TYPE					\
423  ((TARGET_ELF) ? DWARF2_DEBUG: SDB_DEBUG)
424
425#undef EXTRA_SECTIONS
426#define EXTRA_SECTIONS in_init, in_fini
427
428#undef EXTRA_SECTION_FUNCTIONS
429#define EXTRA_SECTION_FUNCTIONS						\
430  INIT_SECTION_FUNCTION							\
431  FINI_SECTION_FUNCTION
432
433#undef FINI_SECTION_FUNCTION
434#define FINI_SECTION_FUNCTION						\
435void									\
436fini_section ()								\
437{									\
438  if ((!TARGET_ELF) && in_section != in_fini)				\
439    {									\
440      fprintf (asm_out_file, "%s\n", FINI_SECTION_ASM_OP);		\
441      in_section = in_fini;						\
442    }									\
443}
444
445#undef INIT_SECTION_FUNCTION
446#define INIT_SECTION_FUNCTION						\
447void									\
448init_section ()								\
449{									\
450  if ((!TARGET_ELF) && in_section != in_init)				\
451    {									\
452      fprintf (asm_out_file, "%s\n", INIT_SECTION_ASM_OP);		\
453      in_section = in_init;						\
454    }									\
455}
456
457#undef SUBTARGET_FRAME_POINTER_REQUIRED
458#define SUBTARGET_FRAME_POINTER_REQUIRED				\
459  ((TARGET_ELF) ? 0 : 							\
460   (current_function_calls_setjmp || current_function_calls_longjmp))
461
462#undef LOCAL_LABEL_PREFIX
463#define LOCAL_LABEL_PREFIX						\
464 ((TARGET_ELF) ? "" : ".")
465
466#undef MD_EXEC_PREFIX
467#undef MD_STARTFILE_PREFIX
468#define MD_EXEC_PREFIX "/usr/ccs/bin/"
469#define MD_STARTFILE_PREFIX "/usr/ccs/lib/"
470
471#undef NON_SAVING_SETJMP
472#define NON_SAVING_SETJMP						\
473  ((TARGET_ELF) ? 0 : 							\
474   (current_function_calls_setjmp && current_function_calls_longjmp))
475
476#undef NO_IMPLICIT_EXTERN_C
477#define NO_IMPLICIT_EXTERN_C 1
478
479/* JKJ FIXME - examine the ramifications of RETURN_IN_MEMORY and
480   RETURN_POPS_ARGS */
481
482#undef RETURN_POPS_ARGS
483#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 				\
484 ((TARGET_ELF) ?							\
485  (ix86_return_pops_args (FUNDECL, FUNTYPE, SIZE)) : 			\
486  (((FUNDECL) && (TREE_CODE (FUNDECL) == IDENTIFIER_NODE)) ? 0		\
487   : (TARGET_RTD							\
488      && (TYPE_ARG_TYPES (FUNTYPE) == 0					\
489	  || (TREE_VALUE (tree_last (TYPE_ARG_TYPES (FUNTYPE)))		\
490	      == void_type_node))) ? (SIZE)				\
491   : 0))
492
493/* ??? Ignore coff.  */
494#undef	TARGET_ASM_SELECT_SECTION
495#define TARGET_ASM_SELECT_SECTION  default_elf_select_section
496
497#undef SWITCH_TAKES_ARG
498#define SWITCH_TAKES_ARG(CHAR) 						\
499  (DEFAULT_SWITCH_TAKES_ARG(CHAR)					\
500   || (CHAR) == 'h' 							\
501   || (CHAR) == 'R' 							\
502   || (CHAR) == 'Y' 							\
503   || (CHAR) == 'z')
504
505#undef WORD_SWITCH_TAKES_ARG
506#define WORD_SWITCH_TAKES_ARG(STR)					\
507 (DEFAULT_WORD_SWITCH_TAKES_ARG (STR)					\
508  && strcmp (STR, "Tdata") && strcmp (STR, "Ttext")			\
509  && strcmp (STR, "Tbss"))
510
511#undef TARGET_SUBTARGET_DEFAULT
512#define TARGET_SUBTARGET_DEFAULT (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS)
513
514#define HANDLE_SYSV_PRAGMA 1
515
516/* Though OpenServer supports .weak in COFF, we don't use it.
517 * G++ will frequently emit a symol as .weak and then (in the same .s
518 * file) declare it global.   The COFF assembler finds this unamusing.
519 */
520#define SUPPORTS_WEAK (TARGET_ELF)
521#define ASM_WEAKEN_LABEL(FILE,NAME) \
522  do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME);		\
523	fputc ('\n', FILE); } while (0)
524
525/*
526 * Define sizes and types
527 */
528#undef SIZE_TYPE
529#undef PTRDIFF_TYPE
530#undef WCHAR_TYPE
531#undef WCHAR_TYPE_SIZE
532#undef LONG_DOUBLE_TYPE_SIZE
533#define LONG_DOUBLE_TYPE_SIZE 	96
534#define SIZE_TYPE		"unsigned int"
535#define PTRDIFF_TYPE		"int"
536#define WCHAR_TYPE		"long int"
537#define WCHAR_TYPE_SIZE		BITS_PER_WORD
538
539/*
540 * New for multilib support. Set the default switches for multilib,
541 * which is -melf.
542 */
543#define MULTILIB_DEFAULTS { "melf" }
544
545
546/* Please note that these specs may look messy but they are required in
547   order to emulate the SCO Development system as closely as possible.
548   With SCO Open Server 5.0, you now get the linker and assembler free,
549   so that is what these specs are targeted for. These utilities are
550   very argument sensitive: a space in the wrong place breaks everything.
551   So RMS, please forgive this mess. It works.
552
553   Parameters which can be passed to gcc, and their SCO equivalents:
554   GCC Parameter                SCO Equivalent
555   -ansi                        -a ansi
556   -posix                       -a posix
557   -Xpg4                        -a xpg4
558   -Xpg4plus                    -a xpg4plus
559   -Xods30                      -a ods30
560
561   As with SCO, the default is XPG4 plus mode. SCO also allows you to
562   specify a C dialect with -Xt, -Xa, -Xc, -Xk and -Xm. These are passed
563   on to the assembler and linker in the same way that the SCO compiler
564   does.
565
566   SCO also allows you to compile, link and generate either ELF or COFF
567   binaries. With gcc, unlike the SCO compiler, the default is ELF.
568   Specify -mcoff to gcc to produce COFF binaries. -fpic will get the
569   assembler and linker to produce PIC code.
570*/
571
572/* Set up assembler flags for PIC and ELF compilations */
573#undef ASM_SPEC
574
575#if USE_GAS
576  /* Leave ASM_SPEC undefined so we pick up the master copy from gcc.c
577   * Undef MD_EXEC_PREFIX because we don't know where GAS is, but it's not
578   * likely in /usr/ccs/bin/
579   */
580#undef MD_EXEC_PREFIX
581#else
582
583#define ASM_SPEC \
584   "-b %{!mcoff:elf}%{mcoff:coff \
585     %{static:%e-static not valid with -mcoff} \
586     %{shared:%e-shared not valid with -mcoff} \
587     %{symbolic:%e-symbolic not valid with -mcoff}} \
588    %{Ym,*} %{Yd,*} %{Wa,*:%*} \
589    %{!mcoff:-E%{Xa:a}%{!Xa:%{Xc:c}%{!Xc:%{Xk:k}%{!Xk:%{Xt:t}%{!Xt:a}}}},%{ansi:ansi}%{!ansi:%{posix:posix}%{!posix:%{Xpg4:xpg4}%{!Xpg4:%{Xpg4plus:XPG4PLUS}%{!Xpg4plus:%{Xods30:ods30}%{!Xods30:XPG4PLUS}}}}},ELF %{Qn:} %{!Qy:-Qn}}"
590#endif
591
592/* Use crt1.o as a startup file and crtn.o as a closing file.  */
593
594#undef STARTFILE_SPEC
595#define STARTFILE_SPEC \
596 "%{shared: %{!mcoff: crti.o%s}} \
597  %{!shared:\
598   %{!symbolic: \
599    %{pg:gcrt.o%s}%{!pg:%{p:mcrt1.o%s}%{!p:crt1.o%s}}}} \
600  %{ansi:values-Xc.o%s} \
601  %{!ansi: \
602   %{Xa:values-Xa.o%s} \
603    %{!Xa:%{Xc:values-Xc.o%s} \
604     %{!Xc:%{Xk:values-Xk.o%s} \
605      %{!Xk:%{Xt:values-Xt.o%s} \
606       %{!Xt:values-Xa.o%s}}}}} \
607  %{mcoff:crtbeginS.o%s} %{!mcoff:crtbegin.o%s}"
608
609#undef ENDFILE_SPEC
610#define ENDFILE_SPEC \
611 "%{!mcoff:crtend.o%s} \
612  %{mcoff:crtendS.o%s} \
613  %{pg:gcrtn.o%s}%{!pg:crtn.o%s}"
614
615#define TARGET_OS_CPP_BUILTINS()		\
616  do						\
617    {						\
618	builtin_define ("__unix");		\
619	builtin_define ("_SCO_DS");		\
620	builtin_define ("_M_I386");		\
621	builtin_define ("_M_XENIX");		\
622	builtin_define ("_M_UNIX");		\
623	builtin_assert ("system=svr3");		\
624	if (flag_iso)				\
625	  cpp_define (pfile, "_STRICT_ANSI");	\
626	if (flag_pic)							\
627	  {								\
628	    builtin_define ("__PIC__");					\
629	    builtin_define ("__pic__");					\
630	  }								\
631    }						\
632  while (0)
633
634#undef CPP_SPEC
635#define CPP_SPEC "\
636  %{fpic:%{mcoff:%e-fpic is not valid with -mcoff}} \
637  %{fPIC:%{mcoff:%e-fPIC is not valid with -mcoff}} \
638  %{!Xods30:-D_STRICT_NAMES} \
639  %{!ansi:%{!posix:%{!Xods30:-D_SCO_XPG_VERS=4}}} \
640  %{ansi:-isystem include/ansi%s -isystem /usr/include/ansi} \
641  %{!ansi: \
642   %{posix:-isystem include/posix%s -isystem /usr/include/posix \
643           -D_POSIX_C_SOURCE=2 -D_POSIX_SOURCE=1} \
644    %{!posix:%{Xpg4:-isystem include/xpg4%s -isystem /usr/include/xpg4 \
645                    -D_XOPEN_SOURCE=1} \
646     %{!Xpg4:-D_M_I86 -D_M_I86SM -D_M_INTERNAT -D_M_SDATA -D_M_STEXT \
647             -D_M_BITFIELDS -D_M_SYS5 -D_M_SYSV -D_M_SYSIII \
648             -D_M_WORDSWAP -Dunix -DM_I386 -DM_UNIX -DM_XENIX \
649             %{Xods30:-isystem include/ods_30_compat%s \
650                      -isystem /usr/include/ods_30_compat \
651                      -D_SCO_ODS_30 -DM_I86 -DM_I86SM -DM_SDATA -DM_STEXT \
652                      -DM_BITFIELDS -DM_SYS5 -DM_SYSV -DM_INTERNAT -DM_SYSIII \
653                      -DM_WORDSWAP}}}} \
654  %{scointl:-DM_INTERNAT -D_M_INTERNAT} \
655  %{!mcoff:-D_SCO_ELF} \
656  %{mcoff:-D_M_COFF -D_SCO_COFF} \
657  %{Xa:-D_SCO_C_DIALECT=1} \
658  %{!Xa:%{Xc:-D_SCO_C_DIALECT=3} \
659   %{!Xc:%{Xk:-D_SCO_C_DIALECT=4} \
660    %{!Xk:%{Xt:-D_SCO_C_DIALECT=2} \
661     %{!Xt:-D_SCO_C_DIALECT=1}}}}"
662
663#undef LINK_SPEC
664#define LINK_SPEC \
665 "-b %{!mcoff:elf}%{mcoff:coff \
666   %{static:%e-static not valid with -mcoff} \
667   %{shared:%e-shared not valid with -mcoff} \
668   %{symbolic:%e-symbolic not valid with -mcoff} \
669   %{fpic:%e-fpic not valid with -mcoff} \
670   %{fPIC:%e-fPIC not valid with -mcoff}} \
671  -R%{Xa:a}%{!Xa:%{Xc:c}%{!Xc:%{Xk:k}%{!Xk:%{Xt:t}%{!Xt:a}}}},%{ansi:ansi}%{!ansi:%{posix:posix}%{!posix:%{Xpg4:xpg4}%{!Xpg4:%{Xpg4plus:XPG4PLUS}%{!Xpg4plus:%{Xods30:ods30}%{!Xods30:XPG4PLUS}}}}},%{mcoff:COFF}%{!mcoff:ELF} \
672  %{Wl,*%*} %{YP,*} %{YL,*} %{YU,*} \
673  %{!YP,*:%{p:-YP,/usr/ccs/libp:/lib/libp:/usr/lib/libp:/usr/ccs/lib:/lib:/usr/lib} \
674   %{!p:-YP,/usr/ccs/lib:/lib:/usr/lib}} \
675  %{h*} %{static:-dn -Bstatic} %{shared:-G -dy %{!z*:-z text}} \
676  %{symbolic:-Bsymbolic -G -dy %{!z*:-z text}} %{z*} %{R*} %{Y*} \
677  %{G:-G} %{!mcoff:%{Qn:} %{!Qy:-Qn}}"
678
679/* The SCO COFF linker gets confused on the difference between "-ofoo"
680   and "-o foo".   So we just always force a single space.  */
681
682#define SWITCHES_NEED_SPACES "o"
683
684/* Library spec. If we are not building a shared library, provide the
685   standard libraries, as per the SCO compiler.  */
686
687#undef LIB_SPEC
688#define LIB_SPEC \
689 "%{shared:pic/libgcc.a%s}%{!shared:%{!symbolic:-lcrypt -lgen -lc}}"
690
691#undef LIBGCC_SPEC
692#define LIBGCC_SPEC \
693 "%{!shared:-lgcc}"
694
695#define MASK_COFF     		010000000000	/* Mask for elf generation */
696#define TARGET_ELF              (1) /* (!(target_flags & MASK_COFF)) */
697
698#undef SUBTARGET_SWITCHES
699#define SUBTARGET_SWITCHES 					\
700	{ "elf", -MASK_COFF, N_("Generate ELF output")  },
701
702#define NO_DOLLAR_IN_LABEL
703
704/* Implicit library calls should use memcpy, not bcopy, etc.  They are
705   faster on OpenServer libraries.  */
706
707#define TARGET_MEM_FUNCTIONS
708
709/* Biggest alignment supported by the object file format of this
710   machine.  Use this macro to limit the alignment which can be
711   specified using the `__attribute__ ((aligned (N)))' construct.  If
712   not defined, the default value is `BIGGEST_ALIGNMENT'.  */
713
714#define MAX_OFILE_ALIGNMENT (32768*8)
715
716/* Define the `__builtin_va_list' type for the ABI.  On OpenServer, this
717   type is `char *'.  */
718#undef BUILD_VA_LIST_TYPE
719#define BUILD_VA_LIST_TYPE(VALIST) \
720  (VALIST) = build_pointer_type (char_type_node)
721
722
723/*
724Here comes some major hackery to get the crt stuff to compile properly.
725Since we can (and do) compile for both COFF and ELF environments, we
726set things up accordingly, based on the pre-processor defines for ELF
727and COFF. This is insane, but then I guess having one compiler with a
728single back-end supporting two vastly different file format types is
729a little insane too. But it is not impossible and we get a useful
730compiler at the end of the day. Onward we go ...
731*/
732
733#if defined(CRT_BEGIN) || defined(CRT_END) || defined(IN_LIBGCC2)
734# undef OBJECT_FORMAT_ELF
735# undef INIT_SECTION_ASM_OP
736# undef FINI_SECTION_ASM_OP
737# undef CTORS_SECTION_ASM_OP
738# undef DTORS_SECTION_ASM_OP
739# undef EH_FRAME_SECTION_NAME
740# undef CTOR_LIST_BEGIN
741# undef CTOR_LIST_END
742# undef DO_GLOBAL_CTORS_BODY
743
744# if defined (_SCO_ELF)
745#  define OBJECT_FORMAT_ELF
746#  define INIT_SECTION_ASM_OP INIT_SECTION_ASM_OP_ELF
747#  define FINI_SECTION_ASM_OP FINI_SECTION_ASM_OP_ELF
748#  define DTORS_SECTION_ASM_OP DTORS_SECTION_ASM_OP_ELF
749#  define CTORS_SECTION_ASM_OP CTORS_SECTION_ASM_OP_ELF
750#  define EH_FRAME_SECTION_NAME EH_FRAME_SECTION_NAME_ELF
751# else /* ! _SCO_ELF */
752#  define INIT_SECTION_ASM_OP INIT_SECTION_ASM_OP_COFF
753#  define FINI_SECTION_ASM_OP FINI_SECTION_ASM_OP_COFF
754#  define DTORS_SECTION_ASM_OP DTORS_SECTION_ASM_OP_COFF
755#  define CTORS_SECTION_ASM_OP CTORS_SECTION_ASM_OP_COFF
756#  define EH_FRAME_SECTION_NAME EH_FRAME_SECTION_NAME_COFF
757#  define CTOR_LIST_BEGIN asm (INIT_SECTION_ASM_OP); asm ("pushl $0")
758#  define CTOR_LIST_END CTOR_LIST_BEGIN
759#  define DO_GLOBAL_CTORS_BODY						\
760do {									\
761     func_ptr *p, *beg = alloca(0);					\
762     for (p = beg; *p;)							\
763      (*p++) ();							\
764} while (0)
765# endif /* ! _SCO_ELF */
766#endif /* CRT_BEGIN !! CRT_END */
767
768/* Handle special EH pointer encodings.  Absolute, pc-relative, and
769   indirect are handled automatically.  */
770#define ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX(FILE, ENCODING, SIZE, ADDR, DONE) \
771  do {									\
772    if ((SIZE) == 4 && ((ENCODING) & 0x70) == DW_EH_PE_datarel)		\
773      {									\
774        fputs (ASM_LONG, FILE);						\
775        assemble_name (FILE, XSTR (ADDR, 0));				\
776	fputs (((ENCODING) & DW_EH_PE_indirect ? "@GOT" : "@GOTOFF"), FILE); \
777        goto DONE;							\
778      }									\
779  } while (0)
780
781/* Used by crtstuff.c to initialize the base of data-relative relocations.
782   These are GOT relative on x86, so return the pic register.  */
783#ifdef __PIC__
784#define CRT_GET_RFIB_DATA(BASE)			\
785  {						\
786    register void *ebx_ __asm__("ebx");		\
787    BASE = ebx_;				\
788  }
789#else
790#define CRT_GET_RFIB_DATA(BASE)						\
791  __asm__ ("call\t.LPR%=\n"						\
792	   ".LPR%=:\n\t"						\
793	   "popl\t%0\n\t"						\
794	   /* Due to a GAS bug, this cannot use EAX.  That encodes	\
795	      smaller than the traditional EBX, which results in the	\
796	      offset being off by one.  */				\
797	   "addl\t$_GLOBAL_OFFSET_TABLE_+[.-.LPR%=],%0"			\
798	   : "=d"(BASE))
799#endif
800
801/* Select a format to encode pointers in exception handling data.  CODE
802   is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
803   true if the symbol may be affected by dynamic relocations.  */
804#undef ASM_PREFERRED_EH_DATA_FORMAT
805#define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL)			\
806  (flag_pic ? (GLOBAL ? DW_EH_PE_indirect : 0) | DW_EH_PE_datarel	\
807   : DW_EH_PE_absptr)
808