OSDN Git Service

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