sco5.h revision 132718
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, 2003
3   Free Software Foundation, Inc.
4   Contributed by Kean Johnston (jkj@sco.com)
5
6This file is part of GCC.
7
8GCC 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
13GCC 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 GCC; see the file COPYING.  If not, write to
20the Free Software Foundation, 59 Temple Place - Suite 330,
21Boston, MA 02111-1307, USA.  */
22
23#undef TARGET_VERSION
24#define TARGET_VERSION fprintf (stderr, " (i386, SCO OpenServer 5 Syntax)");
25
26#undef ASM_QUAD
27
28#undef GLOBAL_ASM_OP
29#define GLOBAL_ASM_OP			"\t.globl\t"
30
31#undef BSS_SECTION_ASM_OP
32#define BSS_SECTION_ASM_OP		"\t.section\t.bss, \"aw\", @nobits"
33
34/*
35 * NOTE: We really do want CTORS_SECTION_ASM_OP and DTORS_SECTION_ASM_OP.
36 * Here's the reason why. If we dont define them, and we dont define them
37 * to always emit to the same section, the default is to emit to "named"
38 * ctors and dtors sections. This would be great if we could use GNU ld,
39 * but we can't. The native linker could possibly be trained to coalesce
40 * named ctors sections, but that hasn't been done either. So if we don't
41 * define these, many C++ ctors and dtors dont get run, because they never
42 * wind up in the ctors/dtors arrays.
43 */
44#define CTORS_SECTION_ASM_OP		"\t.section\t.ctors, \"aw\""
45#define DTORS_SECTION_ASM_OP		"\t.section\t.dtors, \"aw\""
46
47#define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
48#undef X86_FILE_START_VERSION_DIRECTIVE
49#define X86_FILE_START_VERSION_DIRECTIVE true
50
51/* A C statement (sans semicolon) to output to the stdio stream
52   FILE the assembler definition of uninitialized global DECL named
53   NAME whose size is SIZE bytes and alignment is ALIGN bytes.
54   Try to use asm_output_aligned_bss to implement this macro.  */
55
56#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
57  asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
58
59#undef DBX_REGISTER_NUMBER
60#define DBX_REGISTER_NUMBER(n)	svr4_dbx_register_map[n]
61
62#define DWARF2_DEBUGGING_INFO		1
63#define DBX_DEBUGGING_INFO		1
64
65#undef PREFERRED_DEBUGGING_TYPE
66#define PREFERRED_DEBUGGING_TYPE	DWARF2_DEBUG
67
68#undef DWARF2_UNWIND_INFO
69#define DWARF2_UNWIND_INFO		1
70
71#undef NO_IMPLICIT_EXTERN_C
72#define NO_IMPLICIT_EXTERN_C		1
73
74#undef SWITCH_TAKES_ARG
75#define SWITCH_TAKES_ARG(CHAR) 						\
76  (DEFAULT_SWITCH_TAKES_ARG(CHAR)					\
77   || (CHAR) == 'h' 							\
78   || (CHAR) == 'R' 							\
79   || (CHAR) == 'Y' 							\
80   || (CHAR) == 'z')
81
82#undef WORD_SWITCH_TAKES_ARG
83#define WORD_SWITCH_TAKES_ARG(STR)					\
84 (DEFAULT_WORD_SWITCH_TAKES_ARG (STR)					\
85  && strcmp (STR, "Tdata") && strcmp (STR, "Ttext")			\
86  && strcmp (STR, "Tbss"))
87
88#undef TARGET_SUBTARGET_DEFAULT
89#define TARGET_SUBTARGET_DEFAULT (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS)
90
91/*
92 * Define sizes and types
93 */
94#undef SIZE_TYPE
95#undef PTRDIFF_TYPE
96#undef WCHAR_TYPE
97#undef WCHAR_TYPE_SIZE
98#undef WINT_TYPE
99#undef LONG_DOUBLE_TYPE_SIZE
100#define SIZE_TYPE		"unsigned int"
101#define PTRDIFF_TYPE		"int"
102#define WCHAR_TYPE		"long int"
103#define WCHAR_TYPE_SIZE		BITS_PER_WORD
104#define WINT_TYPE		"long int"
105#define LONG_DOUBLE_TYPE_SIZE 	96
106
107/*
108 * New for multilib support. Set the default switches for multilib,
109 * which is -melf.
110 */
111#define MULTILIB_DEFAULTS { "melf" }
112
113
114/* Please note that these specs may look messy but they are required in
115   order to emulate the SCO Development system as closely as possible.
116   With SCO Open Server 5.0, you now get the linker and assembler free,
117   so that is what these specs are targeted for. These utilities are
118   very argument sensitive: a space in the wrong place breaks everything.
119   So please forgive this mess. It works.
120
121   Parameters which can be passed to gcc, and their SCO equivalents:
122   GCC Parameter                SCO Equivalent
123   -ansi                        -a ansi
124   -posix                       -a posix
125   -Xpg4                        -a xpg4
126   -Xpg4plus                    -a xpg4plus
127   -Xods30                      -a ods30
128
129   As with SCO, the default is XPG4 plus mode. SCO also allows you to
130   specify a C dialect with -Xt, -Xa, -Xc, -Xk and -Xm. These are passed
131   on to the assembler and linker in the same way that the SCO compiler
132   does.
133
134   SCO also allows you to compile, link and generate either ELF or COFF
135   binaries. With gcc, we now only support ELF mode.
136
137   GCC also requires that the user has installed OSS646, the Execution
138   Environment Update, or is running release 5.0.7 or later. This has
139   many fixes to the ELF link editor and assembler, and a considerably
140   improved libc and RTLD.
141
142   In terms of tool usage, we want to use the standard link editor always,
143   and either the GNU assembler or the native assembler. With OSS646 the
144   native assembler has grown up quite a bit. Some of the specs below
145   assume that /usr/gnu is the prefix for the GNU tools, because thats
146   where the SCO provided ones go. This is especially important for
147   include and library search path ordering. We want to look in /usr/gnu
148   first because frequently people are linking against -lintl, and they
149   MEAN to link with gettext. What they get is the SCO intl library. Its
150   a REAL pity that GNU gettext chose that name; perhaps in a future
151   version they can be persuaded to change it to -lgnuintl and have a
152   link so that -lintl will work for other systems. The same goes for
153   header files. We want /usr/gnu/include searched for before the system
154   header files. Hence the -isystem /usr/gnu/include in the CPP_SPEC.
155   We get /usr/gnu/lib first by virtue of the MD_STARTFILE_PREFIX below.
156*/
157
158#define MD_STARTFILE_PREFIX	"/usr/gnu/lib/"
159#define MD_STARTFILE_PREFIX_1	"/usr/ccs/lib/"
160
161#if USE_GAS
162# define MD_EXEC_PREFIX		"/usr/gnu/bin/"
163#else
164# define MD_EXEC_PREFIX		"/usr/ccs/bin/elf/"
165#endif
166
167/* Always use the system linker, please.  */
168#ifndef DEFAULT_LINKER
169# define DEFAULT_LINKER		"/usr/ccs/bin/elf/ld"
170#endif
171
172/* Set up assembler flags for PIC and ELF compilations */
173#undef ASM_SPEC
174
175#if USE_GAS
176  /* Leave ASM_SPEC undefined so we pick up the master copy from gcc.c  */
177#else
178#define ASM_SPEC \
179   "%{Ym,*} %{Yd,*} %{Wa,*:%*} \
180    -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}"
181#endif
182
183/*
184 * Use crti.o for shared objects, crt1.o for normal executables. Make sure
185 * to recognize both -G and -shared as a valid way of introducing shared
186 * library generation. This is important for backwards compatibility.
187 */
188
189#undef STARTFILE_SPEC
190#define STARTFILE_SPEC \
191 "%{pg:%e-pg not supported on this platform} \
192  %{p:%{pp:%e-p and -pp specified - pick one}} \
193 %{!shared:\
194   %{!symbolic: \
195    %{!G: \
196     %{pp:pcrt1elf.o%s}%{p:mcrt1.o%s}%{!p:%{!pp:crt1.o%s}}}}} \
197  crti.o%s \
198  %{ansi:values-Xc.o%s} \
199  %{!ansi: \
200   %{traditional:values-Xt.o%s} \
201    %{!traditional: \
202     %{Xa:values-Xa.o%s} \
203      %{!Xa:%{Xc:values-Xc.o%s} \
204       %{!Xc:%{Xk:values-Xk.o%s} \
205        %{!Xk:%{Xt:values-Xt.o%s} \
206         %{!Xt:values-Xa.o%s}}}}}} \
207  crtbegin.o%s"
208
209#undef ENDFILE_SPEC
210#define ENDFILE_SPEC \
211 "crtend.o%s crtn.o%s"
212
213#define TARGET_OS_CPP_BUILTINS()				\
214  do								\
215    {								\
216	builtin_define ("__unix");				\
217	builtin_define ("_SCO_DS");				\
218	builtin_define ("_SCO_DS_LL");				\
219	builtin_define ("_SCO_ELF");				\
220	builtin_define ("_M_I386");				\
221	builtin_define ("_M_XENIX");				\
222	builtin_define ("_M_UNIX");				\
223	builtin_assert ("system=svr3");				\
224	if (flag_iso)						\
225	  cpp_define (pfile, "_STRICT_ANSI");			\
226	if (flag_pic)						\
227	  {							\
228	    builtin_define ("__PIC__");				\
229	    builtin_define ("__pic__");				\
230	  }							\
231    }								\
232  while (0)
233
234#undef CPP_SPEC
235#define CPP_SPEC "\
236  -isystem /usr/gnu/include \
237  %{!Xods30:-D_STRICT_NAMES} \
238  %{!ansi:%{!posix:%{!Xods30:-D_SCO_XPG_VERS=4}}} \
239  %{ansi:-isystem include/ansi%s -isystem /usr/include/ansi} \
240  %{!ansi: \
241   %{posix:-isystem include/posix%s -isystem /usr/include/posix \
242           -D_POSIX_C_SOURCE=2 -D_POSIX_SOURCE=1} \
243    %{!posix:%{Xpg4:-isystem include/xpg4%s -isystem /usr/include/xpg4 \
244                    -D_XOPEN_SOURCE=1} \
245     %{!Xpg4:-D_M_I86 -D_M_I86SM -D_M_INTERNAT -D_M_SDATA -D_M_STEXT \
246             -D_M_BITFIELDS -D_M_SYS5 -D_M_SYSV -D_M_SYSIII \
247             -D_M_WORDSWAP -Dunix -DM_I386 -DM_UNIX -DM_XENIX \
248             %{Xods30:-isystem include/ods_30_compat%s \
249                      -isystem /usr/include/ods_30_compat \
250                      -D_SCO_ODS_30 -DM_I86 -DM_I86SM -DM_SDATA -DM_STEXT \
251                      -DM_BITFIELDS -DM_SYS5 -DM_SYSV -DM_INTERNAT -DM_SYSIII \
252                      -DM_WORDSWAP}}}} \
253  %{scointl:-DM_INTERNAT -D_M_INTERNAT} \
254  %{Xa:-D_SCO_C_DIALECT=1} \
255  %{!Xa:%{Xc:-D_SCO_C_DIALECT=3} \
256   %{!Xc:%{Xk:-D_SCO_C_DIALECT=4} \
257    %{!Xk:%{Xt:-D_SCO_C_DIALECT=2} \
258     %{!Xt:-D_SCO_C_DIALECT=1}}}}"
259
260#undef LINK_SPEC
261#define LINK_SPEC \
262 "%{!shared:%{!symbolic:%{!G:-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}}} \
263  %{Wl,*:%*} %{YP,*} %{YL,*} %{YU,*} \
264  %{!YP,*:%{p:-YP,/usr/ccs/libp:/lib/libp:/usr/lib/libp:/usr/ccs/lib:/lib:/usr/lib} \
265   %{!p:-YP,/usr/ccs/lib:/lib:/usr/lib}} \
266  %{h*} %{static:-dn -Bstatic %{G:%e-G and -static are mutually exclusive}} \
267  %{shared:%{!G:-G}} %{G:%{!shared:-G}} %{shared:%{G:-G}} \
268  %{shared:-dy %{symbolic:-Bsymbolic -G} %{z*}} %{R*} %{Y*} \
269  %{Qn:} %{!Qy:-Qn} -z alt_resolve"
270
271/* Library spec. If we are not building a shared library, provide the
272   standard libraries, as per the SCO compiler.  */
273
274#undef LIB_SPEC
275#define LIB_SPEC \
276 "%{shared:%{!G:pic/libgcc.a%s}} \
277  %{G:%{!shared:pic/libgcc.a%s}} \
278  %{shared:%{G:pic/libgcc.a%s}} \
279  %{p:%{!pp:-lelfprof -lelf}} %{pp:%{!p:-lelfprof -lelf}} \
280  %{!shared:%{!symbolic:%{!G:-lcrypt -lgen -lc}}}"
281
282#undef LIBGCC_SPEC
283#define LIBGCC_SPEC \
284 "%{!shared:%{!G:-lgcc}}"
285
286/* Here for legacy support only so we still accept -melf flag */
287#define MASK_COFF     		010000000000	/* Mask for COFF generation */
288#define TARGET_ELF              (1)
289
290#undef SUBTARGET_SWITCHES
291#define SUBTARGET_SWITCHES 					\
292	{ "elf", -MASK_COFF, N_("Generate ELF output")  },
293
294/* Handle special EH pointer encodings.  Absolute, pc-relative, and
295   indirect are handled automatically.  */
296#define ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX(FILE, ENCODING, SIZE, ADDR, DONE) \
297  do {									\
298    if ((SIZE) == 4 && ((ENCODING) & 0x70) == DW_EH_PE_datarel)		\
299      {									\
300        fputs (ASM_LONG, FILE);						\
301        assemble_name (FILE, XSTR (ADDR, 0));				\
302	fputs (((ENCODING) & DW_EH_PE_indirect ? "@GOT" : "@GOTOFF"), FILE); \
303        goto DONE;							\
304      }									\
305  } while (0)
306
307/* Used by crtstuff.c to initialize the base of data-relative relocations.
308   These are GOT relative on x86, so return the pic register.  */
309#ifdef __PIC__
310#define CRT_GET_RFIB_DATA(BASE)			\
311  {						\
312    register void *ebx_ __asm__("ebx");		\
313    BASE = ebx_;				\
314  }
315#else
316#define CRT_GET_RFIB_DATA(BASE)						\
317  __asm__ ("call\t.LPR%=\n"						\
318	   ".LPR%=:\n\t"						\
319	   "popl\t%0\n\t"						\
320	   /* Due to a GAS bug, this cannot use EAX.  That encodes	\
321	      smaller than the traditional EBX, which results in the	\
322	      offset being off by one.  */				\
323	   "addl\t$_GLOBAL_OFFSET_TABLE_+[.-.LPR%=],%0"			\
324	   : "=d"(BASE))
325#endif
326
327