]>
Commit | Line | Data |
---|---|---|
70e5e841 CF |
1 | /* Operating system specific defines to be used when targeting GCC for |
2 | hosting on Windows32, using a Unix style C library and tools. | |
fe9565ed KH |
3 | Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, |
4 | 2004, 2005 | |
70e5e841 CF |
5 | Free Software Foundation, Inc. |
6 | ||
e20285ad | 7 | This file is part of GCC. |
70e5e841 | 8 | |
e20285ad | 9 | GCC is free software; you can redistribute it and/or modify |
70e5e841 CF |
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 | ||
e20285ad | 14 | GCC is distributed in the hope that it will be useful, |
70e5e841 CF |
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 | |
e20285ad | 20 | along with GCC; see the file COPYING. If not, write to |
39d14dda KC |
21 | the Free Software Foundation, 51 Franklin Street, Fifth Floor, |
22 | Boston, MA 02110-1301, USA. */ | |
70e5e841 CF |
23 | |
24 | #define DBX_DEBUGGING_INFO 1 | |
25 | #define SDB_DEBUGGING_INFO 1 | |
26 | #undef PREFERRED_DEBUGGING_TYPE | |
27 | #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG | |
28 | ||
d38bc601 BF |
29 | #ifdef HAVE_GAS_PE_SECREL32_RELOC |
30 | #define DWARF2_DEBUGGING_INFO 1 | |
31 | ||
32 | #undef DBX_REGISTER_NUMBER | |
33 | #define DBX_REGISTER_NUMBER(n) (write_symbols == DWARF2_DEBUG \ | |
34 | ? svr4_dbx_register_map[n] \ | |
35 | : dbx_register_map[n]) | |
36 | ||
37 | /* Use section relative relocations for debugging offsets. Unlike | |
38 | other targets that fake this by putting the section VMA at 0, PE | |
39 | won't allow it. */ | |
40 | #define ASM_OUTPUT_DWARF_OFFSET(FILE, SIZE, LABEL) \ | |
41 | do { \ | |
42 | if (SIZE != 4) \ | |
43 | abort (); \ | |
44 | \ | |
45 | fputs ("\t.secrel32\t", FILE); \ | |
46 | assemble_name (FILE, LABEL); \ | |
47 | } while (0) | |
48 | #endif | |
49 | ||
70e5e841 CF |
50 | #define TARGET_EXECUTABLE_SUFFIX ".exe" |
51 | ||
52 | #include <stdio.h> | |
53 | ||
70e5e841 CF |
54 | #define MAYBE_UWIN_CPP_BUILTINS() /* Nothing. */ |
55 | ||
70e5e841 CF |
56 | #define TARGET_OS_CPP_BUILTINS() \ |
57 | do \ | |
58 | { \ | |
59 | builtin_define ("_X86_=1"); \ | |
60 | builtin_assert ("system=winnt"); \ | |
61 | builtin_define ("__stdcall=__attribute__((__stdcall__))"); \ | |
62 | builtin_define ("__fastcall=__attribute__((__fastcall__))"); \ | |
63 | builtin_define ("__cdecl=__attribute__((__cdecl__))"); \ | |
70e5e841 CF |
64 | if (!flag_iso) \ |
65 | { \ | |
66 | builtin_define ("_stdcall=__attribute__((__stdcall__))"); \ | |
67 | builtin_define ("_fastcall=__attribute__((__fastcall__))"); \ | |
68 | builtin_define ("_cdecl=__attribute__((__cdecl__))"); \ | |
69 | } \ | |
535306d0 DS |
70 | /* Even though linkonce works with static libs, this is needed \ |
71 | to compare typeinfo symbols across dll boundaries. */ \ | |
72 | builtin_define ("__GXX_MERGED_TYPEINFO_NAMES=0"); \ | |
70e5e841 CF |
73 | MAYBE_UWIN_CPP_BUILTINS (); \ |
74 | EXTRA_OS_CPP_BUILTINS (); \ | |
75 | } \ | |
76 | while (0) | |
77 | ||
78 | /* Get tree.c to declare a target-specific specialization of | |
79 | merge_decl_attributes. */ | |
b2ca3702 | 80 | #define TARGET_DLLIMPORT_DECL_ATTRIBUTES 1 |
70e5e841 CF |
81 | |
82 | /* This macro defines names of additional specifications to put in the specs | |
83 | that can be used in various specifications like CC1_SPEC. Its definition | |
84 | is an initializer with a subgrouping for each command option. | |
85 | ||
86 | Each subgrouping contains a string constant, that defines the | |
e20285ad | 87 | specification name, and a string constant that used by the GCC driver |
70e5e841 CF |
88 | program. |
89 | ||
90 | Do not define this macro if it does not need to do anything. */ | |
91 | ||
92 | #undef SUBTARGET_EXTRA_SPECS | |
9c808aad | 93 | #define SUBTARGET_EXTRA_SPECS \ |
70e5e841 CF |
94 | { "mingw_include_path", DEFAULT_TARGET_MACHINE } |
95 | ||
96 | #undef MATH_LIBRARY | |
97 | #define MATH_LIBRARY "" | |
98 | ||
99 | #define SIZE_TYPE "unsigned int" | |
100 | #define PTRDIFF_TYPE "int" | |
101 | #define WCHAR_TYPE_SIZE 16 | |
102 | #define WCHAR_TYPE "short unsigned int" | |
103 | ||
104 | \f | |
105 | /* Enable parsing of #pragma pack(push,<n>) and #pragma pack(pop). */ | |
106 | #define HANDLE_PRAGMA_PACK_PUSH_POP 1 | |
107 | ||
108 | union tree_node; | |
109 | #define TREE union tree_node * | |
110 | \f | |
d6b5193b RS |
111 | #define drectve_section() \ |
112 | (fprintf (asm_out_file, "\t.section .drectve\n"), \ | |
113 | in_section = NULL) | |
70e5e841 | 114 | |
7f27395d DS |
115 | /* Older versions of gas don't handle 'r' as data. |
116 | Explicitly set data flag with 'd'. */ | |
117 | #define READONLY_DATA_SECTION_ASM_OP "\t.section .rdata,\"dr\"" | |
118 | ||
70e5e841 CF |
119 | /* Don't allow flag_pic to propagate since gas may produce invalid code |
120 | otherwise. */ | |
121 | ||
122 | #undef SUBTARGET_OVERRIDE_OPTIONS | |
123 | #define SUBTARGET_OVERRIDE_OPTIONS \ | |
124 | do { \ | |
125 | if (flag_pic) \ | |
126 | { \ | |
d4ee4d25 | 127 | warning (0, "-f%s ignored for target (all code is position independent)",\ |
70e5e841 CF |
128 | (flag_pic > 1) ? "PIC" : "pic"); \ |
129 | flag_pic = 0; \ | |
130 | } \ | |
131 | } while (0) \ | |
132 | ||
133 | /* Define this macro if references to a symbol must be treated | |
134 | differently depending on something about the variable or | |
135 | function named by the symbol (such as what section it is in). | |
136 | ||
9c808aad | 137 | On i386 running Windows NT, modify the assembler name with a suffix |
70e5e841 | 138 | consisting of an atsign (@) followed by string of digits that represents |
9c808aad | 139 | the number of bytes of arguments passed to the function, if it has the |
70e5e841 CF |
140 | attribute STDCALL. |
141 | ||
9c808aad AJ |
142 | In addition, we must mark dll symbols specially. Definitions of |
143 | dllexport'd objects install some info in the .drectve section. | |
70e5e841 | 144 | References to dllimport'd objects are fetched indirectly via |
9c808aad | 145 | _imp__. If both are declared, dllexport overrides. This is also |
70e5e841 CF |
146 | needed to implement one-only vtables: they go into their own |
147 | section and we need to set DECL_SECTION_NAME so we do that here. | |
148 | Note that we can be called twice on the same decl. */ | |
149 | ||
f18faab7 DS |
150 | #undef SUBTARGET_ENCODE_SECTION_INFO |
151 | #define SUBTARGET_ENCODE_SECTION_INFO i386_pe_encode_section_info | |
70e5e841 CF |
152 | #undef TARGET_STRIP_NAME_ENCODING |
153 | #define TARGET_STRIP_NAME_ENCODING i386_pe_strip_name_encoding_full | |
154 | \f | |
155 | /* Output a reference to a label. */ | |
156 | #undef ASM_OUTPUT_LABELREF | |
157 | #define ASM_OUTPUT_LABELREF i386_pe_output_labelref | |
158 | ||
f18faab7 DS |
159 | #undef COMMON_ASM_OP |
160 | #define COMMON_ASM_OP "\t.comm\t" | |
161 | ||
70e5e841 CF |
162 | /* Output a common block. */ |
163 | #undef ASM_OUTPUT_COMMON | |
164 | #define ASM_OUTPUT_COMMON(STREAM, NAME, SIZE, ROUNDED) \ | |
165 | do { \ | |
166 | if (i386_pe_dllexport_name_p (NAME)) \ | |
167 | i386_pe_record_exported_symbol (NAME, 1); \ | |
168 | if (! i386_pe_dllimport_name_p (NAME)) \ | |
169 | { \ | |
9c808aad | 170 | fprintf ((STREAM), "\t.comm\t"); \ |
70e5e841 CF |
171 | assemble_name ((STREAM), (NAME)); \ |
172 | fprintf ((STREAM), ", %d\t%s %d\n", \ | |
74eda121 | 173 | (int)(ROUNDED), ASM_COMMENT_START, (int)(SIZE)); \ |
70e5e841 CF |
174 | } \ |
175 | } while (0) | |
176 | ||
177 | /* Output the label for an initialized variable. */ | |
178 | #undef ASM_DECLARE_OBJECT_NAME | |
9c808aad | 179 | #define ASM_DECLARE_OBJECT_NAME(STREAM, NAME, DECL) \ |
70e5e841 CF |
180 | do { \ |
181 | if (i386_pe_dllexport_name_p (NAME)) \ | |
182 | i386_pe_record_exported_symbol (NAME, 1); \ | |
183 | ASM_OUTPUT_LABEL ((STREAM), (NAME)); \ | |
184 | } while (0) | |
185 | ||
186 | \f | |
187 | /* Emit code to check the stack when allocating more that 4000 | |
188 | bytes in one go. */ | |
189 | ||
190 | #define CHECK_STACK_LIMIT 4000 | |
191 | ||
192 | /* By default, target has a 80387, uses IEEE compatible arithmetic, | |
193 | returns float values in the 387 and needs stack probes. | |
43f3a59d | 194 | We also align doubles to 64-bits for MSVC default compatibility. */ |
70e5e841 CF |
195 | |
196 | #undef TARGET_SUBTARGET_DEFAULT | |
197 | #define TARGET_SUBTARGET_DEFAULT \ | |
198 | (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS | MASK_STACK_PROBE \ | |
199 | | MASK_ALIGN_DOUBLE) | |
200 | ||
201 | /* This is how to output an assembler line | |
202 | that says to advance the location counter | |
203 | to a multiple of 2**LOG bytes. */ | |
204 | ||
205 | #undef ASM_OUTPUT_ALIGN | |
206 | #define ASM_OUTPUT_ALIGN(FILE,LOG) \ | |
207 | if ((LOG)!=0) fprintf ((FILE), "\t.align %d\n", 1<<(LOG)) | |
208 | ||
15072eb1 ZW |
209 | /* Windows uses explicit import from shared libraries. */ |
210 | #define MULTIPLE_SYMBOL_SPACES 1 | |
70e5e841 | 211 | |
9c808aad | 212 | extern void i386_pe_unique_section (TREE, int); |
70e5e841 | 213 | #define TARGET_ASM_UNIQUE_SECTION i386_pe_unique_section |
ab5c8549 | 214 | #define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section |
70e5e841 CF |
215 | |
216 | #define SUPPORTS_ONE_ONLY 1 | |
217 | ||
218 | /* Switch into a generic section. */ | |
219 | #define TARGET_ASM_NAMED_SECTION i386_pe_asm_named_section | |
220 | ||
221 | /* Select attributes for named sections. */ | |
222 | #define TARGET_SECTION_TYPE_FLAGS i386_pe_section_type_flags | |
223 | ||
224 | /* Write the extra assembler code needed to declare a function | |
225 | properly. If we are generating SDB debugging information, this | |
226 | will happen automatically, so we only need to handle other cases. */ | |
227 | #undef ASM_DECLARE_FUNCTION_NAME | |
228 | #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ | |
229 | do \ | |
230 | { \ | |
231 | if (i386_pe_dllexport_name_p (NAME)) \ | |
232 | i386_pe_record_exported_symbol (NAME, 0); \ | |
233 | if (write_symbols != SDB_DEBUG) \ | |
234 | i386_pe_declare_function_type (FILE, NAME, TREE_PUBLIC (DECL)); \ | |
235 | ASM_OUTPUT_LABEL (FILE, NAME); \ | |
236 | } \ | |
237 | while (0) | |
238 | ||
239 | /* Add an external function to the list of functions to be declared at | |
240 | the end of the file. */ | |
241 | #define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \ | |
242 | do \ | |
243 | { \ | |
244 | if (TREE_CODE (DECL) == FUNCTION_DECL) \ | |
3ce9c824 | 245 | i386_pe_record_external_function ((DECL), (NAME)); \ |
70e5e841 CF |
246 | } \ |
247 | while (0) | |
248 | ||
249 | /* Declare the type properly for any external libcall. */ | |
250 | #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \ | |
251 | i386_pe_declare_function_type (FILE, XSTR (FUN, 0), 1) | |
252 | ||
253 | /* This says out to put a global symbol in the BSS section. */ | |
254 | #undef ASM_OUTPUT_ALIGNED_BSS | |
255 | #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ | |
256 | asm_output_aligned_bss ((FILE), (DECL), (NAME), (SIZE), (ALIGN)) | |
257 | ||
258 | /* Output function declarations at the end of the file. */ | |
a5fe455b ZW |
259 | #undef TARGET_ASM_FILE_END |
260 | #define TARGET_ASM_FILE_END i386_pe_file_end | |
70e5e841 CF |
261 | |
262 | #undef ASM_COMMENT_START | |
263 | #define ASM_COMMENT_START " #" | |
264 | ||
265 | /* DWARF2 Unwinding doesn't work with exception handling yet. To make | |
266 | it work, we need to build a libgcc_s.dll, and dcrt0.o should be | |
267 | changed to call __register_frame_info/__deregister_frame_info. */ | |
268 | #define DWARF2_UNWIND_INFO 0 | |
269 | ||
270 | /* Don't assume anything about the header files. */ | |
271 | #define NO_IMPLICIT_EXTERN_C | |
272 | ||
273 | #undef PROFILE_HOOK | |
274 | #define PROFILE_HOOK(LABEL) \ | |
275 | if (MAIN_NAME_P (DECL_NAME (current_function_decl))) \ | |
276 | { \ | |
f84d109f | 277 | emit_call_insn (gen_rtx_CALL (VOIDmode, \ |
70e5e841 CF |
278 | gen_rtx_MEM (FUNCTION_MODE, \ |
279 | gen_rtx_SYMBOL_REF (Pmode, "_monstartup")), \ | |
280 | const0_rtx)); \ | |
281 | } | |
282 | ||
283 | /* Java Native Interface (JNI) methods on Win32 are invoked using the | |
284 | stdcall calling convention. */ | |
285 | #undef MODIFY_JNI_METHOD_CALL | |
286 | #define MODIFY_JNI_METHOD_CALL(MDECL) \ | |
287 | build_type_attribute_variant ((MDECL), \ | |
288 | build_tree_list (get_identifier ("stdcall"), \ | |
289 | NULL)) | |
290 | ||
291 | /* External function declarations. */ | |
292 | ||
3ce9c824 | 293 | extern void i386_pe_record_external_function (tree, const char *); |
9c808aad AJ |
294 | extern void i386_pe_declare_function_type (FILE *, const char *, int); |
295 | extern void i386_pe_record_exported_symbol (const char *, int); | |
296 | extern void i386_pe_file_end (void); | |
297 | extern int i386_pe_dllexport_name_p (const char *); | |
298 | extern int i386_pe_dllimport_name_p (const char *); | |
70e5e841 CF |
299 | |
300 | /* For Win32 ABI compatibility */ | |
301 | #undef DEFAULT_PCC_STRUCT_RETURN | |
302 | #define DEFAULT_PCC_STRUCT_RETURN 0 | |
303 | ||
304 | /* MSVC returns aggregate types of up to 8 bytes via registers. | |
305 | See i386.c:ix86_return_in_memory. */ | |
306 | #undef MS_AGGREGATE_RETURN | |
307 | #define MS_AGGREGATE_RETURN 1 | |
308 | ||
309 | /* No data type wants to be aligned rounder than this. */ | |
310 | #undef BIGGEST_ALIGNMENT | |
311 | #define BIGGEST_ALIGNMENT 128 | |
312 | ||
313 | /* Native complier aligns internal doubles in structures on dword boundaries. */ | |
314 | #undef BIGGEST_FIELD_ALIGNMENT | |
315 | #define BIGGEST_FIELD_ALIGNMENT 64 | |
316 | ||
317 | /* A bit-field declared as `int' forces `int' alignment for the struct. */ | |
318 | #undef PCC_BITFIELD_TYPE_MATTERS | |
319 | #define PCC_BITFIELD_TYPE_MATTERS 1 | |
320 | #define GROUP_BITFIELDS_BY_ALIGN TYPE_NATIVE(rec) | |
321 | ||
322 | /* Enable alias attribute support. */ | |
323 | #ifndef SET_ASM_OP | |
324 | #define SET_ASM_OP "\t.set\t" | |
325 | #endif | |
1e8a5248 DS |
326 | /* This implements the `alias' attribute, keeping any stdcall or |
327 | fastcall decoration. */ | |
328 | #undef ASM_OUTPUT_DEF_FROM_DECLS | |
329 | #define ASM_OUTPUT_DEF_FROM_DECLS(STREAM, DECL, TARGET) \ | |
330 | do \ | |
331 | { \ | |
332 | const char *alias; \ | |
333 | rtx rtlname = XEXP (DECL_RTL (DECL), 0); \ | |
334 | if (GET_CODE (rtlname) == SYMBOL_REF) \ | |
335 | alias = XSTR (rtlname, 0); \ | |
336 | else \ | |
337 | abort (); \ | |
034f2316 DS |
338 | if (TREE_CODE (DECL) == FUNCTION_DECL) \ |
339 | i386_pe_declare_function_type (STREAM, alias, \ | |
340 | TREE_PUBLIC (DECL)); \ | |
1e8a5248 DS |
341 | ASM_OUTPUT_DEF (STREAM, alias, IDENTIFIER_POINTER (TARGET)); \ |
342 | } while (0) | |
70e5e841 | 343 | |
c37780f5 AL |
344 | /* GNU as supports weak symbols on PECOFF. */ |
345 | #ifdef HAVE_GAS_WEAK | |
346 | #define ASM_WEAKEN_LABEL(FILE, NAME) \ | |
347 | do \ | |
348 | { \ | |
349 | fputs ("\t.weak\t", (FILE)); \ | |
350 | assemble_name ((FILE), (NAME)); \ | |
351 | fputc ('\n', (FILE)); \ | |
352 | } \ | |
353 | while (0) | |
354 | #endif /* HAVE_GAS_WEAK */ | |
355 | ||
e50e6b88 DS |
356 | /* FIXME: SUPPORTS_WEAK && TARGET_HAVE_NAMED_SECTIONS is true, |
357 | but for .jcr section to work we also need crtbegin and crtend | |
358 | objects. */ | |
359 | #define TARGET_USE_JCR_SECTION 0 | |
360 | ||
4a77e08c DS |
361 | /* Decide whether it is safe to use a local alias for a virtual function |
362 | when constructing thunks. */ | |
363 | #undef TARGET_USE_LOCAL_THUNK_ALIAS_P | |
364 | #define TARGET_USE_LOCAL_THUNK_ALIAS_P(DECL) (!DECL_ONE_ONLY (DECL)) | |
365 | ||
a20f6f00 DS |
366 | #define SUBTARGET_ATTRIBUTE_TABLE \ |
367 | /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */ \ | |
368 | { "selectany", 0, 0, true, false, false, ix86_handle_selectany_attribute } | |
369 | ||
d68c2f42 DS |
370 | /* mcount() does not need a counter variable. */ |
371 | #undef NO_PROFILE_COUNTERS | |
372 | #define NO_PROFILE_COUNTERS 1 | |
373 | ||
43d9ad1d DS |
374 | #define TARGET_VALID_DLLIMPORT_ATTRIBUTE_P i386_pe_valid_dllimport_attribute_p |
375 | #define TARGET_CXX_ADJUST_CLASS_AT_DEFINITION i386_pe_adjust_class_at_definition | |
376 | ||
70e5e841 CF |
377 | #undef TREE |
378 | ||
379 | #ifndef BUFSIZ | |
380 | # undef FILE | |
381 | #endif |