OSDN Git Service

16110a71508d38dac3d3726a74293fc4eace2411
[pf3gnuchains/gcc-fork.git] / gcc / config / i386 / winnt.c
1 /* Subroutines for insn-output.c for Windows NT.
2    Contributed by Douglas Rupp (drupp@cs.washington.edu)
3    Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
4    2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "rtl.h"
27 #include "regs.h"
28 #include "hard-reg-set.h"
29 #include "output.h"
30 #include "tree.h"
31 #include "flags.h"
32 #include "tm_p.h"
33 #include "diagnostic-core.h"
34 #include "hashtab.h"
35 #include "langhooks.h"
36 #include "ggc.h"
37 #include "target.h"
38 #include "except.h"
39 #include "lto-streamer.h"
40
41 /* i386/PE specific attribute support.
42
43    i386/PE has two new attributes:
44    dllexport - for exporting a function/variable that will live in a dll
45    dllimport - for importing a function/variable from a dll
46
47    Microsoft allows multiple declspecs in one __declspec, separating
48    them with spaces.  We do NOT support this.  Instead, use __declspec
49    multiple times.
50 */
51
52 /* Handle a "shared" attribute;
53    arguments as in struct attribute_spec.handler.  */
54 tree
55 ix86_handle_shared_attribute (tree *node, tree name,
56                               tree args ATTRIBUTE_UNUSED,
57                               int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
58 {
59   if (TREE_CODE (*node) != VAR_DECL)
60     {
61       warning (OPT_Wattributes, "%qE attribute only applies to variables",
62                name);
63       *no_add_attrs = true;
64     }
65
66   return NULL_TREE;
67 }
68
69 /* Handle a "selectany" attribute;
70    arguments as in struct attribute_spec.handler.  */
71 tree
72 ix86_handle_selectany_attribute (tree *node, tree name,
73                                  tree args ATTRIBUTE_UNUSED,
74                                  int flags ATTRIBUTE_UNUSED,
75                                  bool *no_add_attrs)
76 {
77   /* The attribute applies only to objects that are initialized and have
78      external linkage.  However, we may not know about initialization
79      until the language frontend has processed the decl. We'll check for
80      initialization later in encode_section_info.  */
81   if (TREE_CODE (*node) != VAR_DECL || !TREE_PUBLIC (*node))
82     {   
83       error ("%qE attribute applies only to initialized variables"
84              " with external linkage", name);
85       *no_add_attrs = true;
86     }
87
88   return NULL_TREE;
89 }
90
91 \f
92 /* Return the type that we should use to determine if DECL is
93    imported or exported.  */
94
95 static tree
96 associated_type (tree decl)
97 {
98   return (DECL_CONTEXT (decl) && TYPE_P (DECL_CONTEXT (decl))
99           ?  DECL_CONTEXT (decl) : NULL_TREE);
100 }
101
102 /* Return true if DECL should be a dllexport'd object.  */
103
104 static bool
105 i386_pe_determine_dllexport_p (tree decl)
106 {
107   if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL)
108     return false;
109
110   /* Don't export local clones of dllexports.  */
111   if (!TREE_PUBLIC (decl))
112     return false;
113
114   if (lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl)))
115     return true;
116
117   return false;
118 }
119
120 /* Return true if DECL should be a dllimport'd object.  */
121
122 static bool
123 i386_pe_determine_dllimport_p (tree decl)
124 {
125   tree assoc;
126
127   if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL)
128     return false;
129
130   if (DECL_DLLIMPORT_P (decl))
131     return true;
132
133   /* The DECL_DLLIMPORT_P flag was set for decls in the class definition
134      by  targetm.cxx.adjust_class_at_definition.  Check again to emit
135      error message if the class attribute has been overridden by an
136      out-of-class definition of static data.  */
137   assoc = associated_type (decl);
138   if (assoc && lookup_attribute ("dllimport", TYPE_ATTRIBUTES (assoc))
139       && TREE_CODE (decl) == VAR_DECL
140       && TREE_STATIC (decl) && TREE_PUBLIC (decl)
141       && !DECL_EXTERNAL (decl)
142       /* vtable's are linkonce constants, so defining a vtable is not
143          an error as long as we don't try to import it too.  */
144       && !DECL_VIRTUAL_P (decl))
145         error ("definition of static data member %q+D of "
146                "dllimport%'d class", decl);
147
148   return false;
149 }
150
151 /* Handle the -mno-fun-dllimport target switch.  */
152
153 bool
154 i386_pe_valid_dllimport_attribute_p (const_tree decl)
155 {
156    if (TARGET_NOP_FUN_DLLIMPORT && TREE_CODE (decl) == FUNCTION_DECL)
157      return false;
158    return true;
159 }
160
161 /* Return string which is the function name, identified by ID, modified
162    with a suffix consisting of an atsign (@) followed by the number of
163    bytes of arguments.  If ID is NULL use the DECL_NAME as base. If
164    FASTCALL is true, also add the FASTCALL_PREFIX.
165    Return NULL if no change required.  */
166
167 static tree
168 gen_stdcall_or_fastcall_suffix (tree decl, tree id, bool fastcall)
169 {
170   HOST_WIDE_INT total = 0;
171   const char *old_str = IDENTIFIER_POINTER (id != NULL_TREE ? id : DECL_NAME (decl));
172   char *new_str, *p;
173   tree type = TREE_TYPE (decl);
174   tree arg;
175   function_args_iterator args_iter;
176
177   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);  
178
179   if (prototype_p (type))
180     {
181       /* This attribute is ignored for variadic functions.  */ 
182       if (stdarg_p (type))
183         return NULL_TREE;
184
185       /* Quit if we hit an incomplete type.  Error is reported
186          by convert_arguments in c-typeck.c or cp/typeck.c.  */
187       FOREACH_FUNCTION_ARGS(type, arg, args_iter)
188         {
189           HOST_WIDE_INT parm_size;
190           HOST_WIDE_INT parm_boundary_bytes = PARM_BOUNDARY / BITS_PER_UNIT;
191
192           if (! COMPLETE_TYPE_P (arg))
193             break;
194
195           parm_size = int_size_in_bytes (arg);
196           if (parm_size < 0)
197             break;
198
199           /* Must round up to include padding.  This is done the same
200              way as in store_one_arg.  */
201           parm_size = ((parm_size + parm_boundary_bytes - 1)
202                        / parm_boundary_bytes * parm_boundary_bytes);
203           total += parm_size;
204         }
205       }
206   /* Assume max of 8 base 10 digits in the suffix.  */
207   p = new_str = XALLOCAVEC (char, 1 + strlen (old_str) + 1 + 8 + 1);
208   if (fastcall)
209     *p++ = FASTCALL_PREFIX;
210   sprintf (p, "%s@" HOST_WIDE_INT_PRINT_DEC, old_str, total);
211
212   return get_identifier (new_str);
213 }
214
215 /* Maybe decorate and get a new identifier for the DECL of a stdcall or
216    fastcall function. The original identifier is supplied in ID. */
217
218 static tree
219 i386_pe_maybe_mangle_decl_assembler_name (tree decl, tree id)
220 {
221   tree new_id = NULL_TREE;
222
223   if (TREE_CODE (decl) == FUNCTION_DECL)
224     { 
225       tree type_attributes = TYPE_ATTRIBUTES (TREE_TYPE (decl));
226       if (lookup_attribute ("stdcall", type_attributes))
227         new_id = gen_stdcall_or_fastcall_suffix (decl, id, false);
228       else if (lookup_attribute ("fastcall", type_attributes))
229         new_id = gen_stdcall_or_fastcall_suffix (decl, id, true);
230     }
231
232   return new_id;
233 }
234
235 /* This is used as a target hook to modify the DECL_ASSEMBLER_NAME
236    in the language-independent default hook
237    langhooks,c:lhd_set_decl_assembler_name ()
238    and in cp/mangle,c:mangle_decl ().  */
239 tree
240 i386_pe_mangle_decl_assembler_name (tree decl, tree id)
241 {
242   tree new_id = i386_pe_maybe_mangle_decl_assembler_name (decl, id);   
243
244   return (new_id ? new_id : id);
245 }
246
247 void
248 i386_pe_encode_section_info (tree decl, rtx rtl, int first)
249 {
250   rtx symbol;
251   int flags;
252
253   /* Do this last, due to our frobbing of DECL_DLLIMPORT_P above.  */
254   default_encode_section_info (decl, rtl, first);
255
256   /* Careful not to prod global register variables.  */
257   if (!MEM_P (rtl))
258     return;
259
260   symbol = XEXP (rtl, 0);
261   gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
262
263   switch (TREE_CODE (decl))
264     {
265     case FUNCTION_DECL:
266       /* FIXME:  Imported stdcall names are not modified by the Ada frontend.
267          Check and decorate the RTL name now.  */
268       if  (strcmp (lang_hooks.name, "GNU Ada") == 0)
269         {
270           tree new_id;
271           tree old_id = DECL_ASSEMBLER_NAME (decl);
272           const char* asm_str = IDENTIFIER_POINTER (old_id);
273           /* Do not change the identifier if a verbatim asmspec
274              or if stdcall suffix already added. */
275           if (!(*asm_str == '*' || strchr (asm_str, '@'))
276               && (new_id = i386_pe_maybe_mangle_decl_assembler_name (decl,
277                                                                      old_id)))
278             XSTR (symbol, 0) = IDENTIFIER_POINTER (new_id);
279         }
280       break;
281
282     case VAR_DECL:
283       if (lookup_attribute ("selectany", DECL_ATTRIBUTES (decl)))
284         {
285           if (DECL_INITIAL (decl)
286               /* If an object is initialized with a ctor, the static
287                  initialization and destruction code for it is present in
288                  each unit defining the object.  The code that calls the
289                  ctor is protected by a link-once guard variable, so that
290                  the object still has link-once semantics,  */
291               || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
292             make_decl_one_only (decl, DECL_ASSEMBLER_NAME (decl));
293           else
294             error ("%q+D:'selectany' attribute applies only to "
295                    "initialized objects", decl);
296         }
297       break;
298
299     default:
300       return;
301     }
302
303   /* Mark the decl so we can tell from the rtl whether the object is
304      dllexport'd or dllimport'd.  tree.c: merge_dllimport_decl_attributes
305      handles dllexport/dllimport override semantics.  */
306   flags = (SYMBOL_REF_FLAGS (symbol) &
307            ~(SYMBOL_FLAG_DLLIMPORT | SYMBOL_FLAG_DLLEXPORT));
308   if (i386_pe_determine_dllexport_p (decl))
309     flags |= SYMBOL_FLAG_DLLEXPORT;
310   else if (i386_pe_determine_dllimport_p (decl))
311     flags |= SYMBOL_FLAG_DLLIMPORT;
312  
313   SYMBOL_REF_FLAGS (symbol) = flags;
314 }
315
316 bool
317 i386_pe_binds_local_p (const_tree exp)
318 {
319   /* PE does not do dynamic binding.  Indeed, the only kind of
320      non-local reference comes from a dllimport'd symbol.  */
321   if ((TREE_CODE (exp) == VAR_DECL || TREE_CODE (exp) == FUNCTION_DECL)
322       && DECL_DLLIMPORT_P (exp))
323     return false;
324
325   /* Or a weak one, now that they are supported.  */
326   if ((TREE_CODE (exp) == VAR_DECL || TREE_CODE (exp) == FUNCTION_DECL)
327       && DECL_WEAK (exp))
328     return false;
329
330   return true;
331 }
332
333 /* Also strip the fastcall prefix and stdcall suffix.  */
334
335 const char *
336 i386_pe_strip_name_encoding_full (const char *str)
337 {
338   const char *p;
339   const char *name = default_strip_name_encoding (str);
340
341   /* Strip leading '@' on fastcall symbols.  */
342   if (*name == '@')
343     name++;
344
345   /* Strip trailing "@n".  */
346   p = strchr (name, '@');
347   if (p)
348     return ggc_alloc_string (name, p - name);
349
350   return name;
351 }
352
353 void
354 i386_pe_unique_section (tree decl, int reloc)
355 {
356   int len;
357   const char *name, *prefix;
358   char *string;
359
360   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
361   name = i386_pe_strip_name_encoding_full (name);
362
363   /* The object is put in, for example, section .text$foo.
364      The linker will then ultimately place them in .text
365      (everything from the $ on is stripped). Don't put
366      read-only data in .rdata section to avoid a PE linker
367      bug when .rdata$* grouped sections are used in code
368      without a .rdata section.  */
369   if (TREE_CODE (decl) == FUNCTION_DECL)
370     prefix = ".text$";
371   else if (decl_readonly_section (decl, reloc))
372     prefix = ".rdata$";
373   else
374     prefix = ".data$";
375   len = strlen (name) + strlen (prefix);
376   string = XALLOCAVEC (char, len + 1);
377   sprintf (string, "%s%s", prefix, name);
378
379   DECL_SECTION_NAME (decl) = build_string (len, string);
380 }
381
382 /* Select a set of attributes for section NAME based on the properties
383    of DECL and whether or not RELOC indicates that DECL's initializer
384    might contain runtime relocations.
385
386    We make the section read-only and executable for a function decl,
387    read-only for a const data decl, and writable for a non-const data decl.
388
389    If the section has already been defined, to not allow it to have
390    different attributes, as (1) this is ambiguous since we're not seeing
391    all the declarations up front and (2) some assemblers (e.g. SVR4)
392    do not recognize section redefinitions.  */
393 /* ??? This differs from the "standard" PE implementation in that we
394    handle the SHARED variable attribute.  Should this be done for all
395    PE targets?  */
396
397 #define SECTION_PE_SHARED       SECTION_MACH_DEP
398
399 unsigned int
400 i386_pe_section_type_flags (tree decl, const char *name, int reloc)
401 {
402   static htab_t htab;
403   unsigned int flags;
404   unsigned int **slot;
405
406   /* The names we put in the hashtable will always be the unique
407      versions given to us by the stringtable, so we can just use
408      their addresses as the keys.  */
409   if (!htab)
410     htab = htab_create (31, htab_hash_pointer, htab_eq_pointer, NULL);
411
412   if (decl && TREE_CODE (decl) == FUNCTION_DECL)
413     flags = SECTION_CODE;
414   else if (decl && decl_readonly_section (decl, reloc))
415     flags = 0;
416   else
417     {
418       flags = SECTION_WRITE;
419
420       if (decl && TREE_CODE (decl) == VAR_DECL
421           && lookup_attribute ("shared", DECL_ATTRIBUTES (decl)))
422         flags |= SECTION_PE_SHARED;
423     }
424
425   if (decl && DECL_ONE_ONLY (decl))
426     flags |= SECTION_LINKONCE;
427
428   /* See if we already have an entry for this section.  */
429   slot = (unsigned int **) htab_find_slot (htab, name, INSERT);
430   if (!*slot)
431     {
432       *slot = (unsigned int *) xmalloc (sizeof (unsigned int));
433       **slot = flags;
434     }
435   else
436     {
437       if (decl && **slot != flags)
438         error ("%q+D causes a section type conflict", decl);
439     }
440
441   return flags;
442 }
443
444 void
445 i386_pe_asm_named_section (const char *name, unsigned int flags, 
446                            tree decl)
447 {
448   char flagchars[8], *f = flagchars;
449
450   if ((flags & (SECTION_CODE | SECTION_WRITE)) == 0)
451     /* readonly data */
452     {
453       *f++ ='d';  /* This is necessary for older versions of gas.  */
454       *f++ ='r';
455     }
456   else  
457     {
458       if (flags & SECTION_CODE)
459         *f++ = 'x';
460       if (flags & SECTION_WRITE)
461         *f++ = 'w';
462       if (flags & SECTION_PE_SHARED)
463         *f++ = 's';
464     }
465
466   /* LTO sections need 1-byte alignment to avoid confusing the
467      zlib decompression algorithm with trailing zero pad bytes.  */
468   if (strncmp (name, LTO_SECTION_NAME_PREFIX,
469                         strlen (LTO_SECTION_NAME_PREFIX)) == 0)
470     *f++ = '0';
471
472   *f = '\0';
473
474   fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars);
475
476   if (flags & SECTION_LINKONCE)
477     {
478       /* Functions may have been compiled at various levels of
479          optimization so we can't use `same_size' here.
480          Instead, have the linker pick one, without warning.
481          If 'selectany' attribute has been specified,  MS compiler
482          sets 'discard' characteristic, rather than telling linker
483          to warn of size or content mismatch, so do the same.  */ 
484       bool discard = (flags & SECTION_CODE)
485                       || lookup_attribute ("selectany",
486                                            DECL_ATTRIBUTES (decl));      
487       fprintf (asm_out_file, "\t.linkonce %s\n",
488                (discard  ? "discard" : "same_size"));
489     }
490 }
491
492 /* Beware, DECL may be NULL if compile_file() is emitting the LTO marker.  */
493
494 void
495 i386_pe_asm_output_aligned_decl_common (FILE *stream, tree decl,
496                                         const char *name, HOST_WIDE_INT size,
497                                         HOST_WIDE_INT align ATTRIBUTE_UNUSED)
498 {
499   HOST_WIDE_INT rounded;
500
501   /* Compute as in assemble_noswitch_variable, since we don't have
502      support for aligned common on older binutils.  We must also
503      avoid emitting a common symbol of size zero, as this is the
504      overloaded representation that indicates an undefined external
505      symbol in the PE object file format.  */
506   rounded = size ? size : 1;
507   rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1;
508   rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
509              * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
510   
511   i386_pe_maybe_record_exported_symbol (decl, name, 1);
512
513   fprintf (stream, "\t.comm\t");
514   assemble_name (stream, name);
515   if (use_pe_aligned_common)
516     fprintf (stream, ", " HOST_WIDE_INT_PRINT_DEC ", %d\n",
517            size ? size : (HOST_WIDE_INT) 1,
518            exact_log2 (align) - exact_log2 (CHAR_BIT));
519   else
520     fprintf (stream, ", " HOST_WIDE_INT_PRINT_DEC "\t" ASM_COMMENT_START
521            " " HOST_WIDE_INT_PRINT_DEC "\n", rounded, size);
522 }
523 \f
524 /* The Microsoft linker requires that every function be marked as
525    DT_FCN.  When using gas on cygwin, we must emit appropriate .type
526    directives.  */
527
528 #include "gsyms.h"
529
530 /* Mark a function appropriately.  This should only be called for
531    functions for which we are not emitting COFF debugging information.
532    FILE is the assembler output file, NAME is the name of the
533    function, and PUB is nonzero if the function is globally
534    visible.  */
535
536 void
537 i386_pe_declare_function_type (FILE *file, const char *name, int pub)
538 {
539   fprintf (file, "\t.def\t");
540   assemble_name (file, name);
541   fprintf (file, ";\t.scl\t%d;\t.type\t%d;\t.endef\n",
542            pub ? (int) C_EXT : (int) C_STAT,
543            (int) DT_FCN << N_BTSHFT);
544 }
545
546 /* Keep a list of external functions.  */
547
548 struct GTY(()) extern_list
549 {
550   struct extern_list *next;
551   tree decl;
552   const char *name;
553 };
554
555 static GTY(()) struct extern_list *extern_head;
556
557 /* Assemble an external function reference.  We need to keep a list of
558    these, so that we can output the function types at the end of the
559    assembly.  We can't output the types now, because we might see a
560    definition of the function later on and emit debugging information
561    for it then.  */
562
563 void
564 i386_pe_record_external_function (tree decl, const char *name)
565 {
566   struct extern_list *p;
567
568   p = ggc_alloc_extern_list ();
569   p->next = extern_head;
570   p->decl = decl;
571   p->name = name;
572   extern_head = p;
573 }
574
575 /* Keep a list of exported symbols.  */
576
577 struct GTY(()) export_list
578 {
579   struct export_list *next;
580   const char *name;
581   int is_data;          /* used to type tag exported symbols.  */
582 };
583
584 static GTY(()) struct export_list *export_head;
585
586 /* Assemble an export symbol entry.  We need to keep a list of
587    these, so that we can output the export list at the end of the
588    assembly.  We used to output these export symbols in each function,
589    but that causes problems with GNU ld when the sections are
590    linkonce.  Beware, DECL may be NULL if compile_file() is emitting
591    the LTO marker.  */
592
593 void
594 i386_pe_maybe_record_exported_symbol (tree decl, const char *name, int is_data)
595 {
596   rtx symbol;
597   struct export_list *p;
598
599   if (!decl)
600     return;
601
602   symbol = XEXP (DECL_RTL (decl), 0);
603   gcc_assert (GET_CODE (symbol) == SYMBOL_REF);
604   if (!SYMBOL_REF_DLLEXPORT_P (symbol))
605     return;
606
607   gcc_assert (TREE_PUBLIC (decl));
608
609   p = ggc_alloc_export_list ();
610   p->next = export_head;
611   p->name = name;
612   p->is_data = is_data;
613   export_head = p;
614 }
615
616 #ifdef CXX_WRAP_SPEC_LIST
617
618 /*  Hash table equality helper function.  */
619
620 static int
621 wrapper_strcmp (const void *x, const void *y)
622 {
623   return !strcmp ((const char *) x, (const char *) y);
624 }
625
626 /* Search for a function named TARGET in the list of library wrappers
627    we are using, returning a pointer to it if found or NULL if not.
628    This function might be called on quite a few symbols, and we only
629    have the list of names of wrapped functions available to us as a
630    spec string, so first time round we lazily initialise a hash table
631    to make things quicker.  */
632
633 static const char *
634 i386_find_on_wrapper_list (const char *target)
635 {
636   static char first_time = 1;
637   static htab_t wrappers;
638
639   if (first_time)
640     {
641       /* Beware that this is not a complicated parser, it assumes
642          that any sequence of non-whitespace beginning with an
643          underscore is one of the wrapped symbols.  For now that's
644          adequate to distinguish symbols from spec substitutions
645          and command-line options.  */
646       static char wrapper_list_buffer[] = CXX_WRAP_SPEC_LIST;
647       char *bufptr;
648       /* Breaks up the char array into separated strings
649          strings and enter them into the hash table.  */
650       wrappers = htab_create_alloc (8, htab_hash_string, wrapper_strcmp,
651         0, xcalloc, free);
652       for (bufptr = wrapper_list_buffer; *bufptr; ++bufptr)
653         {
654           char *found = NULL;
655           if (ISSPACE (*bufptr))
656             continue;
657           if (*bufptr == '_')
658             found = bufptr;
659           while (*bufptr && !ISSPACE (*bufptr))
660             ++bufptr;
661           if (*bufptr)
662             *bufptr = 0;
663           if (found)
664             *htab_find_slot (wrappers, found, INSERT) = found;
665         }
666       first_time = 0;
667     }
668
669   return (const char *) htab_find (wrappers, target);
670 }
671
672 #endif /* CXX_WRAP_SPEC_LIST */
673
674 /* This is called at the end of assembly.  For each external function
675    which has not been defined, we output a declaration now.  We also
676    output the .drectve section.  */
677
678 void
679 i386_pe_file_end (void)
680 {
681   struct extern_list *p;
682
683   for (p = extern_head; p != NULL; p = p->next)
684     {
685       tree decl;
686
687       decl = p->decl;
688
689       /* Positively ensure only one declaration for any given symbol.  */
690       if (! TREE_ASM_WRITTEN (decl)
691           && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
692         {
693 #ifdef CXX_WRAP_SPEC_LIST
694           /* To ensure the DLL that provides the corresponding real
695              functions is still loaded at runtime, we must reference
696              the real function so that an (unused) import is created.  */
697           const char *realsym = i386_find_on_wrapper_list (p->name);
698           if (realsym)
699             i386_pe_declare_function_type (asm_out_file,
700                 concat ("__real_", realsym, NULL), TREE_PUBLIC (decl));
701 #endif /* CXX_WRAP_SPEC_LIST */
702           TREE_ASM_WRITTEN (decl) = 1;
703           i386_pe_declare_function_type (asm_out_file, p->name,
704                                          TREE_PUBLIC (decl));
705         }
706     }
707
708   if (export_head)
709     {
710       struct export_list *q;
711       drectve_section ();
712       for (q = export_head; q != NULL; q = q->next)
713         {
714           fprintf (asm_out_file, "\t.ascii \" -export:\\\"%s\\\"%s\"\n",
715                    default_strip_name_encoding (q->name),
716                    (q->is_data ? ",data" : ""));
717         }
718     }
719 }
720
721 \f
722 /* x64 Structured Exception Handling unwind info.  */
723
724 struct seh_frame_state
725 {
726   /* SEH records saves relative to the "current" stack pointer, whether
727      or not there's a frame pointer in place.  This tracks the current
728      stack pointer offset from the CFA.  */
729   HOST_WIDE_INT sp_offset;
730
731   /* The CFA is located at CFA_REG + CFA_OFFSET.  */
732   HOST_WIDE_INT cfa_offset;
733   rtx cfa_reg;
734 };
735
736 /* Set up data structures beginning output for SEH.  */
737
738 void
739 i386_pe_seh_init (FILE *f)
740 {
741   struct seh_frame_state *seh;
742
743   if (!TARGET_SEH)
744     return;
745   if (cfun->is_thunk)
746     return;
747
748   /* We cannot support DRAP with SEH.  We turned off support for it by
749      re-defining MAX_STACK_ALIGNMENT when SEH is enabled.  */
750   gcc_assert (!stack_realign_drap);
751
752   seh = XCNEW (struct seh_frame_state);
753   cfun->machine->seh = seh;
754
755   seh->sp_offset = INCOMING_FRAME_SP_OFFSET;
756   seh->cfa_offset = INCOMING_FRAME_SP_OFFSET;
757   seh->cfa_reg = stack_pointer_rtx;
758
759   fputs ("\t.seh_proc\t", f);
760   assemble_name (f, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (cfun->decl)));
761   fputc ('\n', f);
762 }
763
764 void
765 i386_pe_seh_end_prologue (FILE *f)
766 {
767   struct seh_frame_state *seh;
768
769   if (!TARGET_SEH)
770     return;
771   if (cfun->is_thunk)
772     return;
773   seh = cfun->machine->seh;
774
775   /* Emit an assembler directive to set up the frame pointer.  Always do
776      this last.  The documentation talks about doing this "before" any
777      other code that uses offsets, but (experimentally) that's after we
778      emit the codes in reverse order (handled by the assembler).  */
779   if (seh->cfa_reg != stack_pointer_rtx)
780     {
781       HOST_WIDE_INT offset = seh->sp_offset - seh->cfa_offset;
782
783       gcc_assert ((offset & 15) == 0);
784       gcc_assert (IN_RANGE (offset, 0, 240));
785
786       fputs ("\t.seh_setframe\t", f);
787       print_reg (seh->cfa_reg, 0, f);
788       fprintf (f, ", " HOST_WIDE_INT_PRINT_DEC "\n", offset);
789     }
790
791   XDELETE (seh);
792   cfun->machine->seh = NULL;
793
794   fputs ("\t.seh_endprologue\n", f);
795 }
796
797 static void
798 i386_pe_seh_fini (FILE *f)
799 {
800   if (!TARGET_SEH)
801     return;
802   if (cfun->is_thunk)
803     return;
804   fputs ("\t.seh_endproc\n", f);
805 }
806
807 /* Emit an assembler directive to save REG via a PUSH.  */
808
809 static void
810 seh_emit_push (FILE *f, struct seh_frame_state *seh, rtx reg)
811 {
812   unsigned int regno = REGNO (reg);
813
814   gcc_checking_assert (GENERAL_REGNO_P (regno));
815
816   seh->sp_offset += UNITS_PER_WORD;
817   if (seh->cfa_reg == stack_pointer_rtx)
818     seh->cfa_offset += UNITS_PER_WORD;
819
820   fputs ("\t.seh_pushreg\t", f);
821   print_reg (reg, 0, f);
822   fputc ('\n', f);
823 }
824
825 /* Emit an assembler directive to save REG at CFA - CFA_OFFSET.  */
826
827 static void
828 seh_emit_save (FILE *f, struct seh_frame_state *seh,
829                rtx reg, HOST_WIDE_INT cfa_offset)
830 {
831   unsigned int regno = REGNO (reg);
832   HOST_WIDE_INT offset;
833
834   /* Negative save offsets are of course not supported, since that
835      would be a store below the stack pointer and thus clobberable.  */
836   gcc_assert (seh->sp_offset >= cfa_offset);
837   offset = seh->sp_offset - cfa_offset;
838
839   fputs ((SSE_REGNO_P (regno) ? "\t.seh_savexmm\t"
840          : GENERAL_REGNO_P (regno) ?  "\t.seh_savereg\t"
841          : (gcc_unreachable (), "")), f);
842   print_reg (reg, 0, f);
843   fprintf (f, ", " HOST_WIDE_INT_PRINT_DEC "\n", offset);
844 }
845
846 /* Emit an assembler directive to adjust RSP by OFFSET.  */
847
848 static void
849 seh_emit_stackalloc (FILE *f, struct seh_frame_state *seh,
850                      HOST_WIDE_INT offset)
851 {
852   /* We're only concerned with prologue stack allocations, which all
853      are subtractions from the stack pointer.  */
854   gcc_assert (offset < 0);
855   offset = -offset;
856
857   if (seh->cfa_reg == stack_pointer_rtx)
858     seh->cfa_offset += offset;
859   seh->sp_offset += offset;
860
861   fprintf (f, "\t.seh_stackalloc\t" HOST_WIDE_INT_PRINT_DEC "\n", offset);
862 }
863
864 /* Process REG_CFA_ADJUST_CFA for SEH.  */
865
866 static void
867 seh_cfa_adjust_cfa (FILE *f, struct seh_frame_state *seh, rtx pat)
868 {
869   rtx dest, src;
870   HOST_WIDE_INT reg_offset = 0;
871   unsigned int dest_regno;
872
873   dest = SET_DEST (pat);
874   src = SET_SRC (pat);
875
876   if (GET_CODE (src) == PLUS)
877     {
878       reg_offset = INTVAL (XEXP (src, 1));
879       src = XEXP (src, 0);
880     }
881   else if (GET_CODE (src) == MINUS)
882     {
883       reg_offset = -INTVAL (XEXP (src, 1));
884       src = XEXP (src, 0);
885     }
886   gcc_assert (src == stack_pointer_rtx);
887   gcc_assert (seh->cfa_reg == stack_pointer_rtx);
888   dest_regno = REGNO (dest);
889
890   if (dest_regno == STACK_POINTER_REGNUM)
891     seh_emit_stackalloc (f, seh, reg_offset);
892   else if (dest_regno == HARD_FRAME_POINTER_REGNUM)
893     {
894       seh->cfa_reg = dest;
895       seh->cfa_offset -= reg_offset;
896     }
897   else
898     gcc_unreachable ();
899 }
900
901 /* Process REG_CFA_OFFSET for SEH.  */
902
903 static void
904 seh_cfa_offset (FILE *f, struct seh_frame_state *seh, rtx pat)
905 {
906   rtx dest, src;
907   HOST_WIDE_INT reg_offset;
908
909   dest = SET_DEST (pat);
910   src = SET_SRC (pat);
911
912   gcc_assert (MEM_P (dest));
913   dest = XEXP (dest, 0);
914   if (REG_P (dest))
915     reg_offset = 0;
916   else
917     {
918       gcc_assert (GET_CODE (dest) == PLUS);
919       reg_offset = INTVAL (XEXP (dest, 1));
920       dest = XEXP (dest, 0);
921     }
922   gcc_assert (dest == seh->cfa_reg);
923
924   seh_emit_save (f, seh, src, seh->cfa_offset - reg_offset);
925 }
926
927 /* Process a FRAME_RELATED_EXPR for SEH.  */
928
929 static void
930 seh_frame_related_expr (FILE *f, struct seh_frame_state *seh, rtx pat)
931 {
932   rtx dest, src;
933   HOST_WIDE_INT addend;
934
935   /* See the full loop in dwarf2out_frame_debug_expr.  */
936   if (GET_CODE (pat) == PARALLEL || GET_CODE (pat) == SEQUENCE)
937     {
938       int i, n = XVECLEN (pat, 0), pass, npass;
939
940       npass = (GET_CODE (pat) == PARALLEL ? 2 : 1);
941       for (pass = 0; pass < npass; ++pass)
942         for (i = 0; i < n; ++i)
943           {
944             rtx ele = XVECEXP (pat, 0, i);
945
946             if (GET_CODE (ele) != SET)
947               continue;
948             dest = SET_DEST (ele);
949
950             /* Process each member of the PARALLEL independently.  The first
951                member is always processed; others only if they are marked.  */
952             if (i == 0 || RTX_FRAME_RELATED_P (ele))
953               {
954                 /* Evaluate all register saves in the first pass and all
955                    register updates in the second pass.  */
956                 if ((MEM_P (dest) ^ pass) || npass == 1)
957                   seh_frame_related_expr (f, seh, ele);
958               }
959           }
960       return;
961     }
962
963   dest = SET_DEST (pat);
964   src = SET_SRC (pat);
965
966   switch (GET_CODE (dest))
967     {
968     case REG:
969       switch (GET_CODE (src))
970         {
971         case REG:
972           /* REG = REG: This should be establishing a frame pointer.  */
973           gcc_assert (src == stack_pointer_rtx);
974           gcc_assert (dest == hard_frame_pointer_rtx);
975           seh_cfa_adjust_cfa (f, seh, pat);
976           break;
977
978         case PLUS:
979           addend = INTVAL (XEXP (src, 1));
980           src = XEXP (src, 0);
981           if (dest == hard_frame_pointer_rtx)
982             seh_cfa_adjust_cfa (f, seh, pat);
983           else if (dest == stack_pointer_rtx)
984             {
985               gcc_assert (src == stack_pointer_rtx);
986               seh_emit_stackalloc (f, seh, addend);
987             }
988           else
989             gcc_unreachable ();
990           break;
991
992         default:
993           gcc_unreachable ();
994         }
995       break;
996
997     case MEM:
998       /* A save of some kind.  */
999       dest = XEXP (dest, 0);
1000       if (GET_CODE (dest) == PRE_DEC)
1001         {
1002           gcc_checking_assert (GET_MODE (src) == Pmode);
1003           gcc_checking_assert (REG_P (src));
1004           seh_emit_push (f, seh, src);
1005         }
1006       else
1007         seh_cfa_offset (f, seh, pat);
1008       break;
1009
1010     default:
1011       gcc_unreachable ();
1012     }
1013 }
1014
1015 /* This function looks at a single insn and emits any SEH directives
1016    required for unwind of this insn.  */
1017
1018 void
1019 i386_pe_seh_unwind_emit (FILE *asm_out_file, rtx insn)
1020 {
1021   rtx note, pat;
1022   bool handled_one = false;
1023   struct seh_frame_state *seh;
1024
1025   if (!TARGET_SEH)
1026     return;
1027
1028   /* We free the SEH data once done with the prologue.  Ignore those
1029      RTX_FRAME_RELATED_P insns that are associated with the epilogue.  */
1030   seh = cfun->machine->seh;
1031   if (seh == NULL)
1032     return;
1033
1034   if (NOTE_P (insn) || !RTX_FRAME_RELATED_P (insn))
1035     return;
1036
1037   for (note = REG_NOTES (insn); note ; note = XEXP (note, 1))
1038     {
1039       pat = XEXP (note, 0);
1040       switch (REG_NOTE_KIND (note))
1041         {
1042         case REG_FRAME_RELATED_EXPR:
1043           goto found;
1044
1045         case REG_CFA_DEF_CFA:
1046         case REG_CFA_EXPRESSION:
1047           /* Only emitted with DRAP, which we disable.  */
1048           gcc_unreachable ();
1049           break;
1050
1051         case REG_CFA_REGISTER:
1052           /* Only emitted in epilogues, which we skip.  */
1053           gcc_unreachable ();
1054
1055         case REG_CFA_ADJUST_CFA:
1056           if (pat == NULL)
1057             {
1058               pat = PATTERN (insn);
1059               if (GET_CODE (pat) == PARALLEL)
1060                 pat = XVECEXP (pat, 0, 0);
1061             }
1062           seh_cfa_adjust_cfa (asm_out_file, seh, pat);
1063           handled_one = true;
1064           break;
1065
1066         case REG_CFA_OFFSET:
1067           if (pat == NULL)
1068             pat = single_set (insn);
1069           seh_cfa_offset (asm_out_file, seh, pat);
1070           handled_one = true;
1071           break;
1072
1073         default:
1074           break;
1075         }
1076     }
1077   if (handled_one)
1078     return;
1079   pat = PATTERN (insn);
1080  found:
1081   seh_frame_related_expr (asm_out_file, seh, pat);
1082 }
1083 \f
1084 void
1085 i386_pe_start_function (FILE *f, const char *name, tree decl)
1086 {
1087   i386_pe_maybe_record_exported_symbol (decl, name, 0);
1088   if (write_symbols != SDB_DEBUG)
1089     i386_pe_declare_function_type (f, name, TREE_PUBLIC (decl));
1090   ASM_OUTPUT_FUNCTION_LABEL (f, name, decl);
1091 }
1092
1093 void
1094 i386_pe_end_function (FILE *f, const char *name ATTRIBUTE_UNUSED,
1095                       tree decl ATTRIBUTE_UNUSED)
1096 {
1097   i386_pe_seh_fini (f);
1098 }
1099 \f
1100
1101 #include "gt-winnt.h"