]>
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. | |
85ec4feb | 3 | Copyright (C) 1995-2018 Free Software Foundation, Inc. |
70e5e841 | 4 | |
e20285ad | 5 | This file is part of GCC. |
70e5e841 | 6 | |
e20285ad | 7 | GCC is free software; you can redistribute it and/or modify |
70e5e841 | 8 | it under the terms of the GNU General Public License as published by |
2f83c7d6 | 9 | the Free Software Foundation; either version 3, or (at your option) |
70e5e841 CF |
10 | any later version. |
11 | ||
e20285ad | 12 | GCC is distributed in the hope that it will be useful, |
70e5e841 CF |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | GNU General Public License for more details. | |
16 | ||
17 | You should have received a copy of the GNU General Public License | |
2f83c7d6 NC |
18 | along with GCC; see the file COPYING3. If not see |
19 | <http://www.gnu.org/licenses/>. */ | |
70e5e841 | 20 | |
13c0a630 | 21 | #define DBX_DEBUGGING_INFO 1 |
13c0a630 | 22 | #if TARGET_64BIT_DEFAULT || defined (HAVE_GAS_PE_SECREL32_RELOC) |
ccf8e764 RH |
23 | #define DWARF2_DEBUGGING_INFO 1 |
24 | #endif | |
ccf8e764 | 25 | |
70e5e841 | 26 | #undef PREFERRED_DEBUGGING_TYPE |
13c0a630 | 27 | #if (DWARF2_DEBUGGING_INFO) |
ccf8e764 RH |
28 | #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG |
29 | #else | |
70e5e841 | 30 | #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG |
ccf8e764 RH |
31 | #endif |
32 | ||
f81c9774 RH |
33 | #undef TARGET_SEH |
34 | #define TARGET_SEH (TARGET_64BIT_MS_ABI && flag_unwind_tables) | |
35 | ||
36 | /* Win64 with SEH cannot represent DRAP stack frames. Disable its use. | |
37 | Force the use of different mechanisms to allocate aligned local data. */ | |
38 | #undef MAX_STACK_ALIGNMENT | |
39 | #define MAX_STACK_ALIGNMENT (TARGET_SEH ? 128 : MAX_OFILE_ALIGNMENT) | |
40 | ||
33505bcf EB |
41 | /* 32-bit Windows aligns the stack on a 4-byte boundary but SSE instructions |
42 | may require 16-byte alignment. */ | |
43 | #undef STACK_REALIGN_DEFAULT | |
44 | #define STACK_REALIGN_DEFAULT TARGET_SSE | |
45 | ||
f81c9774 RH |
46 | /* Support hooks for SEH. */ |
47 | #undef TARGET_ASM_UNWIND_EMIT | |
48 | #define TARGET_ASM_UNWIND_EMIT i386_pe_seh_unwind_emit | |
49 | #undef TARGET_ASM_UNWIND_EMIT_BEFORE_INSN | |
50 | #define TARGET_ASM_UNWIND_EMIT_BEFORE_INSN false | |
51 | #undef TARGET_ASM_FUNCTION_END_PROLOGUE | |
52 | #define TARGET_ASM_FUNCTION_END_PROLOGUE i386_pe_seh_end_prologue | |
bf1431e3 TG |
53 | #undef TARGET_ASM_EMIT_EXCEPT_PERSONALITY |
54 | #define TARGET_ASM_EMIT_EXCEPT_PERSONALITY i386_pe_seh_emit_except_personality | |
55 | #undef TARGET_ASM_INIT_SECTIONS | |
56 | #define TARGET_ASM_INIT_SECTIONS i386_pe_seh_init_sections | |
f81c9774 RH |
57 | #define SUBTARGET_ASM_UNWIND_INIT i386_pe_seh_init |
58 | ||
7c800926 KT |
59 | #undef DEFAULT_ABI |
60 | #define DEFAULT_ABI (TARGET_64BIT ? MS_ABI : SYSV_ABI) | |
70e5e841 | 61 | |
a3d7ab92 KT |
62 | #undef TARGET_PECOFF |
63 | #define TARGET_PECOFF 1 | |
64 | ||
ad211091 KT |
65 | #if ! defined (USE_MINGW64_LEADING_UNDERSCORES) |
66 | #undef USER_LABEL_PREFIX | |
67 | #define USER_LABEL_PREFIX (TARGET_64BIT ? "" : "_") | |
42ad7bc8 KT |
68 | |
69 | #undef LOCAL_LABEL_PREFIX | |
70 | #define LOCAL_LABEL_PREFIX (TARGET_64BIT ? "." : "") | |
71 | ||
72 | #undef ASM_GENERATE_INTERNAL_LABEL | |
73 | #define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \ | |
b13ea8bd | 74 | sprintf ((BUF), "*%s%s%ld", LOCAL_LABEL_PREFIX, \ |
42ad7bc8 KT |
75 | (PREFIX), (long)(NUMBER)) |
76 | ||
77 | #undef LPREFIX | |
78 | #define LPREFIX (TARGET_64BIT ? ".L" : "L") | |
79 | ||
ad211091 KT |
80 | #endif |
81 | ||
d38bc601 | 82 | #undef DBX_REGISTER_NUMBER |
ccf8e764 RH |
83 | #define DBX_REGISTER_NUMBER(n) \ |
84 | (TARGET_64BIT ? dbx64_register_map[n] \ | |
85 | : (write_symbols == DWARF2_DEBUG \ | |
86 | ? svr4_dbx_register_map[n] : dbx_register_map[n])) | |
d38bc601 | 87 | |
76f5e200 DS |
88 | /* Map gcc register number to DWARF 2 CFA column number. For 32 bit |
89 | target, always use the svr4_dbx_register_map for DWARF .eh_frame | |
90 | even if we don't use DWARF .debug_frame. */ | |
91 | #undef DWARF_FRAME_REGNUM | |
5c9ffc86 | 92 | #define DWARF_FRAME_REGNUM(n) \ |
6a1868c7 KT |
93 | (TARGET_64BIT ? dbx64_register_map[(n)] \ |
94 | : svr4_dbx_register_map[(n)]) | |
76f5e200 | 95 | |
6510e8bb | 96 | /* The 64-bit MS_ABI changes the set of call-used registers. */ |
2952a37e EB |
97 | #undef DWARF_FRAME_REGISTERS |
98 | #define DWARF_FRAME_REGISTERS (TARGET_64BIT ? 33 : 17) | |
99 | ||
13c0a630 | 100 | #ifdef HAVE_GAS_PE_SECREL32_RELOC |
d38bc601 BF |
101 | /* Use section relative relocations for debugging offsets. Unlike |
102 | other targets that fake this by putting the section VMA at 0, PE | |
103 | won't allow it. */ | |
7180b1a6 | 104 | #define ASM_OUTPUT_DWARF_OFFSET(FILE, SIZE, LABEL, OFFSET, SECTION) \ |
192d0f89 | 105 | do { \ |
4d508d59 RH |
106 | switch (SIZE) \ |
107 | { \ | |
108 | case 4: \ | |
109 | fputs ("\t.secrel32\t", FILE); \ | |
110 | assemble_name (FILE, LABEL); \ | |
45619677 | 111 | if ((OFFSET) != 0) \ |
70428957 | 112 | fprintf (FILE, "+" HOST_WIDE_INT_PRINT_DEC, \ |
cfff6cdd | 113 | (HOST_WIDE_INT) (OFFSET)); \ |
4d508d59 RH |
114 | break; \ |
115 | case 8: \ | |
116 | /* This is a hack. There is no 64-bit section relative \ | |
117 | relocation. However, the COFF format also does not \ | |
118 | support 64-bit file offsets; 64-bit applications are \ | |
119 | limited to 32-bits of code+data in any one module. \ | |
120 | Fake the 64-bit offset by zero-extending it. */ \ | |
121 | fputs ("\t.secrel32\t", FILE); \ | |
122 | assemble_name (FILE, LABEL); \ | |
45619677 | 123 | if ((OFFSET) != 0) \ |
70428957 | 124 | fprintf (FILE, "+" HOST_WIDE_INT_PRINT_DEC, \ |
cfff6cdd | 125 | (HOST_WIDE_INT) (OFFSET)); \ |
4d508d59 RH |
126 | fputs ("\n\t.long\t0", FILE); \ |
127 | break; \ | |
128 | default: \ | |
129 | gcc_unreachable (); \ | |
130 | } \ | |
d38bc601 BF |
131 | } while (0) |
132 | #endif | |
133 | ||
70e5e841 CF |
134 | #define TARGET_EXECUTABLE_SUFFIX ".exe" |
135 | ||
70e5e841 CF |
136 | #define TARGET_OS_CPP_BUILTINS() \ |
137 | do \ | |
138 | { \ | |
f345f84a KT |
139 | if (!TARGET_64BIT) \ |
140 | builtin_define ("_X86_=1"); \ | |
f81c9774 RH |
141 | if (TARGET_SEH) \ |
142 | builtin_define ("__SEH__"); \ | |
70e5e841 CF |
143 | builtin_assert ("system=winnt"); \ |
144 | builtin_define ("__stdcall=__attribute__((__stdcall__))"); \ | |
145 | builtin_define ("__fastcall=__attribute__((__fastcall__))"); \ | |
3e65f251 | 146 | builtin_define ("__thiscall=__attribute__((__thiscall__))"); \ |
70e5e841 | 147 | builtin_define ("__cdecl=__attribute__((__cdecl__))"); \ |
70e5e841 CF |
148 | if (!flag_iso) \ |
149 | { \ | |
150 | builtin_define ("_stdcall=__attribute__((__stdcall__))"); \ | |
151 | builtin_define ("_fastcall=__attribute__((__fastcall__))"); \ | |
3e65f251 | 152 | builtin_define ("_thiscall=__attribute__((__thiscall__))"); \ |
70e5e841 CF |
153 | builtin_define ("_cdecl=__attribute__((__cdecl__))"); \ |
154 | } \ | |
535306d0 DS |
155 | /* Even though linkonce works with static libs, this is needed \ |
156 | to compare typeinfo symbols across dll boundaries. */ \ | |
157 | builtin_define ("__GXX_MERGED_TYPEINFO_NAMES=0"); \ | |
b54c93b7 | 158 | builtin_define ("__GXX_TYPEINFO_EQUALITY_INLINE=0"); \ |
70e5e841 CF |
159 | EXTRA_OS_CPP_BUILTINS (); \ |
160 | } \ | |
161 | while (0) | |
162 | ||
163 | /* Get tree.c to declare a target-specific specialization of | |
164 | merge_decl_attributes. */ | |
b2ca3702 | 165 | #define TARGET_DLLIMPORT_DECL_ATTRIBUTES 1 |
70e5e841 CF |
166 | |
167 | /* This macro defines names of additional specifications to put in the specs | |
168 | that can be used in various specifications like CC1_SPEC. Its definition | |
169 | is an initializer with a subgrouping for each command option. | |
170 | ||
171 | Each subgrouping contains a string constant, that defines the | |
e20285ad | 172 | specification name, and a string constant that used by the GCC driver |
70e5e841 CF |
173 | program. |
174 | ||
175 | Do not define this macro if it does not need to do anything. */ | |
176 | ||
177 | #undef SUBTARGET_EXTRA_SPECS | |
9c808aad | 178 | #define SUBTARGET_EXTRA_SPECS \ |
70e5e841 CF |
179 | { "mingw_include_path", DEFAULT_TARGET_MACHINE } |
180 | ||
181 | #undef MATH_LIBRARY | |
182 | #define MATH_LIBRARY "" | |
183 | ||
d33d9e47 AI |
184 | #undef TARGET_LIBC_HAS_FUNCTION |
185 | #define TARGET_LIBC_HAS_FUNCTION no_c99_libc_has_function | |
186 | ||
ccf8e764 RH |
187 | #define SIZE_TYPE (TARGET_64BIT ? "long long unsigned int" : "unsigned int") |
188 | #define PTRDIFF_TYPE (TARGET_64BIT ? "long long int" : "int") | |
189 | ||
70e5e841 CF |
190 | #define WCHAR_TYPE_SIZE 16 |
191 | #define WCHAR_TYPE "short unsigned int" | |
192 | ||
ccf8e764 RH |
193 | /* Windows64 continues to use a 32-bit long type. */ |
194 | #undef LONG_TYPE_SIZE | |
195 | #define LONG_TYPE_SIZE 32 | |
196 | \f | |
d6b5193b RS |
197 | #define drectve_section() \ |
198 | (fprintf (asm_out_file, "\t.section .drectve\n"), \ | |
199 | in_section = NULL) | |
70e5e841 | 200 | |
7f27395d DS |
201 | /* Older versions of gas don't handle 'r' as data. |
202 | Explicitly set data flag with 'd'. */ | |
203 | #define READONLY_DATA_SECTION_ASM_OP "\t.section .rdata,\"dr\"" | |
204 | ||
70e5e841 CF |
205 | /* Don't allow flag_pic to propagate since gas may produce invalid code |
206 | otherwise. */ | |
207 | ||
208 | #undef SUBTARGET_OVERRIDE_OPTIONS | |
209 | #define SUBTARGET_OVERRIDE_OPTIONS \ | |
210 | do { \ | |
0a1d992e | 211 | flag_pic = TARGET_64BIT ? 1 : 0; \ |
6fd5332b | 212 | } while (0) |
70e5e841 CF |
213 | |
214 | /* Define this macro if references to a symbol must be treated | |
215 | differently depending on something about the variable or | |
216 | function named by the symbol (such as what section it is in). | |
217 | ||
9c808aad | 218 | On i386 running Windows NT, modify the assembler name with a suffix |
70e5e841 | 219 | consisting of an atsign (@) followed by string of digits that represents |
9c808aad | 220 | the number of bytes of arguments passed to the function, if it has the |
70e5e841 CF |
221 | attribute STDCALL. |
222 | ||
9c808aad AJ |
223 | In addition, we must mark dll symbols specially. Definitions of |
224 | dllexport'd objects install some info in the .drectve section. | |
70e5e841 | 225 | References to dllimport'd objects are fetched indirectly via |
9c808aad | 226 | _imp__. If both are declared, dllexport overrides. This is also |
70e5e841 CF |
227 | needed to implement one-only vtables: they go into their own |
228 | section and we need to set DECL_SECTION_NAME so we do that here. | |
229 | Note that we can be called twice on the same decl. */ | |
230 | ||
f18faab7 | 231 | #define SUBTARGET_ENCODE_SECTION_INFO i386_pe_encode_section_info |
f18faab7 | 232 | |
463d5aa0 KT |
233 | /* Local and global relocs can be placed always into readonly memory |
234 | for PE-COFF targets. */ | |
235 | #undef TARGET_ASM_RELOC_RW_MASK | |
236 | #define TARGET_ASM_RELOC_RW_MASK i386_pe_reloc_rw_mask | |
237 | ||
70e5e841 | 238 | /* Output a common block. */ |
da489f73 RH |
239 | #undef ASM_OUTPUT_ALIGNED_DECL_COMMON |
240 | #define ASM_OUTPUT_ALIGNED_DECL_COMMON \ | |
241 | i386_pe_asm_output_aligned_decl_common | |
70e5e841 CF |
242 | |
243 | /* Output the label for an initialized variable. */ | |
244 | #undef ASM_DECLARE_OBJECT_NAME | |
9c808aad | 245 | #define ASM_DECLARE_OBJECT_NAME(STREAM, NAME, DECL) \ |
70e5e841 | 246 | do { \ |
da489f73 | 247 | i386_pe_maybe_record_exported_symbol (DECL, NAME, 1); \ |
70e5e841 CF |
248 | ASM_OUTPUT_LABEL ((STREAM), (NAME)); \ |
249 | } while (0) | |
250 | ||
763a27ee DS |
251 | /* Output a reference to a label. Fastcall function symbols |
252 | keep their '@' prefix, while other symbols are prefixed | |
6110c44a | 253 | with user_label_prefix. */ |
763a27ee DS |
254 | #undef ASM_OUTPUT_LABELREF |
255 | #define ASM_OUTPUT_LABELREF(STREAM, NAME) \ | |
256 | do { \ | |
257 | if ((NAME)[0] != FASTCALL_PREFIX) \ | |
6110c44a | 258 | fputs (user_label_prefix, (STREAM)); \ |
763a27ee DS |
259 | fputs ((NAME), (STREAM)); \ |
260 | } while (0) | |
261 | ||
77754180 DK |
262 | /* This does much the same in memory rather than to a stream. */ |
263 | #undef TARGET_MANGLE_ASSEMBLER_NAME | |
264 | #define TARGET_MANGLE_ASSEMBLER_NAME i386_pe_mangle_assembler_name | |
265 | ||
70e5e841 | 266 | \f |
ccf8e764 | 267 | /* Emit code to check the stack when allocating more than 4000 |
70e5e841 | 268 | bytes in one go. */ |
70e5e841 CF |
269 | #define CHECK_STACK_LIMIT 4000 |
270 | ||
ccf8e764 | 271 | #undef STACK_BOUNDARY |
6510e8bb | 272 | #define STACK_BOUNDARY (TARGET_64BIT && ix86_abi == MS_ABI ? 128 : BITS_PER_WORD) |
ccf8e764 | 273 | |
70e5e841 CF |
274 | /* By default, target has a 80387, uses IEEE compatible arithmetic, |
275 | returns float values in the 387 and needs stack probes. | |
43f3a59d | 276 | We also align doubles to 64-bits for MSVC default compatibility. */ |
70e5e841 CF |
277 | |
278 | #undef TARGET_SUBTARGET_DEFAULT | |
279 | #define TARGET_SUBTARGET_DEFAULT \ | |
ccf8e764 RH |
280 | (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS \ |
281 | | MASK_STACK_PROBE | MASK_ALIGN_DOUBLE) | |
70e5e841 | 282 | |
d3c1d2a0 KT |
283 | #undef TARGET_SUBTARGET64_DEFAULT |
284 | #define TARGET_SUBTARGET64_DEFAULT \ | |
285 | MASK_128BIT_LONG_DOUBLE | |
286 | ||
70e5e841 CF |
287 | /* This is how to output an assembler line |
288 | that says to advance the location counter | |
289 | to a multiple of 2**LOG bytes. */ | |
290 | ||
291 | #undef ASM_OUTPUT_ALIGN | |
292 | #define ASM_OUTPUT_ALIGN(FILE,LOG) \ | |
293 | if ((LOG)!=0) fprintf ((FILE), "\t.align %d\n", 1<<(LOG)) | |
294 | ||
15072eb1 ZW |
295 | /* Windows uses explicit import from shared libraries. */ |
296 | #define MULTIPLE_SYMBOL_SPACES 1 | |
70e5e841 | 297 | |
70e5e841 | 298 | #define TARGET_ASM_UNIQUE_SECTION i386_pe_unique_section |
ab5c8549 | 299 | #define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section |
70e5e841 CF |
300 | |
301 | #define SUPPORTS_ONE_ONLY 1 | |
302 | ||
303 | /* Switch into a generic section. */ | |
304 | #define TARGET_ASM_NAMED_SECTION i386_pe_asm_named_section | |
305 | ||
306 | /* Select attributes for named sections. */ | |
307 | #define TARGET_SECTION_TYPE_FLAGS i386_pe_section_type_flags | |
308 | ||
309 | /* Write the extra assembler code needed to declare a function | |
180295ed | 310 | properly. */ |
ab33bd5c | 311 | #undef ASM_DECLARE_FUNCTION_NAME |
f81c9774 RH |
312 | #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ |
313 | i386_pe_start_function (FILE, NAME, DECL) | |
314 | ||
b78b513e EB |
315 | /* Write the extra assembler code needed to declare the name of a |
316 | cold function partition properly. */ | |
317 | ||
318 | #undef ASM_DECLARE_COLD_FUNCTION_NAME | |
319 | #define ASM_DECLARE_COLD_FUNCTION_NAME(FILE, NAME, DECL) \ | |
320 | do \ | |
321 | { \ | |
322 | i386_pe_declare_function_type (FILE, NAME, 0); \ | |
323 | i386_pe_seh_cold_init (FILE, NAME); \ | |
324 | ASM_OUTPUT_LABEL (FILE, NAME); \ | |
325 | } \ | |
326 | while (0) | |
327 | ||
f81c9774 RH |
328 | #undef ASM_DECLARE_FUNCTION_SIZE |
329 | #define ASM_DECLARE_FUNCTION_SIZE(FILE,NAME,DECL) \ | |
330 | i386_pe_end_function (FILE, NAME, DECL) | |
70e5e841 | 331 | |
b78b513e EB |
332 | #undef ASM_DECLARE_COLD_FUNCTION_SIZE |
333 | #define ASM_DECLARE_COLD_FUNCTION_SIZE(FILE,NAME,DECL) \ | |
334 | i386_pe_end_cold_function (FILE, NAME, DECL) | |
335 | ||
70e5e841 CF |
336 | /* Add an external function to the list of functions to be declared at |
337 | the end of the file. */ | |
338 | #define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \ | |
339 | do \ | |
340 | { \ | |
341 | if (TREE_CODE (DECL) == FUNCTION_DECL) \ | |
3ce9c824 | 342 | i386_pe_record_external_function ((DECL), (NAME)); \ |
70e5e841 CF |
343 | } \ |
344 | while (0) | |
345 | ||
346 | /* Declare the type properly for any external libcall. */ | |
347 | #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \ | |
348 | i386_pe_declare_function_type (FILE, XSTR (FUN, 0), 1) | |
349 | ||
350 | /* This says out to put a global symbol in the BSS section. */ | |
351 | #undef ASM_OUTPUT_ALIGNED_BSS | |
352 | #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ | |
353 | asm_output_aligned_bss ((FILE), (DECL), (NAME), (SIZE), (ALIGN)) | |
354 | ||
355 | /* Output function declarations at the end of the file. */ | |
a5fe455b ZW |
356 | #undef TARGET_ASM_FILE_END |
357 | #define TARGET_ASM_FILE_END i386_pe_file_end | |
70e5e841 CF |
358 | |
359 | #undef ASM_COMMENT_START | |
360 | #define ASM_COMMENT_START " #" | |
361 | ||
ccf8e764 | 362 | #ifndef DWARF2_UNWIND_INFO |
6befaff6 SL |
363 | /* If configured with --disable-sjlj-exceptions, use DWARF2 for 32-bit |
364 | mode else default to SJLJ. 64-bit code uses SEH unless you request | |
365 | SJLJ. */ | |
b3cb08bd | 366 | #if (defined (CONFIG_SJLJ_EXCEPTIONS) && !CONFIG_SJLJ_EXCEPTIONS) |
3cbfaf98 | 367 | /* The logic of this #if must be kept synchronised with the logic |
6befaff6 | 368 | for selecting the tmake_eh_file fragment in libgcc/config.host. */ |
76f5e200 DS |
369 | #define DWARF2_UNWIND_INFO 1 |
370 | #else | |
70e5e841 | 371 | #define DWARF2_UNWIND_INFO 0 |
ccf8e764 | 372 | #endif |
76f5e200 | 373 | #endif |
70e5e841 CF |
374 | |
375 | /* Don't assume anything about the header files. */ | |
376 | #define NO_IMPLICIT_EXTERN_C | |
377 | ||
378 | #undef PROFILE_HOOK | |
379 | #define PROFILE_HOOK(LABEL) \ | |
380 | if (MAIN_NAME_P (DECL_NAME (current_function_decl))) \ | |
381 | { \ | |
f84d109f | 382 | emit_call_insn (gen_rtx_CALL (VOIDmode, \ |
70e5e841 CF |
383 | gen_rtx_MEM (FUNCTION_MODE, \ |
384 | gen_rtx_SYMBOL_REF (Pmode, "_monstartup")), \ | |
385 | const0_rtx)); \ | |
386 | } | |
387 | ||
388 | /* Java Native Interface (JNI) methods on Win32 are invoked using the | |
389 | stdcall calling convention. */ | |
390 | #undef MODIFY_JNI_METHOD_CALL | |
391 | #define MODIFY_JNI_METHOD_CALL(MDECL) \ | |
392 | build_type_attribute_variant ((MDECL), \ | |
393 | build_tree_list (get_identifier ("stdcall"), \ | |
394 | NULL)) | |
395 | ||
70e5e841 CF |
396 | /* For Win32 ABI compatibility */ |
397 | #undef DEFAULT_PCC_STRUCT_RETURN | |
398 | #define DEFAULT_PCC_STRUCT_RETURN 0 | |
399 | ||
400 | /* MSVC returns aggregate types of up to 8 bytes via registers. | |
401 | See i386.c:ix86_return_in_memory. */ | |
402 | #undef MS_AGGREGATE_RETURN | |
403 | #define MS_AGGREGATE_RETURN 1 | |
404 | ||
b0e46dff DS |
405 | /* Biggest alignment supported by the object file format of this |
406 | machine. Use this macro to limit the alignment which can be | |
407 | specified using the `__attribute__ ((aligned (N)))' construct. If | |
408 | not defined, the default value is `BIGGEST_ALIGNMENT'. */ | |
b0e46dff DS |
409 | /* IMAGE_SCN_ALIGN_8192BYTES is the largest section alignment flag |
410 | specified in the PECOFF60 spec. Native MS compiler also limits | |
411 | user-specified alignment to 8192 bytes. */ | |
da489f73 | 412 | #undef MAX_OFILE_ALIGNMENT |
b0e46dff DS |
413 | #define MAX_OFILE_ALIGNMENT (8192 * 8) |
414 | ||
349fcd78 DS |
415 | /* BIGGEST_FIELD_ALIGNMENT macro is used directly by libobjc, There, we |
416 | align internal doubles in structures on dword boundaries. Otherwise, | |
417 | support vector modes using ADJUST_FIELD_ALIGN, defined in i386.h. */ | |
418 | #ifdef IN_TARGET_LIBS | |
70e5e841 CF |
419 | #undef BIGGEST_FIELD_ALIGNMENT |
420 | #define BIGGEST_FIELD_ALIGNMENT 64 | |
349fcd78 | 421 | #endif |
70e5e841 CF |
422 | |
423 | /* A bit-field declared as `int' forces `int' alignment for the struct. */ | |
424 | #undef PCC_BITFIELD_TYPE_MATTERS | |
425 | #define PCC_BITFIELD_TYPE_MATTERS 1 | |
426 | #define GROUP_BITFIELDS_BY_ALIGN TYPE_NATIVE(rec) | |
427 | ||
428 | /* Enable alias attribute support. */ | |
429 | #ifndef SET_ASM_OP | |
430 | #define SET_ASM_OP "\t.set\t" | |
431 | #endif | |
da489f73 | 432 | |
1e8a5248 DS |
433 | /* This implements the `alias' attribute, keeping any stdcall or |
434 | fastcall decoration. */ | |
435 | #undef ASM_OUTPUT_DEF_FROM_DECLS | |
5234b8f5 | 436 | #define ASM_OUTPUT_DEF_FROM_DECLS(STREAM, DECL, TARGET) \ |
1e8a5248 DS |
437 | do \ |
438 | { \ | |
5234b8f5 DS |
439 | const char *alias \ |
440 | = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (DECL)); \ | |
b2469a9b | 441 | i386_pe_maybe_record_exported_symbol (DECL, alias, 0); \ |
034f2316 DS |
442 | if (TREE_CODE (DECL) == FUNCTION_DECL) \ |
443 | i386_pe_declare_function_type (STREAM, alias, \ | |
444 | TREE_PUBLIC (DECL)); \ | |
1e8a5248 DS |
445 | ASM_OUTPUT_DEF (STREAM, alias, IDENTIFIER_POINTER (TARGET)); \ |
446 | } while (0) | |
70e5e841 | 447 | |
c37780f5 AL |
448 | /* GNU as supports weak symbols on PECOFF. */ |
449 | #ifdef HAVE_GAS_WEAK | |
450 | #define ASM_WEAKEN_LABEL(FILE, NAME) \ | |
451 | do \ | |
452 | { \ | |
453 | fputs ("\t.weak\t", (FILE)); \ | |
454 | assemble_name ((FILE), (NAME)); \ | |
455 | fputc ('\n', (FILE)); \ | |
456 | } \ | |
457 | while (0) | |
3360dc9f | 458 | |
c37780f5 AL |
459 | #endif /* HAVE_GAS_WEAK */ |
460 | ||
4a77e08c DS |
461 | /* Decide whether it is safe to use a local alias for a virtual function |
462 | when constructing thunks. */ | |
463 | #undef TARGET_USE_LOCAL_THUNK_ALIAS_P | |
464 | #define TARGET_USE_LOCAL_THUNK_ALIAS_P(DECL) (!DECL_ONE_ONLY (DECL)) | |
465 | ||
a20f6f00 | 466 | #define SUBTARGET_ATTRIBUTE_TABLE \ |
4849deb1 JJ |
467 | { "selectany", 0, 0, true, false, false, false, \ |
468 | ix86_handle_selectany_attribute, NULL } | |
469 | /* { name, min_len, max_len, decl_req, type_req, fn_type_req, | |
470 | affects_type_identity, handler, exclude } */ | |
a20f6f00 | 471 | |
d68c2f42 DS |
472 | /* mcount() does not need a counter variable. */ |
473 | #undef NO_PROFILE_COUNTERS | |
474 | #define NO_PROFILE_COUNTERS 1 | |
475 | ||
43d9ad1d DS |
476 | #define TARGET_VALID_DLLIMPORT_ATTRIBUTE_P i386_pe_valid_dllimport_attribute_p |
477 | #define TARGET_CXX_ADJUST_CLASS_AT_DEFINITION i386_pe_adjust_class_at_definition | |
4a397c3e | 478 | #define SUBTARGET_MANGLE_DECL_ASSEMBLER_NAME i386_pe_mangle_decl_assembler_name |
43d9ad1d | 479 | |
a2b63a20 KT |
480 | #undef TARGET_ASM_ASSEMBLE_VISIBILITY |
481 | #define TARGET_ASM_ASSEMBLE_VISIBILITY i386_pe_assemble_visibility | |
482 | ||
82c0e1a0 KT |
483 | #undef SUB_TARGET_RECORD_STUB |
484 | #define SUB_TARGET_RECORD_STUB i386_pe_record_stub | |
485 | ||
2de710b9 EB |
486 | /* Static stack checking is supported by means of probes. */ |
487 | #define STACK_CHECK_STATIC_BUILTIN 1 |