hooks.c (hook_tree_bool_false): New.
[platform/upstream/gcc.git] / gcc / config / arm / pe.h
1 /* Definitions of target machine for GNU compiler, for ARM with PE obj format.
2    Copyright (C) 1995, 1996, 1999, 2000, 2002 Free Software Foundation, Inc.
3    Contributed by Doug Evans (dje@cygnus.com).
4    
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22 /* Enable PE specific code.  */
23 #define ARM_PE          1
24
25 #define ARM_PE_FLAG_CHAR '@'
26
27 /* Ensure that @x. will be stripped from the function name.  */
28 #undef SUBTARGET_NAME_ENCODING_LENGTHS
29 #define SUBTARGET_NAME_ENCODING_LENGTHS  \
30   case ARM_PE_FLAG_CHAR: return 3;
31
32 #undef  USER_LABEL_PREFIX
33 #define USER_LABEL_PREFIX "_"
34
35 \f
36 /* Run-time Target Specification.  */
37 #undef  TARGET_VERSION
38 #define TARGET_VERSION fputs (" (ARM/pe)", stderr)
39
40 /* Get tree.c to declare a target-specific specialization of
41    merge_decl_attributes.  */
42 #define TARGET_DLLIMPORT_DECL_ATTRIBUTES
43
44 /* Support the __declspec keyword by turning them into attributes.
45    We currently only support: naked, dllimport, and dllexport.
46    Note that the current way we do this may result in a collision with
47    predefined attributes later on.  This can be solved by using one attribute,
48    say __declspec__, and passing args to it.  The problem with that approach
49    is that args are not accumulated: each new appearance would clobber any
50    existing args.  */
51 #undef  SUBTARGET_CPP_SPEC
52 #define SUBTARGET_CPP_SPEC "-D__pe__ -D__declspec(x)=__attribute__((x))"
53
54
55 /* Experimental addition for pr 7885.
56    Ignore dllimport for functions.  */
57 #define TARGET_FLAG_NOP_FUN     (1 << 24)
58
59 #undef  TARGET_NOP_FUN_DLLIMPORT
60 #define TARGET_NOP_FUN_DLLIMPORT (target_flags & TARGET_FLAG_NOP_FUN)
61
62 #undef  SUBTARGET_SWITCHES
63 #define SUBTARGET_SWITCHES                                      \
64 { "nop-fun-dllimport",            TARGET_FLAG_NOP_FUN,          \
65   N_("Ignore dllimport attribute for functions") },             \
66 { "no-nop-fun-dllimport",       - TARGET_FLAG_NOP_FUN, "" },
67
68 #undef  TARGET_DEFAULT
69 #define TARGET_DEFAULT  (ARM_FLAG_SOFT_FLOAT | TARGET_FLAG_NOP_FUN)
70
71 \f
72 #undef  WCHAR_TYPE
73 #define WCHAR_TYPE      "short unsigned int"
74 #undef  WCHAR_TYPE_SIZE
75 #define WCHAR_TYPE_SIZE 16
76
77 /* Same as arm.h except r10 is call-saved, not fixed.  */
78 #undef  FIXED_REGISTERS
79 #define FIXED_REGISTERS \
80 {                       \
81   0,0,0,0,0,0,0,0,      \
82   0,0,0,1,0,1,0,1,      \
83   0,0,0,0,0,0,0,0,      \
84   1,1,1                 \
85 }
86
87 /* Same as arm.h except r10 is call-saved, not fixed.  */
88 #undef  CALL_USED_REGISTERS
89 #define CALL_USED_REGISTERS \
90 {                       \
91   1,1,1,1,0,0,0,0,      \
92   0,0,0,1,1,1,1,1,      \
93   1,1,1,1,0,0,0,0,      \
94   1,1,1                 \
95 }
96 \f
97 /* In addition to the stuff done in arm.h, we must mark dll symbols specially.
98    Definitions of dllexport'd objects install some info in the .drectve
99    section.  References to dllimport'd objects are fetched indirectly via
100    __imp_.  If both are declared, dllexport overrides.
101    This is also needed to implement one-only vtables: they go into their own
102    section and we need to set DECL_SECTION_NAME so we do that here.
103    Note that we can be called twice on the same decl.  */
104 #undef  ENCODE_SECTION_INFO
105 #define ENCODE_SECTION_INFO(DECL, FIRST) \
106   arm_pe_encode_section_info (DECL, FIRST)
107
108 /* Define this macro if in some cases global symbols from one translation
109    unit may not be bound to undefined symbols in another translation unit
110    without user intervention.  For instance, under Microsoft Windows
111    symbols must be explicitly imported from shared libraries (DLLs).  */
112 #define MULTIPLE_SYMBOL_SPACES
113
114 #define TARGET_ASM_UNIQUE_SECTION arm_pe_unique_section
115
116 #define SUPPORTS_ONE_ONLY 1
117
118 /* Switch into a generic section.  */
119 #undef TARGET_ASM_NAMED_SECTION
120 #define TARGET_ASM_NAMED_SECTION  default_pe_asm_named_section
121 \f
122 /* This outputs a lot of .req's to define alias for various registers.
123    Let's try to avoid this.  */
124 #undef  ASM_FILE_START
125 #define ASM_FILE_START(STREAM)                                  \
126   do                                                            \
127     {                                                           \
128       asm_fprintf (STREAM, "%@ Generated by gcc %s for ARM/pe\n",\
129            version_string);                                     \
130       output_file_directive ((STREAM), main_input_filename);    \
131     }                                                           \
132   while (0)
133
134 /* Output a reference to a label.  */
135 #undef  ASM_OUTPUT_LABELREF
136 #define ASM_OUTPUT_LABELREF(STREAM, NAME)  \
137   asm_fprintf (STREAM, "%U%s", arm_strip_name_encoding (NAME))
138
139 /* Output a function definition label.  */
140 #undef  ASM_DECLARE_FUNCTION_NAME
141 #define ASM_DECLARE_FUNCTION_NAME(STREAM, NAME, DECL)           \
142   do                                                            \
143     {                                                           \
144       if (arm_dllexport_name_p (NAME))                          \
145         {                                                       \
146           drectve_section ();                                   \
147           fprintf (STREAM, "\t.ascii \" -export:%s\"\n",        \
148                    arm_strip_name_encoding (NAME));             \
149           function_section (DECL);                              \
150         }                                                       \
151       ARM_DECLARE_FUNCTION_NAME (STREAM, NAME, DECL);           \
152       if (TARGET_THUMB)                                         \
153         fprintf (STREAM, "\t.code 16\n");                       \
154       ASM_OUTPUT_LABEL (STREAM, NAME);                          \
155     }                                                           \
156   while (0)
157
158 /* Output a common block.  */
159 #undef  ASM_OUTPUT_COMMON
160 #define ASM_OUTPUT_COMMON(STREAM, NAME, SIZE, ROUNDED)  \
161   do                                                    \
162     {                                                   \
163       if (arm_dllexport_name_p (NAME))                  \
164         {                                               \
165           drectve_section ();                           \
166           fprintf ((STREAM), "\t.ascii \" -export:%s\"\n",\
167                    arm_strip_name_encoding (NAME));     \
168         }                                               \
169       if (! arm_dllimport_name_p (NAME))                \
170         {                                               \
171           fprintf ((STREAM), "\t.comm\t");              \
172           assemble_name ((STREAM), (NAME));             \
173           asm_fprintf ((STREAM), ", %d\t%@ %d\n",       \
174                    (ROUNDED), (SIZE));                  \
175         }                                               \
176     }                                                   \
177   while (0)
178
179 /* Output the label for an initialized variable.  */
180 #undef  ASM_DECLARE_OBJECT_NAME
181 #define ASM_DECLARE_OBJECT_NAME(STREAM, NAME, DECL)     \
182   do                                                    \
183     {                                                   \
184       if (arm_dllexport_name_p (NAME))                  \
185         {                                               \
186           enum in_section save_section = in_section;    \
187           drectve_section ();                           \
188           fprintf (STREAM, "\t.ascii \" -export:%s\"\n",\
189                    arm_strip_name_encoding (NAME));     \
190           switch_to_section (save_section, (DECL));     \
191         }                                               \
192       ASM_OUTPUT_LABEL ((STREAM), (NAME));              \
193     }                                                   \
194   while (0)
195 \f
196 /* Support the ctors/dtors and other sections.  */
197
198 #define DRECTVE_SECTION_ASM_OP  "\t.section .drectve"
199
200 /* A list of other sections which the compiler might be "in" at any
201    given time.  */
202
203 #undef  SUBTARGET_EXTRA_SECTIONS
204 #define SUBTARGET_EXTRA_SECTIONS in_drectve,
205
206 /* A list of extra section function definitions.  */
207
208 #undef  SUBTARGET_EXTRA_SECTION_FUNCTIONS
209 #define SUBTARGET_EXTRA_SECTION_FUNCTIONS \
210   DRECTVE_SECTION_FUNCTION      \
211   SWITCH_TO_SECTION_FUNCTION
212
213 #define DRECTVE_SECTION_FUNCTION \
214 void                                                                    \
215 drectve_section ()                                                      \
216 {                                                                       \
217   if (in_section != in_drectve)                                         \
218     {                                                                   \
219       fprintf (asm_out_file, "%s\n", DRECTVE_SECTION_ASM_OP);           \
220       in_section = in_drectve;                                          \
221     }                                                                   \
222 }
223
224 /* Switch to SECTION (an `enum in_section').
225
226    ??? This facility should be provided by GCC proper.
227    The problem is that we want to temporarily switch sections in
228    ASM_DECLARE_OBJECT_NAME and then switch back to the original section
229    afterwards.  */
230 #define SWITCH_TO_SECTION_FUNCTION                              \
231 static void switch_to_section PARAMS ((enum in_section, tree)); \
232 static void                                                     \
233 switch_to_section (section, decl)                               \
234      enum in_section section;                                   \
235      tree decl;                                                 \
236 {                                                               \
237   switch (section)                                              \
238     {                                                           \
239       case in_text: text_section (); break;                     \
240       case in_data: data_section (); break;                     \
241       case in_named: named_section (decl, NULL, 0); break;      \
242       case in_rdata: rdata_section (); break;                   \
243       case in_ctors: ctors_section (); break;                   \
244       case in_dtors: dtors_section (); break;                   \
245       case in_drectve: drectve_section (); break;               \
246       default: abort (); break;                                 \
247     }                                                           \
248 }