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
4 Free Software Foundation, Inc.
6 This file is part of GNU CC.
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)
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.
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. */
27 #include "hard-reg-set.h"
35 /* i386/PE specific attribute support.
37 i386/PE has two new attributes:
38 dllexport - for exporting a function/variable that will live in a dll
39 dllimport - for importing a function/variable from a dll
41 Microsoft allows multiple declspecs in one __declspec, separating
42 them with spaces. We do NOT support this. Instead, use __declspec
46 static tree associated_type PARAMS ((tree));
47 const char * gen_stdcall_suffix PARAMS ((tree));
48 int i386_pe_dllexport_p PARAMS ((tree));
49 int i386_pe_dllimport_p PARAMS ((tree));
50 void i386_pe_mark_dllexport PARAMS ((tree));
51 void i386_pe_mark_dllimport PARAMS ((tree));
53 /* Handle a "dllimport" or "dllexport" attribute;
54 arguments as in struct attribute_spec.handler. */
56 ix86_handle_dll_attribute (node, name, args, flags, no_add_attrs)
63 /* These attributes may apply to structure and union types being created,
64 but otherwise should pass to the declaration involved. */
67 if (flags & ((int) ATTR_FLAG_DECL_NEXT | (int) ATTR_FLAG_FUNCTION_NEXT
68 | (int) ATTR_FLAG_ARRAY_NEXT))
71 return tree_cons (name, args, NULL_TREE);
73 if (TREE_CODE (*node) != RECORD_TYPE && TREE_CODE (*node) != UNION_TYPE)
75 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
83 /* Handle a "shared" attribute;
84 arguments as in struct attribute_spec.handler. */
86 ix86_handle_shared_attribute (node, name, args, flags, no_add_attrs)
89 tree args ATTRIBUTE_UNUSED;
90 int flags ATTRIBUTE_UNUSED;
93 if (TREE_CODE (*node) != VAR_DECL)
95 warning ("`%s' attribute only applies to variables",
96 IDENTIFIER_POINTER (name));
103 /* Return the type that we should use to determine if DECL is
104 imported or exported. */
107 associated_type (decl)
112 /* In the C++ frontend, DECL_CONTEXT for a method doesn't actually refer
113 to the containing class. So we look at the 'this' arg. */
114 if (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
116 /* Artificial methods are not affected by the import/export status of
117 their class unless they are virtual. */
118 if (! DECL_ARTIFICIAL (decl) || DECL_VINDEX (decl))
119 t = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl))));
121 else if (DECL_CONTEXT (decl)
122 && TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (decl))) == 't')
123 t = DECL_CONTEXT (decl);
128 /* Return non-zero if DECL is a dllexport'd object. */
131 i386_pe_dllexport_p (decl)
136 if (TREE_CODE (decl) != VAR_DECL
137 && TREE_CODE (decl) != FUNCTION_DECL)
139 exp = lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl));
143 /* Class members get the dllexport status of their class. */
144 if (associated_type (decl))
146 exp = lookup_attribute ("dllexport",
147 TYPE_ATTRIBUTES (associated_type (decl)));
155 /* Return non-zero if DECL is a dllimport'd object. */
158 i386_pe_dllimport_p (decl)
163 if (TREE_CODE (decl) == FUNCTION_DECL
164 && TARGET_NOP_FUN_DLLIMPORT)
167 if (TREE_CODE (decl) != VAR_DECL
168 && TREE_CODE (decl) != FUNCTION_DECL)
170 imp = lookup_attribute ("dllimport", DECL_ATTRIBUTES (decl));
174 /* Class members get the dllimport status of their class. */
175 if (associated_type (decl))
177 imp = lookup_attribute ("dllimport",
178 TYPE_ATTRIBUTES (associated_type (decl)));
186 /* Return non-zero if SYMBOL is marked as being dllexport'd. */
189 i386_pe_dllexport_name_p (symbol)
192 return symbol[0] == '@' && symbol[1] == 'e' && symbol[2] == '.';
195 /* Return non-zero if SYMBOL is marked as being dllimport'd. */
198 i386_pe_dllimport_name_p (symbol)
201 return symbol[0] == '@' && symbol[1] == 'i' && symbol[2] == '.';
204 /* Mark a DECL as being dllexport'd.
205 Note that we override the previous setting (eg: dllimport). */
208 i386_pe_mark_dllexport (decl)
216 rtlname = XEXP (DECL_RTL (decl), 0);
217 if (GET_CODE (rtlname) == SYMBOL_REF)
218 oldname = XSTR (rtlname, 0);
219 else if (GET_CODE (rtlname) == MEM
220 && GET_CODE (XEXP (rtlname, 0)) == SYMBOL_REF)
221 oldname = XSTR (XEXP (rtlname, 0), 0);
224 if (i386_pe_dllimport_name_p (oldname))
226 else if (i386_pe_dllexport_name_p (oldname))
227 return; /* already done */
229 newname = alloca (strlen (oldname) + 4);
230 sprintf (newname, "@e.%s", oldname);
232 /* We pass newname through get_identifier to ensure it has a unique
233 address. RTL processing can sometimes peek inside the symbol ref
234 and compare the string's addresses to see if two symbols are
236 idp = get_identifier (newname);
238 XEXP (DECL_RTL (decl), 0) =
239 gen_rtx (SYMBOL_REF, Pmode, IDENTIFIER_POINTER (idp));
242 /* Mark a DECL as being dllimport'd. */
245 i386_pe_mark_dllimport (decl)
253 rtlname = XEXP (DECL_RTL (decl), 0);
254 if (GET_CODE (rtlname) == SYMBOL_REF)
255 oldname = XSTR (rtlname, 0);
256 else if (GET_CODE (rtlname) == MEM
257 && GET_CODE (XEXP (rtlname, 0)) == SYMBOL_REF)
258 oldname = XSTR (XEXP (rtlname, 0), 0);
261 if (i386_pe_dllexport_name_p (oldname))
263 error ("`%s' declared as both exported to and imported from a DLL",
264 IDENTIFIER_POINTER (DECL_NAME (decl)));
267 else if (i386_pe_dllimport_name_p (oldname))
269 /* Already done, but force correct linkage since the redeclaration
270 might have omitted explicit extern. Sigh. */
271 if (TREE_CODE (decl) == VAR_DECL
272 /* ??? Is this test for vtables needed? */
273 && !DECL_VIRTUAL_P (decl))
275 DECL_EXTERNAL (decl) = 1;
276 TREE_PUBLIC (decl) = 1;
281 /* ??? One can well ask why we're making these checks here,
282 and that would be a good question. */
284 /* Imported variables can't be initialized. Note that C++ classes
285 are marked initial, so we need to check. */
286 if (TREE_CODE (decl) == VAR_DECL
287 && !DECL_VIRTUAL_P (decl)
288 && (DECL_INITIAL (decl)
289 && ! TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl))))
291 error_with_decl (decl, "initialized variable `%s' is marked dllimport");
294 /* Nor can they be static. */
295 if (TREE_CODE (decl) == VAR_DECL
296 /* ??? Is this test for vtables needed? */
297 && !DECL_VIRTUAL_P (decl)
300 error_with_decl (decl, "static variable `%s' is marked dllimport");
304 /* `extern' needn't be specified with dllimport.
305 Specify `extern' now and hope for the best. Sigh. */
306 if (TREE_CODE (decl) == VAR_DECL
307 /* ??? Is this test for vtables needed? */
308 && !DECL_VIRTUAL_P (decl))
310 DECL_EXTERNAL (decl) = 1;
311 TREE_PUBLIC (decl) = 1;
314 newname = alloca (strlen (oldname) + 11);
315 sprintf (newname, "@i._imp__%s", oldname);
317 /* We pass newname through get_identifier to ensure it has a unique
318 address. RTL processing can sometimes peek inside the symbol ref
319 and compare the string's addresses to see if two symbols are
321 idp = get_identifier (newname);
323 newrtl = gen_rtx (MEM, Pmode,
324 gen_rtx (SYMBOL_REF, Pmode,
325 IDENTIFIER_POINTER (idp)));
326 XEXP (DECL_RTL (decl), 0) = newrtl;
328 /* Can't treat a pointer to this as a constant address */
329 DECL_NON_ADDR_CONST_P (decl) = 1;
332 /* Return string which is the former assembler name modified with a
333 suffix consisting of an atsign (@) followed by the number of bytes of
337 gen_stdcall_suffix (decl)
341 /* ??? This probably should use XSTR (XEXP (DECL_RTL (decl), 0), 0) instead
342 of DECL_ASSEMBLER_NAME. */
343 const char *asmname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
346 if (TYPE_ARG_TYPES (TREE_TYPE (decl)))
347 if (TREE_VALUE (tree_last (TYPE_ARG_TYPES (TREE_TYPE (decl))))
350 tree formal_type = TYPE_ARG_TYPES (TREE_TYPE (decl));
352 while (TREE_VALUE (formal_type) != void_type_node)
355 = TREE_INT_CST_LOW (TYPE_SIZE (TREE_VALUE (formal_type)));
356 /* Must round up to include padding. This is done the same
357 way as in store_one_arg. */
358 parm_size = ((parm_size + PARM_BOUNDARY - 1)
359 / PARM_BOUNDARY * PARM_BOUNDARY);
361 formal_type = TREE_CHAIN (formal_type);
365 newsym = xmalloc (strlen (asmname) + 10);
366 sprintf (newsym, "%s@%d", asmname, total/BITS_PER_UNIT);
367 return IDENTIFIER_POINTER (get_identifier (newsym));
371 i386_pe_encode_section_info (decl, first)
378 /* This bit is copied from i386.h. */
379 if (optimize > 0 && TREE_CONSTANT (decl)
380 && (!flag_writable_strings || TREE_CODE (decl) != STRING_CST))
382 rtx rtl = (TREE_CODE_CLASS (TREE_CODE (decl)) != 'd'
383 ? TREE_CST_RTL (decl) : DECL_RTL (decl));
384 SYMBOL_REF_FLAG (XEXP (rtl, 0)) = 1;
387 if (TREE_CODE (decl) == FUNCTION_DECL)
388 if (lookup_attribute ("stdcall",
389 TYPE_ATTRIBUTES (TREE_TYPE (decl))))
390 XEXP (DECL_RTL (decl), 0) =
391 gen_rtx (SYMBOL_REF, Pmode, gen_stdcall_suffix (decl));
393 /* Mark the decl so we can tell from the rtl whether the object is
394 dllexport'd or dllimport'd. */
396 if (i386_pe_dllexport_p (decl))
397 i386_pe_mark_dllexport (decl);
398 else if (i386_pe_dllimport_p (decl))
399 i386_pe_mark_dllimport (decl);
400 /* It might be that DECL has already been marked as dllimport, but a
401 subsequent definition nullified that. The attribute is gone but
402 DECL_RTL still has @i._imp__foo. We need to remove that. Ditto
403 for the DECL_NON_ADDR_CONST_P flag. */
404 else if ((TREE_CODE (decl) == FUNCTION_DECL
405 || TREE_CODE (decl) == VAR_DECL)
406 && DECL_RTL (decl) != NULL_RTX
407 && GET_CODE (DECL_RTL (decl)) == MEM
408 && GET_CODE (XEXP (DECL_RTL (decl), 0)) == MEM
409 && GET_CODE (XEXP (XEXP (DECL_RTL (decl), 0), 0)) == SYMBOL_REF
410 && i386_pe_dllimport_name_p (XSTR (XEXP (XEXP (DECL_RTL (decl), 0), 0), 0)))
412 const char *oldname = XSTR (XEXP (XEXP (DECL_RTL (decl), 0), 0), 0);
413 tree idp = get_identifier (oldname + 9);
414 rtx newrtl = gen_rtx (SYMBOL_REF, Pmode, IDENTIFIER_POINTER (idp));
416 XEXP (DECL_RTL (decl), 0) = newrtl;
418 DECL_NON_ADDR_CONST_P (decl) = 0;
420 /* We previously set TREE_PUBLIC and DECL_EXTERNAL.
421 We leave these alone for now. */
426 i386_pe_unique_section (decl, reloc)
431 const char *name, *prefix;
434 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
435 /* Strip off any encoding in fnname. */
436 STRIP_NAME_ENCODING (name, name);
438 /* The object is put in, for example, section .text$foo.
439 The linker will then ultimately place them in .text
440 (everything from the $ on is stripped). Don't put
441 read-only data in .rdata section to avoid a PE linker
442 bug when .rdata$* grouped sections are used in code
443 without a .rdata section. */
444 if (TREE_CODE (decl) == FUNCTION_DECL)
446 else if (DECL_READONLY_SECTION (decl, reloc))
450 len = strlen (name) + strlen (prefix);
451 string = alloca (len + 1);
452 sprintf (string, "%s%s", prefix, name);
454 DECL_SECTION_NAME (decl) = build_string (len, string);
457 /* Select a set of attributes for section NAME based on the properties
458 of DECL and whether or not RELOC indicates that DECL's initializer
459 might contain runtime relocations.
461 We make the section read-only and executable for a function decl,
462 read-only for a const data decl, and writable for a non-const data decl.
464 If the section has already been defined, to not allow it to have
465 different attributes, as (1) this is ambiguous since we're not seeing
466 all the declarations up front and (2) some assemblers (e.g. SVR4)
467 do not recoginize section redefinitions. */
468 /* ??? This differs from the "standard" PE implementation in that we
469 handle the SHARED variable attribute. Should this be done for all
472 #define SECTION_PE_SHARED SECTION_MACH_DEP
475 i386_pe_section_type_flags (decl, name, reloc)
484 /* The names we put in the hashtable will always be the unique
485 versions gived to us by the stringtable, so we can just use
486 their addresses as the keys. */
488 htab = htab_create (31, htab_hash_pointer, htab_eq_pointer, NULL);
490 if (decl && TREE_CODE (decl) == FUNCTION_DECL)
491 flags = SECTION_CODE;
492 else if (decl && DECL_READONLY_SECTION (decl, reloc))
496 flags = SECTION_WRITE;
498 if (decl && TREE_CODE (decl) == VAR_DECL
499 && lookup_attribute ("shared", DECL_ATTRIBUTES (decl)))
500 flags |= SECTION_PE_SHARED;
503 if (decl && DECL_ONE_ONLY (decl))
504 flags |= SECTION_LINKONCE;
506 /* See if we already have an entry for this section. */
507 slot = (unsigned int **) htab_find_slot (htab, name, INSERT);
510 *slot = (unsigned int *) xmalloc (sizeof (unsigned int));
515 if (decl && **slot != flags)
516 error_with_decl (decl, "%s causes a section type conflict");
523 i386_pe_asm_named_section (name, flags)
527 char flagchars[8], *f = flagchars;
529 if (flags & SECTION_CODE)
531 if (flags & SECTION_WRITE)
533 if (flags & SECTION_PE_SHARED)
537 fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars);
539 if (flags & SECTION_LINKONCE)
541 /* Functions may have been compiled at various levels of
542 optimization so we can't use `same_size' here.
543 Instead, have the linker pick one. */
544 fprintf (asm_out_file, "\t.linkonce %s\n",
545 (flags & SECTION_CODE ? "discard" : "same_size"));
549 /* The Microsoft linker requires that every function be marked as
550 DT_FCN. When using gas on cygwin, we must emit appropriate .type
555 /* Mark a function appropriately. This should only be called for
556 functions for which we are not emitting COFF debugging information.
557 FILE is the assembler output file, NAME is the name of the
558 function, and PUBLIC is non-zero if the function is globally
562 i386_pe_declare_function_type (file, name, public)
567 fprintf (file, "\t.def\t");
568 assemble_name (file, name);
569 fprintf (file, ";\t.scl\t%d;\t.type\t%d;\t.endef\n",
570 public ? (int) C_EXT : (int) C_STAT,
571 (int) DT_FCN << N_BTSHFT);
574 /* Keep a list of external functions. */
578 struct extern_list *next;
582 static struct extern_list *extern_head;
584 /* Assemble an external function reference. We need to keep a list of
585 these, so that we can output the function types at the end of the
586 assembly. We can't output the types now, because we might see a
587 definition of the function later on and emit debugging information
591 i386_pe_record_external_function (name)
594 struct extern_list *p;
596 p = (struct extern_list *) permalloc (sizeof *p);
597 p->next = extern_head;
602 /* Keep a list of exported symbols. */
606 struct export_list *next;
608 int is_data; /* used to type tag exported symbols. */
611 static struct export_list *export_head;
613 /* Assemble an export symbol entry. We need to keep a list of
614 these, so that we can output the export list at the end of the
615 assembly. We used to output these export symbols in each function,
616 but that causes problems with GNU ld when the sections are
620 i386_pe_record_exported_symbol (name, is_data)
624 struct export_list *p;
626 p = (struct export_list *) permalloc (sizeof *p);
627 p->next = export_head;
629 p->is_data = is_data;
633 /* This is called at the end of assembly. For each external function
634 which has not been defined, we output a declaration now. We also
635 output the .drectve section. */
638 i386_pe_asm_file_end (file)
641 struct extern_list *p;
643 ix86_asm_file_end (file);
645 for (p = extern_head; p != NULL; p = p->next)
649 decl = get_identifier (p->name);
651 /* Positively ensure only one declaration for any given symbol. */
652 if (! TREE_ASM_WRITTEN (decl) && TREE_SYMBOL_REFERENCED (decl))
654 TREE_ASM_WRITTEN (decl) = 1;
655 i386_pe_declare_function_type (file, p->name, TREE_PUBLIC (decl));
661 struct export_list *q;
663 for (q = export_head; q != NULL; q = q->next)
665 fprintf (file, "\t.ascii \" -export:%s%s\"\n",
666 I386_PE_STRIP_ENCODING (q->name),
667 (q->is_data) ? ",data" : "");