* Check in merge from gcc2. See ChangeLog.11 and ChangeLog.12
[gcc.git] / gcc / config / i386 / cygwin32.h
1 /* Operating system specific defines to be used when targeting GCC for
2 hosting on Windows NT 3.x, using a Unix style C library and tools,
3 as distinct from winnt.h, which is used to build GCC for use with a
4 windows style library and tool set and uses the Microsoft tools.
5 Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
6
7 This file is part of GNU CC.
8
9 GNU CC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
12 any later version.
13
14 GNU CC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GNU CC; see the file COPYING. If not, write to
21 the Free Software Foundation, 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA. */
23
24 #define YES_UNDERSCORES
25
26 #define DBX_DEBUGGING_INFO
27 #define SDB_DEBUGGING_INFO
28 #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
29
30 #include "i386/gas.h"
31 #include "dbxcoff.h"
32
33 #ifdef CPP_PREDEFINES
34 #undef CPP_PREDEFINES
35 #endif
36
37 #define CPP_PREDEFINES "-Di386 -D_WIN32 \
38 -D__CYGWIN32__ -DWINNT -D_X86_=1 -D__STDC__=1\
39 -D__stdcall=__attribute__((__stdcall__)) \
40 -D__cdecl=__attribute__((__cdecl__)) \
41 -Asystem(winnt) -Acpu(i386) -Amachine(i386)"
42
43 #undef CPP_SPEC
44 #define CPP_SPEC "-remap %(cpp_cpu) %[cpp_cpu] %{posix:-D_POSIX_SOURCE}"
45
46 /* We have to dynamic link to get to the system DLLs. All of libc, libm and
47 the Unix stuff is in cygwin.dll. The import library is called
48 'libcygwin.a'. For Windows applications, include more libraries, but
49 always include kernel32. We'd like to specific subsystem windows to
50 ld, but that doesn't work just yet. */
51
52 #undef LIB_SPEC
53 #define LIB_SPEC "-lcygwin %{mwindows:-luser32 -lgdi32 -lcomdlg32} -lkernel32 \
54 -ladvapi32 -lshell32"
55
56 #define LINK_SPEC "%{mwindows:--subsystem windows}"
57
58 /* Normally, -lgcc is not needed since everything in it is in the DLL, but we
59 want to allow things to be added to it when installing new versions of
60 GCC without making a new CYGWIN.DLL, so we leave it. */
61
62 #undef STARTFILE_SPEC
63 #define STARTFILE_SPEC "crt0%O%s"
64
65 #define SIZE_TYPE "unsigned int"
66 #define PTRDIFF_TYPE "int"
67 #define WCHAR_UNSIGNED 1
68 #define WCHAR_TYPE_SIZE 16
69 #define WCHAR_TYPE "short unsigned int"
70 #define HAVE_ATEXIT 1
71
72 #undef EXTRA_SECTIONS
73 #define EXTRA_SECTIONS in_ctor, in_dtor
74
75 #undef EXTRA_SECTION_FUNCTIONS
76 #define EXTRA_SECTION_FUNCTIONS \
77 CTOR_SECTION_FUNCTION \
78 DTOR_SECTION_FUNCTION
79
80 #define CTOR_SECTION_FUNCTION \
81 void \
82 ctor_section () \
83 { \
84 if (in_section != in_ctor) \
85 { \
86 fprintf (asm_out_file, "\t.section .ctor\n"); \
87 in_section = in_ctor; \
88 } \
89 }
90
91 #define DTOR_SECTION_FUNCTION \
92 void \
93 dtor_section () \
94 { \
95 if (in_section != in_dtor) \
96 { \
97 fprintf (asm_out_file, "\t.section .dtor\n"); \
98 in_section = in_dtor; \
99 } \
100 }
101
102 #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
103 do { \
104 ctor_section (); \
105 fprintf (FILE, "%s\t", ASM_LONG); \
106 assemble_name (FILE, NAME); \
107 fprintf (FILE, "\n"); \
108 } while (0)
109
110 #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
111 do { \
112 dtor_section (); \
113 fprintf (FILE, "%s\t", ASM_LONG); \
114 assemble_name (FILE, NAME); \
115 fprintf (FILE, "\n"); \
116 } while (0)
117
118 /* Define this macro if references to a symbol must be treated
119 differently depending on something about the variable or
120 function named by the symbol (such as what section it is in).
121
122 On i386, if using PIC, mark a SYMBOL_REF for a non-global symbol
123 so that we may access it directly in the GOT.
124
125 On i386 running Windows NT, modify the assembler name with a suffix
126 consisting of an atsign (@) followed by string of digits that represents
127 the number of bytes of arguments passed to the function, if it has the
128 attribute STDCALL. */
129
130 #ifdef ENCODE_SECTION_INFO
131 #undef ENCODE_SECTION_INFO
132 #define ENCODE_SECTION_INFO(DECL) \
133 do \
134 { \
135 if (flag_pic) \
136 { \
137 rtx rtl = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \
138 ? TREE_CST_RTL (DECL) : DECL_RTL (DECL)); \
139 SYMBOL_REF_FLAG (XEXP (rtl, 0)) \
140 = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd' \
141 || ! TREE_PUBLIC (DECL)); \
142 } \
143 if (TREE_CODE (DECL) == FUNCTION_DECL) \
144 if (lookup_attribute ("stdcall", \
145 TYPE_ATTRIBUTES (TREE_TYPE (DECL)))) \
146 XEXP (DECL_RTL (DECL), 0) = \
147 gen_rtx (SYMBOL_REF, Pmode, gen_stdcall_suffix (DECL)); \
148 } \
149 while (0)
150 #endif
151
152 /* This macro gets just the user-specified name out of the string in a
153 SYMBOL_REF. Discard trailing @[NUM] encoded by ENCODE_SECTION_INFO. */
154
155 #undef STRIP_NAME_ENCODING
156 #define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME) \
157 do { \
158 char *_p; \
159 char *_name = ((SYMBOL_NAME) + ((SYMBOL_NAME)[0] == '*')); \
160 for (_p = _name; *_p && *_p != '@'; ++_p) \
161 ; \
162 if (*_p == '@') \
163 { \
164 int _len = _p - _name; \
165 (VAR) = (char *) alloca (_len + 1); \
166 strncpy ((VAR), _name, _len); \
167 (VAR)[_len] = '\0'; \
168 } \
169 else \
170 (VAR) = _name; \
171 } while (0)
172
173 /* Emit code to check the stack when allocating more that 4000
174 bytes in one go. */
175
176 #define CHECK_STACK_LIMIT 4000
177
178 /* By default, target has a 80387, uses IEEE compatible arithmetic,
179 and returns float values in the 387 and needs stack probes */
180 #undef TARGET_DEFAULT
181
182 #define TARGET_DEFAULT \
183 (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS | MASK_STACK_PROBE)
184
185 /* This is how to output an assembler line
186 that says to advance the location counter
187 to a multiple of 2**LOG bytes. */
188
189 #undef ASM_OUTPUT_ALIGN
190 #define ASM_OUTPUT_ALIGN(FILE,LOG) \
191 if ((LOG)!=0) fprintf ((FILE), "\t.align %d\n", 1<<(LOG))
192
193 /* Define this macro if in some cases global symbols from one translation
194 unit may not be bound to undefined symbols in another translation unit
195 without user intervention. For instance, under Microsoft Windows
196 symbols must be explicitly imported from shared libraries (DLLs). */
197 #define MULTIPLE_SYMBOL_SPACES
198
199 #define UNIQUE_SECTION_P(DECL) DECL_ONE_ONLY (DECL)
200 extern void i386_pe_unique_section ();
201 #define UNIQUE_SECTION(DECL,RELOC) i386_pe_unique_section (DECL, RELOC)
202
203 #define SUPPORTS_ONE_ONLY 1
204
205 /* A C statement to output something to the assembler file to switch to section
206 NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
207 NULL_TREE. Some target formats do not support arbitrary sections. Do not
208 define this macro in such cases. */
209 #undef ASM_OUTPUT_SECTION_NAME
210 #define ASM_OUTPUT_SECTION_NAME(STREAM, DECL, NAME, RELOC) \
211 do { \
212 if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL) \
213 fprintf (STREAM, "\t.section %s,\"x\"\n", (NAME)); \
214 else if ((DECL) && DECL_READONLY_SECTION (DECL, RELOC)) \
215 fprintf (STREAM, "\t.section %s,\"\"\n", (NAME)); \
216 else \
217 fprintf (STREAM, "\t.section %s,\"w\"\n", (NAME)); \
218 /* Functions may have been compiled at various levels of \
219 optimization so we can't use `same_size' here. Instead, \
220 have the linker pick one. */ \
221 if ((DECL) && DECL_ONE_ONLY (DECL)) \
222 fprintf (STREAM, "\t.linkonce %s\n", \
223 TREE_CODE (DECL) == FUNCTION_DECL \
224 ? "discard" : "same_size"); \
225 } while (0)
226
227 #undef ASM_COMMENT_START
228 #define ASM_COMMENT_START " #"
229
230 /* DWARF2 Unwinding doesn't work with exception handling yet. */
231 #define DWARF2_UNWIND_INFO 0
232
233 /* Don't assume anything about the header files. */
234 #define NO_IMPLICIT_EXTERN_C