OSDN Git Service

* config/i386/cygwin.h (CPP_SPEC): Add missing space before w32api include.
[pf3gnuchains/gcc-fork.git] / gcc / config / i386 / cygwin.h
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
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 YES_UNDERSCORES
24
25 #define DBX_DEBUGGING_INFO 
26 #define SDB_DEBUGGING_INFO 
27 #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
28
29 #include "i386/gas.h"
30 #include "dbxcoff.h"
31
32 /* Augment TARGET_SWITCHES with the cygwin/no-cygwin options. */
33 #define MASK_WIN32 0x40000000 /* Use -lming32 interface */
34 #define MASK_CYGWIN  0x20000000 /* Use -lcygwin interface */
35 #define MASK_WINDOWS 0x10000000 /* Use windows interface */
36 #define MASK_DLL     0x08000000 /* Use dll interface    */
37 #define MASK_NOP_FUN_DLLIMPORT 0x20000 /* Ignore dllimport for functions */
38
39 #define TARGET_WIN32             (target_flags & MASK_WIN32)
40 #define TARGET_CYGWIN            (target_flags & MASK_CYGWIN)
41 #define TARGET_WINDOWS           (target_flags & MASK_WINDOWS)
42 #define TARGET_DLL               (target_flags & MASK_DLL)
43 #define TARGET_NOP_FUN_DLLIMPORT (target_flags & MASK_NOP_FUN_DLLIMPORT)
44
45 #undef  SUBTARGET_SWITCHES
46 #define SUBTARGET_SWITCHES \
47 { "cygwin",               MASK_CYGWIN,                                  \
48   N_("Use the Cygwin interface") },                                     \
49 { "no-cygwin",            MASK_WIN32,                                   \
50   N_("Use the Mingw32 interface") },                                    \
51 { "windows",              MASK_WINDOWS, N_("Create GUI application") }, \
52 { "no-win32",             -MASK_WIN32, N_("Don't set Windows defines") },\
53 { "win32",                0, N_("Set Windows defines") },               \
54 { "console",              -MASK_WINDOWS,                                \
55   N_("Create console application") },                                   \
56 { "dll",                  MASK_DLL, N_("Generate code for a DLL") },    \
57 { "nop-fun-dllimport",    MASK_NOP_FUN_DLLIMPORT,                       \
58   N_("Ignore dllimport for functions") },                               \
59 { "no-nop-fun-dllimport", -MASK_NOP_FUN_DLLIMPORT, "" }, \
60 { "threads",              0, N_("Use Mingw-specific thread support") },
61
62
63 /* Support the __declspec keyword by turning them into attributes.
64    We currently only support: dllimport and dllexport.
65    Note that the current way we do this may result in a collision with
66    predefined attributes later on.  This can be solved by using one attribute,
67    say __declspec__, and passing args to it.  The problem with that approach
68    is that args are not accumulated: each new appearance would clobber any
69    existing args.  */
70
71 #undef CPP_PREDEFINES
72 #define CPP_PREDEFINES "-D_X86_=1 -Asystem=winnt"
73
74 /* Normally, -lgcc is not needed since everything in it is in the DLL, but we
75    want to allow things to be added to it when installing new versions of
76    GCC without making a new CYGWIN.DLL, so we leave it.  Profiling is handled
77    by calling the init function from the prologue. */
78
79 #undef LIBGCC_SPEC
80 #define LIBGCC_SPEC "%{mno-cygwin: %{mthreads:-lmingwthrd} -lmingw32} -lgcc %{mno-cygwin:-lmoldname -lmsvcrt}"
81
82 #ifdef CROSS_COMPILE
83 #define CYGWIN_INCLUDES "-idirafter " CYGWIN_CROSS_DIR "/include"
84 #define CYGWIN_W32API "-I" CYGWIN_CROSS_DIR "/include/w32api"
85 #define CYGWIN_LIB CYGWIN_CROSS_DIR "/lib"
86 #define MINGW_LIBS "-L" CYGWIN_CROSS_DIR "/lib/mingw"
87 #define MINGW_INCLUDES "-I" CYGWIN_CROSS_DIR "/include/mingw"
88 #else
89 #define CYGWIN_INCLUDES "-isystem /usr/local/include -idirafter /usr/include"
90 #define CYGWIN_W32API "-I/usr/include/w32api"
91 #define CYGWIN_LIB "/usr/lib"
92 #define MINGW_LIBS "-L/usr/local/lib/mingw -L/usr/lib/mingw"
93 #define MINGW_INCLUDES "-isystem /usr/local/include/mingw -idirafter /usr/include/mingw"
94 #endif
95
96 #undef STARTFILE_SPEC
97 #define STARTFILE_SPEC "%{shared|mdll: %{mno-cygwin:dllcrt2%O%s}} \
98   %{!shared: %{!mdll: %{!mno-cygwin:crt0%O%s} %{mno-cygwin:" MINGW_LIBS " mingw/crt2%O%s} \
99   %{pg:gcrt0%O%s}}}"
100
101 #undef CPP_SPEC
102 #define CPP_SPEC "%(cpp_cpu) %{posix:-D_POSIX_SOURCE} \
103   -D__stdcall=__attribute__((__stdcall__)) \
104   -D__cdecl=__attribute__((__cdecl__)) \
105   %{!ansi:-D_stdcall=__attribute__((__stdcall__)) \
106     -D_cdecl=__attribute__((__cdecl__))} \
107   -D__declspec(x)=__attribute__((x)) \
108   -D__i386__ -D__i386 \
109   %{!mno-cygwin:-D__CYGWIN32__ -D__CYGWIN__ -Dunix -D__unix__ -D__unix \
110     " CYGWIN_INCLUDES "} \
111   %{mno-win32: %{mno-cygwin: %emno-cygwin and mno-win32 are not compatible}} \
112   %{mno-cygwin:-DWIN32 -D_WIN32 -D__WIN32 -D__WIN32__ -DWINNT -D__MSVCRT__ \
113     -D__MINGW32__=0.3 %{mthreads:-D_MT} " MINGW_INCLUDES " " CYGWIN_W32API "\
114     -iwithprefixbefore ../../../../mingw/include/g++-3 \
115     -iwithprefixbefore ../../../../mingw/include \
116     -iwithprefixbefore ../../../../mingw32/include/g++-3 \
117     -iwithprefixbefore ../../../../mingw32/include } \
118    %{!mno-win32:-DWIN32 -D_WIN32 -D__WIN32 -D__WIN32__ -DWINNT " CYGWIN_W32API "}"
119
120 /* This macro defines names of additional specifications to put in the specs
121    that can be used in various specifications like CC1_SPEC.  Its definition
122    is an initializer with a subgrouping for each command option.
123
124    Each subgrouping contains a string constant, that defines the
125    specification name, and a string constant that used by the GNU CC driver
126    program.
127
128    Do not define this macro if it does not need to do anything.  */
129
130 #undef  SUBTARGET_EXTRA_SPECS
131 #define SUBTARGET_EXTRA_SPECS                                           \
132   { "mingw_include_path", DEFAULT_TARGET_MACHINE }
133
134 /* We have to dynamic link to get to the system DLLs.  All of libc, libm and
135    the Unix stuff is in cygwin.dll.  The import library is called
136    'libcygwin.a'.  For Windows applications, include more libraries, but
137    always include kernel32.  We'd like to specific subsystem windows to
138    ld, but that doesn't work just yet.  */
139
140 #undef LIB_SPEC
141 #define LIB_SPEC "%{pg:-lgmon} \
142   %{!mno-cygwin:-lcygwin} \
143   %{mno-cygwin:%{mthreads:-lmingwthrd} -lmingw32} \
144   %{mwindows:-lgdi32 -lcomdlg32} \
145   -luser32 -lkernel32 -ladvapi32 -lshell32"
146
147 #define LINK_SPEC "%{mwindows:--subsystem windows} \
148   %{mconsole:--subsystem console} \
149   %{shared: %{mdll: %eshared and mdll are not compatible}} \
150   %{shared: --shared} %{mdll:--dll} \
151   %{static:-Bstatic} %{!static:-Bdynamic} \
152   %{shared|mdll: -e \
153     %{mno-cygwin:_DllMainCRTStartup@12} \
154     %{!mno-cygwin:__cygwin_dll_entry@12}}"
155
156 #undef MATH_LIBRARY
157 #define MATH_LIBRARY ""
158
159 #define SIZE_TYPE "unsigned int"
160 #define PTRDIFF_TYPE "int"
161 #define WCHAR_UNSIGNED 1
162 #define WCHAR_TYPE_SIZE 16
163 #define WCHAR_TYPE "short unsigned int"
164
165 \f
166 /* Enable parsing of #pragma pack(push,<n>) and #pragma pack(pop).  */
167 #define HANDLE_PRAGMA_PACK_PUSH_POP 1
168
169 /* A C expression whose value is nonzero if IDENTIFIER with arguments ARGS
170    is a valid machine specific attribute for DECL.
171    The attributes in ATTRIBUTES have previously been assigned to DECL.  */
172
173 union tree_node;
174 #define TREE union tree_node *
175
176 #undef VALID_MACHINE_DECL_ATTRIBUTE
177 #define VALID_MACHINE_DECL_ATTRIBUTE(DECL, ATTRIBUTES, IDENTIFIER, ARGS) \
178   i386_pe_valid_decl_attribute_p (DECL, ATTRIBUTES, IDENTIFIER, ARGS)
179 extern int i386_pe_valid_decl_attribute_p PARAMS ((TREE, TREE, TREE, TREE));
180
181 /* A C expression whose value is nonzero if IDENTIFIER with arguments ARGS
182    is a valid machine specific attribute for TYPE.
183    The attributes in ATTRIBUTES have previously been assigned to TYPE.  */
184
185 #undef VALID_MACHINE_TYPE_ATTRIBUTE
186 #define VALID_MACHINE_TYPE_ATTRIBUTE(TYPE, ATTRIBUTES, IDENTIFIER, ARGS) \
187   i386_pe_valid_type_attribute_p (TYPE, ATTRIBUTES, IDENTIFIER, ARGS)
188 extern int i386_pe_valid_type_attribute_p PARAMS ((TREE, TREE, TREE, TREE));
189
190 extern union tree_node *i386_pe_merge_decl_attributes PARAMS ((TREE, TREE));
191 #define MERGE_MACHINE_DECL_ATTRIBUTES(OLD, NEW) \
192   i386_pe_merge_decl_attributes ((OLD), (NEW))
193 extern TREE i386_pe_merge_decl_attributes PARAMS ((TREE, TREE));
194
195 /* Used to implement dllexport overriding dllimport semantics.  It's also used
196    to handle vtables - the first pass won't do anything because
197    DECL_CONTEXT (DECL) will be 0 so i386_pe_dll{ex,im}port_p will return 0.
198    It's also used to handle dllimport override semantics.  */
199 #if 0
200 #define REDO_SECTION_INFO_P(DECL) \
201   ((DECL_MACHINE_ATTRIBUTES (DECL) != NULL_TREE) \
202    || (TREE_CODE (DECL) == VAR_DECL && DECL_VIRTUAL_P (DECL)))
203 #else
204 #define REDO_SECTION_INFO_P(DECL) 1
205 #endif
206
207 \f
208 #undef EXTRA_SECTIONS
209 #define EXTRA_SECTIONS in_ctor, in_dtor, in_drectve
210
211 #undef EXTRA_SECTION_FUNCTIONS
212 #define EXTRA_SECTION_FUNCTIONS                                 \
213   CTOR_SECTION_FUNCTION                                         \
214   DTOR_SECTION_FUNCTION                                         \
215   DRECTVE_SECTION_FUNCTION                                      \
216   SWITCH_TO_SECTION_FUNCTION
217
218 #define CTOR_SECTION_FUNCTION                                   \
219 void                                                            \
220 ctor_section ()                                                 \
221 {                                                               \
222   if (in_section != in_ctor)                                    \
223     {                                                           \
224       fprintf (asm_out_file, "\t.section .ctor\n");             \
225       in_section = in_ctor;                                     \
226     }                                                           \
227 }
228
229 #define DTOR_SECTION_FUNCTION                                   \
230 void                                                            \
231 dtor_section ()                                                 \
232 {                                                               \
233   if (in_section != in_dtor)                                    \
234     {                                                           \
235       fprintf (asm_out_file, "\t.section .dtor\n");             \
236       in_section = in_dtor;                                     \
237     }                                                           \
238 }
239
240 #define DRECTVE_SECTION_FUNCTION \
241 void                                                                    \
242 drectve_section ()                                                      \
243 {                                                                       \
244   if (in_section != in_drectve)                                         \
245     {                                                                   \
246       fprintf (asm_out_file, "%s\n", "\t.section .drectve\n");          \
247       in_section = in_drectve;                                          \
248     }                                                                   \
249 }
250
251 /* Switch to SECTION (an `enum in_section').
252
253    ??? This facility should be provided by GCC proper.
254    The problem is that we want to temporarily switch sections in
255    ASM_DECLARE_OBJECT_NAME and then switch back to the original section
256    afterwards.  */
257 #define SWITCH_TO_SECTION_FUNCTION                              \
258 void                                                            \
259 switch_to_section (section, decl)                               \
260      enum in_section section;                                   \
261      tree decl;                                                 \
262 {                                                               \
263   switch (section)                                              \
264     {                                                           \
265       case in_text: text_section (); break;                     \
266       case in_data: data_section (); break;                     \
267       case in_named: named_section (decl, NULL, 0); break;      \
268       case in_ctor: ctor_section (); break;                     \
269       case in_dtor: dtor_section (); break;                     \
270       case in_drectve: drectve_section (); break;               \
271       default: abort (); break;                                 \
272     }                                                           \
273 }
274
275 #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME)       \
276   do {                                          \
277     ctor_section ();                            \
278     fprintf (FILE, "%s\t", ASM_LONG);           \
279     assemble_name (FILE, NAME);                 \
280     fprintf (FILE, "\n");                       \
281   } while (0)
282
283 #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME)        \
284   do {                                          \
285     dtor_section ();                            \
286     fprintf (FILE, "%s\t", ASM_LONG);           \
287     assemble_name (FILE, NAME);                 \
288     fprintf (FILE, "\n");                       \
289   } while (0)
290
291 /* Don't allow flag_pic to propagate since gas may produce invalid code
292    otherwise. */
293
294 #undef  SUBTARGET_OVERRIDE_OPTIONS
295 #define SUBTARGET_OVERRIDE_OPTIONS                                      \
296 do {                                                                    \
297   if (flag_pic)                                                         \
298     {                                                                   \
299       warning ("-f%s ignored for target (all code is position independent)",\
300                (flag_pic > 1) ? "PIC" : "pic");                         \
301       flag_pic = 0;                                                     \
302     }                                                                   \
303 } while (0)                                                             \
304
305 /* Define this macro if references to a symbol must be treated
306    differently depending on something about the variable or
307    function named by the symbol (such as what section it is in).
308
309    On i386 running Windows NT, modify the assembler name with a suffix 
310    consisting of an atsign (@) followed by string of digits that represents
311    the number of bytes of arguments passed to the function, if it has the 
312    attribute STDCALL.
313
314    In addition, we must mark dll symbols specially. Definitions of 
315    dllexport'd objects install some info in the .drectve section.  
316    References to dllimport'd objects are fetched indirectly via
317    _imp__.  If both are declared, dllexport overrides.  This is also 
318    needed to implement one-only vtables: they go into their own
319    section and we need to set DECL_SECTION_NAME so we do that here.
320    Note that we can be called twice on the same decl.  */
321
322 extern void i386_pe_encode_section_info PARAMS ((TREE));
323
324 #ifdef ENCODE_SECTION_INFO
325 #undef ENCODE_SECTION_INFO
326 #endif
327 #define ENCODE_SECTION_INFO(DECL) i386_pe_encode_section_info (DECL)
328
329 /* Utility used only in this file.  */
330 #define I386_PE_STRIP_ENCODING(SYM_NAME) \
331   ((SYM_NAME) + ((SYM_NAME)[0] == '@' ? 3 : 0))
332
333 /* This macro gets just the user-specified name
334    out of the string in a SYMBOL_REF.  Discard
335    trailing @[NUM] encoded by ENCODE_SECTION_INFO.  */
336 #undef  STRIP_NAME_ENCODING
337 #define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME)                            \
338 do {                                                                    \
339   const char *_p;                                                       \
340   const char *_name = I386_PE_STRIP_ENCODING (SYMBOL_NAME);             \
341   for (_p = _name; *_p && *_p != '@'; ++_p)                             \
342     ;                                                                   \
343   if (*_p == '@')                                                       \
344     {                                                                   \
345       int _len = _p - _name;                                            \
346       char *_new_name = (char *) alloca (_len + 1);                     \
347       strncpy (_new_name, _name, _len);                                 \
348       _new_name[_len] = '\0';                                           \
349       (VAR) = _new_name;                                                \
350     }                                                                   \
351   else                                                                  \
352     (VAR) = _name;                                                      \
353 } while (0)
354       
355 \f
356 /* Output a reference to a label.  */
357 #undef ASM_OUTPUT_LABELREF
358 #define ASM_OUTPUT_LABELREF(STREAM, NAME)               \
359   fprintf (STREAM, "%s%s", USER_LABEL_PREFIX,           \
360            I386_PE_STRIP_ENCODING (NAME))               \
361
362 /* Output a common block.  */
363 #undef ASM_OUTPUT_COMMON
364 #define ASM_OUTPUT_COMMON(STREAM, NAME, SIZE, ROUNDED)  \
365 do {                                                    \
366   if (i386_pe_dllexport_name_p (NAME))                  \
367     i386_pe_record_exported_symbol (NAME, 1);           \
368   if (! i386_pe_dllimport_name_p (NAME))                \
369     {                                                   \
370       fprintf ((STREAM), "\t.comm\t");                  \
371       assemble_name ((STREAM), (NAME));                 \
372       fprintf ((STREAM), ", %d\t%s %d\n",               \
373                (ROUNDED), ASM_COMMENT_START, (SIZE));   \
374     }                                                   \
375 } while (0)
376
377 /* Output the label for an initialized variable.  */
378 #undef ASM_DECLARE_OBJECT_NAME
379 #define ASM_DECLARE_OBJECT_NAME(STREAM, NAME, DECL)     \
380 do {                                                    \
381   if (i386_pe_dllexport_name_p (NAME))                  \
382     i386_pe_record_exported_symbol (NAME, 1);           \
383   ASM_OUTPUT_LABEL ((STREAM), (NAME));                  \
384 } while (0)
385
386 \f
387 /* Emit code to check the stack when allocating more that 4000
388    bytes in one go. */
389
390 #define CHECK_STACK_LIMIT 4000
391
392 /* By default, target has a 80387, uses IEEE compatible arithmetic,
393    and returns float values in the 387 and needs stack probes */
394 #undef TARGET_DEFAULT
395
396 #define TARGET_DEFAULT \
397    (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS | MASK_STACK_PROBE) 
398
399 /* This is how to output an assembler line
400    that says to advance the location counter
401    to a multiple of 2**LOG bytes.  */
402
403 #undef ASM_OUTPUT_ALIGN
404 #define ASM_OUTPUT_ALIGN(FILE,LOG)      \
405     if ((LOG)!=0) fprintf ((FILE), "\t.align %d\n", 1<<(LOG))
406
407 /* Define this macro if in some cases global symbols from one translation
408    unit may not be bound to undefined symbols in another translation unit
409    without user intervention.  For instance, under Microsoft Windows
410    symbols must be explicitly imported from shared libraries (DLLs).  */
411 #define MULTIPLE_SYMBOL_SPACES
412
413 #define UNIQUE_SECTION_P(DECL) DECL_ONE_ONLY (DECL)
414 extern void i386_pe_unique_section PARAMS ((TREE, int));
415 #define UNIQUE_SECTION(DECL,RELOC) i386_pe_unique_section (DECL, RELOC)
416
417 #define SUPPORTS_ONE_ONLY 1
418
419 /* A C statement to output something to the assembler file to switch to section
420    NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
421    NULL_TREE.  Some target formats do not support arbitrary sections.  Do not
422    define this macro in such cases.  */
423 #undef ASM_OUTPUT_SECTION_NAME
424 #define ASM_OUTPUT_SECTION_NAME(STREAM, DECL, NAME, RELOC)              \
425 do {                                                                    \
426   static struct section_info                                            \
427     {                                                                   \
428       struct section_info *next;                                        \
429       char *name;                                                       \
430       enum sect_enum {SECT_RW, SECT_RO, SECT_EXEC} type;                \
431     } *sections;                                                        \
432   struct section_info *s;                                               \
433   const char *mode;                                                     \
434   enum sect_enum type;                                                  \
435                                                                         \
436   for (s = sections; s; s = s->next)                                    \
437     if (!strcmp (NAME, s->name))                                        \
438       break;                                                            \
439                                                                         \
440   if (DECL && TREE_CODE (DECL) == FUNCTION_DECL)                        \
441     type = SECT_EXEC, mode = "x";                                       \
442   else if (DECL && DECL_READONLY_SECTION (DECL, RELOC))                 \
443     type = SECT_RO, mode = "";                                          \
444   else                                                                  \
445     {                                                                   \
446       type = SECT_RW;                                                   \
447       if (TREE_CODE (DECL) == VAR_DECL                                  \
448           && lookup_attribute ("shared", DECL_MACHINE_ATTRIBUTES (DECL))) \
449         mode = "ws";                                                    \
450       else                                                              \
451         mode = "w";                                                     \
452     }                                                                   \
453                                                                         \
454   if (s == 0)                                                           \
455     {                                                                   \
456       s = (struct section_info *) xmalloc (sizeof (struct section_info)); \
457       s->name = xmalloc ((strlen (NAME) + 1) * sizeof (*NAME));         \
458       strcpy (s->name, NAME);                                           \
459       s->type = type;                                                   \
460       s->next = sections;                                               \
461       sections = s;                                                     \
462       fprintf (STREAM, ".section\t%s,\"%s\"\n", NAME, mode);            \
463       /* Functions may have been compiled at various levels of          \
464          optimization so we can't use `same_size' here.  Instead,       \
465          have the linker pick one.  */                                  \
466       if ((DECL) && DECL_ONE_ONLY (DECL))                               \
467         fprintf (STREAM, "\t.linkonce %s\n",                            \
468                  TREE_CODE (DECL) == FUNCTION_DECL                      \
469                  ? "discard" : "same_size");                            \
470     }                                                                   \
471   else                                                                  \
472     {                                                                   \
473       fprintf (STREAM, ".section\t%s,\"%s\"\n", NAME, mode);            \
474     }                                                                   \
475 } while (0)
476
477 /* Write the extra assembler code needed to declare a function
478    properly.  If we are generating SDB debugging information, this
479    will happen automatically, so we only need to handle other cases.  */
480 #undef ASM_DECLARE_FUNCTION_NAME
481 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)                     \
482   do                                                                    \
483     {                                                                   \
484       if (i386_pe_dllexport_name_p (NAME))                              \
485         i386_pe_record_exported_symbol (NAME, 0);                       \
486       if (write_symbols != SDB_DEBUG)                                   \
487         i386_pe_declare_function_type (FILE, NAME, TREE_PUBLIC (DECL)); \
488       ASM_OUTPUT_LABEL (FILE, NAME);                                    \
489     }                                                                   \
490   while (0)
491
492 /* Add an external function to the list of functions to be declared at
493    the end of the file.  */
494 #define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME)                           \
495   do                                                                    \
496     {                                                                   \
497       if (TREE_CODE (DECL) == FUNCTION_DECL)                            \
498         i386_pe_record_external_function (NAME);                        \
499     }                                                                   \
500   while (0)
501
502 /* Declare the type properly for any external libcall.  */
503 #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \
504   i386_pe_declare_function_type (FILE, XSTR (FUN, 0), 1)
505
506 /* This says out to put a global symbol in the BSS section. */
507 #undef ASM_OUTPUT_ALIGNED_BSS
508 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
509   asm_output_aligned_bss ((FILE), (DECL), (NAME), (SIZE), (ALIGN))
510
511 /* Output function declarations at the end of the file.  */
512 #undef ASM_FILE_END
513 #define ASM_FILE_END(FILE) \
514   i386_pe_asm_file_end (FILE)
515
516 #undef ASM_COMMENT_START
517 #define ASM_COMMENT_START " #"
518
519 /* DWARF2 Unwinding doesn't work with exception handling yet. */
520 #define DWARF2_UNWIND_INFO 0
521
522 /* Don't assume anything about the header files. */
523 #define NO_IMPLICIT_EXTERN_C
524
525 #define SUBTARGET_PROLOGUE                                              \
526   if (profile_flag                                                      \
527       && MAIN_NAME_P (DECL_NAME (current_function_decl)))               \
528      {                                                                  \
529       emit_call_insn (gen_rtx (CALL, VOIDmode,                          \
530         gen_rtx_MEM (FUNCTION_MODE,                                     \
531                      gen_rtx_SYMBOL_REF (Pmode, "_monstartup")),        \
532         const0_rtx));                                                   \
533      }
534
535 /* External function declarations.  */
536
537 extern void i386_pe_record_external_function PARAMS ((char *));
538 /* extern void i386_pe_declare_function_type PARAMS ((FILE *, char *, int)); */
539 extern void i386_pe_record_exported_symbol PARAMS ((char *, int));
540 /* extern void i386_pe_asm_file_end PARAMS ((FILE *)); */
541
542 /* For Win32 ABI compatibility */
543 #undef DEFAULT_PCC_STRUCT_RETURN
544 #define DEFAULT_PCC_STRUCT_RETURN 0
545
546 /* No data type wants to be aligned rounder than this.  */
547 #undef  BIGGEST_ALIGNMENT
548 #define BIGGEST_ALIGNMENT 128
549
550 /* A bitfield declared as `int' forces `int' alignment for the struct.  */
551 #undef PCC_BITFIELDS_TYPE_MATTERS
552 #define PCC_BITFIELDS_TYPE_MATTERS 1
553 #define GROUP_BITFIELDS_BY_ALIGN TYPE_NATIVE(rec)
554
555
556 /* Enable alias attribute support.  */
557 #ifndef SET_ASM_OP
558 #define SET_ASM_OP "\t.set\t"
559 #endif
560
561 #ifndef INT_ASM_OP
562 #define INT_ASM_OP "\t.long\t"
563 #endif
564
565 #undef MD_STARTFILE_PREFIX
566 #define MD_STARTFILE_PREFIX     "/usr/lib/"
567
568 #undef STANDARD_STARTFILE_PREFIX
569 #define STANDARD_STARTFILE_PREFIX     "/usr/lib/mingw/"
570
571 #ifndef CROSS_COMPILE
572 #undef LOCAL_INCLUDE_DIR
573 #undef TOOL_INCLUDE_DIR
574 #undef SYSTEM_INCLUDE_DIR
575 #undef STANDARD_INCLUDE_DIR
576 #define STANDARD_INCLUDE_DIR 0
577 #endif
578
579 #undef TREE
580
581 #ifndef BUFSIZ
582 # undef FILE
583 #endif