1 /* Operating system specific defines to be used when targeting GCC for 2 hosting on Windows32, using a Unix style C library and tools. 3 Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 4 Free Software Foundation, Inc. 5 6 This file is part of GNU CC. 7 8 GNU CC is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 2, or (at your option) 11 any later version. 12 13 GNU CC is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with GNU CC; see the file COPYING. If not, write to 20 the Free Software Foundation, 59 Temple Place - Suite 330, 21 Boston, MA 02111-1307, USA. */ 22 23 #define DBX_DEBUGGING_INFO 1 24 #define SDB_DEBUGGING_INFO 1 25 #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG 26 27 #define TARGET_VERSION fprintf (stderr, " (x86 Cygwin)"); 28 #define TARGET_EXECUTABLE_SUFFIX ".exe" 29 30 #include <stdio.h> 31 #include "i386/i386.h" 32 #include "i386/unix.h" 33 #include "i386/bsd.h" 34 #include "i386/gas.h" 35 #include "dbxcoff.h" 36 37 /* Masks for subtarget switches used by other files. */ 38 #define MASK_NOP_FUN_DLLIMPORT 0x08000000 /* Ignore dllimport for functions */ 39 40 /* Used in winnt.c. */ 41 #define TARGET_NOP_FUN_DLLIMPORT (target_flags & MASK_NOP_FUN_DLLIMPORT) 42 43 #undef SUBTARGET_SWITCHES 44 #define SUBTARGET_SWITCHES \ 45 { "cygwin", 0, N_("Use the Cygwin interface") }, \ 46 { "no-cygwin", 0, N_("Use the Mingw32 interface") }, \ 47 { "windows", 0, N_("Create GUI application") }, \ 48 { "no-win32", 0, N_("Don't set Windows defines") }, \ 49 { "win32", 0, N_("Set Windows defines") }, \ 50 { "console", 0, N_("Create console application") },\ 51 { "dll", 0, N_("Generate code for a DLL") }, \ 52 { "nop-fun-dllimport", MASK_NOP_FUN_DLLIMPORT, \ 53 N_("Ignore dllimport for functions") }, \ 54 { "no-nop-fun-dllimport", -MASK_NOP_FUN_DLLIMPORT, "" }, \ 55 { "threads", 0, N_("Use Mingw-specific thread support") }, 56 57 #define MAYBE_UWIN_CPP_BUILTINS() /* Nothing. */ 58 #define TARGET_OS_CPP_BUILTINS() \ 59 do \ 60 { \ 61 builtin_define ("_X86_=1"); \ 62 builtin_assert ("system=winnt"); \ 63 builtin_define ("__stdcall=__attribute__((__stdcall__))"); \ 64 builtin_define ("__cdecl=__attribute__((__cdecl__))"); \ 65 builtin_define ("__declspec(x)=__attribute__((x))"); \ 66 if (!flag_iso) \ 67 { \ 68 builtin_define ("_stdcall=__attribute__((__stdcall__))"); \ 69 builtin_define ("_cdecl=__attribute__((__cdecl__))"); \ 70 } \ 71 MAYBE_UWIN_CPP_BUILTINS (); \ 72 } \ 73 while (0) 74 75 #ifdef CROSS_COMPILE 76 #define CYGWIN_INCLUDES "%{!nostdinc:-idirafter " CYGWIN_CROSS_DIR "/include}" 77 #define W32API_INC "%{!nostdinc:-idirafter " CYGWIN_CROSS_DIR "/include/w32api}" 78 #define W32API_LIB "-L" CYGWIN_CROSS_DIR "/lib/w32api/" 79 #define CYGWIN_LIB CYGWIN_CROSS_DIR "/lib" 80 #define MINGW_LIBS "-L" CYGWIN_CROSS_DIR "/lib/mingw" 81 #define MINGW_INCLUDES "%{!nostdinc:-isystem " CYGWIN_CROSS_DIR "/include/mingw/g++-3 "\ 82 "-isystem " CYGWIN_CROSS_DIR "/include/mingw/g++ "\ 83 "-idirafter " CYGWIN_CROSS_DIR "/include/mingw}" 84 #else 85 #define CYGWIN_INCLUDES "%{!nostdinc:-isystem /usr/local/include "\ 86 "-idirafter " CYGWIN_CROSS_DIR "/include "\ 87 "-idirafter /usr/include}" 88 #define W32API_INC "%{!nostdinc:"\ 89 "-idirafter " CYGWIN_CROSS_DIR "/include/w32api "\ 90 "-idirafter /usr/include/w32api}" 91 #define W32API_LIB "-L" CYGWIN_CROSS_DIR "/lib/w32api/ -L/usr/lib/w32api/" 92 #define CYGWIN_LIB "/usr/lib" 93 #define MINGW_LIBS "-L/usr/local/lib/mingw -L/usr/lib/mingw" 94 #define MINGW_INCLUDES "%{!nostdinc:-isystem /usr/include/mingw/g++-3 "\ 95 "-isystem /usr/include/mingw/g++ "\ 96 "-isystem /usr/local/include/mingw "\ 97 "-idirafter " CYGWIN_CROSS_DIR "/include/mingw "\ 98 "-idirafter /usr/include/mingw}" 99 #endif 100 101 /* Get tree.c to declare a target-specific specialization of 102 merge_decl_attributes. */ 103 #define TARGET_DLLIMPORT_DECL_ATTRIBUTES 104 105 /* Support the __declspec keyword by turning them into attributes. 106 We currently only support: dllimport and dllexport. 107 Note that the current way we do this may result in a collision with 108 predefined attributes later on. This can be solved by using one attribute, 109 say __declspec__, and passing args to it. The problem with that approach 110 is that args are not accumulated: each new appearance would clobber any 111 existing args. */ 112 113 #undef CPP_SPEC 114 #define CPP_SPEC "%{posix:-D_POSIX_SOURCE} \ 115 %{mno-win32:%{mno-cygwin: %emno-cygwin and mno-win32 are not compatible}} \ 116 %{mno-cygwin:-D__MSVCRT__ -D__MINGW32__ %{mthreads:-D_MT} "\ 117 MINGW_INCLUDES "} \ 118 %{!mno-cygwin:-D__CYGWIN32__ -D__CYGWIN__ %{!ansi:-Dunix} -D__unix__ -D__unix "\ 119 CYGWIN_INCLUDES "}\ 120 %{mwin32|mno-cygwin:-DWIN32 -D_WIN32 -D__WIN32 -D__WIN32__ %{!ansi:-DWINNT}}\ 121 %{!mno-win32:" W32API_INC "}\ 122 " 123 124 #undef STARTFILE_SPEC 125 #define STARTFILE_SPEC "\ 126 %{shared|mdll: %{mno-cygwin:" MINGW_LIBS " dllcrt2%O%s}}\ 127 %{!shared: %{!mdll: %{!mno-cygwin:crt0%O%s} %{mno-cygwin:" MINGW_LIBS " crt2%O%s}\ 128 %{pg:gcrt0%O%s}}}\ 129 " 130 131 /* Normally, -lgcc is not needed since everything in it is in the DLL, but we 132 want to allow things to be added to it when installing new versions of 133 GCC without making a new CYGWIN.DLL, so we leave it. Profiling is handled 134 by calling the init function from the prologue. */ 135 136 #undef LIBGCC_SPEC 137 #define LIBGCC_SPEC "%{mno-cygwin: %{mthreads:-lmingwthrd} -lmingw32} \ 138 -lgcc %{mno-cygwin:-lmoldname -lmingwex -lmsvcrt}" 139 140 /* This macro defines names of additional specifications to put in the specs 141 that can be used in various specifications like CC1_SPEC. Its definition 142 is an initializer with a subgrouping for each command option. 143 144 Each subgrouping contains a string constant, that defines the 145 specification name, and a string constant that used by the GNU CC driver 146 program. 147 148 Do not define this macro if it does not need to do anything. */ 149 150 #undef SUBTARGET_EXTRA_SPECS 151 #define SUBTARGET_EXTRA_SPECS \ 152 { "mingw_include_path", DEFAULT_TARGET_MACHINE } 153 154 /* We have to dynamic link to get to the system DLLs. All of libc, libm and 155 the Unix stuff is in cygwin.dll. The import library is called 156 'libcygwin.a'. For Windows applications, include more libraries, but 157 always include kernel32. We'd like to specific subsystem windows to 158 ld, but that doesn't work just yet. */ 159 160 #undef LIB_SPEC 161 #define LIB_SPEC "\ 162 %{pg:-lgmon} \ 163 %{!mno-cygwin:-lcygwin} \ 164 %{mno-cygwin:%{mthreads:-lmingwthrd} -lmingw32} \ 165 %{mwindows:-lgdi32 -lcomdlg32} \ 166 -luser32 -lkernel32 -ladvapi32 -lshell32" 167 168 #define LINK_SPEC W32API_LIB "\ 169 %{mwindows:--subsystem windows} \ 170 %{mconsole:--subsystem console} \ 171 %{shared: %{mdll: %eshared and mdll are not compatible}} \ 172 %{shared: --shared} %{mdll:--dll} \ 173 %{static:-Bstatic} %{!static:-Bdynamic} \ 174 %{shared|mdll: -e \ 175 %{mno-cygwin:_DllMainCRTStartup@12} \ 176 %{!mno-cygwin:__cygwin_dll_entry@12}}\ 177 --dll-search-prefix=cyg" 178 179 #undef MATH_LIBRARY 180 #define MATH_LIBRARY "" 181 182 #define SIZE_TYPE "unsigned int" 183 #define PTRDIFF_TYPE "int" 184 #define WCHAR_TYPE_SIZE 16 185 #define WCHAR_TYPE "short unsigned int" 186 187 188 /* Enable parsing of #pragma pack(push,<n>) and #pragma pack(pop). */ 189 #define HANDLE_PRAGMA_PACK_PUSH_POP 1 190 191 union tree_node; 192 #define TREE union tree_node * 193 194 #undef EXTRA_SECTIONS 195 #define EXTRA_SECTIONS in_drectve 196 197 #undef EXTRA_SECTION_FUNCTIONS 198 #define EXTRA_SECTION_FUNCTIONS \ 199 DRECTVE_SECTION_FUNCTION \ 200 SWITCH_TO_SECTION_FUNCTION 201 202 #define DRECTVE_SECTION_FUNCTION \ 203 void \ 204 drectve_section () \ 205 { \ 206 if (in_section != in_drectve) \ 207 { \ 208 fprintf (asm_out_file, "%s\n", "\t.section .drectve\n"); \ 209 in_section = in_drectve; \ 210 } \ 211 } 212 void drectve_section PARAMS ((void)); 213 214 /* Switch to SECTION (an `enum in_section'). 215 216 ??? This facility should be provided by GCC proper. 217 The problem is that we want to temporarily switch sections in 218 ASM_DECLARE_OBJECT_NAME and then switch back to the original section 219 afterwards. */ 220 #define SWITCH_TO_SECTION_FUNCTION \ 221 void switch_to_section PARAMS ((enum in_section, tree)); \ 222 void \ 223 switch_to_section (section, decl) \ 224 enum in_section section; \ 225 tree decl; \ 226 { \ 227 switch (section) \ 228 { \ 229 case in_text: text_section (); break; \ 230 case in_data: data_section (); break; \ 231 case in_named: named_section (decl, NULL, 0); break; \ 232 case in_drectve: drectve_section (); break; \ 233 default: abort (); break; \ 234 } \ 235 } 236 237 /* Don't allow flag_pic to propagate since gas may produce invalid code 238 otherwise. */ 239 240 #undef SUBTARGET_OVERRIDE_OPTIONS 241 #define SUBTARGET_OVERRIDE_OPTIONS \ 242 do { \ 243 if (flag_pic) \ 244 { \ 245 warning ("-f%s ignored for target (all code is position independent)",\ 246 (flag_pic > 1) ? "PIC" : "pic"); \ 247 flag_pic = 0; \ 248 } \ 249 } while (0) \ 250 251 /* Define this macro if references to a symbol must be treated 252 differently depending on something about the variable or 253 function named by the symbol (such as what section it is in). 254 255 On i386 running Windows NT, modify the assembler name with a suffix 256 consisting of an atsign (@) followed by string of digits that represents 257 the number of bytes of arguments passed to the function, if it has the 258 attribute STDCALL. 259 260 In addition, we must mark dll symbols specially. Definitions of 261 dllexport'd objects install some info in the .drectve section. 262 References to dllimport'd objects are fetched indirectly via 263 _imp__. If both are declared, dllexport overrides. This is also 264 needed to implement one-only vtables: they go into their own 265 section and we need to set DECL_SECTION_NAME so we do that here. 266 Note that we can be called twice on the same decl. */ 267 268 #undef TARGET_ENCODE_SECTION_INFO 269 #define TARGET_ENCODE_SECTION_INFO i386_pe_encode_section_info 270 #undef TARGET_STRIP_NAME_ENCODING 271 #define TARGET_STRIP_NAME_ENCODING i386_pe_strip_name_encoding_full 272 273 /* Output a reference to a label. */ 274 #undef ASM_OUTPUT_LABELREF 275 #define ASM_OUTPUT_LABELREF(STREAM, NAME) \ 276 fprintf (STREAM, "%s%s", USER_LABEL_PREFIX, \ 277 i386_pe_strip_name_encoding (NAME)) \ 278 279 /* Output a common block. */ 280 #undef ASM_OUTPUT_COMMON 281 #define ASM_OUTPUT_COMMON(STREAM, NAME, SIZE, ROUNDED) \ 282 do { \ 283 if (i386_pe_dllexport_name_p (NAME)) \ 284 i386_pe_record_exported_symbol (NAME, 1); \ 285 if (! i386_pe_dllimport_name_p (NAME)) \ 286 { \ 287 fprintf ((STREAM), "\t.comm\t"); \ 288 assemble_name ((STREAM), (NAME)); \ 289 fprintf ((STREAM), ", %d\t%s %d\n", \ 290 (ROUNDED), ASM_COMMENT_START, (SIZE)); \ 291 } \ 292 } while (0) 293 294 /* Output the label for an initialized variable. */ 295 #undef ASM_DECLARE_OBJECT_NAME 296 #define ASM_DECLARE_OBJECT_NAME(STREAM, NAME, DECL) \ 297 do { \ 298 if (i386_pe_dllexport_name_p (NAME)) \ 299 i386_pe_record_exported_symbol (NAME, 1); \ 300 ASM_OUTPUT_LABEL ((STREAM), (NAME)); \ 301 } while (0) 302 303 304 /* Emit code to check the stack when allocating more that 4000 305 bytes in one go. */ 306 307 #define CHECK_STACK_LIMIT 4000 308 309 /* By default, target has a 80387, uses IEEE compatible arithmetic, 310 returns float values in the 387 and needs stack probes. 311 We also align doubles to 64-bits for MSVC default compatibility. */ 312 313 #undef TARGET_SUBTARGET_DEFAULT 314 #define TARGET_SUBTARGET_DEFAULT \ 315 (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS | MASK_STACK_PROBE \ 316 | MASK_ALIGN_DOUBLE) 317 318 /* This is how to output an assembler line 319 that says to advance the location counter 320 to a multiple of 2**LOG bytes. */ 321 322 #undef ASM_OUTPUT_ALIGN 323 #define ASM_OUTPUT_ALIGN(FILE,LOG) \ 324 if ((LOG)!=0) fprintf ((FILE), "\t.align %d\n", 1<<(LOG)) 325 326 /* Define this macro if in some cases global symbols from one translation 327 unit may not be bound to undefined symbols in another translation unit 328 without user intervention. For instance, under Microsoft Windows 329 symbols must be explicitly imported from shared libraries (DLLs). */ 330 #define MULTIPLE_SYMBOL_SPACES 331 332 extern void i386_pe_unique_section PARAMS ((TREE, int)); 333 #define TARGET_ASM_UNIQUE_SECTION i386_pe_unique_section 334 335 #define SUPPORTS_ONE_ONLY 1 336 337 /* Switch into a generic section. */ 338 #define TARGET_ASM_NAMED_SECTION i386_pe_asm_named_section 339 340 /* Select attributes for named sections. */ 341 #define TARGET_SECTION_TYPE_FLAGS i386_pe_section_type_flags 342 343 /* Write the extra assembler code needed to declare a function 344 properly. If we are generating SDB debugging information, this 345 will happen automatically, so we only need to handle other cases. */ 346 #undef ASM_DECLARE_FUNCTION_NAME 347 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ 348 do \ 349 { \ 350 if (i386_pe_dllexport_name_p (NAME)) \ 351 i386_pe_record_exported_symbol (NAME, 0); \ 352 if (write_symbols != SDB_DEBUG) \ 353 i386_pe_declare_function_type (FILE, NAME, TREE_PUBLIC (DECL)); \ 354 ASM_OUTPUT_LABEL (FILE, NAME); \ 355 } \ 356 while (0) 357 358 /* Add an external function to the list of functions to be declared at 359 the end of the file. */ 360 #define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \ 361 do \ 362 { \ 363 if (TREE_CODE (DECL) == FUNCTION_DECL) \ 364 i386_pe_record_external_function (NAME); \ 365 } \ 366 while (0) 367 368 /* Declare the type properly for any external libcall. */ 369 #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \ 370 i386_pe_declare_function_type (FILE, XSTR (FUN, 0), 1) 371 372 /* This says out to put a global symbol in the BSS section. */ 373 #undef ASM_OUTPUT_ALIGNED_BSS 374 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ 375 asm_output_aligned_bss ((FILE), (DECL), (NAME), (SIZE), (ALIGN)) 376 377 /* Output function declarations at the end of the file. */ 378 #undef ASM_FILE_END 379 #define ASM_FILE_END(FILE) \ 380 i386_pe_asm_file_end (FILE) 381 382 #undef ASM_COMMENT_START 383 #define ASM_COMMENT_START " #" 384 385 /* DWARF2 Unwinding doesn't work with exception handling yet. To make 386 it work, we need to build a libgcc_s.dll, and dcrt0.o should be 387 changed to call __register_frame_info/__deregister_frame_info. */ 388 #define DWARF2_UNWIND_INFO 0 389 390 /* Don't assume anything about the header files. */ 391 #define NO_IMPLICIT_EXTERN_C 392 393 #undef PROFILE_HOOK 394 #define PROFILE_HOOK(LABEL) \ 395 if (MAIN_NAME_P (DECL_NAME (current_function_decl))) \ 396 { \ 397 emit_call_insn (gen_rtx (CALL, VOIDmode, \ 398 gen_rtx_MEM (FUNCTION_MODE, \ 399 gen_rtx_SYMBOL_REF (Pmode, "_monstartup")), \ 400 const0_rtx)); \ 401 } 402 403 /* Java Native Interface (JNI) methods on Win32 are invoked using the 404 stdcall calling convention. */ 405 #undef MODIFY_JNI_METHOD_CALL 406 #define MODIFY_JNI_METHOD_CALL(MDECL) \ 407 build_type_attribute_variant ((MDECL), \ 408 build_tree_list (get_identifier ("stdcall"), \ 409 NULL)) 410 411 412 /* External function declarations. */ 413 414 extern void i386_pe_record_external_function PARAMS ((const char *)); 415 extern void i386_pe_declare_function_type PARAMS ((FILE *, const char *, int)); 416 extern void i386_pe_record_exported_symbol PARAMS ((const char *, int)); 417 extern void i386_pe_asm_file_end PARAMS ((FILE *)); 418 extern int i386_pe_dllexport_name_p PARAMS ((const char *)); 419 extern int i386_pe_dllimport_name_p PARAMS ((const char *)); 420 421 /* For Win32 ABI compatibility */ 422 #undef DEFAULT_PCC_STRUCT_RETURN 423 #define DEFAULT_PCC_STRUCT_RETURN 0 424 425 /* No data type wants to be aligned rounder than this. */ 426 #undef BIGGEST_ALIGNMENT 427 #define BIGGEST_ALIGNMENT 128 428 429 /* Native complier aligns internal doubles in structures on dword boundaries. */ 430 #undef BIGGEST_FIELD_ALIGNMENT 431 #define BIGGEST_FIELD_ALIGNMENT 64 432 433 /* A bit-field declared as `int' forces `int' alignment for the struct. */ 434 #undef PCC_BITFIELD_TYPE_MATTERS 435 #define PCC_BITFIELD_TYPE_MATTERS 1 436 #define GROUP_BITFIELDS_BY_ALIGN TYPE_NATIVE(rec) 437 438 439 /* Enable alias attribute support. */ 440 #ifndef SET_ASM_OP 441 #define SET_ASM_OP "\t.set\t" 442 #endif 443 444 /* Override GCC's relative pathname lookup (ie., relocatability) unless 445 otherwise told by other subtargets. */ 446 #ifndef WIN32_NO_ABSOLUTE_INST_DIRS 447 #undef MD_STARTFILE_PREFIX 448 #define MD_STARTFILE_PREFIX "/usr/lib/" 449 450 #undef STANDARD_STARTFILE_PREFIX 451 #define STANDARD_STARTFILE_PREFIX "/usr/lib/mingw/" 452 453 #ifndef CROSS_COMPILE 454 #undef LOCAL_INCLUDE_DIR 455 #undef TOOL_INCLUDE_DIR 456 #undef SYSTEM_INCLUDE_DIR 457 #undef STANDARD_INCLUDE_DIR 458 #define STANDARD_INCLUDE_DIR 0 459 #endif /* not CROSS_COMPILE */ 460 #endif /* not WIN32_NO_ABSOLUTE_INST_DIRS */ 461 462 #undef TREE 463 464 #ifndef BUFSIZ 465 # undef FILE 466 #endif 467