Mercurial > hg > CbC > CbC_gcc
annotate gcc/config/pa/som.h @ 67:f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
author | nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 22 Mar 2011 17:18:12 +0900 |
parents | a06113de4d67 |
children | 04ced10e8804 |
rev | line source |
---|---|
0 | 1 /* Definitions for SOM assembler support. |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2 Copyright (C) 1999, 2001, 2002, 2003, 2004, 2005, 2007, 2010 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
3 Free Software Foundation, Inc. |
0 | 4 |
5 This file is part of GCC. | |
6 | |
7 GCC 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 3, or (at your option) | |
10 any later version. | |
11 | |
12 GCC 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 GCC; see the file COPYING3. If not see | |
19 <http://www.gnu.org/licenses/>. */ | |
20 | |
21 /* So we can conditionalize small amounts of code in pa.c or pa.md. */ | |
22 #undef TARGET_SOM | |
23 #define TARGET_SOM 1 | |
24 | |
25 /* We do not use BINCL stabs in SOM. | |
26 ??? If it does not hurt, we probably should to avoid useless divergence | |
27 from other embedded stabs implementations. */ | |
28 #undef DBX_USE_BINCL | |
29 | |
30 #define DBX_LINES_FUNCTION_RELATIVE 1 | |
31 | |
32 /* gdb needs a null N_SO at the end of each file for scattered loading. */ | |
33 | |
34 #define DBX_OUTPUT_NULL_N_SO_AT_MAIN_SOURCE_FILE_END | |
35 | |
36 /* HPUX has a program 'chatr' to list the dependencies of dynamically | |
37 linked executables and shared libraries. */ | |
38 #define LDD_SUFFIX "chatr" | |
39 /* Look for lines like "dynamic /usr/lib/X11R5/libX11.sl" | |
40 or "static /usr/lib/X11R5/libX11.sl". | |
41 | |
42 HPUX 10.20 also has lines like "static branch prediction ..." | |
43 so we filter that out explicitly. | |
44 | |
45 We also try to bound our search for libraries with marker | |
46 lines. What a pain. */ | |
47 #define PARSE_LDD_OUTPUT(PTR) \ | |
48 do { \ | |
49 static int in_shlib_list = 0; \ | |
50 while (*PTR == ' ') PTR++; \ | |
51 if (strncmp (PTR, "shared library list:", \ | |
52 sizeof ("shared library list:") - 1) == 0) \ | |
53 { \ | |
54 PTR = 0; \ | |
55 in_shlib_list = 1; \ | |
56 } \ | |
57 else if (strncmp (PTR, "shared library binding:", \ | |
58 sizeof ("shared library binding:") - 1) == 0)\ | |
59 { \ | |
60 PTR = 0; \ | |
61 in_shlib_list = 0; \ | |
62 } \ | |
63 else if (strncmp (PTR, "static branch prediction disabled", \ | |
64 sizeof ("static branch prediction disabled") - 1) == 0)\ | |
65 { \ | |
66 PTR = 0; \ | |
67 in_shlib_list = 0; \ | |
68 } \ | |
69 else if (in_shlib_list \ | |
70 && strncmp (PTR, "dynamic", sizeof ("dynamic") - 1) == 0) \ | |
71 { \ | |
72 PTR += sizeof ("dynamic") - 1; \ | |
73 while (*p == ' ') PTR++; \ | |
74 } \ | |
75 else if (in_shlib_list \ | |
76 && strncmp (PTR, "static", sizeof ("static") - 1) == 0) \ | |
77 { \ | |
78 PTR += sizeof ("static") - 1; \ | |
79 while (*p == ' ') PTR++; \ | |
80 } \ | |
81 else \ | |
82 PTR = 0; \ | |
83 } while (0) | |
84 | |
85 /* Output the label for a function definition. */ | |
86 #ifndef HP_FP_ARG_DESCRIPTOR_REVERSED | |
87 #define ASM_DOUBLE_ARG_DESCRIPTORS(FILE, ARG0, ARG1) \ | |
88 do { fprintf (FILE, ",ARGW%d=FR", (ARG0)); \ | |
89 fprintf (FILE, ",ARGW%d=FU", (ARG1));} while (0) | |
90 #define DFMODE_RETURN_STRING ",RTNVAL=FU" | |
91 #define SFMODE_RETURN_STRING ",RTNVAL=FR" | |
92 #else | |
93 #define ASM_DOUBLE_ARG_DESCRIPTORS(FILE, ARG0, ARG1) \ | |
94 do { fprintf (FILE, ",ARGW%d=FU", (ARG0)); \ | |
95 fprintf (FILE, ",ARGW%d=FR", (ARG1));} while (0) | |
96 #define DFMODE_RETURN_STRING ",RTNVAL=FR" | |
97 #define SFMODE_RETURN_STRING ",RTNVAL=FU" | |
98 #endif | |
99 | |
100 | |
101 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ | |
102 do { tree fntype = TREE_TYPE (TREE_TYPE (DECL)); \ | |
103 tree tree_type = TREE_TYPE (DECL); \ | |
104 tree parm; \ | |
105 int i; \ | |
106 if (TREE_PUBLIC (DECL) || TARGET_GAS) \ | |
107 { \ | |
108 if (TREE_PUBLIC (DECL)) \ | |
109 { \ | |
110 fputs ("\t.EXPORT ", FILE); \ | |
111 assemble_name (FILE, NAME); \ | |
112 fputs (",ENTRY,PRIV_LEV=3", FILE); \ | |
113 } \ | |
114 else \ | |
115 { \ | |
116 fputs ("\t.PARAM ", FILE); \ | |
117 assemble_name (FILE, NAME); \ | |
118 fputs (",PRIV_LEV=3", FILE); \ | |
119 } \ | |
120 for (parm = DECL_ARGUMENTS (DECL), i = 0; parm && i < 4; \ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
121 parm = DECL_CHAIN (parm)) \ |
0 | 122 { \ |
123 if (TYPE_MODE (DECL_ARG_TYPE (parm)) == SFmode \ | |
124 && ! TARGET_SOFT_FLOAT) \ | |
125 fprintf (FILE, ",ARGW%d=FR", i++); \ | |
126 else if (TYPE_MODE (DECL_ARG_TYPE (parm)) == DFmode \ | |
127 && ! TARGET_SOFT_FLOAT) \ | |
128 { \ | |
129 if (i <= 2) \ | |
130 { \ | |
131 if (i == 1) i++; \ | |
132 ASM_DOUBLE_ARG_DESCRIPTORS (FILE, i++, i++); \ | |
133 } \ | |
134 else \ | |
135 break; \ | |
136 } \ | |
137 else \ | |
138 { \ | |
139 int arg_size = \ | |
140 FUNCTION_ARG_SIZE (TYPE_MODE (DECL_ARG_TYPE (parm)),\ | |
141 DECL_ARG_TYPE (parm)); \ | |
142 /* Passing structs by invisible reference uses \ | |
143 one general register. */ \ | |
144 if (arg_size > 2 \ | |
145 || TREE_ADDRESSABLE (DECL_ARG_TYPE (parm))) \ | |
146 arg_size = 1; \ | |
147 if (arg_size == 2 && i <= 2) \ | |
148 { \ | |
149 if (i == 1) i++; \ | |
150 fprintf (FILE, ",ARGW%d=GR", i++); \ | |
151 fprintf (FILE, ",ARGW%d=GR", i++); \ | |
152 } \ | |
153 else if (arg_size == 1) \ | |
154 fprintf (FILE, ",ARGW%d=GR", i++); \ | |
155 else \ | |
156 i += arg_size; \ | |
157 } \ | |
158 } \ | |
159 /* anonymous args */ \ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
160 if (stdarg_p (tree_type)) \ |
0 | 161 { \ |
162 for (; i < 4; i++) \ | |
163 fprintf (FILE, ",ARGW%d=GR", i); \ | |
164 } \ | |
165 if (TYPE_MODE (fntype) == DFmode && ! TARGET_SOFT_FLOAT) \ | |
166 fputs (DFMODE_RETURN_STRING, FILE); \ | |
167 else if (TYPE_MODE (fntype) == SFmode && ! TARGET_SOFT_FLOAT) \ | |
168 fputs (SFMODE_RETURN_STRING, FILE); \ | |
169 else if (fntype != void_type_node) \ | |
170 fputs (",RTNVAL=GR", FILE); \ | |
171 fputs ("\n", FILE); \ | |
172 }} while (0) | |
173 | |
174 #define TARGET_ASM_FILE_START pa_som_file_start | |
175 #define TARGET_ASM_INIT_SECTIONS pa_som_asm_init_sections | |
176 | |
177 /* String to output before writable data. */ | |
178 #define DATA_SECTION_ASM_OP "\t.SPACE $PRIVATE$\n\t.SUBSPA $DATA$\n" | |
179 | |
180 /* String to output before uninitialized data. */ | |
181 #define BSS_SECTION_ASM_OP "\t.SPACE $PRIVATE$\n\t.SUBSPA $BSS$\n" | |
182 | |
183 /* This is how to output a command to make the user-level label | |
184 named NAME defined for reference from other files. We use | |
185 assemble_name_raw instead of assemble_name since a symbol in | |
186 a .IMPORT directive that isn't otherwise referenced is not | |
187 placed in the symbol table of the assembled object. | |
188 | |
189 Failure to import a function reference can cause the HP linker | |
190 to segmentation fault! | |
191 | |
192 Note that the SOM based tools need the symbol imported as a | |
193 CODE symbol, while the ELF based tools require the symbol to | |
194 be imported as an ENTRY symbol. */ | |
195 | |
196 #define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \ | |
197 pa_hpux_asm_output_external ((FILE), (DECL), (NAME)) | |
198 #define ASM_OUTPUT_EXTERNAL_REAL(FILE, DECL, NAME) \ | |
199 do { fputs ("\t.IMPORT ", FILE); \ | |
200 assemble_name_raw (FILE, NAME); \ | |
201 if (FUNCTION_NAME_P (NAME)) \ | |
202 fputs (",CODE\n", FILE); \ | |
203 else \ | |
204 fputs (",DATA\n", FILE); \ | |
205 } while (0) | |
206 | |
207 /* The bogus HP assembler requires ALL external references to be | |
208 "imported", even library calls. They look a bit different, so | |
209 here's this macro. | |
210 | |
211 Also note not all libcall names are passed to pa_encode_section_info | |
212 (__main for example). To make sure all libcall names have section | |
213 info recorded in them, we do it here. | |
214 | |
215 We must also ensure that a libcall that has been previously | |
216 exported is not subsequently imported since the HP assembler may | |
217 change the type from an ENTRY to a CODE symbol. This would make | |
218 the symbol local. We are forced to use the identifier node | |
219 associated with the real assembler name for this check as the | |
220 symbol_ref available in ASM_DECLARE_FUNCTION_NAME is not the | |
221 same as the one used here. As a result, we can't use flags | |
222 in the symbol_ref for this check. The identifier check assumes | |
223 assemble_external_libcall is called before the symbol is used. */ | |
224 | |
225 #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, RTL) \ | |
226 do { const char *name; \ | |
227 tree id; \ | |
228 \ | |
229 if (!function_label_operand (RTL, VOIDmode)) \ | |
230 hppa_encode_label (RTL); \ | |
231 \ | |
232 name = targetm.strip_name_encoding (XSTR ((RTL), 0)); \ | |
233 id = maybe_get_identifier (name); \ | |
234 if (!id || !TREE_SYMBOL_REFERENCED (id)) \ | |
235 { \ | |
236 fputs ("\t.IMPORT ", FILE); \ | |
237 assemble_name_raw (FILE, XSTR ((RTL), 0)); \ | |
238 fputs (",CODE\n", FILE); \ | |
239 } \ | |
240 } while (0) | |
241 | |
242 /* We want __gcc_plt_call to appear in every program built by | |
243 gcc, so we make a reference to it out of __main. | |
244 We use the asm statement to fool the optimizer into not | |
245 removing the dead (but important) initialization of | |
246 REFERENCE. */ | |
247 | |
248 #define DO_GLOBAL_DTORS_BODY \ | |
249 do { \ | |
250 extern void __gcc_plt_call (void); \ | |
251 void (*reference)(void) = &__gcc_plt_call; \ | |
252 func_ptr *p; \ | |
253 __asm__ ("" : : "r" (reference)); \ | |
254 for (p = __DTOR_LIST__ + 1; *p; ) \ | |
255 (*p++) (); \ | |
256 } while (0) | |
257 | |
258 /* This macro specifies the biggest alignment supported by the object | |
259 file format of this machine. | |
260 | |
261 The .align directive in the HP assembler allows alignments up to 4096 | |
262 bytes. However, the maximum alignment of a global common symbol is 8 | |
263 bytes for objects smaller than the page size (4096 bytes). For larger | |
264 objects, the linker provides an alignment of 32 bytes. Unfortunately, | |
265 this macro doesn't provide a mechanism to test for common symbols. */ | |
266 #define MAX_OFILE_ALIGNMENT 32768 | |
267 | |
268 /* The SOM linker hardcodes paths into binaries. As a result, dotdots | |
269 must be removed from library prefixes to prevent binaries from depending | |
270 on the location of the GCC tool directory. The downside is GCC | |
271 cannot be moved after installation using a symlink. */ | |
272 #define ALWAYS_STRIP_DOTDOT 1 | |
273 | |
274 /* If GAS supports weak, we can support weak when we have working linker | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
275 support for secondary definitions and are generating code for GAS. |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
276 This is primarily for one-only support as SOM doesn't allow undefined |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
277 weak symbols. */ |
0 | 278 #ifdef HAVE_GAS_WEAK |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
279 #define TARGET_SUPPORTS_WEAK (TARGET_SOM_SDEF && TARGET_GAS) |
0 | 280 #else |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
281 #define TARGET_SUPPORTS_WEAK 0 |
0 | 282 #endif |
283 | |
284 /* CVS GAS as of 4/28/04 supports a comdat parameter for the .nsubspa | |
285 directive. This provides one-only linkage semantics even though we | |
286 don't have weak support. */ | |
287 #ifdef HAVE_GAS_NSUBSPA_COMDAT | |
288 #define SUPPORTS_SOM_COMDAT (TARGET_GAS) | |
289 #else | |
290 #define SUPPORTS_SOM_COMDAT 0 | |
291 #endif | |
292 | |
293 /* We can support one only if we support weak or comdat. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
294 #define SUPPORTS_ONE_ONLY (TARGET_SUPPORTS_WEAK || SUPPORTS_SOM_COMDAT) |
0 | 295 |
296 /* We use DECL_COMMON for uninitialized one-only variables as we don't | |
297 have linkonce .bss. We use SOM secondary definitions or comdat for | |
298 initialized variables and functions. */ | |
299 #define MAKE_DECL_ONE_ONLY(DECL) \ | |
300 do { \ | |
301 if (TREE_CODE (DECL) == VAR_DECL \ | |
302 && (DECL_INITIAL (DECL) == 0 \ | |
303 || DECL_INITIAL (DECL) == error_mark_node)) \ | |
304 DECL_COMMON (DECL) = 1; \ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
305 else if (TARGET_SUPPORTS_WEAK) \ |
0 | 306 DECL_WEAK (DECL) = 1; \ |
307 } while (0) | |
308 | |
309 /* This is how we tell the assembler that a symbol is weak. The SOM | |
310 weak implementation uses the secondary definition (sdef) flag. | |
311 | |
312 The behavior of sdef symbols is similar to ELF weak symbols in that | |
313 multiple definitions can occur without incurring a link error. | |
314 However, they differ in the following ways: | |
315 1) Undefined sdef symbols are not allowed. | |
316 2) The linker searches for undefined sdef symbols and will load an | |
317 archive library member to resolve an undefined sdef symbol. | |
318 3) The exported symbol from a shared library is a primary symbol | |
319 rather than a sdef symbol. Thus, more care is needed in the | |
320 ordering of libraries. | |
321 | |
322 It appears that the linker discards extra copies of "weak" functions | |
323 when linking shared libraries, independent of whether or not they | |
324 are in their own section. In linking final executables, -Wl,-O can | |
325 be used to remove dead procedures. Thus, support for named sections | |
326 is not needed and in previous testing caused problems with various | |
327 HP tools. */ | |
328 #define ASM_WEAKEN_LABEL(FILE,NAME) \ | |
329 do { fputs ("\t.weak\t", FILE); \ | |
330 assemble_name (FILE, NAME); \ | |
331 fputc ('\n', FILE); \ | |
332 targetm.asm_out.globalize_label (FILE, NAME); \ | |
333 } while (0) | |
334 | |
335 /* We can't handle weak aliases, and therefore can't support pragma weak. | |
336 Suppress the use of pragma weak in gthr-dce.h and gthr-posix.h. */ | |
337 #define GTHREAD_USE_WEAK 0 | |
338 | |
339 /* Shared library suffix. Collect2 strips the version string after | |
340 this suffix when generating constructor/destructor names. */ | |
341 #define SHLIB_SUFFIX ".sl" |