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 Free Software Foundation, Inc.
6 This file is part of GCC.
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 2, or (at your option) any later
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
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
25 #include "coretypes.h"
29 #include "hard-reg-set.h"
38 /* i386/PE specific attribute support.
40 i386/PE has two new attributes:
41 dllexport - for exporting a function/variable that will live in a dll
42 dllimport - for importing a function/variable from a dll
44 Microsoft allows multiple declspecs in one __declspec, separating
45 them with spaces. We do NOT support this. Instead, use __declspec
49 static tree associated_type (tree);
50 static tree gen_stdcall_or_fastcall_suffix (tree, bool);
51 static int i386_pe_dllexport_p (tree);
52 static int i386_pe_dllimport_p (tree);
53 static void i386_pe_mark_dllexport (tree);
54 static void i386_pe_mark_dllimport (tree);
56 /* This is we how mark internal identifiers with dllimport or dllexport
58 #ifndef DLL_IMPORT_PREFIX
59 #define DLL_IMPORT_PREFIX "#i."
61 #ifndef DLL_EXPORT_PREFIX
62 #define DLL_EXPORT_PREFIX "#e."
65 /* Handle a "shared" attribute;
66 arguments as in struct attribute_spec.handler. */
68 ix86_handle_shared_attribute (tree *node, tree name,
69 tree args ATTRIBUTE_UNUSED,
70 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
72 if (TREE_CODE (*node) != VAR_DECL)
74 warning ("`%s' attribute only applies to variables",
75 IDENTIFIER_POINTER (name));
82 /* Return the type that we should use to determine if DECL is
83 imported or exported. */
86 associated_type (tree decl)
90 /* In the C++ frontend, DECL_CONTEXT for a method doesn't actually refer
91 to the containing class. So we look at the 'this' arg. */
92 if (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
94 /* Artificial methods are not affected by the import/export status
95 of their class unless they are COMDAT. Implicit copy ctor's and
96 dtor's are not affected by class status but virtual and
97 non-virtual thunks are. */
98 if (!DECL_ARTIFICIAL (decl) || DECL_COMDAT (decl))
100 (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl)))));
102 else if (DECL_CONTEXT (decl)
103 && TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (decl))) == 't')
104 t = DECL_CONTEXT (decl);
109 /* Return nonzero if DECL is a dllexport'd object. */
112 i386_pe_dllexport_p (tree decl)
116 if (TREE_CODE (decl) != VAR_DECL
117 && TREE_CODE (decl) != FUNCTION_DECL)
119 exp = lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl));
123 /* Class members get the dllexport status of their class. */
124 if (associated_type (decl))
126 exp = lookup_attribute ("dllexport",
127 TYPE_ATTRIBUTES (associated_type (decl)));
135 /* Return nonzero if DECL is a dllimport'd object. */
138 i386_pe_dllimport_p (tree decl)
143 if (TREE_CODE (decl) == FUNCTION_DECL
144 && TARGET_NOP_FUN_DLLIMPORT)
147 if (TREE_CODE (decl) != VAR_DECL
148 && TREE_CODE (decl) != FUNCTION_DECL)
151 imp = lookup_attribute ("dllimport", DECL_ATTRIBUTES (decl));
153 /* Class members get the dllimport status of their class. */
154 if (!imp && associated_type (decl))
156 imp = lookup_attribute ("dllimport",
157 TYPE_ATTRIBUTES (associated_type (decl)));
164 /* Don't mark defined functions as dllimport. If the definition
165 itself was marked with dllimport, than ix86_handle_dll_attribute
166 reports an error. This handles the case when the definition
167 overrides an earlier declaration. */
168 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl)
169 && !DECL_INLINE (decl))
171 /* Don't warn about artificial methods. */
172 if (!DECL_ARTIFICIAL (decl))
173 warning ("%Jfunction '%D' is defined after prior declaration "
174 "as dllimport: attribute ignored", decl, decl);
178 /* We ignore the dllimport attribute for inline member functions.
179 This differs from MSVC behavior which treats it like GNUC
180 'extern inline' extension. */
181 else if (TREE_CODE (decl) == FUNCTION_DECL && DECL_INLINE (decl))
184 warning ("%Jinline function '%D' is declared as dllimport: "
185 "attribute ignored.", decl, decl);
189 /* Don't allow definitions of static data members in dllimport class,
190 Just ignore attribute for vtable data. */
191 else if (TREE_CODE (decl) == VAR_DECL
192 && TREE_STATIC (decl) && TREE_PUBLIC (decl)
193 && !DECL_EXTERNAL (decl) && context_imp)
195 if (!DECL_VIRTUAL_P (decl))
196 error ("%Jdefinition of static data member '%D' of "
197 "dllimport'd class.", decl, decl);
201 /* Since we can't treat a pointer to a dllimport'd symbol as a
202 constant address, we turn off the attribute on C++ virtual
203 methods to allow creation of vtables using thunks. Don't mark
204 artificial methods either (in associated_type, only COMDAT
205 artificial method get import status from class context). */
206 else if (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE
207 && (DECL_VIRTUAL_P (decl) || DECL_ARTIFICIAL (decl)))
216 /* Return nonzero if SYMBOL is marked as being dllexport'd. */
219 i386_pe_dllexport_name_p (const char *symbol)
221 return (strncmp (DLL_EXPORT_PREFIX, symbol,
222 strlen (DLL_EXPORT_PREFIX)) == 0);
225 /* Return nonzero if SYMBOL is marked as being dllimport'd. */
228 i386_pe_dllimport_name_p (const char *symbol)
230 return (strncmp (DLL_IMPORT_PREFIX, symbol,
231 strlen (DLL_IMPORT_PREFIX)) == 0);
234 /* Mark a DECL as being dllexport'd.
235 Note that we override the previous setting (eg: dllimport). */
238 i386_pe_mark_dllexport (tree decl)
246 rtlname = XEXP (DECL_RTL (decl), 0);
247 if (GET_CODE (rtlname) == SYMBOL_REF)
248 oldname = XSTR (rtlname, 0);
249 else if (GET_CODE (rtlname) == MEM
250 && GET_CODE (XEXP (rtlname, 0)) == SYMBOL_REF)
251 oldname = XSTR (XEXP (rtlname, 0), 0);
254 if (i386_pe_dllimport_name_p (oldname))
256 warning ("%Jinconsistent dll linkage for '%D', dllexport assumed.",
258 /* Remove DLL_IMPORT_PREFIX. */
259 oldname += strlen (DLL_IMPORT_PREFIX);
260 DECL_NON_ADDR_CONST_P (decl) = 0;
262 else if (i386_pe_dllexport_name_p (oldname))
263 return; /* already done */
265 newname = alloca (strlen (DLL_EXPORT_PREFIX) + strlen (oldname) + 1);
266 sprintf (newname, "%s%s", DLL_EXPORT_PREFIX, oldname);
268 /* We pass newname through get_identifier to ensure it has a unique
269 address. RTL processing can sometimes peek inside the symbol ref
270 and compare the string's addresses to see if two symbols are
272 idp = get_identifier (newname);
274 symref = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (idp));
275 SYMBOL_REF_DECL (symref) = decl;
276 XEXP (DECL_RTL (decl), 0) = symref;
279 /* Mark a DECL as being dllimport'd. */
282 i386_pe_mark_dllimport (tree decl)
290 rtlname = XEXP (DECL_RTL (decl), 0);
291 if (GET_CODE (rtlname) == SYMBOL_REF)
292 oldname = XSTR (rtlname, 0);
293 else if (GET_CODE (rtlname) == MEM
294 && GET_CODE (XEXP (rtlname, 0)) == SYMBOL_REF)
295 oldname = XSTR (XEXP (rtlname, 0), 0);
298 if (i386_pe_dllexport_name_p (oldname))
300 error ("`%s' declared as both exported to and imported from a DLL",
301 IDENTIFIER_POINTER (DECL_NAME (decl)));
304 else if (i386_pe_dllimport_name_p (oldname))
306 /* Already done, but do a sanity check to prevent assembler errors. */
307 if (!DECL_EXTERNAL (decl) || !TREE_PUBLIC (decl))
309 error ("%Jfailure in redeclaration of '%D': dllimport'd "
310 "symbol lacks external linkage.", decl, decl);
316 newname = alloca (strlen (DLL_IMPORT_PREFIX) + strlen (oldname) + 1);
317 sprintf (newname, "%s%s", DLL_IMPORT_PREFIX, oldname);
319 /* We pass newname through get_identifier to ensure it has a unique
320 address. RTL processing can sometimes peek inside the symbol ref
321 and compare the string's addresses to see if two symbols are
323 idp = get_identifier (newname);
325 symref = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (idp));
326 SYMBOL_REF_DECL (symref) = decl;
327 newrtl = gen_rtx_MEM (Pmode,symref);
328 XEXP (DECL_RTL (decl), 0) = newrtl;
330 /* Can't treat a pointer to this as a constant address */
331 DECL_NON_ADDR_CONST_P (decl) = 1;
334 /* Return string which is the former assembler name modified with a
335 suffix consisting of an atsign (@) followed by the number of bytes of
336 arguments. If FASTCALL is true, also add the FASTCALL_PREFIX. */
339 gen_stdcall_or_fastcall_suffix (tree decl, bool fastcall)
342 /* ??? This probably should use XSTR (XEXP (DECL_RTL (decl), 0), 0) instead
343 of DECL_ASSEMBLER_NAME. */
344 const char *asmname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
349 /* Do not change the identifier if a verbatim asmspec or already done. */
350 if (*asmname == '*' || strchr (asmname, '@'))
351 return DECL_ASSEMBLER_NAME (decl);
353 formal_type = TYPE_ARG_TYPES (TREE_TYPE (decl));
354 if (formal_type != NULL_TREE)
356 /* These attributes are ignored for variadic functions in
357 i386.c:ix86_return_pops_args. For compatibility with MS
358 compiler do not add @0 suffix here. */
359 if (TREE_VALUE (tree_last (formal_type)) != void_type_node)
360 return DECL_ASSEMBLER_NAME (decl);
362 /* Quit if we hit an incomplete type. Error is reported
363 by convert_arguments in c-typeck.c or cp/typeck.c. */
364 while (TREE_VALUE (formal_type) != void_type_node
365 && COMPLETE_TYPE_P (TREE_VALUE (formal_type)))
368 = TREE_INT_CST_LOW (TYPE_SIZE (TREE_VALUE (formal_type)));
369 /* Must round up to include padding. This is done the same
370 way as in store_one_arg. */
371 parm_size = ((parm_size + PARM_BOUNDARY - 1)
372 / PARM_BOUNDARY * PARM_BOUNDARY);
374 formal_type = TREE_CHAIN (formal_type);\
378 /* Assume max of 8 base 10 digits in the suffix. */
379 newsym = alloca (1 + strlen (asmname) + 1 + 8 + 1);
382 *p++ = FASTCALL_PREFIX;
383 sprintf (p, "%s@%d", asmname, total/BITS_PER_UNIT);
384 return get_identifier (newsym);
388 i386_pe_encode_section_info (tree decl, rtx rtl, int first)
390 default_encode_section_info (decl, rtl, first);
392 if (first && TREE_CODE (decl) == FUNCTION_DECL)
394 tree type_attributes = TYPE_ATTRIBUTES (TREE_TYPE (decl));
395 tree newid = NULL_TREE;
397 if (lookup_attribute ("stdcall", type_attributes))
398 newid = gen_stdcall_or_fastcall_suffix (decl, false);
399 else if (lookup_attribute ("fastcall", type_attributes))
400 newid = gen_stdcall_or_fastcall_suffix (decl, true);
401 if (newid != NULL_TREE)
403 rtx rtlname = XEXP (rtl, 0);
404 if (GET_CODE (rtlname) == MEM)
405 rtlname = XEXP (rtlname, 0);
406 XSTR (rtlname, 0) = IDENTIFIER_POINTER (newid);
407 /* These attributes must be present on first declaration,
408 change_decl_assembler_name will warn if they are added
409 later and the decl has been referenced, but duplicate_decls
410 should catch the mismatch before this is called. */
411 change_decl_assembler_name (decl, newid);
415 /* Mark the decl so we can tell from the rtl whether the object is
416 dllexport'd or dllimport'd. This also handles dllexport/dllimport
417 override semantics. */
419 if (i386_pe_dllexport_p (decl))
420 i386_pe_mark_dllexport (decl);
421 else if (i386_pe_dllimport_p (decl))
422 i386_pe_mark_dllimport (decl);
423 /* It might be that DECL has already been marked as dllimport, but a
424 subsequent definition nullified that. The attribute is gone but
425 DECL_RTL still has (DLL_IMPORT_PREFIX) prefixed. We need to remove
426 that. Ditto for the DECL_NON_ADDR_CONST_P flag. */
427 else if ((TREE_CODE (decl) == FUNCTION_DECL
428 || TREE_CODE (decl) == VAR_DECL)
429 && DECL_RTL (decl) != NULL_RTX
430 && GET_CODE (DECL_RTL (decl)) == MEM
431 && GET_CODE (XEXP (DECL_RTL (decl), 0)) == MEM
432 && GET_CODE (XEXP (XEXP (DECL_RTL (decl), 0), 0)) == SYMBOL_REF
433 && i386_pe_dllimport_name_p (XSTR (XEXP (XEXP (DECL_RTL (decl), 0), 0), 0)))
435 const char *oldname = XSTR (XEXP (XEXP (DECL_RTL (decl), 0), 0), 0);
437 /* Remove DLL_IMPORT_PREFIX. */
438 tree idp = get_identifier (oldname + strlen (DLL_IMPORT_PREFIX));
439 rtx symref = gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (idp));
440 SYMBOL_REF_DECL (symref) = decl;
441 XEXP (DECL_RTL (decl), 0) = symref;
442 DECL_NON_ADDR_CONST_P (decl) = 0;
444 /* We previously set TREE_PUBLIC and DECL_EXTERNAL.
445 We leave these alone for now. */
447 if (DECL_INITIAL (decl) || !DECL_EXTERNAL (decl))
448 warning ("%J'%D' defined locally after being "
449 "referenced with dllimport linkage", decl, decl);
451 warning ("%J'%D' redeclared without dllimport attribute "
452 "after being referenced with dllimport linkage", decl, decl);
456 /* Strip only the leading encoding, leaving the stdcall suffix and fastcall
457 prefix if it exists. */
460 i386_pe_strip_name_encoding (const char *str)
462 if (strncmp (str, DLL_IMPORT_PREFIX, strlen (DLL_IMPORT_PREFIX))
464 str += strlen (DLL_IMPORT_PREFIX);
465 else if (strncmp (str, DLL_EXPORT_PREFIX, strlen (DLL_EXPORT_PREFIX))
467 str += strlen (DLL_EXPORT_PREFIX);
473 /* Also strip the fastcall prefix and stdcall suffix. */
476 i386_pe_strip_name_encoding_full (const char *str)
479 const char *name = i386_pe_strip_name_encoding (str);
481 /* Strip leading '@' on fastcall symbols. */
485 /* Strip trailing "@n". */
486 p = strchr (name, '@');
488 return ggc_alloc_string (name, p - name);
493 /* Output a reference to a label. Fastcall symbols are prefixed with @,
494 whereas symbols for functions using other calling conventions don't
495 have a prefix (unless they are marked dllimport or dllexport). */
497 void i386_pe_output_labelref (FILE *stream, const char *name)
499 if (strncmp (name, DLL_IMPORT_PREFIX, strlen (DLL_IMPORT_PREFIX))
503 if (name[strlen (DLL_IMPORT_PREFIX)] == FASTCALL_PREFIX)
504 /* A dllimport fastcall symbol. */
506 fprintf (stream, "__imp_%s",
507 i386_pe_strip_name_encoding (name));
510 /* A dllimport non-fastcall symbol. */
512 fprintf (stream, "__imp__%s",
513 i386_pe_strip_name_encoding (name));
516 else if ((name[0] == FASTCALL_PREFIX)
517 || (strncmp (name, DLL_EXPORT_PREFIX, strlen (DLL_EXPORT_PREFIX))
519 && name[strlen (DLL_EXPORT_PREFIX)] == FASTCALL_PREFIX))
520 /* A fastcall symbol. */
522 fprintf (stream, "%s",
523 i386_pe_strip_name_encoding (name));
526 /* Everything else. */
528 fprintf (stream, "%s%s", USER_LABEL_PREFIX,
529 i386_pe_strip_name_encoding (name));
534 i386_pe_unique_section (tree decl, int reloc)
537 const char *name, *prefix;
540 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
541 name = i386_pe_strip_name_encoding_full (name);
543 /* The object is put in, for example, section .text$foo.
544 The linker will then ultimately place them in .text
545 (everything from the $ on is stripped). Don't put
546 read-only data in .rdata section to avoid a PE linker
547 bug when .rdata$* grouped sections are used in code
548 without a .rdata section. */
549 if (TREE_CODE (decl) == FUNCTION_DECL)
551 else if (decl_readonly_section (decl, reloc))
555 len = strlen (name) + strlen (prefix);
556 string = alloca (len + 1);
557 sprintf (string, "%s%s", prefix, name);
559 DECL_SECTION_NAME (decl) = build_string (len, string);
562 /* Select a set of attributes for section NAME based on the properties
563 of DECL and whether or not RELOC indicates that DECL's initializer
564 might contain runtime relocations.
566 We make the section read-only and executable for a function decl,
567 read-only for a const data decl, and writable for a non-const data decl.
569 If the section has already been defined, to not allow it to have
570 different attributes, as (1) this is ambiguous since we're not seeing
571 all the declarations up front and (2) some assemblers (e.g. SVR4)
572 do not recognize section redefinitions. */
573 /* ??? This differs from the "standard" PE implementation in that we
574 handle the SHARED variable attribute. Should this be done for all
577 #define SECTION_PE_SHARED SECTION_MACH_DEP
580 i386_pe_section_type_flags (tree decl, const char *name, int reloc)
586 /* The names we put in the hashtable will always be the unique
587 versions given to us by the stringtable, so we can just use
588 their addresses as the keys. */
590 htab = htab_create (31, htab_hash_pointer, htab_eq_pointer, NULL);
592 if (decl && TREE_CODE (decl) == FUNCTION_DECL)
593 flags = SECTION_CODE;
594 else if (decl && decl_readonly_section (decl, reloc))
598 flags = SECTION_WRITE;
600 if (decl && TREE_CODE (decl) == VAR_DECL
601 && lookup_attribute ("shared", DECL_ATTRIBUTES (decl)))
602 flags |= SECTION_PE_SHARED;
605 if (decl && DECL_ONE_ONLY (decl))
606 flags |= SECTION_LINKONCE;
608 /* See if we already have an entry for this section. */
609 slot = (unsigned int **) htab_find_slot (htab, name, INSERT);
612 *slot = (unsigned int *) xmalloc (sizeof (unsigned int));
617 if (decl && **slot != flags)
618 error ("%J'%D' causes a section type conflict", decl, decl);
625 i386_pe_asm_named_section (const char *name, unsigned int flags)
627 char flagchars[8], *f = flagchars;
629 if ((flags & (SECTION_CODE | SECTION_WRITE)) == 0)
632 *f++ ='d'; /* This is necessary for older versions of gas. */
637 if (flags & SECTION_CODE)
639 if (flags & SECTION_WRITE)
641 if (flags & SECTION_PE_SHARED)
647 fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars);
649 if (flags & SECTION_LINKONCE)
651 /* Functions may have been compiled at various levels of
652 optimization so we can't use `same_size' here.
653 Instead, have the linker pick one. */
654 fprintf (asm_out_file, "\t.linkonce %s\n",
655 (flags & SECTION_CODE ? "discard" : "same_size"));
659 /* The Microsoft linker requires that every function be marked as
660 DT_FCN. When using gas on cygwin, we must emit appropriate .type
665 /* Mark a function appropriately. This should only be called for
666 functions for which we are not emitting COFF debugging information.
667 FILE is the assembler output file, NAME is the name of the
668 function, and PUBLIC is nonzero if the function is globally
672 i386_pe_declare_function_type (FILE *file, const char *name, int public)
674 fprintf (file, "\t.def\t");
675 assemble_name (file, name);
676 fprintf (file, ";\t.scl\t%d;\t.type\t%d;\t.endef\n",
677 public ? (int) C_EXT : (int) C_STAT,
678 (int) DT_FCN << N_BTSHFT);
681 /* Keep a list of external functions. */
683 struct extern_list GTY(())
685 struct extern_list *next;
689 static GTY(()) struct extern_list *extern_head;
691 /* Assemble an external function reference. We need to keep a list of
692 these, so that we can output the function types at the end of the
693 assembly. We can't output the types now, because we might see a
694 definition of the function later on and emit debugging information
698 i386_pe_record_external_function (const char *name)
700 struct extern_list *p;
702 p = (struct extern_list *) ggc_alloc (sizeof *p);
703 p->next = extern_head;
708 /* Keep a list of exported symbols. */
710 struct export_list GTY(())
712 struct export_list *next;
714 int is_data; /* used to type tag exported symbols. */
717 static GTY(()) struct export_list *export_head;
719 /* Assemble an export symbol entry. We need to keep a list of
720 these, so that we can output the export list at the end of the
721 assembly. We used to output these export symbols in each function,
722 but that causes problems with GNU ld when the sections are
726 i386_pe_record_exported_symbol (const char *name, int is_data)
728 struct export_list *p;
730 p = (struct export_list *) ggc_alloc (sizeof *p);
731 p->next = export_head;
733 p->is_data = is_data;
737 /* This is called at the end of assembly. For each external function
738 which has not been defined, we output a declaration now. We also
739 output the .drectve section. */
742 i386_pe_file_end (void)
744 struct extern_list *p;
748 for (p = extern_head; p != NULL; p = p->next)
752 decl = get_identifier (p->name);
754 /* Positively ensure only one declaration for any given symbol. */
755 if (! TREE_ASM_WRITTEN (decl) && TREE_SYMBOL_REFERENCED (decl))
757 TREE_ASM_WRITTEN (decl) = 1;
758 i386_pe_declare_function_type (asm_out_file, p->name,
765 struct export_list *q;
767 for (q = export_head; q != NULL; q = q->next)
769 fprintf (asm_out_file, "\t.ascii \" -export:%s%s\"\n",
770 i386_pe_strip_name_encoding (q->name),
771 (q->is_data) ? ",data" : "");
776 #include "gt-winnt.h"