* tree.c (handle_dll_attribute): Move here from i383/winnt.c.
[official-gcc.git] / gcc / config / arm / pe.h
blob34e9457d7ce4a51e539e7245cf081feacf95eae7
1 /* Definitions of target machine for GNU compiler, for ARM with PE obj format.
2 Copyright (C) 1995, 1996, 1999, 2000, 2002, 2003, 2004
3 Free Software Foundation, Inc.
4 Contributed by Doug Evans (dje@cygnus.com).
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published
10 by the Free Software Foundation; either version 2, or (at your
11 option) any later version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
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
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
23 /* Enable PE specific code. */
24 #define ARM_PE 1
26 #define ARM_PE_FLAG_CHAR '@'
28 /* Ensure that @x. will be stripped from the function name. */
29 #undef SUBTARGET_NAME_ENCODING_LENGTHS
30 #define SUBTARGET_NAME_ENCODING_LENGTHS \
31 case ARM_PE_FLAG_CHAR: return 3;
33 #undef USER_LABEL_PREFIX
34 #define USER_LABEL_PREFIX "_"
37 /* Run-time Target Specification. */
38 #undef TARGET_VERSION
39 #define TARGET_VERSION fputs (" (ARM/pe)", stderr)
41 /* Get tree.c to declare a target-specific specialization of
42 merge_decl_attributes. */
43 #define TARGET_DLLIMPORT_DECL_ATTRIBUTES 1
45 #undef SUBTARGET_CPP_SPEC
46 #define SUBTARGET_CPP_SPEC "-D__pe__"
49 /* Experimental addition for pr 7885.
50 Ignore dllimport for functions. */
51 #define TARGET_FLAG_NOP_FUN (1 << 24)
53 #undef TARGET_NOP_FUN_DLLIMPORT
54 #define TARGET_NOP_FUN_DLLIMPORT (target_flags & TARGET_FLAG_NOP_FUN)
56 #undef SUBTARGET_SWITCHES
57 #define SUBTARGET_SWITCHES \
58 { "nop-fun-dllimport", TARGET_FLAG_NOP_FUN, \
59 N_("Ignore dllimport attribute for functions") }, \
60 { "no-nop-fun-dllimport", - TARGET_FLAG_NOP_FUN, "" },
62 #undef TARGET_DEFAULT
63 #define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | TARGET_FLAG_NOP_FUN)
65 #undef MULTILIB_DEFAULTS
66 #define MULTILIB_DEFAULTS \
67 { "marm", "mlittle-endian", "msoft-float", "mno-thumb-interwork" }
69 #undef WCHAR_TYPE
70 #define WCHAR_TYPE "short unsigned int"
71 #undef WCHAR_TYPE_SIZE
72 #define WCHAR_TYPE_SIZE 16
74 /* r11 is fixed. */
75 #undef SUBTARGET_CONDITIONAL_REGISTER_USAGE
76 #define SUBTARGET_CONDITIONAL_REGISTER_USAGE \
77 fixed_regs [11] = 1; \
78 call_used_regs [11] = 1;
81 /* Define this macro if in some cases global symbols from one translation
82 unit may not be bound to undefined symbols in another translation unit
83 without user intervention. For instance, under Microsoft Windows
84 symbols must be explicitly imported from shared libraries (DLLs). */
85 #define MULTIPLE_SYMBOL_SPACES
87 #define TARGET_ASM_UNIQUE_SECTION arm_pe_unique_section
89 #define SUPPORTS_ONE_ONLY 1
91 /* Switch into a generic section. */
92 #undef TARGET_ASM_NAMED_SECTION
93 #define TARGET_ASM_NAMED_SECTION default_pe_asm_named_section
95 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
97 /* Output a reference to a label. */
98 #undef ASM_OUTPUT_LABELREF
99 #define ASM_OUTPUT_LABELREF(STREAM, NAME) \
100 asm_fprintf (STREAM, "%U%s", arm_strip_name_encoding (NAME))
102 /* Output a function definition label. */
103 #undef ASM_DECLARE_FUNCTION_NAME
104 #define ASM_DECLARE_FUNCTION_NAME(STREAM, NAME, DECL) \
105 do \
107 if (arm_dllexport_name_p (NAME)) \
109 drectve_section (); \
110 fprintf (STREAM, "\t.ascii \" -export:%s\"\n", \
111 arm_strip_name_encoding (NAME)); \
112 function_section (DECL); \
114 ARM_DECLARE_FUNCTION_NAME (STREAM, NAME, DECL); \
115 if (TARGET_THUMB) \
116 fprintf (STREAM, "\t.code 16\n"); \
117 ASM_OUTPUT_LABEL (STREAM, NAME); \
119 while (0)
121 /* Output a common block. */
122 #undef ASM_OUTPUT_COMMON
123 #define ASM_OUTPUT_COMMON(STREAM, NAME, SIZE, ROUNDED) \
124 do \
126 if (arm_dllexport_name_p (NAME)) \
128 drectve_section (); \
129 fprintf ((STREAM), "\t.ascii \" -export:%s\"\n",\
130 arm_strip_name_encoding (NAME)); \
132 if (! arm_dllimport_name_p (NAME)) \
134 fprintf ((STREAM), "\t.comm\t"); \
135 assemble_name ((STREAM), (NAME)); \
136 asm_fprintf ((STREAM), ", %d\t%@ %d\n", \
137 (int)(ROUNDED), (int)(SIZE)); \
140 while (0)
142 /* Output the label for an initialized variable. */
143 #undef ASM_DECLARE_OBJECT_NAME
144 #define ASM_DECLARE_OBJECT_NAME(STREAM, NAME, DECL) \
145 do \
147 if (arm_dllexport_name_p (NAME)) \
149 enum in_section save_section = in_section; \
150 drectve_section (); \
151 fprintf (STREAM, "\t.ascii \" -export:%s\"\n",\
152 arm_strip_name_encoding (NAME)); \
153 switch_to_section (save_section, (DECL)); \
155 ASM_OUTPUT_LABEL ((STREAM), (NAME)); \
157 while (0)
159 /* Support the ctors/dtors and other sections. */
161 #define DRECTVE_SECTION_ASM_OP "\t.section .drectve"
163 /* A list of other sections which the compiler might be "in" at any
164 given time. */
166 #undef EXTRA_SECTIONS
167 #define EXTRA_SECTIONS in_drectve
169 /* A list of extra section function definitions. */
171 #undef EXTRA_SECTION_FUNCTIONS
172 #define EXTRA_SECTION_FUNCTIONS \
173 DRECTVE_SECTION_FUNCTION \
174 SWITCH_TO_SECTION_FUNCTION
176 #define DRECTVE_SECTION_FUNCTION \
177 void \
178 drectve_section (void) \
180 if (in_section != in_drectve) \
182 fprintf (asm_out_file, "%s\n", DRECTVE_SECTION_ASM_OP); \
183 in_section = in_drectve; \
187 /* Switch to SECTION (an `enum in_section').
189 ??? This facility should be provided by GCC proper.
190 The problem is that we want to temporarily switch sections in
191 ASM_DECLARE_OBJECT_NAME and then switch back to the original section
192 afterwards. */
193 #define SWITCH_TO_SECTION_FUNCTION \
194 static void \
195 switch_to_section (enum in_section section, tree decl) \
197 switch (section) \
199 case in_text: text_section (); break; \
200 case in_data: data_section (); break; \
201 case in_named: named_section (decl, NULL, 0); break; \
202 case in_readonly_data: readonly_data_section (); break; \
203 case in_ctors: ctors_section (); break; \
204 case in_dtors: dtors_section (); break; \
205 case in_drectve: drectve_section (); break; \
206 default: abort (); break; \