Mercurial > hg > CbC > CbC_gcc
comparison gcc/varasm.c @ 0:a06113de4d67
first commit
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2009 14:47:48 +0900 |
parents | |
children | 3bfb6c00c1e0 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:a06113de4d67 |
---|---|
1 /* Output variables, constants and external declarations, for GNU compiler. | |
2 Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, | |
3 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 | |
4 Free Software Foundation, Inc. | |
5 | |
6 This file is part of GCC. | |
7 | |
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 3, or (at your option) any later | |
11 version. | |
12 | |
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 | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
19 along with GCC; see the file COPYING3. If not see | |
20 <http://www.gnu.org/licenses/>. */ | |
21 | |
22 | |
23 /* This file handles generation of all the assembler code | |
24 *except* the instructions of a function. | |
25 This includes declarations of variables and their initial values. | |
26 | |
27 We also output the assembler code for constants stored in memory | |
28 and are responsible for combining constants with the same value. */ | |
29 | |
30 #include "config.h" | |
31 #include "system.h" | |
32 #include "coretypes.h" | |
33 #include "tm.h" | |
34 #include "rtl.h" | |
35 #include "tree.h" | |
36 #include "flags.h" | |
37 #include "function.h" | |
38 #include "expr.h" | |
39 #include "hard-reg-set.h" | |
40 #include "regs.h" | |
41 #include "real.h" | |
42 #include "output.h" | |
43 #include "toplev.h" | |
44 #include "hashtab.h" | |
45 #include "c-pragma.h" | |
46 #include "ggc.h" | |
47 #include "langhooks.h" | |
48 #include "tm_p.h" | |
49 #include "debug.h" | |
50 #include "target.h" | |
51 #include "targhooks.h" | |
52 #include "tree-mudflap.h" | |
53 #include "cgraph.h" | |
54 #include "cfglayout.h" | |
55 #include "basic-block.h" | |
56 #include "tree-iterator.h" | |
57 | |
58 #ifdef XCOFF_DEBUGGING_INFO | |
59 #include "xcoffout.h" /* Needed for external data | |
60 declarations for e.g. AIX 4.x. */ | |
61 #endif | |
62 | |
63 /* The (assembler) name of the first globally-visible object output. */ | |
64 extern GTY(()) const char *first_global_object_name; | |
65 extern GTY(()) const char *weak_global_object_name; | |
66 | |
67 const char *first_global_object_name; | |
68 const char *weak_global_object_name; | |
69 | |
70 struct addr_const; | |
71 struct constant_descriptor_rtx; | |
72 struct rtx_constant_pool; | |
73 | |
74 #define n_deferred_constants (crtl->varasm.deferred_constants) | |
75 | |
76 /* Number for making the label on the next | |
77 constant that is stored in memory. */ | |
78 | |
79 static GTY(()) int const_labelno; | |
80 | |
81 /* Carry information from ASM_DECLARE_OBJECT_NAME | |
82 to ASM_FINISH_DECLARE_OBJECT. */ | |
83 | |
84 int size_directive_output; | |
85 | |
86 /* The last decl for which assemble_variable was called, | |
87 if it did ASM_DECLARE_OBJECT_NAME. | |
88 If the last call to assemble_variable didn't do that, | |
89 this holds 0. */ | |
90 | |
91 tree last_assemble_variable_decl; | |
92 | |
93 /* The following global variable indicates if the first basic block | |
94 in a function belongs to the cold partition or not. */ | |
95 | |
96 bool first_function_block_is_cold; | |
97 | |
98 /* We give all constants their own alias set. Perhaps redundant with | |
99 MEM_READONLY_P, but pre-dates it. */ | |
100 | |
101 static alias_set_type const_alias_set; | |
102 | |
103 static const char *strip_reg_name (const char *); | |
104 static int contains_pointers_p (tree); | |
105 #ifdef ASM_OUTPUT_EXTERNAL | |
106 static bool incorporeal_function_p (tree); | |
107 #endif | |
108 static void decode_addr_const (tree, struct addr_const *); | |
109 static hashval_t const_desc_hash (const void *); | |
110 static int const_desc_eq (const void *, const void *); | |
111 static hashval_t const_hash_1 (const tree); | |
112 static int compare_constant (const tree, const tree); | |
113 static tree copy_constant (tree); | |
114 static void output_constant_def_contents (rtx); | |
115 static void output_addressed_constants (tree); | |
116 static unsigned HOST_WIDE_INT array_size_for_constructor (tree); | |
117 static unsigned min_align (unsigned, unsigned); | |
118 static void output_constructor (tree, unsigned HOST_WIDE_INT, unsigned int); | |
119 static void globalize_decl (tree); | |
120 #ifdef BSS_SECTION_ASM_OP | |
121 #ifdef ASM_OUTPUT_BSS | |
122 static void asm_output_bss (FILE *, tree, const char *, | |
123 unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT); | |
124 #endif | |
125 #ifdef ASM_OUTPUT_ALIGNED_BSS | |
126 static void asm_output_aligned_bss (FILE *, tree, const char *, | |
127 unsigned HOST_WIDE_INT, int) | |
128 ATTRIBUTE_UNUSED; | |
129 #endif | |
130 #endif /* BSS_SECTION_ASM_OP */ | |
131 static void mark_weak (tree); | |
132 static void output_constant_pool (const char *, tree); | |
133 | |
134 /* Well-known sections, each one associated with some sort of *_ASM_OP. */ | |
135 section *text_section; | |
136 section *data_section; | |
137 section *readonly_data_section; | |
138 section *sdata_section; | |
139 section *ctors_section; | |
140 section *dtors_section; | |
141 section *bss_section; | |
142 section *sbss_section; | |
143 | |
144 /* Various forms of common section. All are guaranteed to be nonnull. */ | |
145 section *tls_comm_section; | |
146 section *comm_section; | |
147 section *lcomm_section; | |
148 | |
149 /* A SECTION_NOSWITCH section used for declaring global BSS variables. | |
150 May be null. */ | |
151 section *bss_noswitch_section; | |
152 | |
153 /* The section that holds the main exception table, when known. The section | |
154 is set either by the target's init_sections hook or by the first call to | |
155 switch_to_exception_section. */ | |
156 section *exception_section; | |
157 | |
158 /* The section that holds the DWARF2 frame unwind information, when known. | |
159 The section is set either by the target's init_sections hook or by the | |
160 first call to switch_to_eh_frame_section. */ | |
161 section *eh_frame_section; | |
162 | |
163 /* asm_out_file's current section. This is NULL if no section has yet | |
164 been selected or if we lose track of what the current section is. */ | |
165 section *in_section; | |
166 | |
167 /* True if code for the current function is currently being directed | |
168 at the cold section. */ | |
169 bool in_cold_section_p; | |
170 | |
171 /* A linked list of all the unnamed sections. */ | |
172 static GTY(()) section *unnamed_sections; | |
173 | |
174 /* Return a nonzero value if DECL has a section attribute. */ | |
175 #ifndef IN_NAMED_SECTION | |
176 #define IN_NAMED_SECTION(DECL) \ | |
177 ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \ | |
178 && DECL_SECTION_NAME (DECL) != NULL_TREE) | |
179 #endif | |
180 | |
181 /* Hash table of named sections. */ | |
182 static GTY((param_is (section))) htab_t section_htab; | |
183 | |
184 /* A table of object_blocks, indexed by section. */ | |
185 static GTY((param_is (struct object_block))) htab_t object_block_htab; | |
186 | |
187 /* The next number to use for internal anchor labels. */ | |
188 static GTY(()) int anchor_labelno; | |
189 | |
190 /* A pool of constants that can be shared between functions. */ | |
191 static GTY(()) struct rtx_constant_pool *shared_constant_pool; | |
192 | |
193 /* TLS emulation. */ | |
194 | |
195 static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map))) | |
196 htab_t emutls_htab; | |
197 static GTY (()) tree emutls_object_type; | |
198 /* Emulated TLS objects have the TLS model TLS_MODEL_EMULATED. This | |
199 macro can be used on them to distinguish the control variable from | |
200 the initialization template. */ | |
201 #define DECL_EMUTLS_VAR_P(D) (TREE_TYPE (D) == emutls_object_type) | |
202 | |
203 #if !defined (NO_DOT_IN_LABEL) | |
204 # define EMUTLS_SEPARATOR "." | |
205 #elif !defined (NO_DOLLAR_IN_LABEL) | |
206 # define EMUTLS_SEPARATOR "$" | |
207 #else | |
208 # define EMUTLS_SEPARATOR "_" | |
209 #endif | |
210 | |
211 /* Create an IDENTIFIER_NODE by prefixing PREFIX to the | |
212 IDENTIFIER_NODE NAME's name. */ | |
213 | |
214 static tree | |
215 prefix_name (const char *prefix, tree name) | |
216 { | |
217 unsigned plen = strlen (prefix); | |
218 unsigned nlen = strlen (IDENTIFIER_POINTER (name)); | |
219 char *toname = (char *) alloca (plen + nlen + 1); | |
220 | |
221 memcpy (toname, prefix, plen); | |
222 memcpy (toname + plen, IDENTIFIER_POINTER (name), nlen + 1); | |
223 | |
224 return get_identifier (toname); | |
225 } | |
226 | |
227 /* Create an identifier for the struct __emutls_object, given an identifier | |
228 of the DECL_ASSEMBLY_NAME of the original object. */ | |
229 | |
230 static tree | |
231 get_emutls_object_name (tree name) | |
232 { | |
233 const char *prefix = (targetm.emutls.var_prefix | |
234 ? targetm.emutls.var_prefix | |
235 : "__emutls_v" EMUTLS_SEPARATOR); | |
236 return prefix_name (prefix, name); | |
237 } | |
238 | |
239 tree | |
240 default_emutls_var_fields (tree type, tree *name ATTRIBUTE_UNUSED) | |
241 { | |
242 tree word_type_node, field, next_field; | |
243 | |
244 field = build_decl (FIELD_DECL, get_identifier ("__templ"), ptr_type_node); | |
245 DECL_CONTEXT (field) = type; | |
246 next_field = field; | |
247 | |
248 field = build_decl (FIELD_DECL, get_identifier ("__offset"), | |
249 ptr_type_node); | |
250 DECL_CONTEXT (field) = type; | |
251 TREE_CHAIN (field) = next_field; | |
252 next_field = field; | |
253 | |
254 word_type_node = lang_hooks.types.type_for_mode (word_mode, 1); | |
255 field = build_decl (FIELD_DECL, get_identifier ("__align"), | |
256 word_type_node); | |
257 DECL_CONTEXT (field) = type; | |
258 TREE_CHAIN (field) = next_field; | |
259 next_field = field; | |
260 | |
261 field = build_decl (FIELD_DECL, get_identifier ("__size"), word_type_node); | |
262 DECL_CONTEXT (field) = type; | |
263 TREE_CHAIN (field) = next_field; | |
264 | |
265 return field; | |
266 } | |
267 | |
268 /* Create the structure for struct __emutls_object. This should match the | |
269 structure at the top of emutls.c, modulo the union there. */ | |
270 | |
271 static tree | |
272 get_emutls_object_type (void) | |
273 { | |
274 tree type, type_name, field; | |
275 | |
276 type = emutls_object_type; | |
277 if (type) | |
278 return type; | |
279 | |
280 emutls_object_type = type = lang_hooks.types.make_type (RECORD_TYPE); | |
281 type_name = NULL; | |
282 field = targetm.emutls.var_fields (type, &type_name); | |
283 if (!type_name) | |
284 type_name = get_identifier ("__emutls_object"); | |
285 type_name = build_decl (TYPE_DECL, type_name, type); | |
286 TYPE_NAME (type) = type_name; | |
287 TYPE_FIELDS (type) = field; | |
288 layout_type (type); | |
289 | |
290 return type; | |
291 } | |
292 | |
293 /* Create a read-only variable like DECL, with the same DECL_INITIAL. | |
294 This will be used for initializing the emulated tls data area. */ | |
295 | |
296 static tree | |
297 get_emutls_init_templ_addr (tree decl) | |
298 { | |
299 tree name, to; | |
300 | |
301 if (targetm.emutls.register_common && !DECL_INITIAL (decl) | |
302 && !DECL_SECTION_NAME (decl)) | |
303 return null_pointer_node; | |
304 | |
305 name = DECL_ASSEMBLER_NAME (decl); | |
306 if (!targetm.emutls.tmpl_prefix || targetm.emutls.tmpl_prefix[0]) | |
307 { | |
308 const char *prefix = (targetm.emutls.tmpl_prefix | |
309 ? targetm.emutls.tmpl_prefix | |
310 : "__emutls_t" EMUTLS_SEPARATOR); | |
311 name = prefix_name (prefix, name); | |
312 } | |
313 | |
314 to = build_decl (VAR_DECL, name, TREE_TYPE (decl)); | |
315 SET_DECL_ASSEMBLER_NAME (to, DECL_NAME (to)); | |
316 DECL_TLS_MODEL (to) = TLS_MODEL_EMULATED; | |
317 DECL_ARTIFICIAL (to) = 1; | |
318 TREE_USED (to) = TREE_USED (decl); | |
319 TREE_READONLY (to) = 1; | |
320 DECL_IGNORED_P (to) = 1; | |
321 DECL_CONTEXT (to) = DECL_CONTEXT (decl); | |
322 DECL_SECTION_NAME (to) = DECL_SECTION_NAME (decl); | |
323 | |
324 DECL_WEAK (to) = DECL_WEAK (decl); | |
325 if (DECL_ONE_ONLY (decl)) | |
326 { | |
327 make_decl_one_only (to); | |
328 TREE_STATIC (to) = TREE_STATIC (decl); | |
329 TREE_PUBLIC (to) = TREE_PUBLIC (decl); | |
330 DECL_VISIBILITY (to) = DECL_VISIBILITY (decl); | |
331 } | |
332 else | |
333 TREE_STATIC (to) = 1; | |
334 | |
335 DECL_INITIAL (to) = DECL_INITIAL (decl); | |
336 DECL_INITIAL (decl) = NULL; | |
337 | |
338 varpool_finalize_decl (to); | |
339 return build_fold_addr_expr (to); | |
340 } | |
341 | |
342 /* When emulating tls, we use a control structure for use by the runtime. | |
343 Create and return this structure. */ | |
344 | |
345 tree | |
346 emutls_decl (tree decl) | |
347 { | |
348 tree name, to; | |
349 struct tree_map *h, in; | |
350 void **loc; | |
351 | |
352 if (targetm.have_tls || decl == NULL || decl == error_mark_node | |
353 || TREE_CODE (decl) != VAR_DECL || ! DECL_THREAD_LOCAL_P (decl)) | |
354 return decl; | |
355 | |
356 /* Look up the object in the hash; return the control structure if | |
357 it has already been created. */ | |
358 if (! emutls_htab) | |
359 emutls_htab = htab_create_ggc (512, tree_map_hash, tree_map_eq, 0); | |
360 | |
361 name = DECL_ASSEMBLER_NAME (decl); | |
362 | |
363 /* Note that we use the hash of the decl's name, rather than a hash | |
364 of the decl's pointer. In emutls_finish we iterate through the | |
365 hash table, and we want this traversal to be predictable. */ | |
366 in.hash = htab_hash_string (IDENTIFIER_POINTER (name)); | |
367 in.base.from = decl; | |
368 loc = htab_find_slot_with_hash (emutls_htab, &in, in.hash, INSERT); | |
369 h = (struct tree_map *) *loc; | |
370 if (h != NULL) | |
371 to = h->to; | |
372 else | |
373 { | |
374 to = build_decl (VAR_DECL, get_emutls_object_name (name), | |
375 get_emutls_object_type ()); | |
376 | |
377 h = GGC_NEW (struct tree_map); | |
378 h->hash = in.hash; | |
379 h->base.from = decl; | |
380 h->to = to; | |
381 *(struct tree_map **) loc = h; | |
382 | |
383 DECL_TLS_MODEL (to) = TLS_MODEL_EMULATED; | |
384 DECL_ARTIFICIAL (to) = 1; | |
385 DECL_IGNORED_P (to) = 1; | |
386 TREE_READONLY (to) = 0; | |
387 SET_DECL_ASSEMBLER_NAME (to, DECL_NAME (to)); | |
388 if (DECL_ONE_ONLY (decl)) | |
389 make_decl_one_only (to); | |
390 DECL_CONTEXT (to) = DECL_CONTEXT (decl); | |
391 if (targetm.emutls.var_align_fixed) | |
392 /* If we're not allowed to change the proxy object's | |
393 alignment, pretend it's been set by the user. */ | |
394 DECL_USER_ALIGN (to) = 1; | |
395 } | |
396 | |
397 /* Note that these fields may need to be updated from time to time from | |
398 the original decl. Consider: | |
399 extern __thread int i; | |
400 int foo() { return i; } | |
401 __thread int i = 1; | |
402 in which I goes from external to locally defined and initialized. */ | |
403 | |
404 TREE_STATIC (to) = TREE_STATIC (decl); | |
405 TREE_USED (to) = TREE_USED (decl); | |
406 TREE_PUBLIC (to) = TREE_PUBLIC (decl); | |
407 DECL_EXTERNAL (to) = DECL_EXTERNAL (decl); | |
408 DECL_COMMON (to) = DECL_COMMON (decl); | |
409 DECL_WEAK (to) = DECL_WEAK (decl); | |
410 DECL_VISIBILITY (to) = DECL_VISIBILITY (decl); | |
411 | |
412 return to; | |
413 } | |
414 | |
415 static int | |
416 emutls_common_1 (void **loc, void *xstmts) | |
417 { | |
418 struct tree_map *h = *(struct tree_map **) loc; | |
419 tree args, x, *pstmts = (tree *) xstmts; | |
420 tree word_type_node; | |
421 | |
422 if (! DECL_COMMON (h->base.from) | |
423 || (DECL_INITIAL (h->base.from) | |
424 && DECL_INITIAL (h->base.from) != error_mark_node)) | |
425 return 1; | |
426 | |
427 word_type_node = lang_hooks.types.type_for_mode (word_mode, 1); | |
428 | |
429 /* The idea was to call get_emutls_init_templ_addr here, but if we | |
430 do this and there is an initializer, -fanchor_section loses, | |
431 because it would be too late to ensure the template is | |
432 output. */ | |
433 x = null_pointer_node; | |
434 args = tree_cons (NULL, x, NULL); | |
435 x = build_int_cst (word_type_node, DECL_ALIGN_UNIT (h->base.from)); | |
436 args = tree_cons (NULL, x, args); | |
437 x = fold_convert (word_type_node, DECL_SIZE_UNIT (h->base.from)); | |
438 args = tree_cons (NULL, x, args); | |
439 x = build_fold_addr_expr (h->to); | |
440 args = tree_cons (NULL, x, args); | |
441 | |
442 x = built_in_decls[BUILT_IN_EMUTLS_REGISTER_COMMON]; | |
443 x = build_function_call_expr (x, args); | |
444 | |
445 append_to_statement_list (x, pstmts); | |
446 return 1; | |
447 } | |
448 | |
449 void | |
450 emutls_finish (void) | |
451 { | |
452 if (targetm.emutls.register_common) | |
453 { | |
454 tree body = NULL_TREE; | |
455 | |
456 if (emutls_htab == NULL) | |
457 return; | |
458 | |
459 htab_traverse_noresize (emutls_htab, emutls_common_1, &body); | |
460 if (body == NULL_TREE) | |
461 return; | |
462 | |
463 cgraph_build_static_cdtor ('I', body, DEFAULT_INIT_PRIORITY); | |
464 } | |
465 } | |
466 | |
467 /* Helper routines for maintaining section_htab. */ | |
468 | |
469 static int | |
470 section_entry_eq (const void *p1, const void *p2) | |
471 { | |
472 const section *old = (const section *) p1; | |
473 const char *new_name = (const char *) p2; | |
474 | |
475 return strcmp (old->named.name, new_name) == 0; | |
476 } | |
477 | |
478 static hashval_t | |
479 section_entry_hash (const void *p) | |
480 { | |
481 const section *old = (const section *) p; | |
482 return htab_hash_string (old->named.name); | |
483 } | |
484 | |
485 /* Return a hash value for section SECT. */ | |
486 | |
487 static hashval_t | |
488 hash_section (section *sect) | |
489 { | |
490 if (sect->common.flags & SECTION_NAMED) | |
491 return htab_hash_string (sect->named.name); | |
492 return sect->common.flags; | |
493 } | |
494 | |
495 /* Helper routines for maintaining object_block_htab. */ | |
496 | |
497 static int | |
498 object_block_entry_eq (const void *p1, const void *p2) | |
499 { | |
500 const struct object_block *old = (const struct object_block *) p1; | |
501 const section *new_section = (const section *) p2; | |
502 | |
503 return old->sect == new_section; | |
504 } | |
505 | |
506 static hashval_t | |
507 object_block_entry_hash (const void *p) | |
508 { | |
509 const struct object_block *old = (const struct object_block *) p; | |
510 return hash_section (old->sect); | |
511 } | |
512 | |
513 /* Return a new unnamed section with the given fields. */ | |
514 | |
515 section * | |
516 get_unnamed_section (unsigned int flags, void (*callback) (const void *), | |
517 const void *data) | |
518 { | |
519 section *sect; | |
520 | |
521 sect = GGC_NEW (section); | |
522 sect->unnamed.common.flags = flags | SECTION_UNNAMED; | |
523 sect->unnamed.callback = callback; | |
524 sect->unnamed.data = data; | |
525 sect->unnamed.next = unnamed_sections; | |
526 | |
527 unnamed_sections = sect; | |
528 return sect; | |
529 } | |
530 | |
531 /* Return a SECTION_NOSWITCH section with the given fields. */ | |
532 | |
533 static section * | |
534 get_noswitch_section (unsigned int flags, noswitch_section_callback callback) | |
535 { | |
536 section *sect; | |
537 | |
538 sect = GGC_NEW (section); | |
539 sect->noswitch.common.flags = flags | SECTION_NOSWITCH; | |
540 sect->noswitch.callback = callback; | |
541 | |
542 return sect; | |
543 } | |
544 | |
545 /* Return the named section structure associated with NAME. Create | |
546 a new section with the given fields if no such structure exists. */ | |
547 | |
548 section * | |
549 get_section (const char *name, unsigned int flags, tree decl) | |
550 { | |
551 section *sect, **slot; | |
552 | |
553 slot = (section **) | |
554 htab_find_slot_with_hash (section_htab, name, | |
555 htab_hash_string (name), INSERT); | |
556 flags |= SECTION_NAMED; | |
557 if (*slot == NULL) | |
558 { | |
559 sect = GGC_NEW (section); | |
560 sect->named.common.flags = flags; | |
561 sect->named.name = ggc_strdup (name); | |
562 sect->named.decl = decl; | |
563 *slot = sect; | |
564 } | |
565 else | |
566 { | |
567 sect = *slot; | |
568 if ((sect->common.flags & ~SECTION_DECLARED) != flags | |
569 && ((sect->common.flags | flags) & SECTION_OVERRIDE) == 0) | |
570 { | |
571 /* Sanity check user variables for flag changes. */ | |
572 if (decl == 0) | |
573 decl = sect->named.decl; | |
574 gcc_assert (decl); | |
575 error ("%+D causes a section type conflict", decl); | |
576 } | |
577 } | |
578 return sect; | |
579 } | |
580 | |
581 /* Return true if the current compilation mode benefits from having | |
582 objects grouped into blocks. */ | |
583 | |
584 static bool | |
585 use_object_blocks_p (void) | |
586 { | |
587 return flag_section_anchors; | |
588 } | |
589 | |
590 /* Return the object_block structure for section SECT. Create a new | |
591 structure if we haven't created one already. Return null if SECT | |
592 itself is null. */ | |
593 | |
594 static struct object_block * | |
595 get_block_for_section (section *sect) | |
596 { | |
597 struct object_block *block; | |
598 void **slot; | |
599 | |
600 if (sect == NULL) | |
601 return NULL; | |
602 | |
603 slot = htab_find_slot_with_hash (object_block_htab, sect, | |
604 hash_section (sect), INSERT); | |
605 block = (struct object_block *) *slot; | |
606 if (block == NULL) | |
607 { | |
608 block = (struct object_block *) | |
609 ggc_alloc_cleared (sizeof (struct object_block)); | |
610 block->sect = sect; | |
611 *slot = block; | |
612 } | |
613 return block; | |
614 } | |
615 | |
616 /* Create a symbol with label LABEL and place it at byte offset | |
617 OFFSET in BLOCK. OFFSET can be negative if the symbol's offset | |
618 is not yet known. LABEL must be a garbage-collected string. */ | |
619 | |
620 static rtx | |
621 create_block_symbol (const char *label, struct object_block *block, | |
622 HOST_WIDE_INT offset) | |
623 { | |
624 rtx symbol; | |
625 unsigned int size; | |
626 | |
627 /* Create the extended SYMBOL_REF. */ | |
628 size = RTX_HDR_SIZE + sizeof (struct block_symbol); | |
629 symbol = (rtx) ggc_alloc_zone (size, &rtl_zone); | |
630 | |
631 /* Initialize the normal SYMBOL_REF fields. */ | |
632 memset (symbol, 0, size); | |
633 PUT_CODE (symbol, SYMBOL_REF); | |
634 PUT_MODE (symbol, Pmode); | |
635 XSTR (symbol, 0) = label; | |
636 SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_HAS_BLOCK_INFO; | |
637 | |
638 /* Initialize the block_symbol stuff. */ | |
639 SYMBOL_REF_BLOCK (symbol) = block; | |
640 SYMBOL_REF_BLOCK_OFFSET (symbol) = offset; | |
641 | |
642 return symbol; | |
643 } | |
644 | |
645 static void | |
646 initialize_cold_section_name (void) | |
647 { | |
648 const char *stripped_name; | |
649 char *name, *buffer; | |
650 tree dsn; | |
651 | |
652 gcc_assert (cfun && current_function_decl); | |
653 if (crtl->subsections.unlikely_text_section_name) | |
654 return; | |
655 | |
656 dsn = DECL_SECTION_NAME (current_function_decl); | |
657 if (flag_function_sections && dsn) | |
658 { | |
659 name = (char *) alloca (TREE_STRING_LENGTH (dsn) + 1); | |
660 memcpy (name, TREE_STRING_POINTER (dsn), TREE_STRING_LENGTH (dsn) + 1); | |
661 | |
662 stripped_name = targetm.strip_name_encoding (name); | |
663 | |
664 buffer = ACONCAT ((stripped_name, "_unlikely", NULL)); | |
665 crtl->subsections.unlikely_text_section_name = ggc_strdup (buffer); | |
666 } | |
667 else | |
668 crtl->subsections.unlikely_text_section_name = UNLIKELY_EXECUTED_TEXT_SECTION_NAME; | |
669 } | |
670 | |
671 /* Tell assembler to switch to unlikely-to-be-executed text section. */ | |
672 | |
673 section * | |
674 unlikely_text_section (void) | |
675 { | |
676 if (cfun) | |
677 { | |
678 if (!crtl->subsections.unlikely_text_section_name) | |
679 initialize_cold_section_name (); | |
680 | |
681 return get_named_section (NULL, crtl->subsections.unlikely_text_section_name, 0); | |
682 } | |
683 else | |
684 return get_named_section (NULL, UNLIKELY_EXECUTED_TEXT_SECTION_NAME, 0); | |
685 } | |
686 | |
687 /* When called within a function context, return true if the function | |
688 has been assigned a cold text section and if SECT is that section. | |
689 When called outside a function context, return true if SECT is the | |
690 default cold section. */ | |
691 | |
692 bool | |
693 unlikely_text_section_p (section *sect) | |
694 { | |
695 const char *name; | |
696 | |
697 if (cfun) | |
698 name = crtl->subsections.unlikely_text_section_name; | |
699 else | |
700 name = UNLIKELY_EXECUTED_TEXT_SECTION_NAME; | |
701 | |
702 return (name | |
703 && sect | |
704 && SECTION_STYLE (sect) == SECTION_NAMED | |
705 && strcmp (name, sect->named.name) == 0); | |
706 } | |
707 | |
708 /* Return a section with a particular name and with whatever SECTION_* | |
709 flags section_type_flags deems appropriate. The name of the section | |
710 is taken from NAME if nonnull, otherwise it is taken from DECL's | |
711 DECL_SECTION_NAME. DECL is the decl associated with the section | |
712 (see the section comment for details) and RELOC is as for | |
713 section_type_flags. */ | |
714 | |
715 section * | |
716 get_named_section (tree decl, const char *name, int reloc) | |
717 { | |
718 unsigned int flags; | |
719 | |
720 gcc_assert (!decl || DECL_P (decl)); | |
721 if (name == NULL) | |
722 name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl)); | |
723 | |
724 flags = targetm.section_type_flags (decl, name, reloc); | |
725 | |
726 return get_section (name, flags, decl); | |
727 } | |
728 | |
729 /* If required, set DECL_SECTION_NAME to a unique name. */ | |
730 | |
731 void | |
732 resolve_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED, | |
733 int flag_function_or_data_sections) | |
734 { | |
735 if (DECL_SECTION_NAME (decl) == NULL_TREE | |
736 && targetm.have_named_sections | |
737 && (flag_function_or_data_sections | |
738 || DECL_ONE_ONLY (decl))) | |
739 targetm.asm_out.unique_section (decl, reloc); | |
740 } | |
741 | |
742 #ifdef BSS_SECTION_ASM_OP | |
743 | |
744 #ifdef ASM_OUTPUT_BSS | |
745 | |
746 /* Utility function for ASM_OUTPUT_BSS for targets to use if | |
747 they don't support alignments in .bss. | |
748 ??? It is believed that this function will work in most cases so such | |
749 support is localized here. */ | |
750 | |
751 static void | |
752 asm_output_bss (FILE *file, tree decl ATTRIBUTE_UNUSED, | |
753 const char *name, | |
754 unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED, | |
755 unsigned HOST_WIDE_INT rounded) | |
756 { | |
757 gcc_assert (strcmp (XSTR (XEXP (DECL_RTL (decl), 0), 0), name) == 0); | |
758 targetm.asm_out.globalize_decl_name (file, decl); | |
759 switch_to_section (bss_section); | |
760 #ifdef ASM_DECLARE_OBJECT_NAME | |
761 last_assemble_variable_decl = decl; | |
762 ASM_DECLARE_OBJECT_NAME (file, name, decl); | |
763 #else | |
764 /* Standard thing is just output label for the object. */ | |
765 ASM_OUTPUT_LABEL (file, name); | |
766 #endif /* ASM_DECLARE_OBJECT_NAME */ | |
767 ASM_OUTPUT_SKIP (file, rounded ? rounded : 1); | |
768 } | |
769 | |
770 #endif | |
771 | |
772 #ifdef ASM_OUTPUT_ALIGNED_BSS | |
773 | |
774 /* Utility function for targets to use in implementing | |
775 ASM_OUTPUT_ALIGNED_BSS. | |
776 ??? It is believed that this function will work in most cases so such | |
777 support is localized here. */ | |
778 | |
779 static void | |
780 asm_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED, | |
781 const char *name, unsigned HOST_WIDE_INT size, | |
782 int align) | |
783 { | |
784 switch_to_section (bss_section); | |
785 ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT)); | |
786 #ifdef ASM_DECLARE_OBJECT_NAME | |
787 last_assemble_variable_decl = decl; | |
788 ASM_DECLARE_OBJECT_NAME (file, name, decl); | |
789 #else | |
790 /* Standard thing is just output label for the object. */ | |
791 ASM_OUTPUT_LABEL (file, name); | |
792 #endif /* ASM_DECLARE_OBJECT_NAME */ | |
793 ASM_OUTPUT_SKIP (file, size ? size : 1); | |
794 } | |
795 | |
796 #endif | |
797 | |
798 #endif /* BSS_SECTION_ASM_OP */ | |
799 | |
800 #ifndef USE_SELECT_SECTION_FOR_FUNCTIONS | |
801 /* Return the hot section for function DECL. Return text_section for | |
802 null DECLs. */ | |
803 | |
804 static section * | |
805 hot_function_section (tree decl) | |
806 { | |
807 if (decl != NULL_TREE | |
808 && DECL_SECTION_NAME (decl) != NULL_TREE | |
809 && targetm.have_named_sections) | |
810 return get_named_section (decl, NULL, 0); | |
811 else | |
812 return text_section; | |
813 } | |
814 #endif | |
815 | |
816 /* Return the section for function DECL. | |
817 | |
818 If DECL is NULL_TREE, return the text section. We can be passed | |
819 NULL_TREE under some circumstances by dbxout.c at least. */ | |
820 | |
821 section * | |
822 function_section (tree decl) | |
823 { | |
824 int reloc = 0; | |
825 | |
826 if (first_function_block_is_cold) | |
827 reloc = 1; | |
828 | |
829 #ifdef USE_SELECT_SECTION_FOR_FUNCTIONS | |
830 if (decl != NULL_TREE | |
831 && DECL_SECTION_NAME (decl) != NULL_TREE) | |
832 return reloc ? unlikely_text_section () | |
833 : get_named_section (decl, NULL, 0); | |
834 else | |
835 return targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl)); | |
836 #else | |
837 return reloc ? unlikely_text_section () : hot_function_section (decl); | |
838 #endif | |
839 } | |
840 | |
841 section * | |
842 current_function_section (void) | |
843 { | |
844 #ifdef USE_SELECT_SECTION_FOR_FUNCTIONS | |
845 if (current_function_decl != NULL_TREE | |
846 && DECL_SECTION_NAME (current_function_decl) != NULL_TREE) | |
847 return in_cold_section_p ? unlikely_text_section () | |
848 : get_named_section (current_function_decl, | |
849 NULL, 0); | |
850 else | |
851 return targetm.asm_out.select_section (current_function_decl, | |
852 in_cold_section_p, | |
853 DECL_ALIGN (current_function_decl)); | |
854 #else | |
855 return (in_cold_section_p | |
856 ? unlikely_text_section () | |
857 : hot_function_section (current_function_decl)); | |
858 #endif | |
859 } | |
860 | |
861 /* Return the read-only data section associated with function DECL. */ | |
862 | |
863 section * | |
864 default_function_rodata_section (tree decl) | |
865 { | |
866 if (decl != NULL_TREE && DECL_SECTION_NAME (decl)) | |
867 { | |
868 const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl)); | |
869 | |
870 if (DECL_ONE_ONLY (decl) && HAVE_COMDAT_GROUP) | |
871 { | |
872 size_t len = strlen (name) + 3; | |
873 char* rname = (char *) alloca (len); | |
874 | |
875 strcpy (rname, ".rodata"); | |
876 strcat (rname, name + 5); | |
877 return get_section (rname, SECTION_LINKONCE, decl); | |
878 } | |
879 /* For .gnu.linkonce.t.foo we want to use .gnu.linkonce.r.foo. */ | |
880 else if (DECL_ONE_ONLY (decl) | |
881 && strncmp (name, ".gnu.linkonce.t.", 16) == 0) | |
882 { | |
883 size_t len = strlen (name) + 1; | |
884 char *rname = (char *) alloca (len); | |
885 | |
886 memcpy (rname, name, len); | |
887 rname[14] = 'r'; | |
888 return get_section (rname, SECTION_LINKONCE, decl); | |
889 } | |
890 /* For .text.foo we want to use .rodata.foo. */ | |
891 else if (flag_function_sections && flag_data_sections | |
892 && strncmp (name, ".text.", 6) == 0) | |
893 { | |
894 size_t len = strlen (name) + 1; | |
895 char *rname = (char *) alloca (len + 2); | |
896 | |
897 memcpy (rname, ".rodata", 7); | |
898 memcpy (rname + 7, name + 5, len - 5); | |
899 return get_section (rname, 0, decl); | |
900 } | |
901 } | |
902 | |
903 return readonly_data_section; | |
904 } | |
905 | |
906 /* Return the read-only data section associated with function DECL | |
907 for targets where that section should be always the single | |
908 readonly data section. */ | |
909 | |
910 section * | |
911 default_no_function_rodata_section (tree decl ATTRIBUTE_UNUSED) | |
912 { | |
913 return readonly_data_section; | |
914 } | |
915 | |
916 /* Return the section to use for string merging. */ | |
917 | |
918 static section * | |
919 mergeable_string_section (tree decl ATTRIBUTE_UNUSED, | |
920 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED, | |
921 unsigned int flags ATTRIBUTE_UNUSED) | |
922 { | |
923 HOST_WIDE_INT len; | |
924 | |
925 if (HAVE_GAS_SHF_MERGE && flag_merge_constants | |
926 && TREE_CODE (decl) == STRING_CST | |
927 && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE | |
928 && align <= 256 | |
929 && (len = int_size_in_bytes (TREE_TYPE (decl))) > 0 | |
930 && TREE_STRING_LENGTH (decl) >= len) | |
931 { | |
932 enum machine_mode mode; | |
933 unsigned int modesize; | |
934 const char *str; | |
935 HOST_WIDE_INT i; | |
936 int j, unit; | |
937 char name[30]; | |
938 | |
939 mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (decl))); | |
940 modesize = GET_MODE_BITSIZE (mode); | |
941 if (modesize >= 8 && modesize <= 256 | |
942 && (modesize & (modesize - 1)) == 0) | |
943 { | |
944 if (align < modesize) | |
945 align = modesize; | |
946 | |
947 str = TREE_STRING_POINTER (decl); | |
948 unit = GET_MODE_SIZE (mode); | |
949 | |
950 /* Check for embedded NUL characters. */ | |
951 for (i = 0; i < len; i += unit) | |
952 { | |
953 for (j = 0; j < unit; j++) | |
954 if (str[i + j] != '\0') | |
955 break; | |
956 if (j == unit) | |
957 break; | |
958 } | |
959 if (i == len - unit) | |
960 { | |
961 sprintf (name, ".rodata.str%d.%d", modesize / 8, | |
962 (int) (align / 8)); | |
963 flags |= (modesize / 8) | SECTION_MERGE | SECTION_STRINGS; | |
964 return get_section (name, flags, NULL); | |
965 } | |
966 } | |
967 } | |
968 | |
969 return readonly_data_section; | |
970 } | |
971 | |
972 /* Return the section to use for constant merging. */ | |
973 | |
974 section * | |
975 mergeable_constant_section (enum machine_mode mode ATTRIBUTE_UNUSED, | |
976 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED, | |
977 unsigned int flags ATTRIBUTE_UNUSED) | |
978 { | |
979 unsigned int modesize = GET_MODE_BITSIZE (mode); | |
980 | |
981 if (HAVE_GAS_SHF_MERGE && flag_merge_constants | |
982 && mode != VOIDmode | |
983 && mode != BLKmode | |
984 && modesize <= align | |
985 && align >= 8 | |
986 && align <= 256 | |
987 && (align & (align - 1)) == 0) | |
988 { | |
989 char name[24]; | |
990 | |
991 sprintf (name, ".rodata.cst%d", (int) (align / 8)); | |
992 flags |= (align / 8) | SECTION_MERGE; | |
993 return get_section (name, flags, NULL); | |
994 } | |
995 return readonly_data_section; | |
996 } | |
997 | |
998 /* Given NAME, a putative register name, discard any customary prefixes. */ | |
999 | |
1000 static const char * | |
1001 strip_reg_name (const char *name) | |
1002 { | |
1003 #ifdef REGISTER_PREFIX | |
1004 if (!strncmp (name, REGISTER_PREFIX, strlen (REGISTER_PREFIX))) | |
1005 name += strlen (REGISTER_PREFIX); | |
1006 #endif | |
1007 if (name[0] == '%' || name[0] == '#') | |
1008 name++; | |
1009 return name; | |
1010 } | |
1011 | |
1012 /* The user has asked for a DECL to have a particular name. Set (or | |
1013 change) it in such a way that we don't prefix an underscore to | |
1014 it. */ | |
1015 void | |
1016 set_user_assembler_name (tree decl, const char *name) | |
1017 { | |
1018 char *starred = (char *) alloca (strlen (name) + 2); | |
1019 starred[0] = '*'; | |
1020 strcpy (starred + 1, name); | |
1021 change_decl_assembler_name (decl, get_identifier (starred)); | |
1022 SET_DECL_RTL (decl, NULL_RTX); | |
1023 } | |
1024 | |
1025 /* Decode an `asm' spec for a declaration as a register name. | |
1026 Return the register number, or -1 if nothing specified, | |
1027 or -2 if the ASMSPEC is not `cc' or `memory' and is not recognized, | |
1028 or -3 if ASMSPEC is `cc' and is not recognized, | |
1029 or -4 if ASMSPEC is `memory' and is not recognized. | |
1030 Accept an exact spelling or a decimal number. | |
1031 Prefixes such as % are optional. */ | |
1032 | |
1033 int | |
1034 decode_reg_name (const char *asmspec) | |
1035 { | |
1036 if (asmspec != 0) | |
1037 { | |
1038 int i; | |
1039 | |
1040 /* Get rid of confusing prefixes. */ | |
1041 asmspec = strip_reg_name (asmspec); | |
1042 | |
1043 /* Allow a decimal number as a "register name". */ | |
1044 for (i = strlen (asmspec) - 1; i >= 0; i--) | |
1045 if (! ISDIGIT (asmspec[i])) | |
1046 break; | |
1047 if (asmspec[0] != 0 && i < 0) | |
1048 { | |
1049 i = atoi (asmspec); | |
1050 if (i < FIRST_PSEUDO_REGISTER && i >= 0) | |
1051 return i; | |
1052 else | |
1053 return -2; | |
1054 } | |
1055 | |
1056 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) | |
1057 if (reg_names[i][0] | |
1058 && ! strcmp (asmspec, strip_reg_name (reg_names[i]))) | |
1059 return i; | |
1060 | |
1061 #ifdef ADDITIONAL_REGISTER_NAMES | |
1062 { | |
1063 static const struct { const char *const name; const int number; } table[] | |
1064 = ADDITIONAL_REGISTER_NAMES; | |
1065 | |
1066 for (i = 0; i < (int) ARRAY_SIZE (table); i++) | |
1067 if (table[i].name[0] | |
1068 && ! strcmp (asmspec, table[i].name)) | |
1069 return table[i].number; | |
1070 } | |
1071 #endif /* ADDITIONAL_REGISTER_NAMES */ | |
1072 | |
1073 if (!strcmp (asmspec, "memory")) | |
1074 return -4; | |
1075 | |
1076 if (!strcmp (asmspec, "cc")) | |
1077 return -3; | |
1078 | |
1079 return -2; | |
1080 } | |
1081 | |
1082 return -1; | |
1083 } | |
1084 | |
1085 /* Return true if DECL's initializer is suitable for a BSS section. */ | |
1086 | |
1087 static bool | |
1088 bss_initializer_p (const_tree decl) | |
1089 { | |
1090 return (DECL_INITIAL (decl) == NULL | |
1091 || DECL_INITIAL (decl) == error_mark_node | |
1092 || (flag_zero_initialized_in_bss | |
1093 /* Leave constant zeroes in .rodata so they | |
1094 can be shared. */ | |
1095 && !TREE_READONLY (decl) | |
1096 && initializer_zerop (DECL_INITIAL (decl)))); | |
1097 } | |
1098 | |
1099 /* Compute the alignment of variable specified by DECL. | |
1100 DONT_OUTPUT_DATA is from assemble_variable. */ | |
1101 | |
1102 void | |
1103 align_variable (tree decl, bool dont_output_data) | |
1104 { | |
1105 unsigned int align = DECL_ALIGN (decl); | |
1106 | |
1107 /* In the case for initialing an array whose length isn't specified, | |
1108 where we have not yet been able to do the layout, | |
1109 figure out the proper alignment now. */ | |
1110 if (dont_output_data && DECL_SIZE (decl) == 0 | |
1111 && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE) | |
1112 align = MAX (align, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl)))); | |
1113 | |
1114 /* Some object file formats have a maximum alignment which they support. | |
1115 In particular, a.out format supports a maximum alignment of 4. */ | |
1116 if (align > MAX_OFILE_ALIGNMENT) | |
1117 { | |
1118 warning (0, "alignment of %q+D is greater than maximum object " | |
1119 "file alignment. Using %d", decl, | |
1120 MAX_OFILE_ALIGNMENT/BITS_PER_UNIT); | |
1121 align = MAX_OFILE_ALIGNMENT; | |
1122 } | |
1123 | |
1124 /* On some machines, it is good to increase alignment sometimes. */ | |
1125 if (! DECL_USER_ALIGN (decl)) | |
1126 { | |
1127 #ifdef DATA_ALIGNMENT | |
1128 unsigned int data_align = DATA_ALIGNMENT (TREE_TYPE (decl), align); | |
1129 /* Don't increase alignment too much for TLS variables - TLS space | |
1130 is too precious. */ | |
1131 if (! DECL_THREAD_LOCAL_P (decl) || data_align <= BITS_PER_WORD) | |
1132 align = data_align; | |
1133 #endif | |
1134 #ifdef CONSTANT_ALIGNMENT | |
1135 if (DECL_INITIAL (decl) != 0 && DECL_INITIAL (decl) != error_mark_node) | |
1136 { | |
1137 unsigned int const_align = CONSTANT_ALIGNMENT (DECL_INITIAL (decl), | |
1138 align); | |
1139 /* Don't increase alignment too much for TLS variables - TLS space | |
1140 is too precious. */ | |
1141 if (! DECL_THREAD_LOCAL_P (decl) || const_align <= BITS_PER_WORD) | |
1142 align = const_align; | |
1143 } | |
1144 #endif | |
1145 } | |
1146 | |
1147 /* Reset the alignment in case we have made it tighter, so we can benefit | |
1148 from it in get_pointer_alignment. */ | |
1149 DECL_ALIGN (decl) = align; | |
1150 } | |
1151 | |
1152 /* Return the section into which the given VAR_DECL or CONST_DECL | |
1153 should be placed. PREFER_NOSWITCH_P is true if a noswitch | |
1154 section should be used wherever possible. */ | |
1155 | |
1156 static section * | |
1157 get_variable_section (tree decl, bool prefer_noswitch_p) | |
1158 { | |
1159 int reloc; | |
1160 | |
1161 /* If the decl has been given an explicit section name, then it | |
1162 isn't common, and shouldn't be handled as such. */ | |
1163 if (DECL_COMMON (decl) && DECL_SECTION_NAME (decl) == NULL) | |
1164 { | |
1165 if (DECL_THREAD_LOCAL_P (decl)) | |
1166 return tls_comm_section; | |
1167 /* This cannot be common bss for an emulated TLS object without | |
1168 a register_common hook. */ | |
1169 else if (DECL_TLS_MODEL (decl) == TLS_MODEL_EMULATED | |
1170 && !targetm.emutls.register_common) | |
1171 ; | |
1172 else if (TREE_PUBLIC (decl) && bss_initializer_p (decl)) | |
1173 return comm_section; | |
1174 } | |
1175 | |
1176 if (DECL_INITIAL (decl) == error_mark_node) | |
1177 reloc = contains_pointers_p (TREE_TYPE (decl)) ? 3 : 0; | |
1178 else if (DECL_INITIAL (decl)) | |
1179 reloc = compute_reloc_for_constant (DECL_INITIAL (decl)); | |
1180 else | |
1181 reloc = 0; | |
1182 | |
1183 resolve_unique_section (decl, reloc, flag_data_sections); | |
1184 if (IN_NAMED_SECTION (decl)) | |
1185 return get_named_section (decl, NULL, reloc); | |
1186 | |
1187 if (!DECL_THREAD_LOCAL_P (decl) | |
1188 && !(prefer_noswitch_p && targetm.have_switchable_bss_sections) | |
1189 && bss_initializer_p (decl)) | |
1190 { | |
1191 if (!TREE_PUBLIC (decl)) | |
1192 return lcomm_section; | |
1193 if (bss_noswitch_section) | |
1194 return bss_noswitch_section; | |
1195 } | |
1196 | |
1197 return targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl)); | |
1198 } | |
1199 | |
1200 /* Return the block into which object_block DECL should be placed. */ | |
1201 | |
1202 static struct object_block * | |
1203 get_block_for_decl (tree decl) | |
1204 { | |
1205 section *sect; | |
1206 | |
1207 if (TREE_CODE (decl) == VAR_DECL) | |
1208 { | |
1209 /* The object must be defined in this translation unit. */ | |
1210 if (DECL_EXTERNAL (decl)) | |
1211 return NULL; | |
1212 | |
1213 /* There's no point using object blocks for something that is | |
1214 isolated by definition. */ | |
1215 if (DECL_ONE_ONLY (decl)) | |
1216 return NULL; | |
1217 } | |
1218 | |
1219 /* We can only calculate block offsets if the decl has a known | |
1220 constant size. */ | |
1221 if (DECL_SIZE_UNIT (decl) == NULL) | |
1222 return NULL; | |
1223 if (!host_integerp (DECL_SIZE_UNIT (decl), 1)) | |
1224 return NULL; | |
1225 | |
1226 /* Find out which section should contain DECL. We cannot put it into | |
1227 an object block if it requires a standalone definition. */ | |
1228 if (TREE_CODE (decl) == VAR_DECL) | |
1229 align_variable (decl, 0); | |
1230 sect = get_variable_section (decl, true); | |
1231 if (SECTION_STYLE (sect) == SECTION_NOSWITCH) | |
1232 return NULL; | |
1233 | |
1234 return get_block_for_section (sect); | |
1235 } | |
1236 | |
1237 /* Make sure block symbol SYMBOL is in block BLOCK. */ | |
1238 | |
1239 static void | |
1240 change_symbol_block (rtx symbol, struct object_block *block) | |
1241 { | |
1242 if (block != SYMBOL_REF_BLOCK (symbol)) | |
1243 { | |
1244 gcc_assert (SYMBOL_REF_BLOCK_OFFSET (symbol) < 0); | |
1245 SYMBOL_REF_BLOCK (symbol) = block; | |
1246 } | |
1247 } | |
1248 | |
1249 /* Return true if it is possible to put DECL in an object_block. */ | |
1250 | |
1251 static bool | |
1252 use_blocks_for_decl_p (tree decl) | |
1253 { | |
1254 /* Only data DECLs can be placed into object blocks. */ | |
1255 if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != CONST_DECL) | |
1256 return false; | |
1257 | |
1258 /* Detect decls created by dw2_force_const_mem. Such decls are | |
1259 special because DECL_INITIAL doesn't specify the decl's true value. | |
1260 dw2_output_indirect_constants will instead call assemble_variable | |
1261 with dont_output_data set to 1 and then print the contents itself. */ | |
1262 if (DECL_INITIAL (decl) == decl) | |
1263 return false; | |
1264 | |
1265 /* If this decl is an alias, then we don't want to emit a definition. */ | |
1266 if (lookup_attribute ("alias", DECL_ATTRIBUTES (decl))) | |
1267 return false; | |
1268 | |
1269 return true; | |
1270 } | |
1271 | |
1272 /* Create the DECL_RTL for a VAR_DECL or FUNCTION_DECL. DECL should | |
1273 have static storage duration. In other words, it should not be an | |
1274 automatic variable, including PARM_DECLs. | |
1275 | |
1276 There is, however, one exception: this function handles variables | |
1277 explicitly placed in a particular register by the user. | |
1278 | |
1279 This is never called for PARM_DECL nodes. */ | |
1280 | |
1281 void | |
1282 make_decl_rtl (tree decl) | |
1283 { | |
1284 const char *name = 0; | |
1285 int reg_number; | |
1286 rtx x; | |
1287 | |
1288 /* Check that we are not being given an automatic variable. */ | |
1289 gcc_assert (TREE_CODE (decl) != PARM_DECL | |
1290 && TREE_CODE (decl) != RESULT_DECL); | |
1291 | |
1292 /* A weak alias has TREE_PUBLIC set but not the other bits. */ | |
1293 gcc_assert (TREE_CODE (decl) != VAR_DECL | |
1294 || TREE_STATIC (decl) | |
1295 || TREE_PUBLIC (decl) | |
1296 || DECL_EXTERNAL (decl) | |
1297 || DECL_REGISTER (decl)); | |
1298 | |
1299 /* And that we were not given a type or a label. */ | |
1300 gcc_assert (TREE_CODE (decl) != TYPE_DECL | |
1301 && TREE_CODE (decl) != LABEL_DECL); | |
1302 | |
1303 /* For a duplicate declaration, we can be called twice on the | |
1304 same DECL node. Don't discard the RTL already made. */ | |
1305 if (DECL_RTL_SET_P (decl)) | |
1306 { | |
1307 /* If the old RTL had the wrong mode, fix the mode. */ | |
1308 x = DECL_RTL (decl); | |
1309 if (GET_MODE (x) != DECL_MODE (decl)) | |
1310 SET_DECL_RTL (decl, adjust_address_nv (x, DECL_MODE (decl), 0)); | |
1311 | |
1312 if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl)) | |
1313 return; | |
1314 | |
1315 /* ??? Another way to do this would be to maintain a hashed | |
1316 table of such critters. Instead of adding stuff to a DECL | |
1317 to give certain attributes to it, we could use an external | |
1318 hash map from DECL to set of attributes. */ | |
1319 | |
1320 /* Let the target reassign the RTL if it wants. | |
1321 This is necessary, for example, when one machine specific | |
1322 decl attribute overrides another. */ | |
1323 targetm.encode_section_info (decl, DECL_RTL (decl), false); | |
1324 | |
1325 /* If the symbol has a SYMBOL_REF_BLOCK field, update it based | |
1326 on the new decl information. */ | |
1327 if (MEM_P (x) | |
1328 && GET_CODE (XEXP (x, 0)) == SYMBOL_REF | |
1329 && SYMBOL_REF_HAS_BLOCK_INFO_P (XEXP (x, 0))) | |
1330 change_symbol_block (XEXP (x, 0), get_block_for_decl (decl)); | |
1331 | |
1332 /* Make this function static known to the mudflap runtime. */ | |
1333 if (flag_mudflap && TREE_CODE (decl) == VAR_DECL) | |
1334 mudflap_enqueue_decl (decl); | |
1335 | |
1336 return; | |
1337 } | |
1338 | |
1339 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); | |
1340 | |
1341 if (name[0] != '*' && TREE_CODE (decl) != FUNCTION_DECL | |
1342 && DECL_REGISTER (decl)) | |
1343 { | |
1344 error ("register name not specified for %q+D", decl); | |
1345 } | |
1346 else if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl)) | |
1347 { | |
1348 const char *asmspec = name+1; | |
1349 reg_number = decode_reg_name (asmspec); | |
1350 /* First detect errors in declaring global registers. */ | |
1351 if (reg_number == -1) | |
1352 error ("register name not specified for %q+D", decl); | |
1353 else if (reg_number < 0) | |
1354 error ("invalid register name for %q+D", decl); | |
1355 else if (TYPE_MODE (TREE_TYPE (decl)) == BLKmode) | |
1356 error ("data type of %q+D isn%'t suitable for a register", | |
1357 decl); | |
1358 else if (! HARD_REGNO_MODE_OK (reg_number, TYPE_MODE (TREE_TYPE (decl)))) | |
1359 error ("register specified for %q+D isn%'t suitable for data type", | |
1360 decl); | |
1361 /* Now handle properly declared static register variables. */ | |
1362 else | |
1363 { | |
1364 int nregs; | |
1365 | |
1366 if (DECL_INITIAL (decl) != 0 && TREE_STATIC (decl)) | |
1367 { | |
1368 DECL_INITIAL (decl) = 0; | |
1369 error ("global register variable has initial value"); | |
1370 } | |
1371 if (TREE_THIS_VOLATILE (decl)) | |
1372 warning (OPT_Wvolatile_register_var, | |
1373 "optimization may eliminate reads and/or " | |
1374 "writes to register variables"); | |
1375 | |
1376 /* If the user specified one of the eliminables registers here, | |
1377 e.g., FRAME_POINTER_REGNUM, we don't want to get this variable | |
1378 confused with that register and be eliminated. This usage is | |
1379 somewhat suspect... */ | |
1380 | |
1381 SET_DECL_RTL (decl, gen_rtx_raw_REG (DECL_MODE (decl), reg_number)); | |
1382 ORIGINAL_REGNO (DECL_RTL (decl)) = reg_number; | |
1383 REG_USERVAR_P (DECL_RTL (decl)) = 1; | |
1384 | |
1385 if (TREE_STATIC (decl)) | |
1386 { | |
1387 /* Make this register global, so not usable for anything | |
1388 else. */ | |
1389 #ifdef ASM_DECLARE_REGISTER_GLOBAL | |
1390 name = IDENTIFIER_POINTER (DECL_NAME (decl)); | |
1391 ASM_DECLARE_REGISTER_GLOBAL (asm_out_file, decl, reg_number, name); | |
1392 #endif | |
1393 nregs = hard_regno_nregs[reg_number][DECL_MODE (decl)]; | |
1394 while (nregs > 0) | |
1395 globalize_reg (reg_number + --nregs); | |
1396 } | |
1397 | |
1398 /* As a register variable, it has no section. */ | |
1399 return; | |
1400 } | |
1401 } | |
1402 /* Now handle ordinary static variables and functions (in memory). | |
1403 Also handle vars declared register invalidly. */ | |
1404 else if (name[0] == '*') | |
1405 { | |
1406 #ifdef REGISTER_PREFIX | |
1407 if (strlen (REGISTER_PREFIX) != 0) | |
1408 { | |
1409 reg_number = decode_reg_name (name); | |
1410 if (reg_number >= 0 || reg_number == -3) | |
1411 error ("register name given for non-register variable %q+D", decl); | |
1412 } | |
1413 #endif | |
1414 } | |
1415 | |
1416 /* Specifying a section attribute on a variable forces it into a | |
1417 non-.bss section, and thus it cannot be common. */ | |
1418 if (TREE_CODE (decl) == VAR_DECL | |
1419 && DECL_SECTION_NAME (decl) != NULL_TREE | |
1420 && DECL_INITIAL (decl) == NULL_TREE | |
1421 && DECL_COMMON (decl)) | |
1422 DECL_COMMON (decl) = 0; | |
1423 | |
1424 /* Variables can't be both common and weak. */ | |
1425 if (TREE_CODE (decl) == VAR_DECL && DECL_WEAK (decl)) | |
1426 DECL_COMMON (decl) = 0; | |
1427 | |
1428 if (use_object_blocks_p () && use_blocks_for_decl_p (decl)) | |
1429 x = create_block_symbol (name, get_block_for_decl (decl), -1); | |
1430 else | |
1431 x = gen_rtx_SYMBOL_REF (Pmode, name); | |
1432 SYMBOL_REF_WEAK (x) = DECL_WEAK (decl); | |
1433 SET_SYMBOL_REF_DECL (x, decl); | |
1434 | |
1435 x = gen_rtx_MEM (DECL_MODE (decl), x); | |
1436 if (TREE_CODE (decl) != FUNCTION_DECL) | |
1437 set_mem_attributes (x, decl, 1); | |
1438 SET_DECL_RTL (decl, x); | |
1439 | |
1440 /* Optionally set flags or add text to the name to record information | |
1441 such as that it is a function name. | |
1442 If the name is changed, the macro ASM_OUTPUT_LABELREF | |
1443 will have to know how to strip this information. */ | |
1444 targetm.encode_section_info (decl, DECL_RTL (decl), true); | |
1445 | |
1446 /* Make this function static known to the mudflap runtime. */ | |
1447 if (flag_mudflap && TREE_CODE (decl) == VAR_DECL) | |
1448 mudflap_enqueue_decl (decl); | |
1449 } | |
1450 | |
1451 /* Output a string of literal assembler code | |
1452 for an `asm' keyword used between functions. */ | |
1453 | |
1454 void | |
1455 assemble_asm (tree string) | |
1456 { | |
1457 app_enable (); | |
1458 | |
1459 if (TREE_CODE (string) == ADDR_EXPR) | |
1460 string = TREE_OPERAND (string, 0); | |
1461 | |
1462 fprintf (asm_out_file, "\t%s\n", TREE_STRING_POINTER (string)); | |
1463 } | |
1464 | |
1465 /* Record an element in the table of global destructors. SYMBOL is | |
1466 a SYMBOL_REF of the function to be called; PRIORITY is a number | |
1467 between 0 and MAX_INIT_PRIORITY. */ | |
1468 | |
1469 void | |
1470 default_stabs_asm_out_destructor (rtx symbol ATTRIBUTE_UNUSED, | |
1471 int priority ATTRIBUTE_UNUSED) | |
1472 { | |
1473 #if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO | |
1474 /* Tell GNU LD that this is part of the static destructor set. | |
1475 This will work for any system that uses stabs, most usefully | |
1476 aout systems. */ | |
1477 dbxout_begin_simple_stabs ("___DTOR_LIST__", 22 /* N_SETT */); | |
1478 dbxout_stab_value_label (XSTR (symbol, 0)); | |
1479 #else | |
1480 sorry ("global destructors not supported on this target"); | |
1481 #endif | |
1482 } | |
1483 | |
1484 /* Write the address of the entity given by SYMBOL to SEC. */ | |
1485 void | |
1486 assemble_addr_to_section (rtx symbol, section *sec) | |
1487 { | |
1488 switch_to_section (sec); | |
1489 assemble_align (POINTER_SIZE); | |
1490 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1); | |
1491 } | |
1492 | |
1493 /* Return the numbered .ctors.N (if CONSTRUCTOR_P) or .dtors.N (if | |
1494 not) section for PRIORITY. */ | |
1495 section * | |
1496 get_cdtor_priority_section (int priority, bool constructor_p) | |
1497 { | |
1498 char buf[16]; | |
1499 | |
1500 /* ??? This only works reliably with the GNU linker. */ | |
1501 sprintf (buf, "%s.%.5u", | |
1502 constructor_p ? ".ctors" : ".dtors", | |
1503 /* Invert the numbering so the linker puts us in the proper | |
1504 order; constructors are run from right to left, and the | |
1505 linker sorts in increasing order. */ | |
1506 MAX_INIT_PRIORITY - priority); | |
1507 return get_section (buf, SECTION_WRITE, NULL); | |
1508 } | |
1509 | |
1510 void | |
1511 default_named_section_asm_out_destructor (rtx symbol, int priority) | |
1512 { | |
1513 section *sec; | |
1514 | |
1515 if (priority != DEFAULT_INIT_PRIORITY) | |
1516 sec = get_cdtor_priority_section (priority, | |
1517 /*constructor_p=*/false); | |
1518 else | |
1519 sec = get_section (".dtors", SECTION_WRITE, NULL); | |
1520 | |
1521 assemble_addr_to_section (symbol, sec); | |
1522 } | |
1523 | |
1524 #ifdef DTORS_SECTION_ASM_OP | |
1525 void | |
1526 default_dtor_section_asm_out_destructor (rtx symbol, | |
1527 int priority ATTRIBUTE_UNUSED) | |
1528 { | |
1529 assemble_addr_to_section (symbol, dtors_section); | |
1530 } | |
1531 #endif | |
1532 | |
1533 /* Likewise for global constructors. */ | |
1534 | |
1535 void | |
1536 default_stabs_asm_out_constructor (rtx symbol ATTRIBUTE_UNUSED, | |
1537 int priority ATTRIBUTE_UNUSED) | |
1538 { | |
1539 #if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO | |
1540 /* Tell GNU LD that this is part of the static destructor set. | |
1541 This will work for any system that uses stabs, most usefully | |
1542 aout systems. */ | |
1543 dbxout_begin_simple_stabs ("___CTOR_LIST__", 22 /* N_SETT */); | |
1544 dbxout_stab_value_label (XSTR (symbol, 0)); | |
1545 #else | |
1546 sorry ("global constructors not supported on this target"); | |
1547 #endif | |
1548 } | |
1549 | |
1550 void | |
1551 default_named_section_asm_out_constructor (rtx symbol, int priority) | |
1552 { | |
1553 section *sec; | |
1554 | |
1555 if (priority != DEFAULT_INIT_PRIORITY) | |
1556 sec = get_cdtor_priority_section (priority, | |
1557 /*constructor_p=*/true); | |
1558 else | |
1559 sec = get_section (".ctors", SECTION_WRITE, NULL); | |
1560 | |
1561 assemble_addr_to_section (symbol, sec); | |
1562 } | |
1563 | |
1564 #ifdef CTORS_SECTION_ASM_OP | |
1565 void | |
1566 default_ctor_section_asm_out_constructor (rtx symbol, | |
1567 int priority ATTRIBUTE_UNUSED) | |
1568 { | |
1569 assemble_addr_to_section (symbol, ctors_section); | |
1570 } | |
1571 #endif | |
1572 | |
1573 /* CONSTANT_POOL_BEFORE_FUNCTION may be defined as an expression with | |
1574 a nonzero value if the constant pool should be output before the | |
1575 start of the function, or a zero value if the pool should output | |
1576 after the end of the function. The default is to put it before the | |
1577 start. */ | |
1578 | |
1579 #ifndef CONSTANT_POOL_BEFORE_FUNCTION | |
1580 #define CONSTANT_POOL_BEFORE_FUNCTION 1 | |
1581 #endif | |
1582 | |
1583 /* DECL is an object (either VAR_DECL or FUNCTION_DECL) which is going | |
1584 to be output to assembler. | |
1585 Set first_global_object_name and weak_global_object_name as appropriate. */ | |
1586 | |
1587 void | |
1588 notice_global_symbol (tree decl) | |
1589 { | |
1590 const char **type = &first_global_object_name; | |
1591 | |
1592 if (first_global_object_name | |
1593 || !TREE_PUBLIC (decl) | |
1594 || DECL_EXTERNAL (decl) | |
1595 || !DECL_NAME (decl) | |
1596 || (TREE_CODE (decl) != FUNCTION_DECL | |
1597 && (TREE_CODE (decl) != VAR_DECL | |
1598 || (DECL_COMMON (decl) | |
1599 && (DECL_INITIAL (decl) == 0 | |
1600 || DECL_INITIAL (decl) == error_mark_node)))) | |
1601 || !MEM_P (DECL_RTL (decl))) | |
1602 return; | |
1603 | |
1604 /* We win when global object is found, but it is useful to know about weak | |
1605 symbol as well so we can produce nicer unique names. */ | |
1606 if (DECL_WEAK (decl) || DECL_ONE_ONLY (decl) || flag_shlib) | |
1607 type = &weak_global_object_name; | |
1608 | |
1609 if (!*type) | |
1610 { | |
1611 const char *p; | |
1612 const char *name; | |
1613 rtx decl_rtl = DECL_RTL (decl); | |
1614 | |
1615 p = targetm.strip_name_encoding (XSTR (XEXP (decl_rtl, 0), 0)); | |
1616 name = ggc_strdup (p); | |
1617 | |
1618 *type = name; | |
1619 } | |
1620 } | |
1621 | |
1622 /* Output assembler code for the constant pool of a function and associated | |
1623 with defining the name of the function. DECL describes the function. | |
1624 NAME is the function's name. For the constant pool, we use the current | |
1625 constant pool data. */ | |
1626 | |
1627 void | |
1628 assemble_start_function (tree decl, const char *fnname) | |
1629 { | |
1630 int align; | |
1631 char tmp_label[100]; | |
1632 bool hot_label_written = false; | |
1633 | |
1634 crtl->subsections.unlikely_text_section_name = NULL; | |
1635 | |
1636 first_function_block_is_cold = false; | |
1637 if (flag_reorder_blocks_and_partition) | |
1638 { | |
1639 ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LHOTB", const_labelno); | |
1640 crtl->subsections.hot_section_label = ggc_strdup (tmp_label); | |
1641 ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LCOLDB", const_labelno); | |
1642 crtl->subsections.cold_section_label = ggc_strdup (tmp_label); | |
1643 ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LHOTE", const_labelno); | |
1644 crtl->subsections.hot_section_end_label = ggc_strdup (tmp_label); | |
1645 ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LCOLDE", const_labelno); | |
1646 crtl->subsections.cold_section_end_label = ggc_strdup (tmp_label); | |
1647 const_labelno++; | |
1648 } | |
1649 else | |
1650 { | |
1651 crtl->subsections.hot_section_label = NULL; | |
1652 crtl->subsections.cold_section_label = NULL; | |
1653 crtl->subsections.hot_section_end_label = NULL; | |
1654 crtl->subsections.cold_section_end_label = NULL; | |
1655 } | |
1656 | |
1657 /* The following code does not need preprocessing in the assembler. */ | |
1658 | |
1659 app_disable (); | |
1660 | |
1661 if (CONSTANT_POOL_BEFORE_FUNCTION) | |
1662 output_constant_pool (fnname, decl); | |
1663 | |
1664 resolve_unique_section (decl, 0, flag_function_sections); | |
1665 | |
1666 /* Make sure the not and cold text (code) sections are properly | |
1667 aligned. This is necessary here in the case where the function | |
1668 has both hot and cold sections, because we don't want to re-set | |
1669 the alignment when the section switch happens mid-function. */ | |
1670 | |
1671 if (flag_reorder_blocks_and_partition) | |
1672 { | |
1673 switch_to_section (unlikely_text_section ()); | |
1674 assemble_align (DECL_ALIGN (decl)); | |
1675 ASM_OUTPUT_LABEL (asm_out_file, crtl->subsections.cold_section_label); | |
1676 | |
1677 /* When the function starts with a cold section, we need to explicitly | |
1678 align the hot section and write out the hot section label. | |
1679 But if the current function is a thunk, we do not have a CFG. */ | |
1680 if (!cfun->is_thunk | |
1681 && BB_PARTITION (ENTRY_BLOCK_PTR->next_bb) == BB_COLD_PARTITION) | |
1682 { | |
1683 switch_to_section (text_section); | |
1684 assemble_align (DECL_ALIGN (decl)); | |
1685 ASM_OUTPUT_LABEL (asm_out_file, crtl->subsections.hot_section_label); | |
1686 hot_label_written = true; | |
1687 first_function_block_is_cold = true; | |
1688 } | |
1689 } | |
1690 else if (DECL_SECTION_NAME (decl)) | |
1691 { | |
1692 /* Calls to function_section rely on first_function_block_is_cold | |
1693 being accurate. The first block may be cold even if we aren't | |
1694 doing partitioning, if the entire function was decided by | |
1695 choose_function_section (predict.c) to be cold. */ | |
1696 | |
1697 initialize_cold_section_name (); | |
1698 | |
1699 if (crtl->subsections.unlikely_text_section_name | |
1700 && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)), | |
1701 crtl->subsections.unlikely_text_section_name) == 0) | |
1702 first_function_block_is_cold = true; | |
1703 } | |
1704 | |
1705 in_cold_section_p = first_function_block_is_cold; | |
1706 | |
1707 /* Switch to the correct text section for the start of the function. */ | |
1708 | |
1709 switch_to_section (function_section (decl)); | |
1710 if (flag_reorder_blocks_and_partition | |
1711 && !hot_label_written) | |
1712 ASM_OUTPUT_LABEL (asm_out_file, crtl->subsections.hot_section_label); | |
1713 | |
1714 /* Tell assembler to move to target machine's alignment for functions. */ | |
1715 align = floor_log2 (DECL_ALIGN (decl) / BITS_PER_UNIT); | |
1716 if (align > 0) | |
1717 { | |
1718 ASM_OUTPUT_ALIGN (asm_out_file, align); | |
1719 } | |
1720 | |
1721 /* Handle a user-specified function alignment. | |
1722 Note that we still need to align to DECL_ALIGN, as above, | |
1723 because ASM_OUTPUT_MAX_SKIP_ALIGN might not do any alignment at all. */ | |
1724 if (! DECL_USER_ALIGN (decl) | |
1725 && align_functions_log > align | |
1726 && optimize_function_for_speed_p (cfun)) | |
1727 { | |
1728 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN | |
1729 ASM_OUTPUT_MAX_SKIP_ALIGN (asm_out_file, | |
1730 align_functions_log, align_functions - 1); | |
1731 #else | |
1732 ASM_OUTPUT_ALIGN (asm_out_file, align_functions_log); | |
1733 #endif | |
1734 } | |
1735 | |
1736 #ifdef ASM_OUTPUT_FUNCTION_PREFIX | |
1737 ASM_OUTPUT_FUNCTION_PREFIX (asm_out_file, fnname); | |
1738 #endif | |
1739 | |
1740 (*debug_hooks->begin_function) (decl); | |
1741 | |
1742 /* Make function name accessible from other files, if appropriate. */ | |
1743 | |
1744 if (TREE_PUBLIC (decl)) | |
1745 { | |
1746 notice_global_symbol (decl); | |
1747 | |
1748 globalize_decl (decl); | |
1749 | |
1750 maybe_assemble_visibility (decl); | |
1751 } | |
1752 | |
1753 if (DECL_PRESERVE_P (decl)) | |
1754 targetm.asm_out.mark_decl_preserved (fnname); | |
1755 | |
1756 /* Do any machine/system dependent processing of the function name. */ | |
1757 #ifdef ASM_DECLARE_FUNCTION_NAME | |
1758 ASM_DECLARE_FUNCTION_NAME (asm_out_file, fnname, current_function_decl); | |
1759 #else | |
1760 /* Standard thing is just output label for the function. */ | |
1761 ASM_OUTPUT_LABEL (asm_out_file, fnname); | |
1762 #endif /* ASM_DECLARE_FUNCTION_NAME */ | |
1763 } | |
1764 | |
1765 /* Output assembler code associated with defining the size of the | |
1766 function. DECL describes the function. NAME is the function's name. */ | |
1767 | |
1768 void | |
1769 assemble_end_function (tree decl, const char *fnname ATTRIBUTE_UNUSED) | |
1770 { | |
1771 #ifdef ASM_DECLARE_FUNCTION_SIZE | |
1772 /* We could have switched section in the middle of the function. */ | |
1773 if (flag_reorder_blocks_and_partition) | |
1774 switch_to_section (function_section (decl)); | |
1775 ASM_DECLARE_FUNCTION_SIZE (asm_out_file, fnname, decl); | |
1776 #endif | |
1777 if (! CONSTANT_POOL_BEFORE_FUNCTION) | |
1778 { | |
1779 output_constant_pool (fnname, decl); | |
1780 switch_to_section (function_section (decl)); /* need to switch back */ | |
1781 } | |
1782 /* Output labels for end of hot/cold text sections (to be used by | |
1783 debug info.) */ | |
1784 if (flag_reorder_blocks_and_partition) | |
1785 { | |
1786 section *save_text_section; | |
1787 | |
1788 save_text_section = in_section; | |
1789 switch_to_section (unlikely_text_section ()); | |
1790 ASM_OUTPUT_LABEL (asm_out_file, crtl->subsections.cold_section_end_label); | |
1791 if (first_function_block_is_cold) | |
1792 switch_to_section (text_section); | |
1793 else | |
1794 switch_to_section (function_section (decl)); | |
1795 ASM_OUTPUT_LABEL (asm_out_file, crtl->subsections.hot_section_end_label); | |
1796 switch_to_section (save_text_section); | |
1797 } | |
1798 } | |
1799 | |
1800 /* Assemble code to leave SIZE bytes of zeros. */ | |
1801 | |
1802 void | |
1803 assemble_zeros (unsigned HOST_WIDE_INT size) | |
1804 { | |
1805 /* Do no output if -fsyntax-only. */ | |
1806 if (flag_syntax_only) | |
1807 return; | |
1808 | |
1809 #ifdef ASM_NO_SKIP_IN_TEXT | |
1810 /* The `space' pseudo in the text section outputs nop insns rather than 0s, | |
1811 so we must output 0s explicitly in the text section. */ | |
1812 if (ASM_NO_SKIP_IN_TEXT && (in_section->common.flags & SECTION_CODE) != 0) | |
1813 { | |
1814 unsigned HOST_WIDE_INT i; | |
1815 for (i = 0; i < size; i++) | |
1816 assemble_integer (const0_rtx, 1, BITS_PER_UNIT, 1); | |
1817 } | |
1818 else | |
1819 #endif | |
1820 if (size > 0) | |
1821 ASM_OUTPUT_SKIP (asm_out_file, size); | |
1822 } | |
1823 | |
1824 /* Assemble an alignment pseudo op for an ALIGN-bit boundary. */ | |
1825 | |
1826 void | |
1827 assemble_align (int align) | |
1828 { | |
1829 if (align > BITS_PER_UNIT) | |
1830 { | |
1831 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT)); | |
1832 } | |
1833 } | |
1834 | |
1835 /* Assemble a string constant with the specified C string as contents. */ | |
1836 | |
1837 void | |
1838 assemble_string (const char *p, int size) | |
1839 { | |
1840 int pos = 0; | |
1841 int maximum = 2000; | |
1842 | |
1843 /* If the string is very long, split it up. */ | |
1844 | |
1845 while (pos < size) | |
1846 { | |
1847 int thissize = size - pos; | |
1848 if (thissize > maximum) | |
1849 thissize = maximum; | |
1850 | |
1851 ASM_OUTPUT_ASCII (asm_out_file, p, thissize); | |
1852 | |
1853 pos += thissize; | |
1854 p += thissize; | |
1855 } | |
1856 } | |
1857 | |
1858 | |
1859 /* A noswitch_section_callback for lcomm_section. */ | |
1860 | |
1861 static bool | |
1862 emit_local (tree decl ATTRIBUTE_UNUSED, | |
1863 const char *name ATTRIBUTE_UNUSED, | |
1864 unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED, | |
1865 unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED) | |
1866 { | |
1867 #if defined ASM_OUTPUT_ALIGNED_DECL_LOCAL | |
1868 ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, decl, name, | |
1869 size, DECL_ALIGN (decl)); | |
1870 return true; | |
1871 #elif defined ASM_OUTPUT_ALIGNED_LOCAL | |
1872 ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, DECL_ALIGN (decl)); | |
1873 return true; | |
1874 #else | |
1875 ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded); | |
1876 return false; | |
1877 #endif | |
1878 } | |
1879 | |
1880 /* A noswitch_section_callback for bss_noswitch_section. */ | |
1881 | |
1882 #if defined ASM_OUTPUT_ALIGNED_BSS || defined ASM_OUTPUT_BSS | |
1883 static bool | |
1884 emit_bss (tree decl ATTRIBUTE_UNUSED, | |
1885 const char *name ATTRIBUTE_UNUSED, | |
1886 unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED, | |
1887 unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED) | |
1888 { | |
1889 #if defined ASM_OUTPUT_ALIGNED_BSS | |
1890 ASM_OUTPUT_ALIGNED_BSS (asm_out_file, decl, name, size, DECL_ALIGN (decl)); | |
1891 return true; | |
1892 #else | |
1893 ASM_OUTPUT_BSS (asm_out_file, decl, name, size, rounded); | |
1894 return false; | |
1895 #endif | |
1896 } | |
1897 #endif | |
1898 | |
1899 /* A noswitch_section_callback for comm_section. */ | |
1900 | |
1901 static bool | |
1902 emit_common (tree decl ATTRIBUTE_UNUSED, | |
1903 const char *name ATTRIBUTE_UNUSED, | |
1904 unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED, | |
1905 unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED) | |
1906 { | |
1907 #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON | |
1908 ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, decl, name, | |
1909 size, DECL_ALIGN (decl)); | |
1910 return true; | |
1911 #elif defined ASM_OUTPUT_ALIGNED_COMMON | |
1912 ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, name, size, DECL_ALIGN (decl)); | |
1913 return true; | |
1914 #else | |
1915 ASM_OUTPUT_COMMON (asm_out_file, name, size, rounded); | |
1916 return false; | |
1917 #endif | |
1918 } | |
1919 | |
1920 /* A noswitch_section_callback for tls_comm_section. */ | |
1921 | |
1922 static bool | |
1923 emit_tls_common (tree decl ATTRIBUTE_UNUSED, | |
1924 const char *name ATTRIBUTE_UNUSED, | |
1925 unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED, | |
1926 unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED) | |
1927 { | |
1928 #ifdef ASM_OUTPUT_TLS_COMMON | |
1929 ASM_OUTPUT_TLS_COMMON (asm_out_file, decl, name, size); | |
1930 return true; | |
1931 #else | |
1932 sorry ("thread-local COMMON data not implemented"); | |
1933 return true; | |
1934 #endif | |
1935 } | |
1936 | |
1937 /* Assemble DECL given that it belongs in SECTION_NOSWITCH section SECT. | |
1938 NAME is the name of DECL's SYMBOL_REF. */ | |
1939 | |
1940 static void | |
1941 assemble_noswitch_variable (tree decl, const char *name, section *sect) | |
1942 { | |
1943 unsigned HOST_WIDE_INT size, rounded; | |
1944 | |
1945 size = tree_low_cst (DECL_SIZE_UNIT (decl), 1); | |
1946 rounded = size; | |
1947 | |
1948 /* Don't allocate zero bytes of common, | |
1949 since that means "undefined external" in the linker. */ | |
1950 if (size == 0) | |
1951 rounded = 1; | |
1952 | |
1953 /* Round size up to multiple of BIGGEST_ALIGNMENT bits | |
1954 so that each uninitialized object starts on such a boundary. */ | |
1955 rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1; | |
1956 rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT) | |
1957 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); | |
1958 | |
1959 if (!sect->noswitch.callback (decl, name, size, rounded) | |
1960 && (unsigned HOST_WIDE_INT) DECL_ALIGN_UNIT (decl) > rounded) | |
1961 warning (0, "requested alignment for %q+D is greater than " | |
1962 "implemented alignment of %wu", decl, rounded); | |
1963 } | |
1964 | |
1965 /* A subroutine of assemble_variable. Output the label and contents of | |
1966 DECL, whose address is a SYMBOL_REF with name NAME. DONT_OUTPUT_DATA | |
1967 is as for assemble_variable. */ | |
1968 | |
1969 static void | |
1970 assemble_variable_contents (tree decl, const char *name, | |
1971 bool dont_output_data) | |
1972 { | |
1973 /* Do any machine/system dependent processing of the object. */ | |
1974 #ifdef ASM_DECLARE_OBJECT_NAME | |
1975 last_assemble_variable_decl = decl; | |
1976 ASM_DECLARE_OBJECT_NAME (asm_out_file, name, decl); | |
1977 #else | |
1978 /* Standard thing is just output label for the object. */ | |
1979 ASM_OUTPUT_LABEL (asm_out_file, name); | |
1980 #endif /* ASM_DECLARE_OBJECT_NAME */ | |
1981 | |
1982 if (!dont_output_data) | |
1983 { | |
1984 if (DECL_INITIAL (decl) | |
1985 && DECL_INITIAL (decl) != error_mark_node | |
1986 && !initializer_zerop (DECL_INITIAL (decl))) | |
1987 /* Output the actual data. */ | |
1988 output_constant (DECL_INITIAL (decl), | |
1989 tree_low_cst (DECL_SIZE_UNIT (decl), 1), | |
1990 DECL_ALIGN (decl)); | |
1991 else | |
1992 /* Leave space for it. */ | |
1993 assemble_zeros (tree_low_cst (DECL_SIZE_UNIT (decl), 1)); | |
1994 } | |
1995 } | |
1996 | |
1997 /* Initialize emulated tls object TO, which refers to TLS variable | |
1998 DECL and is initialized by PROXY. */ | |
1999 | |
2000 tree | |
2001 default_emutls_var_init (tree to, tree decl, tree proxy) | |
2002 { | |
2003 VEC(constructor_elt,gc) *v = VEC_alloc (constructor_elt, gc, 4); | |
2004 constructor_elt *elt; | |
2005 tree type = TREE_TYPE (to); | |
2006 tree field = TYPE_FIELDS (type); | |
2007 | |
2008 elt = VEC_quick_push (constructor_elt, v, NULL); | |
2009 elt->index = field; | |
2010 elt->value = fold_convert (TREE_TYPE (field), DECL_SIZE_UNIT (decl)); | |
2011 | |
2012 elt = VEC_quick_push (constructor_elt, v, NULL); | |
2013 field = TREE_CHAIN (field); | |
2014 elt->index = field; | |
2015 elt->value = build_int_cst (TREE_TYPE (field), | |
2016 DECL_ALIGN_UNIT (decl)); | |
2017 | |
2018 elt = VEC_quick_push (constructor_elt, v, NULL); | |
2019 field = TREE_CHAIN (field); | |
2020 elt->index = field; | |
2021 elt->value = null_pointer_node; | |
2022 | |
2023 elt = VEC_quick_push (constructor_elt, v, NULL); | |
2024 field = TREE_CHAIN (field); | |
2025 elt->index = field; | |
2026 elt->value = proxy; | |
2027 | |
2028 return build_constructor (type, v); | |
2029 } | |
2030 | |
2031 /* Assemble everything that is needed for a variable or function declaration. | |
2032 Not used for automatic variables, and not used for function definitions. | |
2033 Should not be called for variables of incomplete structure type. | |
2034 | |
2035 TOP_LEVEL is nonzero if this variable has file scope. | |
2036 AT_END is nonzero if this is the special handling, at end of compilation, | |
2037 to define things that have had only tentative definitions. | |
2038 DONT_OUTPUT_DATA if nonzero means don't actually output the | |
2039 initial value (that will be done by the caller). */ | |
2040 | |
2041 void | |
2042 assemble_variable (tree decl, int top_level ATTRIBUTE_UNUSED, | |
2043 int at_end ATTRIBUTE_UNUSED, int dont_output_data) | |
2044 { | |
2045 const char *name; | |
2046 rtx decl_rtl, symbol; | |
2047 section *sect; | |
2048 | |
2049 if (! targetm.have_tls | |
2050 && TREE_CODE (decl) == VAR_DECL | |
2051 && DECL_THREAD_LOCAL_P (decl)) | |
2052 { | |
2053 tree to = emutls_decl (decl); | |
2054 | |
2055 /* If this variable is defined locally, then we need to initialize the | |
2056 control structure with size and alignment information. We do this | |
2057 at the last moment because tentative definitions can take a locally | |
2058 defined but uninitialized variable and initialize it later, which | |
2059 would result in incorrect contents. */ | |
2060 if (! DECL_EXTERNAL (to) | |
2061 && (! DECL_COMMON (to) | |
2062 || (DECL_INITIAL (decl) | |
2063 && DECL_INITIAL (decl) != error_mark_node))) | |
2064 { | |
2065 DECL_INITIAL (to) = targetm.emutls.var_init | |
2066 (to, decl, get_emutls_init_templ_addr (decl)); | |
2067 | |
2068 /* Make sure the template is marked as needed early enough. | |
2069 Without this, if the variable is placed in a | |
2070 section-anchored block, the template will only be marked | |
2071 when it's too late. */ | |
2072 record_references_in_initializer (to); | |
2073 } | |
2074 | |
2075 decl = to; | |
2076 } | |
2077 | |
2078 last_assemble_variable_decl = 0; | |
2079 | |
2080 /* Normally no need to say anything here for external references, | |
2081 since assemble_external is called by the language-specific code | |
2082 when a declaration is first seen. */ | |
2083 | |
2084 if (DECL_EXTERNAL (decl)) | |
2085 return; | |
2086 | |
2087 /* Output no assembler code for a function declaration. | |
2088 Only definitions of functions output anything. */ | |
2089 | |
2090 if (TREE_CODE (decl) == FUNCTION_DECL) | |
2091 return; | |
2092 | |
2093 /* Do nothing for global register variables. */ | |
2094 if (DECL_RTL_SET_P (decl) && REG_P (DECL_RTL (decl))) | |
2095 { | |
2096 TREE_ASM_WRITTEN (decl) = 1; | |
2097 return; | |
2098 } | |
2099 | |
2100 /* If type was incomplete when the variable was declared, | |
2101 see if it is complete now. */ | |
2102 | |
2103 if (DECL_SIZE (decl) == 0) | |
2104 layout_decl (decl, 0); | |
2105 | |
2106 /* Still incomplete => don't allocate it; treat the tentative defn | |
2107 (which is what it must have been) as an `extern' reference. */ | |
2108 | |
2109 if (!dont_output_data && DECL_SIZE (decl) == 0) | |
2110 { | |
2111 error ("storage size of %q+D isn%'t known", decl); | |
2112 TREE_ASM_WRITTEN (decl) = 1; | |
2113 return; | |
2114 } | |
2115 | |
2116 /* The first declaration of a variable that comes through this function | |
2117 decides whether it is global (in C, has external linkage) | |
2118 or local (in C, has internal linkage). So do nothing more | |
2119 if this function has already run. */ | |
2120 | |
2121 if (TREE_ASM_WRITTEN (decl)) | |
2122 return; | |
2123 | |
2124 /* Make sure targetm.encode_section_info is invoked before we set | |
2125 ASM_WRITTEN. */ | |
2126 decl_rtl = DECL_RTL (decl); | |
2127 | |
2128 TREE_ASM_WRITTEN (decl) = 1; | |
2129 | |
2130 /* Do no output if -fsyntax-only. */ | |
2131 if (flag_syntax_only) | |
2132 return; | |
2133 | |
2134 app_disable (); | |
2135 | |
2136 if (! dont_output_data | |
2137 && ! host_integerp (DECL_SIZE_UNIT (decl), 1)) | |
2138 { | |
2139 error ("size of variable %q+D is too large", decl); | |
2140 return; | |
2141 } | |
2142 | |
2143 gcc_assert (MEM_P (decl_rtl)); | |
2144 gcc_assert (GET_CODE (XEXP (decl_rtl, 0)) == SYMBOL_REF); | |
2145 symbol = XEXP (decl_rtl, 0); | |
2146 name = XSTR (symbol, 0); | |
2147 if (TREE_PUBLIC (decl) && DECL_NAME (decl)) | |
2148 notice_global_symbol (decl); | |
2149 | |
2150 /* Compute the alignment of this data. */ | |
2151 | |
2152 align_variable (decl, dont_output_data); | |
2153 set_mem_align (decl_rtl, DECL_ALIGN (decl)); | |
2154 | |
2155 if (TREE_PUBLIC (decl)) | |
2156 maybe_assemble_visibility (decl); | |
2157 | |
2158 if (DECL_PRESERVE_P (decl)) | |
2159 targetm.asm_out.mark_decl_preserved (name); | |
2160 | |
2161 /* First make the assembler name(s) global if appropriate. */ | |
2162 sect = get_variable_section (decl, false); | |
2163 if (TREE_PUBLIC (decl) | |
2164 && (sect->common.flags & SECTION_COMMON) == 0) | |
2165 globalize_decl (decl); | |
2166 | |
2167 /* Output any data that we will need to use the address of. */ | |
2168 if (DECL_INITIAL (decl) && DECL_INITIAL (decl) != error_mark_node) | |
2169 output_addressed_constants (DECL_INITIAL (decl)); | |
2170 | |
2171 /* dbxout.c needs to know this. */ | |
2172 if (sect && (sect->common.flags & SECTION_CODE) != 0) | |
2173 DECL_IN_TEXT_SECTION (decl) = 1; | |
2174 | |
2175 /* If the decl is part of an object_block, make sure that the decl | |
2176 has been positioned within its block, but do not write out its | |
2177 definition yet. output_object_blocks will do that later. */ | |
2178 if (SYMBOL_REF_HAS_BLOCK_INFO_P (symbol) && SYMBOL_REF_BLOCK (symbol)) | |
2179 { | |
2180 gcc_assert (!dont_output_data); | |
2181 place_block_symbol (symbol); | |
2182 } | |
2183 else if (SECTION_STYLE (sect) == SECTION_NOSWITCH) | |
2184 assemble_noswitch_variable (decl, name, sect); | |
2185 else | |
2186 { | |
2187 switch_to_section (sect); | |
2188 if (DECL_ALIGN (decl) > BITS_PER_UNIT) | |
2189 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (DECL_ALIGN_UNIT (decl))); | |
2190 assemble_variable_contents (decl, name, dont_output_data); | |
2191 } | |
2192 } | |
2193 | |
2194 /* Return 1 if type TYPE contains any pointers. */ | |
2195 | |
2196 static int | |
2197 contains_pointers_p (tree type) | |
2198 { | |
2199 switch (TREE_CODE (type)) | |
2200 { | |
2201 case POINTER_TYPE: | |
2202 case REFERENCE_TYPE: | |
2203 /* I'm not sure whether OFFSET_TYPE needs this treatment, | |
2204 so I'll play safe and return 1. */ | |
2205 case OFFSET_TYPE: | |
2206 return 1; | |
2207 | |
2208 case RECORD_TYPE: | |
2209 case UNION_TYPE: | |
2210 case QUAL_UNION_TYPE: | |
2211 { | |
2212 tree fields; | |
2213 /* For a type that has fields, see if the fields have pointers. */ | |
2214 for (fields = TYPE_FIELDS (type); fields; fields = TREE_CHAIN (fields)) | |
2215 if (TREE_CODE (fields) == FIELD_DECL | |
2216 && contains_pointers_p (TREE_TYPE (fields))) | |
2217 return 1; | |
2218 return 0; | |
2219 } | |
2220 | |
2221 case ARRAY_TYPE: | |
2222 /* An array type contains pointers if its element type does. */ | |
2223 return contains_pointers_p (TREE_TYPE (type)); | |
2224 | |
2225 default: | |
2226 return 0; | |
2227 } | |
2228 } | |
2229 | |
2230 /* We delay assemble_external processing until | |
2231 the compilation unit is finalized. This is the best we can do for | |
2232 right now (i.e. stage 3 of GCC 4.0) - the right thing is to delay | |
2233 it all the way to final. See PR 17982 for further discussion. */ | |
2234 static GTY(()) tree pending_assemble_externals; | |
2235 | |
2236 #ifdef ASM_OUTPUT_EXTERNAL | |
2237 /* True if DECL is a function decl for which no out-of-line copy exists. | |
2238 It is assumed that DECL's assembler name has been set. */ | |
2239 | |
2240 static bool | |
2241 incorporeal_function_p (tree decl) | |
2242 { | |
2243 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl)) | |
2244 { | |
2245 const char *name; | |
2246 | |
2247 if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL | |
2248 && DECL_FUNCTION_CODE (decl) == BUILT_IN_ALLOCA) | |
2249 return true; | |
2250 | |
2251 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); | |
2252 if (strncmp (name, "__builtin_", strlen ("__builtin_")) == 0) | |
2253 return true; | |
2254 } | |
2255 return false; | |
2256 } | |
2257 | |
2258 /* Actually do the tests to determine if this is necessary, and invoke | |
2259 ASM_OUTPUT_EXTERNAL. */ | |
2260 static void | |
2261 assemble_external_real (tree decl) | |
2262 { | |
2263 rtx rtl = DECL_RTL (decl); | |
2264 | |
2265 if (MEM_P (rtl) && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF | |
2266 && !SYMBOL_REF_USED (XEXP (rtl, 0)) | |
2267 && !incorporeal_function_p (decl)) | |
2268 { | |
2269 /* Some systems do require some output. */ | |
2270 SYMBOL_REF_USED (XEXP (rtl, 0)) = 1; | |
2271 ASM_OUTPUT_EXTERNAL (asm_out_file, decl, XSTR (XEXP (rtl, 0), 0)); | |
2272 } | |
2273 } | |
2274 #endif | |
2275 | |
2276 void | |
2277 process_pending_assemble_externals (void) | |
2278 { | |
2279 #ifdef ASM_OUTPUT_EXTERNAL | |
2280 tree list; | |
2281 for (list = pending_assemble_externals; list; list = TREE_CHAIN (list)) | |
2282 assemble_external_real (TREE_VALUE (list)); | |
2283 | |
2284 pending_assemble_externals = 0; | |
2285 #endif | |
2286 } | |
2287 | |
2288 /* This TREE_LIST contains any weak symbol declarations waiting | |
2289 to be emitted. */ | |
2290 static GTY(()) tree weak_decls; | |
2291 | |
2292 /* Output something to declare an external symbol to the assembler, | |
2293 and qualifiers such as weakness. (Most assemblers don't need | |
2294 extern declaration, so we normally output nothing.) Do nothing if | |
2295 DECL is not external. */ | |
2296 | |
2297 void | |
2298 assemble_external (tree decl ATTRIBUTE_UNUSED) | |
2299 { | |
2300 /* Because most platforms do not define ASM_OUTPUT_EXTERNAL, the | |
2301 main body of this code is only rarely exercised. To provide some | |
2302 testing, on all platforms, we make sure that the ASM_OUT_FILE is | |
2303 open. If it's not, we should not be calling this function. */ | |
2304 gcc_assert (asm_out_file); | |
2305 | |
2306 if (!DECL_P (decl) || !DECL_EXTERNAL (decl) || !TREE_PUBLIC (decl)) | |
2307 return; | |
2308 | |
2309 /* We want to output annotation for weak and external symbols at | |
2310 very last to check if they are references or not. */ | |
2311 | |
2312 if (SUPPORTS_WEAK && DECL_WEAK (decl) | |
2313 /* TREE_STATIC is a weird and abused creature which is not | |
2314 generally the right test for whether an entity has been | |
2315 locally emitted, inlined or otherwise not-really-extern, but | |
2316 for declarations that can be weak, it happens to be | |
2317 match. */ | |
2318 && !TREE_STATIC (decl)) | |
2319 weak_decls = tree_cons (NULL, decl, weak_decls); | |
2320 | |
2321 #ifdef ASM_OUTPUT_EXTERNAL | |
2322 pending_assemble_externals = tree_cons (0, decl, | |
2323 pending_assemble_externals); | |
2324 #endif | |
2325 } | |
2326 | |
2327 /* Similar, for calling a library function FUN. */ | |
2328 | |
2329 void | |
2330 assemble_external_libcall (rtx fun) | |
2331 { | |
2332 /* Declare library function name external when first used, if nec. */ | |
2333 if (! SYMBOL_REF_USED (fun)) | |
2334 { | |
2335 SYMBOL_REF_USED (fun) = 1; | |
2336 targetm.asm_out.external_libcall (fun); | |
2337 } | |
2338 } | |
2339 | |
2340 /* Assemble a label named NAME. */ | |
2341 | |
2342 void | |
2343 assemble_label (const char *name) | |
2344 { | |
2345 ASM_OUTPUT_LABEL (asm_out_file, name); | |
2346 } | |
2347 | |
2348 /* Set the symbol_referenced flag for ID. */ | |
2349 void | |
2350 mark_referenced (tree id) | |
2351 { | |
2352 TREE_SYMBOL_REFERENCED (id) = 1; | |
2353 } | |
2354 | |
2355 /* Set the symbol_referenced flag for DECL and notify callgraph. */ | |
2356 void | |
2357 mark_decl_referenced (tree decl) | |
2358 { | |
2359 if (TREE_CODE (decl) == FUNCTION_DECL) | |
2360 { | |
2361 /* Extern inline functions don't become needed when referenced. | |
2362 If we know a method will be emitted in other TU and no new | |
2363 functions can be marked reachable, just use the external | |
2364 definition. */ | |
2365 struct cgraph_node *node = cgraph_node (decl); | |
2366 if (!DECL_EXTERNAL (decl) | |
2367 && (!node->local.vtable_method || !cgraph_global_info_ready | |
2368 || !node->local.finalized)) | |
2369 cgraph_mark_needed_node (node); | |
2370 } | |
2371 else if (TREE_CODE (decl) == VAR_DECL) | |
2372 { | |
2373 struct varpool_node *node = varpool_node (decl); | |
2374 varpool_mark_needed_node (node); | |
2375 /* C++ frontend use mark_decl_references to force COMDAT variables | |
2376 to be output that might appear dead otherwise. */ | |
2377 node->force_output = true; | |
2378 } | |
2379 /* else do nothing - we can get various sorts of CST nodes here, | |
2380 which do not need to be marked. */ | |
2381 } | |
2382 | |
2383 | |
2384 /* Follow the IDENTIFIER_TRANSPARENT_ALIAS chain starting at *ALIAS | |
2385 until we find an identifier that is not itself a transparent alias. | |
2386 Modify the alias passed to it by reference (and all aliases on the | |
2387 way to the ultimate target), such that they do not have to be | |
2388 followed again, and return the ultimate target of the alias | |
2389 chain. */ | |
2390 | |
2391 static inline tree | |
2392 ultimate_transparent_alias_target (tree *alias) | |
2393 { | |
2394 tree target = *alias; | |
2395 | |
2396 if (IDENTIFIER_TRANSPARENT_ALIAS (target)) | |
2397 { | |
2398 gcc_assert (TREE_CHAIN (target)); | |
2399 target = ultimate_transparent_alias_target (&TREE_CHAIN (target)); | |
2400 gcc_assert (! IDENTIFIER_TRANSPARENT_ALIAS (target) | |
2401 && ! TREE_CHAIN (target)); | |
2402 *alias = target; | |
2403 } | |
2404 | |
2405 return target; | |
2406 } | |
2407 | |
2408 /* Output to FILE (an assembly file) a reference to NAME. If NAME | |
2409 starts with a *, the rest of NAME is output verbatim. Otherwise | |
2410 NAME is transformed in a target-specific way (usually by the | |
2411 addition of an underscore). */ | |
2412 | |
2413 void | |
2414 assemble_name_raw (FILE *file, const char *name) | |
2415 { | |
2416 if (name[0] == '*') | |
2417 fputs (&name[1], file); | |
2418 else | |
2419 ASM_OUTPUT_LABELREF (file, name); | |
2420 } | |
2421 | |
2422 /* Like assemble_name_raw, but should be used when NAME might refer to | |
2423 an entity that is also represented as a tree (like a function or | |
2424 variable). If NAME does refer to such an entity, that entity will | |
2425 be marked as referenced. */ | |
2426 | |
2427 void | |
2428 assemble_name (FILE *file, const char *name) | |
2429 { | |
2430 const char *real_name; | |
2431 tree id; | |
2432 | |
2433 real_name = targetm.strip_name_encoding (name); | |
2434 | |
2435 id = maybe_get_identifier (real_name); | |
2436 if (id) | |
2437 { | |
2438 tree id_orig = id; | |
2439 | |
2440 mark_referenced (id); | |
2441 ultimate_transparent_alias_target (&id); | |
2442 if (id != id_orig) | |
2443 name = IDENTIFIER_POINTER (id); | |
2444 gcc_assert (! TREE_CHAIN (id)); | |
2445 } | |
2446 | |
2447 assemble_name_raw (file, name); | |
2448 } | |
2449 | |
2450 /* Allocate SIZE bytes writable static space with a gensym name | |
2451 and return an RTX to refer to its address. */ | |
2452 | |
2453 rtx | |
2454 assemble_static_space (unsigned HOST_WIDE_INT size) | |
2455 { | |
2456 char name[12]; | |
2457 const char *namestring; | |
2458 rtx x; | |
2459 | |
2460 ASM_GENERATE_INTERNAL_LABEL (name, "LF", const_labelno); | |
2461 ++const_labelno; | |
2462 namestring = ggc_strdup (name); | |
2463 | |
2464 x = gen_rtx_SYMBOL_REF (Pmode, namestring); | |
2465 SYMBOL_REF_FLAGS (x) = SYMBOL_FLAG_LOCAL; | |
2466 | |
2467 #ifdef ASM_OUTPUT_ALIGNED_DECL_LOCAL | |
2468 ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, NULL_TREE, name, size, | |
2469 BIGGEST_ALIGNMENT); | |
2470 #else | |
2471 #ifdef ASM_OUTPUT_ALIGNED_LOCAL | |
2472 ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, BIGGEST_ALIGNMENT); | |
2473 #else | |
2474 { | |
2475 /* Round size up to multiple of BIGGEST_ALIGNMENT bits | |
2476 so that each uninitialized object starts on such a boundary. */ | |
2477 /* Variable `rounded' might or might not be used in ASM_OUTPUT_LOCAL. */ | |
2478 unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED | |
2479 = ((size + (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1) | |
2480 / (BIGGEST_ALIGNMENT / BITS_PER_UNIT) | |
2481 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); | |
2482 ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded); | |
2483 } | |
2484 #endif | |
2485 #endif | |
2486 return x; | |
2487 } | |
2488 | |
2489 /* Assemble the static constant template for function entry trampolines. | |
2490 This is done at most once per compilation. | |
2491 Returns an RTX for the address of the template. */ | |
2492 | |
2493 static GTY(()) rtx initial_trampoline; | |
2494 | |
2495 #ifdef TRAMPOLINE_TEMPLATE | |
2496 rtx | |
2497 assemble_trampoline_template (void) | |
2498 { | |
2499 char label[256]; | |
2500 const char *name; | |
2501 int align; | |
2502 rtx symbol; | |
2503 | |
2504 if (initial_trampoline) | |
2505 return initial_trampoline; | |
2506 | |
2507 /* By default, put trampoline templates in read-only data section. */ | |
2508 | |
2509 #ifdef TRAMPOLINE_SECTION | |
2510 switch_to_section (TRAMPOLINE_SECTION); | |
2511 #else | |
2512 switch_to_section (readonly_data_section); | |
2513 #endif | |
2514 | |
2515 /* Write the assembler code to define one. */ | |
2516 align = floor_log2 (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT); | |
2517 if (align > 0) | |
2518 { | |
2519 ASM_OUTPUT_ALIGN (asm_out_file, align); | |
2520 } | |
2521 | |
2522 targetm.asm_out.internal_label (asm_out_file, "LTRAMP", 0); | |
2523 TRAMPOLINE_TEMPLATE (asm_out_file); | |
2524 | |
2525 /* Record the rtl to refer to it. */ | |
2526 ASM_GENERATE_INTERNAL_LABEL (label, "LTRAMP", 0); | |
2527 name = ggc_strdup (label); | |
2528 symbol = gen_rtx_SYMBOL_REF (Pmode, name); | |
2529 SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL; | |
2530 | |
2531 initial_trampoline = gen_rtx_MEM (BLKmode, symbol); | |
2532 set_mem_align (initial_trampoline, TRAMPOLINE_ALIGNMENT); | |
2533 | |
2534 return initial_trampoline; | |
2535 } | |
2536 #endif | |
2537 | |
2538 /* A and B are either alignments or offsets. Return the minimum alignment | |
2539 that may be assumed after adding the two together. */ | |
2540 | |
2541 static inline unsigned | |
2542 min_align (unsigned int a, unsigned int b) | |
2543 { | |
2544 return (a | b) & -(a | b); | |
2545 } | |
2546 | |
2547 /* Return the assembler directive for creating a given kind of integer | |
2548 object. SIZE is the number of bytes in the object and ALIGNED_P | |
2549 indicates whether it is known to be aligned. Return NULL if the | |
2550 assembly dialect has no such directive. | |
2551 | |
2552 The returned string should be printed at the start of a new line and | |
2553 be followed immediately by the object's initial value. */ | |
2554 | |
2555 const char * | |
2556 integer_asm_op (int size, int aligned_p) | |
2557 { | |
2558 struct asm_int_op *ops; | |
2559 | |
2560 if (aligned_p) | |
2561 ops = &targetm.asm_out.aligned_op; | |
2562 else | |
2563 ops = &targetm.asm_out.unaligned_op; | |
2564 | |
2565 switch (size) | |
2566 { | |
2567 case 1: | |
2568 return targetm.asm_out.byte_op; | |
2569 case 2: | |
2570 return ops->hi; | |
2571 case 4: | |
2572 return ops->si; | |
2573 case 8: | |
2574 return ops->di; | |
2575 case 16: | |
2576 return ops->ti; | |
2577 default: | |
2578 return NULL; | |
2579 } | |
2580 } | |
2581 | |
2582 /* Use directive OP to assemble an integer object X. Print OP at the | |
2583 start of the line, followed immediately by the value of X. */ | |
2584 | |
2585 void | |
2586 assemble_integer_with_op (const char *op, rtx x) | |
2587 { | |
2588 fputs (op, asm_out_file); | |
2589 output_addr_const (asm_out_file, x); | |
2590 fputc ('\n', asm_out_file); | |
2591 } | |
2592 | |
2593 /* The default implementation of the asm_out.integer target hook. */ | |
2594 | |
2595 bool | |
2596 default_assemble_integer (rtx x ATTRIBUTE_UNUSED, | |
2597 unsigned int size ATTRIBUTE_UNUSED, | |
2598 int aligned_p ATTRIBUTE_UNUSED) | |
2599 { | |
2600 const char *op = integer_asm_op (size, aligned_p); | |
2601 /* Avoid GAS bugs for large values. Specifically negative values whose | |
2602 absolute value fits in a bfd_vma, but not in a bfd_signed_vma. */ | |
2603 if (size > UNITS_PER_WORD && size > POINTER_SIZE / BITS_PER_UNIT) | |
2604 return false; | |
2605 return op && (assemble_integer_with_op (op, x), true); | |
2606 } | |
2607 | |
2608 /* Assemble the integer constant X into an object of SIZE bytes. ALIGN is | |
2609 the alignment of the integer in bits. Return 1 if we were able to output | |
2610 the constant, otherwise 0. We must be able to output the constant, | |
2611 if FORCE is nonzero. */ | |
2612 | |
2613 bool | |
2614 assemble_integer (rtx x, unsigned int size, unsigned int align, int force) | |
2615 { | |
2616 int aligned_p; | |
2617 | |
2618 aligned_p = (align >= MIN (size * BITS_PER_UNIT, BIGGEST_ALIGNMENT)); | |
2619 | |
2620 /* See if the target hook can handle this kind of object. */ | |
2621 if (targetm.asm_out.integer (x, size, aligned_p)) | |
2622 return true; | |
2623 | |
2624 /* If the object is a multi-byte one, try splitting it up. Split | |
2625 it into words it if is multi-word, otherwise split it into bytes. */ | |
2626 if (size > 1) | |
2627 { | |
2628 enum machine_mode omode, imode; | |
2629 unsigned int subalign; | |
2630 unsigned int subsize, i; | |
2631 unsigned char mclass; | |
2632 | |
2633 subsize = size > UNITS_PER_WORD? UNITS_PER_WORD : 1; | |
2634 subalign = MIN (align, subsize * BITS_PER_UNIT); | |
2635 if (GET_CODE (x) == CONST_FIXED) | |
2636 mclass = GET_MODE_CLASS (GET_MODE (x)); | |
2637 else | |
2638 mclass = MODE_INT; | |
2639 | |
2640 omode = mode_for_size (subsize * BITS_PER_UNIT, mclass, 0); | |
2641 imode = mode_for_size (size * BITS_PER_UNIT, mclass, 0); | |
2642 | |
2643 for (i = 0; i < size; i += subsize) | |
2644 { | |
2645 rtx partial = simplify_subreg (omode, x, imode, i); | |
2646 if (!partial || !assemble_integer (partial, subsize, subalign, 0)) | |
2647 break; | |
2648 } | |
2649 if (i == size) | |
2650 return true; | |
2651 | |
2652 /* If we've printed some of it, but not all of it, there's no going | |
2653 back now. */ | |
2654 gcc_assert (!i); | |
2655 } | |
2656 | |
2657 gcc_assert (!force); | |
2658 | |
2659 return false; | |
2660 } | |
2661 | |
2662 void | |
2663 assemble_real (REAL_VALUE_TYPE d, enum machine_mode mode, unsigned int align) | |
2664 { | |
2665 long data[4] = {0, 0, 0, 0}; | |
2666 int i; | |
2667 int bitsize, nelts, nunits, units_per; | |
2668 | |
2669 /* This is hairy. We have a quantity of known size. real_to_target | |
2670 will put it into an array of *host* longs, 32 bits per element | |
2671 (even if long is more than 32 bits). We need to determine the | |
2672 number of array elements that are occupied (nelts) and the number | |
2673 of *target* min-addressable units that will be occupied in the | |
2674 object file (nunits). We cannot assume that 32 divides the | |
2675 mode's bitsize (size * BITS_PER_UNIT) evenly. | |
2676 | |
2677 size * BITS_PER_UNIT is used here to make sure that padding bits | |
2678 (which might appear at either end of the value; real_to_target | |
2679 will include the padding bits in its output array) are included. */ | |
2680 | |
2681 nunits = GET_MODE_SIZE (mode); | |
2682 bitsize = nunits * BITS_PER_UNIT; | |
2683 nelts = CEIL (bitsize, 32); | |
2684 units_per = 32 / BITS_PER_UNIT; | |
2685 | |
2686 real_to_target (data, &d, mode); | |
2687 | |
2688 /* Put out the first word with the specified alignment. */ | |
2689 assemble_integer (GEN_INT (data[0]), MIN (nunits, units_per), align, 1); | |
2690 nunits -= units_per; | |
2691 | |
2692 /* Subsequent words need only 32-bit alignment. */ | |
2693 align = min_align (align, 32); | |
2694 | |
2695 for (i = 1; i < nelts; i++) | |
2696 { | |
2697 assemble_integer (GEN_INT (data[i]), MIN (nunits, units_per), align, 1); | |
2698 nunits -= units_per; | |
2699 } | |
2700 } | |
2701 | |
2702 /* Given an expression EXP with a constant value, | |
2703 reduce it to the sum of an assembler symbol and an integer. | |
2704 Store them both in the structure *VALUE. | |
2705 EXP must be reducible. */ | |
2706 | |
2707 struct addr_const GTY(()) | |
2708 { | |
2709 rtx base; | |
2710 HOST_WIDE_INT offset; | |
2711 }; | |
2712 | |
2713 static void | |
2714 decode_addr_const (tree exp, struct addr_const *value) | |
2715 { | |
2716 tree target = TREE_OPERAND (exp, 0); | |
2717 int offset = 0; | |
2718 rtx x; | |
2719 | |
2720 while (1) | |
2721 { | |
2722 if (TREE_CODE (target) == COMPONENT_REF | |
2723 && host_integerp (byte_position (TREE_OPERAND (target, 1)), 0)) | |
2724 | |
2725 { | |
2726 offset += int_byte_position (TREE_OPERAND (target, 1)); | |
2727 target = TREE_OPERAND (target, 0); | |
2728 } | |
2729 else if (TREE_CODE (target) == ARRAY_REF | |
2730 || TREE_CODE (target) == ARRAY_RANGE_REF) | |
2731 { | |
2732 offset += (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (target)), 1) | |
2733 * tree_low_cst (TREE_OPERAND (target, 1), 0)); | |
2734 target = TREE_OPERAND (target, 0); | |
2735 } | |
2736 else | |
2737 break; | |
2738 } | |
2739 | |
2740 switch (TREE_CODE (target)) | |
2741 { | |
2742 case VAR_DECL: | |
2743 case FUNCTION_DECL: | |
2744 x = DECL_RTL (target); | |
2745 break; | |
2746 | |
2747 case LABEL_DECL: | |
2748 x = gen_rtx_MEM (FUNCTION_MODE, | |
2749 gen_rtx_LABEL_REF (Pmode, force_label_rtx (target))); | |
2750 break; | |
2751 | |
2752 case REAL_CST: | |
2753 case FIXED_CST: | |
2754 case STRING_CST: | |
2755 case COMPLEX_CST: | |
2756 case CONSTRUCTOR: | |
2757 case INTEGER_CST: | |
2758 x = output_constant_def (target, 1); | |
2759 break; | |
2760 | |
2761 default: | |
2762 gcc_unreachable (); | |
2763 } | |
2764 | |
2765 gcc_assert (MEM_P (x)); | |
2766 x = XEXP (x, 0); | |
2767 | |
2768 value->base = x; | |
2769 value->offset = offset; | |
2770 } | |
2771 | |
2772 /* Uniquize all constants that appear in memory. | |
2773 Each constant in memory thus far output is recorded | |
2774 in `const_desc_table'. */ | |
2775 | |
2776 struct constant_descriptor_tree GTY(()) | |
2777 { | |
2778 /* A MEM for the constant. */ | |
2779 rtx rtl; | |
2780 | |
2781 /* The value of the constant. */ | |
2782 tree value; | |
2783 | |
2784 /* Hash of value. Computing the hash from value each time | |
2785 hashfn is called can't work properly, as that means recursive | |
2786 use of the hash table during hash table expansion. */ | |
2787 hashval_t hash; | |
2788 }; | |
2789 | |
2790 static GTY((param_is (struct constant_descriptor_tree))) | |
2791 htab_t const_desc_htab; | |
2792 | |
2793 static struct constant_descriptor_tree * build_constant_desc (tree); | |
2794 static void maybe_output_constant_def_contents (struct constant_descriptor_tree *, int); | |
2795 | |
2796 /* Compute a hash code for a constant expression. */ | |
2797 | |
2798 static hashval_t | |
2799 const_desc_hash (const void *ptr) | |
2800 { | |
2801 return ((const struct constant_descriptor_tree *)ptr)->hash; | |
2802 } | |
2803 | |
2804 static hashval_t | |
2805 const_hash_1 (const tree exp) | |
2806 { | |
2807 const char *p; | |
2808 hashval_t hi; | |
2809 int len, i; | |
2810 enum tree_code code = TREE_CODE (exp); | |
2811 | |
2812 /* Either set P and LEN to the address and len of something to hash and | |
2813 exit the switch or return a value. */ | |
2814 | |
2815 switch (code) | |
2816 { | |
2817 case INTEGER_CST: | |
2818 p = (char *) &TREE_INT_CST (exp); | |
2819 len = sizeof TREE_INT_CST (exp); | |
2820 break; | |
2821 | |
2822 case REAL_CST: | |
2823 return real_hash (TREE_REAL_CST_PTR (exp)); | |
2824 | |
2825 case FIXED_CST: | |
2826 return fixed_hash (TREE_FIXED_CST_PTR (exp)); | |
2827 | |
2828 case STRING_CST: | |
2829 p = TREE_STRING_POINTER (exp); | |
2830 len = TREE_STRING_LENGTH (exp); | |
2831 break; | |
2832 | |
2833 case COMPLEX_CST: | |
2834 return (const_hash_1 (TREE_REALPART (exp)) * 5 | |
2835 + const_hash_1 (TREE_IMAGPART (exp))); | |
2836 | |
2837 case CONSTRUCTOR: | |
2838 { | |
2839 unsigned HOST_WIDE_INT idx; | |
2840 tree value; | |
2841 | |
2842 hi = 5 + int_size_in_bytes (TREE_TYPE (exp)); | |
2843 | |
2844 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value) | |
2845 if (value) | |
2846 hi = hi * 603 + const_hash_1 (value); | |
2847 | |
2848 return hi; | |
2849 } | |
2850 | |
2851 case ADDR_EXPR: | |
2852 case FDESC_EXPR: | |
2853 { | |
2854 struct addr_const value; | |
2855 | |
2856 decode_addr_const (exp, &value); | |
2857 switch (GET_CODE (value.base)) | |
2858 { | |
2859 case SYMBOL_REF: | |
2860 /* Don't hash the address of the SYMBOL_REF; | |
2861 only use the offset and the symbol name. */ | |
2862 hi = value.offset; | |
2863 p = XSTR (value.base, 0); | |
2864 for (i = 0; p[i] != 0; i++) | |
2865 hi = ((hi * 613) + (unsigned) (p[i])); | |
2866 break; | |
2867 | |
2868 case LABEL_REF: | |
2869 hi = value.offset + CODE_LABEL_NUMBER (XEXP (value.base, 0)) * 13; | |
2870 break; | |
2871 | |
2872 default: | |
2873 gcc_unreachable (); | |
2874 } | |
2875 } | |
2876 return hi; | |
2877 | |
2878 case PLUS_EXPR: | |
2879 case POINTER_PLUS_EXPR: | |
2880 case MINUS_EXPR: | |
2881 return (const_hash_1 (TREE_OPERAND (exp, 0)) * 9 | |
2882 + const_hash_1 (TREE_OPERAND (exp, 1))); | |
2883 | |
2884 CASE_CONVERT: | |
2885 return const_hash_1 (TREE_OPERAND (exp, 0)) * 7 + 2; | |
2886 | |
2887 default: | |
2888 /* A language specific constant. Just hash the code. */ | |
2889 return code; | |
2890 } | |
2891 | |
2892 /* Compute hashing function. */ | |
2893 hi = len; | |
2894 for (i = 0; i < len; i++) | |
2895 hi = ((hi * 613) + (unsigned) (p[i])); | |
2896 | |
2897 return hi; | |
2898 } | |
2899 | |
2900 /* Wrapper of compare_constant, for the htab interface. */ | |
2901 static int | |
2902 const_desc_eq (const void *p1, const void *p2) | |
2903 { | |
2904 const struct constant_descriptor_tree *const c1 | |
2905 = (const struct constant_descriptor_tree *) p1; | |
2906 const struct constant_descriptor_tree *const c2 | |
2907 = (const struct constant_descriptor_tree *) p2; | |
2908 if (c1->hash != c2->hash) | |
2909 return 0; | |
2910 return compare_constant (c1->value, c2->value); | |
2911 } | |
2912 | |
2913 /* Compare t1 and t2, and return 1 only if they are known to result in | |
2914 the same bit pattern on output. */ | |
2915 | |
2916 static int | |
2917 compare_constant (const tree t1, const tree t2) | |
2918 { | |
2919 enum tree_code typecode; | |
2920 | |
2921 if (t1 == NULL_TREE) | |
2922 return t2 == NULL_TREE; | |
2923 if (t2 == NULL_TREE) | |
2924 return 0; | |
2925 | |
2926 if (TREE_CODE (t1) != TREE_CODE (t2)) | |
2927 return 0; | |
2928 | |
2929 switch (TREE_CODE (t1)) | |
2930 { | |
2931 case INTEGER_CST: | |
2932 /* Integer constants are the same only if the same width of type. */ | |
2933 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2))) | |
2934 return 0; | |
2935 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))) | |
2936 return 0; | |
2937 return tree_int_cst_equal (t1, t2); | |
2938 | |
2939 case REAL_CST: | |
2940 /* Real constants are the same only if the same width of type. */ | |
2941 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2))) | |
2942 return 0; | |
2943 | |
2944 return REAL_VALUES_IDENTICAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2)); | |
2945 | |
2946 case FIXED_CST: | |
2947 /* Fixed constants are the same only if the same width of type. */ | |
2948 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2))) | |
2949 return 0; | |
2950 | |
2951 return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (t1), TREE_FIXED_CST (t2)); | |
2952 | |
2953 case STRING_CST: | |
2954 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))) | |
2955 return 0; | |
2956 | |
2957 return (TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2) | |
2958 && ! memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2), | |
2959 TREE_STRING_LENGTH (t1))); | |
2960 | |
2961 case COMPLEX_CST: | |
2962 return (compare_constant (TREE_REALPART (t1), TREE_REALPART (t2)) | |
2963 && compare_constant (TREE_IMAGPART (t1), TREE_IMAGPART (t2))); | |
2964 | |
2965 case CONSTRUCTOR: | |
2966 { | |
2967 VEC(constructor_elt, gc) *v1, *v2; | |
2968 unsigned HOST_WIDE_INT idx; | |
2969 | |
2970 typecode = TREE_CODE (TREE_TYPE (t1)); | |
2971 if (typecode != TREE_CODE (TREE_TYPE (t2))) | |
2972 return 0; | |
2973 | |
2974 if (typecode == ARRAY_TYPE) | |
2975 { | |
2976 HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1)); | |
2977 /* For arrays, check that the sizes all match. */ | |
2978 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)) | |
2979 || size_1 == -1 | |
2980 || size_1 != int_size_in_bytes (TREE_TYPE (t2))) | |
2981 return 0; | |
2982 } | |
2983 else | |
2984 { | |
2985 /* For record and union constructors, require exact type | |
2986 equality. */ | |
2987 if (TREE_TYPE (t1) != TREE_TYPE (t2)) | |
2988 return 0; | |
2989 } | |
2990 | |
2991 v1 = CONSTRUCTOR_ELTS (t1); | |
2992 v2 = CONSTRUCTOR_ELTS (t2); | |
2993 if (VEC_length (constructor_elt, v1) | |
2994 != VEC_length (constructor_elt, v2)) | |
2995 return 0; | |
2996 | |
2997 for (idx = 0; idx < VEC_length (constructor_elt, v1); ++idx) | |
2998 { | |
2999 constructor_elt *c1 = VEC_index (constructor_elt, v1, idx); | |
3000 constructor_elt *c2 = VEC_index (constructor_elt, v2, idx); | |
3001 | |
3002 /* Check that each value is the same... */ | |
3003 if (!compare_constant (c1->value, c2->value)) | |
3004 return 0; | |
3005 /* ... and that they apply to the same fields! */ | |
3006 if (typecode == ARRAY_TYPE) | |
3007 { | |
3008 if (!compare_constant (c1->index, c2->index)) | |
3009 return 0; | |
3010 } | |
3011 else | |
3012 { | |
3013 if (c1->index != c2->index) | |
3014 return 0; | |
3015 } | |
3016 } | |
3017 | |
3018 return 1; | |
3019 } | |
3020 | |
3021 case ADDR_EXPR: | |
3022 case FDESC_EXPR: | |
3023 { | |
3024 struct addr_const value1, value2; | |
3025 | |
3026 decode_addr_const (t1, &value1); | |
3027 decode_addr_const (t2, &value2); | |
3028 return (value1.offset == value2.offset | |
3029 && strcmp (XSTR (value1.base, 0), XSTR (value2.base, 0)) == 0); | |
3030 } | |
3031 | |
3032 case PLUS_EXPR: | |
3033 case POINTER_PLUS_EXPR: | |
3034 case MINUS_EXPR: | |
3035 case RANGE_EXPR: | |
3036 return (compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0)) | |
3037 && compare_constant(TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1))); | |
3038 | |
3039 CASE_CONVERT: | |
3040 case VIEW_CONVERT_EXPR: | |
3041 return compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0)); | |
3042 | |
3043 default: | |
3044 return 0; | |
3045 } | |
3046 | |
3047 gcc_unreachable (); | |
3048 } | |
3049 | |
3050 /* Make a copy of the whole tree structure for a constant. This | |
3051 handles the same types of nodes that compare_constant handles. */ | |
3052 | |
3053 static tree | |
3054 copy_constant (tree exp) | |
3055 { | |
3056 switch (TREE_CODE (exp)) | |
3057 { | |
3058 case ADDR_EXPR: | |
3059 /* For ADDR_EXPR, we do not want to copy the decl whose address | |
3060 is requested. We do want to copy constants though. */ | |
3061 if (CONSTANT_CLASS_P (TREE_OPERAND (exp, 0))) | |
3062 return build1 (TREE_CODE (exp), TREE_TYPE (exp), | |
3063 copy_constant (TREE_OPERAND (exp, 0))); | |
3064 else | |
3065 return copy_node (exp); | |
3066 | |
3067 case INTEGER_CST: | |
3068 case REAL_CST: | |
3069 case FIXED_CST: | |
3070 case STRING_CST: | |
3071 return copy_node (exp); | |
3072 | |
3073 case COMPLEX_CST: | |
3074 return build_complex (TREE_TYPE (exp), | |
3075 copy_constant (TREE_REALPART (exp)), | |
3076 copy_constant (TREE_IMAGPART (exp))); | |
3077 | |
3078 case PLUS_EXPR: | |
3079 case POINTER_PLUS_EXPR: | |
3080 case MINUS_EXPR: | |
3081 return build2 (TREE_CODE (exp), TREE_TYPE (exp), | |
3082 copy_constant (TREE_OPERAND (exp, 0)), | |
3083 copy_constant (TREE_OPERAND (exp, 1))); | |
3084 | |
3085 CASE_CONVERT: | |
3086 case VIEW_CONVERT_EXPR: | |
3087 return build1 (TREE_CODE (exp), TREE_TYPE (exp), | |
3088 copy_constant (TREE_OPERAND (exp, 0))); | |
3089 | |
3090 case CONSTRUCTOR: | |
3091 { | |
3092 tree copy = copy_node (exp); | |
3093 VEC(constructor_elt, gc) *v; | |
3094 unsigned HOST_WIDE_INT idx; | |
3095 tree purpose, value; | |
3096 | |
3097 v = VEC_alloc(constructor_elt, gc, VEC_length(constructor_elt, | |
3098 CONSTRUCTOR_ELTS (exp))); | |
3099 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, purpose, value) | |
3100 { | |
3101 constructor_elt *ce = VEC_quick_push (constructor_elt, v, NULL); | |
3102 ce->index = purpose; | |
3103 ce->value = copy_constant (value); | |
3104 } | |
3105 CONSTRUCTOR_ELTS (copy) = v; | |
3106 return copy; | |
3107 } | |
3108 | |
3109 default: | |
3110 gcc_unreachable (); | |
3111 } | |
3112 } | |
3113 | |
3114 /* Return the alignment of constant EXP in bits. */ | |
3115 | |
3116 static unsigned int | |
3117 get_constant_alignment (tree exp) | |
3118 { | |
3119 unsigned int align; | |
3120 | |
3121 align = TYPE_ALIGN (TREE_TYPE (exp)); | |
3122 #ifdef CONSTANT_ALIGNMENT | |
3123 align = CONSTANT_ALIGNMENT (exp, align); | |
3124 #endif | |
3125 return align; | |
3126 } | |
3127 | |
3128 /* Return the section into which constant EXP should be placed. */ | |
3129 | |
3130 static section * | |
3131 get_constant_section (tree exp) | |
3132 { | |
3133 if (IN_NAMED_SECTION (exp)) | |
3134 return get_named_section (exp, NULL, compute_reloc_for_constant (exp)); | |
3135 else | |
3136 return targetm.asm_out.select_section (exp, | |
3137 compute_reloc_for_constant (exp), | |
3138 get_constant_alignment (exp)); | |
3139 } | |
3140 | |
3141 /* Return the size of constant EXP in bytes. */ | |
3142 | |
3143 static HOST_WIDE_INT | |
3144 get_constant_size (tree exp) | |
3145 { | |
3146 HOST_WIDE_INT size; | |
3147 | |
3148 size = int_size_in_bytes (TREE_TYPE (exp)); | |
3149 if (TREE_CODE (exp) == STRING_CST) | |
3150 size = MAX (TREE_STRING_LENGTH (exp), size); | |
3151 return size; | |
3152 } | |
3153 | |
3154 /* Subroutine of output_constant_def: | |
3155 No constant equal to EXP is known to have been output. | |
3156 Make a constant descriptor to enter EXP in the hash table. | |
3157 Assign the label number and construct RTL to refer to the | |
3158 constant's location in memory. | |
3159 Caller is responsible for updating the hash table. */ | |
3160 | |
3161 static struct constant_descriptor_tree * | |
3162 build_constant_desc (tree exp) | |
3163 { | |
3164 rtx symbol; | |
3165 rtx rtl; | |
3166 char label[256]; | |
3167 int labelno; | |
3168 struct constant_descriptor_tree *desc; | |
3169 | |
3170 desc = GGC_NEW (struct constant_descriptor_tree); | |
3171 desc->value = copy_constant (exp); | |
3172 | |
3173 /* Propagate marked-ness to copied constant. */ | |
3174 if (flag_mudflap && mf_marked_p (exp)) | |
3175 mf_mark (desc->value); | |
3176 | |
3177 /* Create a string containing the label name, in LABEL. */ | |
3178 labelno = const_labelno++; | |
3179 ASM_GENERATE_INTERNAL_LABEL (label, "LC", labelno); | |
3180 | |
3181 /* We have a symbol name; construct the SYMBOL_REF and the MEM. */ | |
3182 if (use_object_blocks_p ()) | |
3183 { | |
3184 section *sect = get_constant_section (exp); | |
3185 symbol = create_block_symbol (ggc_strdup (label), | |
3186 get_block_for_section (sect), -1); | |
3187 } | |
3188 else | |
3189 symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label)); | |
3190 SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LOCAL; | |
3191 SET_SYMBOL_REF_DECL (symbol, desc->value); | |
3192 TREE_CONSTANT_POOL_ADDRESS_P (symbol) = 1; | |
3193 | |
3194 rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp)), symbol); | |
3195 set_mem_attributes (rtl, exp, 1); | |
3196 set_mem_alias_set (rtl, 0); | |
3197 set_mem_alias_set (rtl, const_alias_set); | |
3198 | |
3199 /* Set flags or add text to the name to record information, such as | |
3200 that it is a local symbol. If the name is changed, the macro | |
3201 ASM_OUTPUT_LABELREF will have to know how to strip this | |
3202 information. This call might invalidate our local variable | |
3203 SYMBOL; we can't use it afterward. */ | |
3204 | |
3205 targetm.encode_section_info (exp, rtl, true); | |
3206 | |
3207 desc->rtl = rtl; | |
3208 | |
3209 return desc; | |
3210 } | |
3211 | |
3212 /* Return an rtx representing a reference to constant data in memory | |
3213 for the constant expression EXP. | |
3214 | |
3215 If assembler code for such a constant has already been output, | |
3216 return an rtx to refer to it. | |
3217 Otherwise, output such a constant in memory | |
3218 and generate an rtx for it. | |
3219 | |
3220 If DEFER is nonzero, this constant can be deferred and output only | |
3221 if referenced in the function after all optimizations. | |
3222 | |
3223 `const_desc_table' records which constants already have label strings. */ | |
3224 | |
3225 rtx | |
3226 output_constant_def (tree exp, int defer) | |
3227 { | |
3228 struct constant_descriptor_tree *desc; | |
3229 struct constant_descriptor_tree key; | |
3230 void **loc; | |
3231 | |
3232 /* Look up EXP in the table of constant descriptors. If we didn't find | |
3233 it, create a new one. */ | |
3234 key.value = exp; | |
3235 key.hash = const_hash_1 (exp); | |
3236 loc = htab_find_slot_with_hash (const_desc_htab, &key, key.hash, INSERT); | |
3237 | |
3238 desc = (struct constant_descriptor_tree *) *loc; | |
3239 if (desc == 0) | |
3240 { | |
3241 desc = build_constant_desc (exp); | |
3242 desc->hash = key.hash; | |
3243 *loc = desc; | |
3244 } | |
3245 | |
3246 maybe_output_constant_def_contents (desc, defer); | |
3247 return desc->rtl; | |
3248 } | |
3249 | |
3250 /* Subroutine of output_constant_def: Decide whether or not we need to | |
3251 output the constant DESC now, and if so, do it. */ | |
3252 static void | |
3253 maybe_output_constant_def_contents (struct constant_descriptor_tree *desc, | |
3254 int defer) | |
3255 { | |
3256 rtx symbol = XEXP (desc->rtl, 0); | |
3257 tree exp = desc->value; | |
3258 | |
3259 if (flag_syntax_only) | |
3260 return; | |
3261 | |
3262 if (TREE_ASM_WRITTEN (exp)) | |
3263 /* Already output; don't do it again. */ | |
3264 return; | |
3265 | |
3266 /* We can always defer constants as long as the context allows | |
3267 doing so. */ | |
3268 if (defer) | |
3269 { | |
3270 /* Increment n_deferred_constants if it exists. It needs to be at | |
3271 least as large as the number of constants actually referred to | |
3272 by the function. If it's too small we'll stop looking too early | |
3273 and fail to emit constants; if it's too large we'll only look | |
3274 through the entire function when we could have stopped earlier. */ | |
3275 if (cfun) | |
3276 n_deferred_constants++; | |
3277 return; | |
3278 } | |
3279 | |
3280 output_constant_def_contents (symbol); | |
3281 } | |
3282 | |
3283 /* Subroutine of output_constant_def_contents. Output the definition | |
3284 of constant EXP, which is pointed to by label LABEL. ALIGN is the | |
3285 constant's alignment in bits. */ | |
3286 | |
3287 static void | |
3288 assemble_constant_contents (tree exp, const char *label, unsigned int align) | |
3289 { | |
3290 HOST_WIDE_INT size; | |
3291 | |
3292 size = get_constant_size (exp); | |
3293 | |
3294 /* Do any machine/system dependent processing of the constant. */ | |
3295 #ifdef ASM_DECLARE_CONSTANT_NAME | |
3296 ASM_DECLARE_CONSTANT_NAME (asm_out_file, label, exp, size); | |
3297 #else | |
3298 /* Standard thing is just output label for the constant. */ | |
3299 ASM_OUTPUT_LABEL (asm_out_file, label); | |
3300 #endif /* ASM_DECLARE_CONSTANT_NAME */ | |
3301 | |
3302 /* Output the value of EXP. */ | |
3303 output_constant (exp, size, align); | |
3304 } | |
3305 | |
3306 /* We must output the constant data referred to by SYMBOL; do so. */ | |
3307 | |
3308 static void | |
3309 output_constant_def_contents (rtx symbol) | |
3310 { | |
3311 tree exp = SYMBOL_REF_DECL (symbol); | |
3312 unsigned int align; | |
3313 | |
3314 /* Make sure any other constants whose addresses appear in EXP | |
3315 are assigned label numbers. */ | |
3316 output_addressed_constants (exp); | |
3317 | |
3318 /* We are no longer deferring this constant. */ | |
3319 TREE_ASM_WRITTEN (exp) = 1; | |
3320 | |
3321 /* If the constant is part of an object block, make sure that the | |
3322 decl has been positioned within its block, but do not write out | |
3323 its definition yet. output_object_blocks will do that later. */ | |
3324 if (SYMBOL_REF_HAS_BLOCK_INFO_P (symbol) && SYMBOL_REF_BLOCK (symbol)) | |
3325 place_block_symbol (symbol); | |
3326 else | |
3327 { | |
3328 switch_to_section (get_constant_section (exp)); | |
3329 align = get_constant_alignment (exp); | |
3330 if (align > BITS_PER_UNIT) | |
3331 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT)); | |
3332 assemble_constant_contents (exp, XSTR (symbol, 0), align); | |
3333 } | |
3334 if (flag_mudflap) | |
3335 mudflap_enqueue_constant (exp); | |
3336 } | |
3337 | |
3338 /* Look up EXP in the table of constant descriptors. Return the rtl | |
3339 if it has been emitted, else null. */ | |
3340 | |
3341 rtx | |
3342 lookup_constant_def (tree exp) | |
3343 { | |
3344 struct constant_descriptor_tree *desc; | |
3345 struct constant_descriptor_tree key; | |
3346 | |
3347 key.value = exp; | |
3348 key.hash = const_hash_1 (exp); | |
3349 desc = (struct constant_descriptor_tree *) | |
3350 htab_find_with_hash (const_desc_htab, &key, key.hash); | |
3351 | |
3352 return (desc ? desc->rtl : NULL_RTX); | |
3353 } | |
3354 | |
3355 /* Used in the hash tables to avoid outputting the same constant | |
3356 twice. Unlike 'struct constant_descriptor_tree', RTX constants | |
3357 are output once per function, not once per file. */ | |
3358 /* ??? Only a few targets need per-function constant pools. Most | |
3359 can use one per-file pool. Should add a targetm bit to tell the | |
3360 difference. */ | |
3361 | |
3362 struct rtx_constant_pool GTY(()) | |
3363 { | |
3364 /* Pointers to first and last constant in pool, as ordered by offset. */ | |
3365 struct constant_descriptor_rtx *first; | |
3366 struct constant_descriptor_rtx *last; | |
3367 | |
3368 /* Hash facility for making memory-constants from constant rtl-expressions. | |
3369 It is used on RISC machines where immediate integer arguments and | |
3370 constant addresses are restricted so that such constants must be stored | |
3371 in memory. */ | |
3372 htab_t GTY((param_is (struct constant_descriptor_rtx))) const_rtx_htab; | |
3373 | |
3374 /* Current offset in constant pool (does not include any | |
3375 machine-specific header). */ | |
3376 HOST_WIDE_INT offset; | |
3377 }; | |
3378 | |
3379 struct constant_descriptor_rtx GTY((chain_next ("%h.next"))) | |
3380 { | |
3381 struct constant_descriptor_rtx *next; | |
3382 rtx mem; | |
3383 rtx sym; | |
3384 rtx constant; | |
3385 HOST_WIDE_INT offset; | |
3386 hashval_t hash; | |
3387 enum machine_mode mode; | |
3388 unsigned int align; | |
3389 int labelno; | |
3390 int mark; | |
3391 }; | |
3392 | |
3393 /* Hash and compare functions for const_rtx_htab. */ | |
3394 | |
3395 static hashval_t | |
3396 const_desc_rtx_hash (const void *ptr) | |
3397 { | |
3398 const struct constant_descriptor_rtx *const desc | |
3399 = (const struct constant_descriptor_rtx *) ptr; | |
3400 return desc->hash; | |
3401 } | |
3402 | |
3403 static int | |
3404 const_desc_rtx_eq (const void *a, const void *b) | |
3405 { | |
3406 const struct constant_descriptor_rtx *const x | |
3407 = (const struct constant_descriptor_rtx *) a; | |
3408 const struct constant_descriptor_rtx *const y | |
3409 = (const struct constant_descriptor_rtx *) b; | |
3410 | |
3411 if (x->mode != y->mode) | |
3412 return 0; | |
3413 return rtx_equal_p (x->constant, y->constant); | |
3414 } | |
3415 | |
3416 /* This is the worker function for const_rtx_hash, called via for_each_rtx. */ | |
3417 | |
3418 static int | |
3419 const_rtx_hash_1 (rtx *xp, void *data) | |
3420 { | |
3421 unsigned HOST_WIDE_INT hwi; | |
3422 enum machine_mode mode; | |
3423 enum rtx_code code; | |
3424 hashval_t h, *hp; | |
3425 rtx x; | |
3426 | |
3427 x = *xp; | |
3428 code = GET_CODE (x); | |
3429 mode = GET_MODE (x); | |
3430 h = (hashval_t) code * 1048573 + mode; | |
3431 | |
3432 switch (code) | |
3433 { | |
3434 case CONST_INT: | |
3435 hwi = INTVAL (x); | |
3436 fold_hwi: | |
3437 { | |
3438 const int shift = sizeof (hashval_t) * CHAR_BIT; | |
3439 const int n = sizeof (HOST_WIDE_INT) / sizeof (hashval_t); | |
3440 int i; | |
3441 | |
3442 h ^= (hashval_t) hwi; | |
3443 for (i = 1; i < n; ++i) | |
3444 { | |
3445 hwi >>= shift; | |
3446 h ^= (hashval_t) hwi; | |
3447 } | |
3448 } | |
3449 break; | |
3450 | |
3451 case CONST_DOUBLE: | |
3452 if (mode == VOIDmode) | |
3453 { | |
3454 hwi = CONST_DOUBLE_LOW (x) ^ CONST_DOUBLE_HIGH (x); | |
3455 goto fold_hwi; | |
3456 } | |
3457 else | |
3458 h ^= real_hash (CONST_DOUBLE_REAL_VALUE (x)); | |
3459 break; | |
3460 | |
3461 case CONST_FIXED: | |
3462 h ^= fixed_hash (CONST_FIXED_VALUE (x)); | |
3463 break; | |
3464 | |
3465 case CONST_VECTOR: | |
3466 { | |
3467 int i; | |
3468 for (i = XVECLEN (x, 0); i-- > 0; ) | |
3469 h = h * 251 + const_rtx_hash_1 (&XVECEXP (x, 0, i), data); | |
3470 } | |
3471 break; | |
3472 | |
3473 case SYMBOL_REF: | |
3474 h ^= htab_hash_string (XSTR (x, 0)); | |
3475 break; | |
3476 | |
3477 case LABEL_REF: | |
3478 h = h * 251 + CODE_LABEL_NUMBER (XEXP (x, 0)); | |
3479 break; | |
3480 | |
3481 case UNSPEC: | |
3482 case UNSPEC_VOLATILE: | |
3483 h = h * 251 + XINT (x, 1); | |
3484 break; | |
3485 | |
3486 default: | |
3487 break; | |
3488 } | |
3489 | |
3490 hp = (hashval_t *) data; | |
3491 *hp = *hp * 509 + h; | |
3492 return 0; | |
3493 } | |
3494 | |
3495 /* Compute a hash value for X, which should be a constant. */ | |
3496 | |
3497 static hashval_t | |
3498 const_rtx_hash (rtx x) | |
3499 { | |
3500 hashval_t h = 0; | |
3501 for_each_rtx (&x, const_rtx_hash_1, &h); | |
3502 return h; | |
3503 } | |
3504 | |
3505 | |
3506 /* Create and return a new rtx constant pool. */ | |
3507 | |
3508 static struct rtx_constant_pool * | |
3509 create_constant_pool (void) | |
3510 { | |
3511 struct rtx_constant_pool *pool; | |
3512 | |
3513 pool = GGC_NEW (struct rtx_constant_pool); | |
3514 pool->const_rtx_htab = htab_create_ggc (31, const_desc_rtx_hash, | |
3515 const_desc_rtx_eq, NULL); | |
3516 pool->first = NULL; | |
3517 pool->last = NULL; | |
3518 pool->offset = 0; | |
3519 return pool; | |
3520 } | |
3521 | |
3522 /* Initialize constant pool hashing for a new function. */ | |
3523 | |
3524 void | |
3525 init_varasm_status (void) | |
3526 { | |
3527 crtl->varasm.pool = create_constant_pool (); | |
3528 crtl->varasm.deferred_constants = 0; | |
3529 } | |
3530 | |
3531 /* Given a MINUS expression, simplify it if both sides | |
3532 include the same symbol. */ | |
3533 | |
3534 rtx | |
3535 simplify_subtraction (rtx x) | |
3536 { | |
3537 rtx r = simplify_rtx (x); | |
3538 return r ? r : x; | |
3539 } | |
3540 | |
3541 /* Given a constant rtx X, make (or find) a memory constant for its value | |
3542 and return a MEM rtx to refer to it in memory. */ | |
3543 | |
3544 rtx | |
3545 force_const_mem (enum machine_mode mode, rtx x) | |
3546 { | |
3547 struct constant_descriptor_rtx *desc, tmp; | |
3548 struct rtx_constant_pool *pool; | |
3549 char label[256]; | |
3550 rtx def, symbol; | |
3551 hashval_t hash; | |
3552 unsigned int align; | |
3553 void **slot; | |
3554 | |
3555 /* If we're not allowed to drop X into the constant pool, don't. */ | |
3556 if (targetm.cannot_force_const_mem (x)) | |
3557 return NULL_RTX; | |
3558 | |
3559 /* Record that this function has used a constant pool entry. */ | |
3560 crtl->uses_const_pool = 1; | |
3561 | |
3562 /* Decide which pool to use. */ | |
3563 pool = (targetm.use_blocks_for_constant_p (mode, x) | |
3564 ? shared_constant_pool | |
3565 : crtl->varasm.pool); | |
3566 | |
3567 /* Lookup the value in the hashtable. */ | |
3568 tmp.constant = x; | |
3569 tmp.mode = mode; | |
3570 hash = const_rtx_hash (x); | |
3571 slot = htab_find_slot_with_hash (pool->const_rtx_htab, &tmp, hash, INSERT); | |
3572 desc = (struct constant_descriptor_rtx *) *slot; | |
3573 | |
3574 /* If the constant was already present, return its memory. */ | |
3575 if (desc) | |
3576 return copy_rtx (desc->mem); | |
3577 | |
3578 /* Otherwise, create a new descriptor. */ | |
3579 desc = GGC_NEW (struct constant_descriptor_rtx); | |
3580 *slot = desc; | |
3581 | |
3582 /* Align the location counter as required by EXP's data type. */ | |
3583 align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode); | |
3584 #ifdef CONSTANT_ALIGNMENT | |
3585 { | |
3586 tree type = lang_hooks.types.type_for_mode (mode, 0); | |
3587 if (type != NULL_TREE) | |
3588 align = CONSTANT_ALIGNMENT (make_tree (type, x), align); | |
3589 } | |
3590 #endif | |
3591 | |
3592 pool->offset += (align / BITS_PER_UNIT) - 1; | |
3593 pool->offset &= ~ ((align / BITS_PER_UNIT) - 1); | |
3594 | |
3595 desc->next = NULL; | |
3596 desc->constant = tmp.constant; | |
3597 desc->offset = pool->offset; | |
3598 desc->hash = hash; | |
3599 desc->mode = mode; | |
3600 desc->align = align; | |
3601 desc->labelno = const_labelno; | |
3602 desc->mark = 0; | |
3603 | |
3604 pool->offset += GET_MODE_SIZE (mode); | |
3605 if (pool->last) | |
3606 pool->last->next = desc; | |
3607 else | |
3608 pool->first = pool->last = desc; | |
3609 pool->last = desc; | |
3610 | |
3611 /* Create a string containing the label name, in LABEL. */ | |
3612 ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno); | |
3613 ++const_labelno; | |
3614 | |
3615 /* Construct the SYMBOL_REF. Make sure to mark it as belonging to | |
3616 the constants pool. */ | |
3617 if (use_object_blocks_p () && targetm.use_blocks_for_constant_p (mode, x)) | |
3618 { | |
3619 section *sect = targetm.asm_out.select_rtx_section (mode, x, align); | |
3620 symbol = create_block_symbol (ggc_strdup (label), | |
3621 get_block_for_section (sect), -1); | |
3622 } | |
3623 else | |
3624 symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label)); | |
3625 desc->sym = symbol; | |
3626 SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LOCAL; | |
3627 CONSTANT_POOL_ADDRESS_P (symbol) = 1; | |
3628 SET_SYMBOL_REF_CONSTANT (symbol, desc); | |
3629 | |
3630 /* Construct the MEM. */ | |
3631 desc->mem = def = gen_const_mem (mode, symbol); | |
3632 set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1); | |
3633 set_mem_align (def, align); | |
3634 | |
3635 /* If we're dropping a label to the constant pool, make sure we | |
3636 don't delete it. */ | |
3637 if (GET_CODE (x) == LABEL_REF) | |
3638 LABEL_PRESERVE_P (XEXP (x, 0)) = 1; | |
3639 | |
3640 return copy_rtx (def); | |
3641 } | |
3642 | |
3643 /* Given a constant pool SYMBOL_REF, return the corresponding constant. */ | |
3644 | |
3645 rtx | |
3646 get_pool_constant (rtx addr) | |
3647 { | |
3648 return SYMBOL_REF_CONSTANT (addr)->constant; | |
3649 } | |
3650 | |
3651 /* Given a constant pool SYMBOL_REF, return the corresponding constant | |
3652 and whether it has been output or not. */ | |
3653 | |
3654 rtx | |
3655 get_pool_constant_mark (rtx addr, bool *pmarked) | |
3656 { | |
3657 struct constant_descriptor_rtx *desc; | |
3658 | |
3659 desc = SYMBOL_REF_CONSTANT (addr); | |
3660 *pmarked = (desc->mark != 0); | |
3661 return desc->constant; | |
3662 } | |
3663 | |
3664 /* Similar, return the mode. */ | |
3665 | |
3666 enum machine_mode | |
3667 get_pool_mode (const_rtx addr) | |
3668 { | |
3669 return SYMBOL_REF_CONSTANT (addr)->mode; | |
3670 } | |
3671 | |
3672 /* Return the size of the constant pool. */ | |
3673 | |
3674 int | |
3675 get_pool_size (void) | |
3676 { | |
3677 return crtl->varasm.pool->offset; | |
3678 } | |
3679 | |
3680 /* Worker function for output_constant_pool_1. Emit assembly for X | |
3681 in MODE with known alignment ALIGN. */ | |
3682 | |
3683 static void | |
3684 output_constant_pool_2 (enum machine_mode mode, rtx x, unsigned int align) | |
3685 { | |
3686 switch (GET_MODE_CLASS (mode)) | |
3687 { | |
3688 case MODE_FLOAT: | |
3689 case MODE_DECIMAL_FLOAT: | |
3690 { | |
3691 REAL_VALUE_TYPE r; | |
3692 | |
3693 gcc_assert (GET_CODE (x) == CONST_DOUBLE); | |
3694 REAL_VALUE_FROM_CONST_DOUBLE (r, x); | |
3695 assemble_real (r, mode, align); | |
3696 break; | |
3697 } | |
3698 | |
3699 case MODE_INT: | |
3700 case MODE_PARTIAL_INT: | |
3701 case MODE_FRACT: | |
3702 case MODE_UFRACT: | |
3703 case MODE_ACCUM: | |
3704 case MODE_UACCUM: | |
3705 assemble_integer (x, GET_MODE_SIZE (mode), align, 1); | |
3706 break; | |
3707 | |
3708 case MODE_VECTOR_FLOAT: | |
3709 case MODE_VECTOR_INT: | |
3710 case MODE_VECTOR_FRACT: | |
3711 case MODE_VECTOR_UFRACT: | |
3712 case MODE_VECTOR_ACCUM: | |
3713 case MODE_VECTOR_UACCUM: | |
3714 { | |
3715 int i, units; | |
3716 enum machine_mode submode = GET_MODE_INNER (mode); | |
3717 unsigned int subalign = MIN (align, GET_MODE_BITSIZE (submode)); | |
3718 | |
3719 gcc_assert (GET_CODE (x) == CONST_VECTOR); | |
3720 units = CONST_VECTOR_NUNITS (x); | |
3721 | |
3722 for (i = 0; i < units; i++) | |
3723 { | |
3724 rtx elt = CONST_VECTOR_ELT (x, i); | |
3725 output_constant_pool_2 (submode, elt, i ? subalign : align); | |
3726 } | |
3727 } | |
3728 break; | |
3729 | |
3730 default: | |
3731 gcc_unreachable (); | |
3732 } | |
3733 } | |
3734 | |
3735 /* Worker function for output_constant_pool. Emit constant DESC, | |
3736 giving it ALIGN bits of alignment. */ | |
3737 | |
3738 static void | |
3739 output_constant_pool_1 (struct constant_descriptor_rtx *desc, | |
3740 unsigned int align) | |
3741 { | |
3742 rtx x, tmp; | |
3743 | |
3744 x = desc->constant; | |
3745 | |
3746 /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF) | |
3747 whose CODE_LABEL has been deleted. This can occur if a jump table | |
3748 is eliminated by optimization. If so, write a constant of zero | |
3749 instead. Note that this can also happen by turning the | |
3750 CODE_LABEL into a NOTE. */ | |
3751 /* ??? This seems completely and utterly wrong. Certainly it's | |
3752 not true for NOTE_INSN_DELETED_LABEL, but I disbelieve proper | |
3753 functioning even with INSN_DELETED_P and friends. */ | |
3754 | |
3755 tmp = x; | |
3756 switch (GET_CODE (tmp)) | |
3757 { | |
3758 case CONST: | |
3759 if (GET_CODE (XEXP (tmp, 0)) != PLUS | |
3760 || GET_CODE (XEXP (XEXP (tmp, 0), 0)) != LABEL_REF) | |
3761 break; | |
3762 tmp = XEXP (XEXP (tmp, 0), 0); | |
3763 /* FALLTHRU */ | |
3764 | |
3765 case LABEL_REF: | |
3766 tmp = XEXP (tmp, 0); | |
3767 gcc_assert (!INSN_DELETED_P (tmp)); | |
3768 gcc_assert (!NOTE_P (tmp) | |
3769 || NOTE_KIND (tmp) != NOTE_INSN_DELETED); | |
3770 break; | |
3771 | |
3772 default: | |
3773 break; | |
3774 } | |
3775 | |
3776 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY | |
3777 ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, desc->mode, | |
3778 align, desc->labelno, done); | |
3779 #endif | |
3780 | |
3781 assemble_align (align); | |
3782 | |
3783 /* Output the label. */ | |
3784 targetm.asm_out.internal_label (asm_out_file, "LC", desc->labelno); | |
3785 | |
3786 /* Output the data. */ | |
3787 output_constant_pool_2 (desc->mode, x, align); | |
3788 | |
3789 /* Make sure all constants in SECTION_MERGE and not SECTION_STRINGS | |
3790 sections have proper size. */ | |
3791 if (align > GET_MODE_BITSIZE (desc->mode) | |
3792 && in_section | |
3793 && (in_section->common.flags & SECTION_MERGE)) | |
3794 assemble_align (align); | |
3795 | |
3796 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY | |
3797 done: | |
3798 #endif | |
3799 return; | |
3800 } | |
3801 | |
3802 /* Given a SYMBOL_REF CURRENT_RTX, mark it and all constants it refers | |
3803 to as used. Emit referenced deferred strings. This function can | |
3804 be used with for_each_rtx to mark all SYMBOL_REFs in an rtx. */ | |
3805 | |
3806 static int | |
3807 mark_constant (rtx *current_rtx, void *data ATTRIBUTE_UNUSED) | |
3808 { | |
3809 rtx x = *current_rtx; | |
3810 | |
3811 if (x == NULL_RTX || GET_CODE (x) != SYMBOL_REF) | |
3812 return 0; | |
3813 | |
3814 if (CONSTANT_POOL_ADDRESS_P (x)) | |
3815 { | |
3816 struct constant_descriptor_rtx *desc = SYMBOL_REF_CONSTANT (x); | |
3817 if (desc->mark == 0) | |
3818 { | |
3819 desc->mark = 1; | |
3820 for_each_rtx (&desc->constant, mark_constant, NULL); | |
3821 } | |
3822 } | |
3823 else if (TREE_CONSTANT_POOL_ADDRESS_P (x)) | |
3824 { | |
3825 tree exp = SYMBOL_REF_DECL (x); | |
3826 if (!TREE_ASM_WRITTEN (exp)) | |
3827 { | |
3828 n_deferred_constants--; | |
3829 output_constant_def_contents (x); | |
3830 } | |
3831 } | |
3832 | |
3833 return -1; | |
3834 } | |
3835 | |
3836 /* Look through appropriate parts of INSN, marking all entries in the | |
3837 constant pool which are actually being used. Entries that are only | |
3838 referenced by other constants are also marked as used. Emit | |
3839 deferred strings that are used. */ | |
3840 | |
3841 static void | |
3842 mark_constants (rtx insn) | |
3843 { | |
3844 if (!INSN_P (insn)) | |
3845 return; | |
3846 | |
3847 /* Insns may appear inside a SEQUENCE. Only check the patterns of | |
3848 insns, not any notes that may be attached. We don't want to mark | |
3849 a constant just because it happens to appear in a REG_EQUIV note. */ | |
3850 if (GET_CODE (PATTERN (insn)) == SEQUENCE) | |
3851 { | |
3852 rtx seq = PATTERN (insn); | |
3853 int i, n = XVECLEN (seq, 0); | |
3854 for (i = 0; i < n; ++i) | |
3855 { | |
3856 rtx subinsn = XVECEXP (seq, 0, i); | |
3857 if (INSN_P (subinsn)) | |
3858 for_each_rtx (&PATTERN (subinsn), mark_constant, NULL); | |
3859 } | |
3860 } | |
3861 else | |
3862 for_each_rtx (&PATTERN (insn), mark_constant, NULL); | |
3863 } | |
3864 | |
3865 /* Look through the instructions for this function, and mark all the | |
3866 entries in POOL which are actually being used. Emit deferred constants | |
3867 which have indeed been used. */ | |
3868 | |
3869 static void | |
3870 mark_constant_pool (void) | |
3871 { | |
3872 rtx insn, link; | |
3873 | |
3874 if (!crtl->uses_const_pool && n_deferred_constants == 0) | |
3875 return; | |
3876 | |
3877 for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) | |
3878 mark_constants (insn); | |
3879 | |
3880 for (link = crtl->epilogue_delay_list; | |
3881 link; | |
3882 link = XEXP (link, 1)) | |
3883 mark_constants (XEXP (link, 0)); | |
3884 } | |
3885 | |
3886 /* Write all the constants in POOL. */ | |
3887 | |
3888 static void | |
3889 output_constant_pool_contents (struct rtx_constant_pool *pool) | |
3890 { | |
3891 struct constant_descriptor_rtx *desc; | |
3892 | |
3893 for (desc = pool->first; desc ; desc = desc->next) | |
3894 if (desc->mark) | |
3895 { | |
3896 /* If the constant is part of an object_block, make sure that | |
3897 the constant has been positioned within its block, but do not | |
3898 write out its definition yet. output_object_blocks will do | |
3899 that later. */ | |
3900 if (SYMBOL_REF_HAS_BLOCK_INFO_P (desc->sym) | |
3901 && SYMBOL_REF_BLOCK (desc->sym)) | |
3902 place_block_symbol (desc->sym); | |
3903 else | |
3904 { | |
3905 switch_to_section (targetm.asm_out.select_rtx_section | |
3906 (desc->mode, desc->constant, desc->align)); | |
3907 output_constant_pool_1 (desc, desc->align); | |
3908 } | |
3909 } | |
3910 } | |
3911 | |
3912 /* Mark all constants that are used in the current function, then write | |
3913 out the function's private constant pool. */ | |
3914 | |
3915 static void | |
3916 output_constant_pool (const char *fnname ATTRIBUTE_UNUSED, | |
3917 tree fndecl ATTRIBUTE_UNUSED) | |
3918 { | |
3919 struct rtx_constant_pool *pool = crtl->varasm.pool; | |
3920 | |
3921 /* It is possible for gcc to call force_const_mem and then to later | |
3922 discard the instructions which refer to the constant. In such a | |
3923 case we do not need to output the constant. */ | |
3924 mark_constant_pool (); | |
3925 | |
3926 #ifdef ASM_OUTPUT_POOL_PROLOGUE | |
3927 ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool->offset); | |
3928 #endif | |
3929 | |
3930 output_constant_pool_contents (pool); | |
3931 | |
3932 #ifdef ASM_OUTPUT_POOL_EPILOGUE | |
3933 ASM_OUTPUT_POOL_EPILOGUE (asm_out_file, fnname, fndecl, pool->offset); | |
3934 #endif | |
3935 } | |
3936 | |
3937 /* Write the contents of the shared constant pool. */ | |
3938 | |
3939 void | |
3940 output_shared_constant_pool (void) | |
3941 { | |
3942 output_constant_pool_contents (shared_constant_pool); | |
3943 } | |
3944 | |
3945 /* Determine what kind of relocations EXP may need. */ | |
3946 | |
3947 int | |
3948 compute_reloc_for_constant (tree exp) | |
3949 { | |
3950 int reloc = 0, reloc2; | |
3951 tree tem; | |
3952 | |
3953 switch (TREE_CODE (exp)) | |
3954 { | |
3955 case ADDR_EXPR: | |
3956 case FDESC_EXPR: | |
3957 /* Go inside any operations that get_inner_reference can handle and see | |
3958 if what's inside is a constant: no need to do anything here for | |
3959 addresses of variables or functions. */ | |
3960 for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem); | |
3961 tem = TREE_OPERAND (tem, 0)) | |
3962 ; | |
3963 | |
3964 if (TREE_PUBLIC (tem)) | |
3965 reloc |= 2; | |
3966 else | |
3967 reloc |= 1; | |
3968 break; | |
3969 | |
3970 case PLUS_EXPR: | |
3971 case POINTER_PLUS_EXPR: | |
3972 reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0)); | |
3973 reloc |= compute_reloc_for_constant (TREE_OPERAND (exp, 1)); | |
3974 break; | |
3975 | |
3976 case MINUS_EXPR: | |
3977 reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0)); | |
3978 reloc2 = compute_reloc_for_constant (TREE_OPERAND (exp, 1)); | |
3979 /* The difference of two local labels is computable at link time. */ | |
3980 if (reloc == 1 && reloc2 == 1) | |
3981 reloc = 0; | |
3982 else | |
3983 reloc |= reloc2; | |
3984 break; | |
3985 | |
3986 CASE_CONVERT: | |
3987 case VIEW_CONVERT_EXPR: | |
3988 reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0)); | |
3989 break; | |
3990 | |
3991 case CONSTRUCTOR: | |
3992 { | |
3993 unsigned HOST_WIDE_INT idx; | |
3994 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, tem) | |
3995 if (tem != 0) | |
3996 reloc |= compute_reloc_for_constant (tem); | |
3997 } | |
3998 break; | |
3999 | |
4000 default: | |
4001 break; | |
4002 } | |
4003 return reloc; | |
4004 } | |
4005 | |
4006 /* Find all the constants whose addresses are referenced inside of EXP, | |
4007 and make sure assembler code with a label has been output for each one. | |
4008 Indicate whether an ADDR_EXPR has been encountered. */ | |
4009 | |
4010 static void | |
4011 output_addressed_constants (tree exp) | |
4012 { | |
4013 tree tem; | |
4014 | |
4015 switch (TREE_CODE (exp)) | |
4016 { | |
4017 case ADDR_EXPR: | |
4018 case FDESC_EXPR: | |
4019 /* Go inside any operations that get_inner_reference can handle and see | |
4020 if what's inside is a constant: no need to do anything here for | |
4021 addresses of variables or functions. */ | |
4022 for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem); | |
4023 tem = TREE_OPERAND (tem, 0)) | |
4024 ; | |
4025 | |
4026 /* If we have an initialized CONST_DECL, retrieve the initializer. */ | |
4027 if (TREE_CODE (tem) == CONST_DECL && DECL_INITIAL (tem)) | |
4028 tem = DECL_INITIAL (tem); | |
4029 | |
4030 if (CONSTANT_CLASS_P (tem) || TREE_CODE (tem) == CONSTRUCTOR) | |
4031 output_constant_def (tem, 0); | |
4032 break; | |
4033 | |
4034 case PLUS_EXPR: | |
4035 case POINTER_PLUS_EXPR: | |
4036 case MINUS_EXPR: | |
4037 output_addressed_constants (TREE_OPERAND (exp, 1)); | |
4038 /* Fall through. */ | |
4039 | |
4040 CASE_CONVERT: | |
4041 case VIEW_CONVERT_EXPR: | |
4042 output_addressed_constants (TREE_OPERAND (exp, 0)); | |
4043 break; | |
4044 | |
4045 case CONSTRUCTOR: | |
4046 { | |
4047 unsigned HOST_WIDE_INT idx; | |
4048 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, tem) | |
4049 if (tem != 0) | |
4050 output_addressed_constants (tem); | |
4051 } | |
4052 break; | |
4053 | |
4054 default: | |
4055 break; | |
4056 } | |
4057 } | |
4058 | |
4059 /* Whether a constructor CTOR is a valid static constant initializer if all | |
4060 its elements are. This used to be internal to initializer_constant_valid_p | |
4061 and has been exposed to let other functions like categorize_ctor_elements | |
4062 evaluate the property while walking a constructor for other purposes. */ | |
4063 | |
4064 bool | |
4065 constructor_static_from_elts_p (const_tree ctor) | |
4066 { | |
4067 return (TREE_CONSTANT (ctor) | |
4068 && (TREE_CODE (TREE_TYPE (ctor)) == UNION_TYPE | |
4069 || TREE_CODE (TREE_TYPE (ctor)) == RECORD_TYPE) | |
4070 && !VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (ctor))); | |
4071 } | |
4072 | |
4073 /* A subroutine of initializer_constant_valid_p. VALUE is a MINUS_EXPR, | |
4074 PLUS_EXPR or POINTER_PLUS_EXPR. This looks for cases of VALUE | |
4075 which are valid when ENDTYPE is an integer of any size; in | |
4076 particular, this does not accept a pointer minus a constant. This | |
4077 returns null_pointer_node if the VALUE is an absolute constant | |
4078 which can be used to initialize a static variable. Otherwise it | |
4079 returns NULL. */ | |
4080 | |
4081 static tree | |
4082 narrowing_initializer_constant_valid_p (tree value, tree endtype) | |
4083 { | |
4084 tree op0, op1; | |
4085 | |
4086 if (!INTEGRAL_TYPE_P (endtype)) | |
4087 return NULL_TREE; | |
4088 | |
4089 op0 = TREE_OPERAND (value, 0); | |
4090 op1 = TREE_OPERAND (value, 1); | |
4091 | |
4092 /* Like STRIP_NOPS except allow the operand mode to widen. This | |
4093 works around a feature of fold that simplifies (int)(p1 - p2) to | |
4094 ((int)p1 - (int)p2) under the theory that the narrower operation | |
4095 is cheaper. */ | |
4096 | |
4097 while (CONVERT_EXPR_P (op0) | |
4098 || TREE_CODE (op0) == NON_LVALUE_EXPR) | |
4099 { | |
4100 tree inner = TREE_OPERAND (op0, 0); | |
4101 if (inner == error_mark_node | |
4102 || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner))) | |
4103 || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0))) | |
4104 > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner))))) | |
4105 break; | |
4106 op0 = inner; | |
4107 } | |
4108 | |
4109 while (CONVERT_EXPR_P (op1) | |
4110 || TREE_CODE (op1) == NON_LVALUE_EXPR) | |
4111 { | |
4112 tree inner = TREE_OPERAND (op1, 0); | |
4113 if (inner == error_mark_node | |
4114 || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner))) | |
4115 || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1))) | |
4116 > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner))))) | |
4117 break; | |
4118 op1 = inner; | |
4119 } | |
4120 | |
4121 op0 = initializer_constant_valid_p (op0, endtype); | |
4122 op1 = initializer_constant_valid_p (op1, endtype); | |
4123 | |
4124 /* Both initializers must be known. */ | |
4125 if (op0 && op1) | |
4126 { | |
4127 if (op0 == op1 | |
4128 && (op0 == null_pointer_node | |
4129 || TREE_CODE (value) == MINUS_EXPR)) | |
4130 return null_pointer_node; | |
4131 | |
4132 /* Support differences between labels. */ | |
4133 if (TREE_CODE (op0) == LABEL_DECL | |
4134 && TREE_CODE (op1) == LABEL_DECL) | |
4135 return null_pointer_node; | |
4136 | |
4137 if (TREE_CODE (op0) == STRING_CST | |
4138 && TREE_CODE (op1) == STRING_CST | |
4139 && operand_equal_p (op0, op1, 1)) | |
4140 return null_pointer_node; | |
4141 } | |
4142 | |
4143 return NULL_TREE; | |
4144 } | |
4145 | |
4146 /* Return nonzero if VALUE is a valid constant-valued expression | |
4147 for use in initializing a static variable; one that can be an | |
4148 element of a "constant" initializer. | |
4149 | |
4150 Return null_pointer_node if the value is absolute; | |
4151 if it is relocatable, return the variable that determines the relocation. | |
4152 We assume that VALUE has been folded as much as possible; | |
4153 therefore, we do not need to check for such things as | |
4154 arithmetic-combinations of integers. */ | |
4155 | |
4156 tree | |
4157 initializer_constant_valid_p (tree value, tree endtype) | |
4158 { | |
4159 tree ret; | |
4160 | |
4161 switch (TREE_CODE (value)) | |
4162 { | |
4163 case CONSTRUCTOR: | |
4164 if (constructor_static_from_elts_p (value)) | |
4165 { | |
4166 unsigned HOST_WIDE_INT idx; | |
4167 tree elt; | |
4168 bool absolute = true; | |
4169 | |
4170 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (value), idx, elt) | |
4171 { | |
4172 tree reloc; | |
4173 reloc = initializer_constant_valid_p (elt, TREE_TYPE (elt)); | |
4174 if (!reloc) | |
4175 return NULL_TREE; | |
4176 if (reloc != null_pointer_node) | |
4177 absolute = false; | |
4178 } | |
4179 /* For a non-absolute relocation, there is no single | |
4180 variable that can be "the variable that determines the | |
4181 relocation." */ | |
4182 return absolute ? null_pointer_node : error_mark_node; | |
4183 } | |
4184 | |
4185 return TREE_STATIC (value) ? null_pointer_node : NULL_TREE; | |
4186 | |
4187 case INTEGER_CST: | |
4188 case VECTOR_CST: | |
4189 case REAL_CST: | |
4190 case FIXED_CST: | |
4191 case STRING_CST: | |
4192 case COMPLEX_CST: | |
4193 return null_pointer_node; | |
4194 | |
4195 case ADDR_EXPR: | |
4196 case FDESC_EXPR: | |
4197 { | |
4198 tree op0 = staticp (TREE_OPERAND (value, 0)); | |
4199 if (op0) | |
4200 { | |
4201 /* "&(*a).f" is like unto pointer arithmetic. If "a" turns out | |
4202 to be a constant, this is old-skool offsetof-like nonsense. */ | |
4203 if (TREE_CODE (op0) == INDIRECT_REF | |
4204 && TREE_CONSTANT (TREE_OPERAND (op0, 0))) | |
4205 return null_pointer_node; | |
4206 /* Taking the address of a nested function involves a trampoline, | |
4207 unless we don't need or want one. */ | |
4208 if (TREE_CODE (op0) == FUNCTION_DECL | |
4209 && decl_function_context (op0) | |
4210 && !DECL_NO_STATIC_CHAIN (op0) | |
4211 && !TREE_NO_TRAMPOLINE (value)) | |
4212 return NULL_TREE; | |
4213 /* "&{...}" requires a temporary to hold the constructed | |
4214 object. */ | |
4215 if (TREE_CODE (op0) == CONSTRUCTOR) | |
4216 return NULL_TREE; | |
4217 } | |
4218 return op0; | |
4219 } | |
4220 | |
4221 case NON_LVALUE_EXPR: | |
4222 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype); | |
4223 | |
4224 case VIEW_CONVERT_EXPR: | |
4225 { | |
4226 tree src = TREE_OPERAND (value, 0); | |
4227 tree src_type = TREE_TYPE (src); | |
4228 tree dest_type = TREE_TYPE (value); | |
4229 | |
4230 /* Allow view-conversions from aggregate to non-aggregate type only | |
4231 if the bit pattern is fully preserved afterwards; otherwise, the | |
4232 RTL expander won't be able to apply a subsequent transformation | |
4233 to the underlying constructor. */ | |
4234 if (AGGREGATE_TYPE_P (src_type) && !AGGREGATE_TYPE_P (dest_type)) | |
4235 { | |
4236 if (TYPE_MODE (endtype) == TYPE_MODE (dest_type)) | |
4237 return initializer_constant_valid_p (src, endtype); | |
4238 else | |
4239 return NULL_TREE; | |
4240 } | |
4241 | |
4242 /* Allow all other kinds of view-conversion. */ | |
4243 return initializer_constant_valid_p (src, endtype); | |
4244 } | |
4245 | |
4246 CASE_CONVERT: | |
4247 { | |
4248 tree src = TREE_OPERAND (value, 0); | |
4249 tree src_type = TREE_TYPE (src); | |
4250 tree dest_type = TREE_TYPE (value); | |
4251 | |
4252 /* Allow conversions between pointer types, floating-point | |
4253 types, and offset types. */ | |
4254 if ((POINTER_TYPE_P (dest_type) && POINTER_TYPE_P (src_type)) | |
4255 || (FLOAT_TYPE_P (dest_type) && FLOAT_TYPE_P (src_type)) | |
4256 || (TREE_CODE (dest_type) == OFFSET_TYPE | |
4257 && TREE_CODE (src_type) == OFFSET_TYPE)) | |
4258 return initializer_constant_valid_p (src, endtype); | |
4259 | |
4260 /* Allow length-preserving conversions between integer types. */ | |
4261 if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type) | |
4262 && (TYPE_PRECISION (dest_type) == TYPE_PRECISION (src_type))) | |
4263 return initializer_constant_valid_p (src, endtype); | |
4264 | |
4265 /* Allow conversions between other integer types only if | |
4266 explicit value. */ | |
4267 if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type)) | |
4268 { | |
4269 tree inner = initializer_constant_valid_p (src, endtype); | |
4270 if (inner == null_pointer_node) | |
4271 return null_pointer_node; | |
4272 break; | |
4273 } | |
4274 | |
4275 /* Allow (int) &foo provided int is as wide as a pointer. */ | |
4276 if (INTEGRAL_TYPE_P (dest_type) && POINTER_TYPE_P (src_type) | |
4277 && (TYPE_PRECISION (dest_type) >= TYPE_PRECISION (src_type))) | |
4278 return initializer_constant_valid_p (src, endtype); | |
4279 | |
4280 /* Likewise conversions from int to pointers, but also allow | |
4281 conversions from 0. */ | |
4282 if ((POINTER_TYPE_P (dest_type) | |
4283 || TREE_CODE (dest_type) == OFFSET_TYPE) | |
4284 && INTEGRAL_TYPE_P (src_type)) | |
4285 { | |
4286 if (TREE_CODE (src) == INTEGER_CST | |
4287 && TYPE_PRECISION (dest_type) >= TYPE_PRECISION (src_type)) | |
4288 return null_pointer_node; | |
4289 if (integer_zerop (src)) | |
4290 return null_pointer_node; | |
4291 else if (TYPE_PRECISION (dest_type) <= TYPE_PRECISION (src_type)) | |
4292 return initializer_constant_valid_p (src, endtype); | |
4293 } | |
4294 | |
4295 /* Allow conversions to struct or union types if the value | |
4296 inside is okay. */ | |
4297 if (TREE_CODE (dest_type) == RECORD_TYPE | |
4298 || TREE_CODE (dest_type) == UNION_TYPE) | |
4299 return initializer_constant_valid_p (src, endtype); | |
4300 } | |
4301 break; | |
4302 | |
4303 case POINTER_PLUS_EXPR: | |
4304 case PLUS_EXPR: | |
4305 if (! INTEGRAL_TYPE_P (endtype) | |
4306 || TYPE_PRECISION (endtype) >= POINTER_SIZE) | |
4307 { | |
4308 tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0), | |
4309 endtype); | |
4310 tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1), | |
4311 endtype); | |
4312 /* If either term is absolute, use the other term's relocation. */ | |
4313 if (valid0 == null_pointer_node) | |
4314 return valid1; | |
4315 if (valid1 == null_pointer_node) | |
4316 return valid0; | |
4317 } | |
4318 | |
4319 /* Support narrowing pointer differences. */ | |
4320 ret = narrowing_initializer_constant_valid_p (value, endtype); | |
4321 if (ret != NULL_TREE) | |
4322 return ret; | |
4323 | |
4324 break; | |
4325 | |
4326 case MINUS_EXPR: | |
4327 if (! INTEGRAL_TYPE_P (endtype) | |
4328 || TYPE_PRECISION (endtype) >= POINTER_SIZE) | |
4329 { | |
4330 tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0), | |
4331 endtype); | |
4332 tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1), | |
4333 endtype); | |
4334 /* Win if second argument is absolute. */ | |
4335 if (valid1 == null_pointer_node) | |
4336 return valid0; | |
4337 /* Win if both arguments have the same relocation. | |
4338 Then the value is absolute. */ | |
4339 if (valid0 == valid1 && valid0 != 0) | |
4340 return null_pointer_node; | |
4341 | |
4342 /* Since GCC guarantees that string constants are unique in the | |
4343 generated code, a subtraction between two copies of the same | |
4344 constant string is absolute. */ | |
4345 if (valid0 && TREE_CODE (valid0) == STRING_CST | |
4346 && valid1 && TREE_CODE (valid1) == STRING_CST | |
4347 && operand_equal_p (valid0, valid1, 1)) | |
4348 return null_pointer_node; | |
4349 } | |
4350 | |
4351 /* Support narrowing differences. */ | |
4352 ret = narrowing_initializer_constant_valid_p (value, endtype); | |
4353 if (ret != NULL_TREE) | |
4354 return ret; | |
4355 | |
4356 break; | |
4357 | |
4358 default: | |
4359 break; | |
4360 } | |
4361 | |
4362 return 0; | |
4363 } | |
4364 | |
4365 /* Output assembler code for constant EXP to FILE, with no label. | |
4366 This includes the pseudo-op such as ".int" or ".byte", and a newline. | |
4367 Assumes output_addressed_constants has been done on EXP already. | |
4368 | |
4369 Generate exactly SIZE bytes of assembler data, padding at the end | |
4370 with zeros if necessary. SIZE must always be specified. | |
4371 | |
4372 SIZE is important for structure constructors, | |
4373 since trailing members may have been omitted from the constructor. | |
4374 It is also important for initialization of arrays from string constants | |
4375 since the full length of the string constant might not be wanted. | |
4376 It is also needed for initialization of unions, where the initializer's | |
4377 type is just one member, and that may not be as long as the union. | |
4378 | |
4379 There a case in which we would fail to output exactly SIZE bytes: | |
4380 for a structure constructor that wants to produce more than SIZE bytes. | |
4381 But such constructors will never be generated for any possible input. | |
4382 | |
4383 ALIGN is the alignment of the data in bits. */ | |
4384 | |
4385 void | |
4386 output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align) | |
4387 { | |
4388 enum tree_code code; | |
4389 unsigned HOST_WIDE_INT thissize; | |
4390 | |
4391 if (size == 0 || flag_syntax_only) | |
4392 return; | |
4393 | |
4394 /* See if we're trying to initialize a pointer in a non-default mode | |
4395 to the address of some declaration somewhere. If the target says | |
4396 the mode is valid for pointers, assume the target has a way of | |
4397 resolving it. */ | |
4398 if (TREE_CODE (exp) == NOP_EXPR | |
4399 && POINTER_TYPE_P (TREE_TYPE (exp)) | |
4400 && targetm.valid_pointer_mode (TYPE_MODE (TREE_TYPE (exp)))) | |
4401 { | |
4402 tree saved_type = TREE_TYPE (exp); | |
4403 | |
4404 /* Peel off any intermediate conversions-to-pointer for valid | |
4405 pointer modes. */ | |
4406 while (TREE_CODE (exp) == NOP_EXPR | |
4407 && POINTER_TYPE_P (TREE_TYPE (exp)) | |
4408 && targetm.valid_pointer_mode (TYPE_MODE (TREE_TYPE (exp)))) | |
4409 exp = TREE_OPERAND (exp, 0); | |
4410 | |
4411 /* If what we're left with is the address of something, we can | |
4412 convert the address to the final type and output it that | |
4413 way. */ | |
4414 if (TREE_CODE (exp) == ADDR_EXPR) | |
4415 exp = build1 (ADDR_EXPR, saved_type, TREE_OPERAND (exp, 0)); | |
4416 /* Likewise for constant ints. */ | |
4417 else if (TREE_CODE (exp) == INTEGER_CST) | |
4418 exp = build_int_cst_wide (saved_type, TREE_INT_CST_LOW (exp), | |
4419 TREE_INT_CST_HIGH (exp)); | |
4420 | |
4421 } | |
4422 | |
4423 /* Eliminate any conversions since we'll be outputting the underlying | |
4424 constant. */ | |
4425 while (CONVERT_EXPR_P (exp) | |
4426 || TREE_CODE (exp) == NON_LVALUE_EXPR | |
4427 || TREE_CODE (exp) == VIEW_CONVERT_EXPR) | |
4428 { | |
4429 HOST_WIDE_INT type_size = int_size_in_bytes (TREE_TYPE (exp)); | |
4430 HOST_WIDE_INT op_size = int_size_in_bytes (TREE_TYPE (TREE_OPERAND (exp, 0))); | |
4431 | |
4432 /* Make sure eliminating the conversion is really a no-op, except with | |
4433 VIEW_CONVERT_EXPRs to allow for wild Ada unchecked conversions and | |
4434 union types to allow for Ada unchecked unions. */ | |
4435 if (type_size > op_size | |
4436 && TREE_CODE (exp) != VIEW_CONVERT_EXPR | |
4437 && TREE_CODE (TREE_TYPE (exp)) != UNION_TYPE) | |
4438 /* Keep the conversion. */ | |
4439 break; | |
4440 else | |
4441 exp = TREE_OPERAND (exp, 0); | |
4442 } | |
4443 | |
4444 code = TREE_CODE (TREE_TYPE (exp)); | |
4445 thissize = int_size_in_bytes (TREE_TYPE (exp)); | |
4446 | |
4447 /* Allow a constructor with no elements for any data type. | |
4448 This means to fill the space with zeros. */ | |
4449 if (TREE_CODE (exp) == CONSTRUCTOR | |
4450 && VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (exp))) | |
4451 { | |
4452 assemble_zeros (size); | |
4453 return; | |
4454 } | |
4455 | |
4456 if (TREE_CODE (exp) == FDESC_EXPR) | |
4457 { | |
4458 #ifdef ASM_OUTPUT_FDESC | |
4459 HOST_WIDE_INT part = tree_low_cst (TREE_OPERAND (exp, 1), 0); | |
4460 tree decl = TREE_OPERAND (exp, 0); | |
4461 ASM_OUTPUT_FDESC (asm_out_file, decl, part); | |
4462 #else | |
4463 gcc_unreachable (); | |
4464 #endif | |
4465 return; | |
4466 } | |
4467 | |
4468 /* Now output the underlying data. If we've handling the padding, return. | |
4469 Otherwise, break and ensure SIZE is the size written. */ | |
4470 switch (code) | |
4471 { | |
4472 case BOOLEAN_TYPE: | |
4473 case INTEGER_TYPE: | |
4474 case ENUMERAL_TYPE: | |
4475 case POINTER_TYPE: | |
4476 case REFERENCE_TYPE: | |
4477 case OFFSET_TYPE: | |
4478 case FIXED_POINT_TYPE: | |
4479 if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode, | |
4480 EXPAND_INITIALIZER), | |
4481 MIN (size, thissize), align, 0)) | |
4482 error ("initializer for integer/fixed-point value is too complicated"); | |
4483 break; | |
4484 | |
4485 case REAL_TYPE: | |
4486 if (TREE_CODE (exp) != REAL_CST) | |
4487 error ("initializer for floating value is not a floating constant"); | |
4488 | |
4489 assemble_real (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)), align); | |
4490 break; | |
4491 | |
4492 case COMPLEX_TYPE: | |
4493 output_constant (TREE_REALPART (exp), thissize / 2, align); | |
4494 output_constant (TREE_IMAGPART (exp), thissize / 2, | |
4495 min_align (align, BITS_PER_UNIT * (thissize / 2))); | |
4496 break; | |
4497 | |
4498 case ARRAY_TYPE: | |
4499 case VECTOR_TYPE: | |
4500 switch (TREE_CODE (exp)) | |
4501 { | |
4502 case CONSTRUCTOR: | |
4503 output_constructor (exp, size, align); | |
4504 return; | |
4505 case STRING_CST: | |
4506 thissize = MIN ((unsigned HOST_WIDE_INT)TREE_STRING_LENGTH (exp), | |
4507 size); | |
4508 assemble_string (TREE_STRING_POINTER (exp), thissize); | |
4509 break; | |
4510 | |
4511 case VECTOR_CST: | |
4512 { | |
4513 int elt_size; | |
4514 tree link; | |
4515 unsigned int nalign; | |
4516 enum machine_mode inner; | |
4517 | |
4518 inner = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp))); | |
4519 nalign = MIN (align, GET_MODE_ALIGNMENT (inner)); | |
4520 | |
4521 elt_size = GET_MODE_SIZE (inner); | |
4522 | |
4523 link = TREE_VECTOR_CST_ELTS (exp); | |
4524 output_constant (TREE_VALUE (link), elt_size, align); | |
4525 thissize = elt_size; | |
4526 while ((link = TREE_CHAIN (link)) != NULL) | |
4527 { | |
4528 output_constant (TREE_VALUE (link), elt_size, nalign); | |
4529 thissize += elt_size; | |
4530 } | |
4531 break; | |
4532 } | |
4533 default: | |
4534 gcc_unreachable (); | |
4535 } | |
4536 break; | |
4537 | |
4538 case RECORD_TYPE: | |
4539 case UNION_TYPE: | |
4540 gcc_assert (TREE_CODE (exp) == CONSTRUCTOR); | |
4541 output_constructor (exp, size, align); | |
4542 return; | |
4543 | |
4544 case ERROR_MARK: | |
4545 return; | |
4546 | |
4547 default: | |
4548 gcc_unreachable (); | |
4549 } | |
4550 | |
4551 if (size > thissize) | |
4552 assemble_zeros (size - thissize); | |
4553 } | |
4554 | |
4555 | |
4556 /* Subroutine of output_constructor, used for computing the size of | |
4557 arrays of unspecified length. VAL must be a CONSTRUCTOR of an array | |
4558 type with an unspecified upper bound. */ | |
4559 | |
4560 static unsigned HOST_WIDE_INT | |
4561 array_size_for_constructor (tree val) | |
4562 { | |
4563 tree max_index, i; | |
4564 unsigned HOST_WIDE_INT cnt; | |
4565 tree index, value, tmp; | |
4566 | |
4567 /* This code used to attempt to handle string constants that are not | |
4568 arrays of single-bytes, but nothing else does, so there's no point in | |
4569 doing it here. */ | |
4570 if (TREE_CODE (val) == STRING_CST) | |
4571 return TREE_STRING_LENGTH (val); | |
4572 | |
4573 max_index = NULL_TREE; | |
4574 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (val), cnt, index, value) | |
4575 { | |
4576 if (TREE_CODE (index) == RANGE_EXPR) | |
4577 index = TREE_OPERAND (index, 1); | |
4578 if (max_index == NULL_TREE || tree_int_cst_lt (max_index, index)) | |
4579 max_index = index; | |
4580 } | |
4581 | |
4582 if (max_index == NULL_TREE) | |
4583 return 0; | |
4584 | |
4585 /* Compute the total number of array elements. */ | |
4586 tmp = TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (val))); | |
4587 i = size_binop (MINUS_EXPR, fold_convert (sizetype, max_index), | |
4588 fold_convert (sizetype, tmp)); | |
4589 i = size_binop (PLUS_EXPR, i, build_int_cst (sizetype, 1)); | |
4590 | |
4591 /* Multiply by the array element unit size to find number of bytes. */ | |
4592 i = size_binop (MULT_EXPR, i, TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (val)))); | |
4593 | |
4594 return tree_low_cst (i, 1); | |
4595 } | |
4596 | |
4597 /* Subroutine of output_constant, used for CONSTRUCTORs (aggregate constants). | |
4598 Generate at least SIZE bytes, padding if necessary. */ | |
4599 | |
4600 static void | |
4601 output_constructor (tree exp, unsigned HOST_WIDE_INT size, | |
4602 unsigned int align) | |
4603 { | |
4604 tree type = TREE_TYPE (exp); | |
4605 tree field = 0; | |
4606 tree min_index = 0; | |
4607 /* Number of bytes output or skipped so far. | |
4608 In other words, current position within the constructor. */ | |
4609 HOST_WIDE_INT total_bytes = 0; | |
4610 /* Nonzero means BYTE contains part of a byte, to be output. */ | |
4611 int byte_buffer_in_use = 0; | |
4612 int byte = 0; | |
4613 unsigned HOST_WIDE_INT cnt; | |
4614 constructor_elt *ce; | |
4615 | |
4616 gcc_assert (HOST_BITS_PER_WIDE_INT >= BITS_PER_UNIT); | |
4617 | |
4618 if (TREE_CODE (type) == RECORD_TYPE) | |
4619 field = TYPE_FIELDS (type); | |
4620 | |
4621 if (TREE_CODE (type) == ARRAY_TYPE | |
4622 && TYPE_DOMAIN (type) != 0) | |
4623 min_index = TYPE_MIN_VALUE (TYPE_DOMAIN (type)); | |
4624 | |
4625 /* As LINK goes through the elements of the constant, | |
4626 FIELD goes through the structure fields, if the constant is a structure. | |
4627 if the constant is a union, then we override this, | |
4628 by getting the field from the TREE_LIST element. | |
4629 But the constant could also be an array. Then FIELD is zero. | |
4630 | |
4631 There is always a maximum of one element in the chain LINK for unions | |
4632 (even if the initializer in a source program incorrectly contains | |
4633 more one). */ | |
4634 for (cnt = 0; | |
4635 VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (exp), cnt, ce); | |
4636 cnt++, field = field ? TREE_CHAIN (field) : 0) | |
4637 { | |
4638 tree val = ce->value; | |
4639 tree index = 0; | |
4640 | |
4641 /* The element in a union constructor specifies the proper field | |
4642 or index. */ | |
4643 if ((TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE | |
4644 || TREE_CODE (type) == QUAL_UNION_TYPE) | |
4645 && ce->index != 0) | |
4646 field = ce->index; | |
4647 | |
4648 else if (TREE_CODE (type) == ARRAY_TYPE) | |
4649 index = ce->index; | |
4650 | |
4651 #ifdef ASM_COMMENT_START | |
4652 if (field && flag_verbose_asm) | |
4653 fprintf (asm_out_file, "%s %s:\n", | |
4654 ASM_COMMENT_START, | |
4655 DECL_NAME (field) | |
4656 ? IDENTIFIER_POINTER (DECL_NAME (field)) | |
4657 : "<anonymous>"); | |
4658 #endif | |
4659 | |
4660 /* Eliminate the marker that makes a cast not be an lvalue. */ | |
4661 if (val != 0) | |
4662 STRIP_NOPS (val); | |
4663 | |
4664 if (index && TREE_CODE (index) == RANGE_EXPR) | |
4665 { | |
4666 unsigned HOST_WIDE_INT fieldsize | |
4667 = int_size_in_bytes (TREE_TYPE (type)); | |
4668 HOST_WIDE_INT lo_index = tree_low_cst (TREE_OPERAND (index, 0), 0); | |
4669 HOST_WIDE_INT hi_index = tree_low_cst (TREE_OPERAND (index, 1), 0); | |
4670 HOST_WIDE_INT index; | |
4671 unsigned int align2 = min_align (align, fieldsize * BITS_PER_UNIT); | |
4672 | |
4673 for (index = lo_index; index <= hi_index; index++) | |
4674 { | |
4675 /* Output the element's initial value. */ | |
4676 if (val == 0) | |
4677 assemble_zeros (fieldsize); | |
4678 else | |
4679 output_constant (val, fieldsize, align2); | |
4680 | |
4681 /* Count its size. */ | |
4682 total_bytes += fieldsize; | |
4683 } | |
4684 } | |
4685 else if (field == 0 || !DECL_BIT_FIELD (field)) | |
4686 { | |
4687 /* An element that is not a bit-field. */ | |
4688 | |
4689 unsigned HOST_WIDE_INT fieldsize; | |
4690 /* Since this structure is static, | |
4691 we know the positions are constant. */ | |
4692 HOST_WIDE_INT pos = field ? int_byte_position (field) : 0; | |
4693 unsigned int align2; | |
4694 | |
4695 if (index != 0) | |
4696 pos = (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (val)), 1) | |
4697 * (tree_low_cst (index, 0) - tree_low_cst (min_index, 0))); | |
4698 | |
4699 /* Output any buffered-up bit-fields preceding this element. */ | |
4700 if (byte_buffer_in_use) | |
4701 { | |
4702 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1); | |
4703 total_bytes++; | |
4704 byte_buffer_in_use = 0; | |
4705 } | |
4706 | |
4707 /* Advance to offset of this element. | |
4708 Note no alignment needed in an array, since that is guaranteed | |
4709 if each element has the proper size. */ | |
4710 if ((field != 0 || index != 0) && pos != total_bytes) | |
4711 { | |
4712 gcc_assert (pos >= total_bytes); | |
4713 assemble_zeros (pos - total_bytes); | |
4714 total_bytes = pos; | |
4715 } | |
4716 | |
4717 /* Find the alignment of this element. */ | |
4718 align2 = min_align (align, BITS_PER_UNIT * pos); | |
4719 | |
4720 /* Determine size this element should occupy. */ | |
4721 if (field) | |
4722 { | |
4723 fieldsize = 0; | |
4724 | |
4725 /* If this is an array with an unspecified upper bound, | |
4726 the initializer determines the size. */ | |
4727 /* ??? This ought to only checked if DECL_SIZE_UNIT is NULL, | |
4728 but we cannot do this until the deprecated support for | |
4729 initializing zero-length array members is removed. */ | |
4730 if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE | |
4731 && TYPE_DOMAIN (TREE_TYPE (field)) | |
4732 && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (field)))) | |
4733 { | |
4734 fieldsize = array_size_for_constructor (val); | |
4735 /* Given a non-empty initialization, this field had | |
4736 better be last. */ | |
4737 gcc_assert (!fieldsize || !TREE_CHAIN (field)); | |
4738 } | |
4739 else if (DECL_SIZE_UNIT (field)) | |
4740 { | |
4741 /* ??? This can't be right. If the decl size overflows | |
4742 a host integer we will silently emit no data. */ | |
4743 if (host_integerp (DECL_SIZE_UNIT (field), 1)) | |
4744 fieldsize = tree_low_cst (DECL_SIZE_UNIT (field), 1); | |
4745 } | |
4746 } | |
4747 else | |
4748 fieldsize = int_size_in_bytes (TREE_TYPE (type)); | |
4749 | |
4750 /* Output the element's initial value. */ | |
4751 if (val == 0) | |
4752 assemble_zeros (fieldsize); | |
4753 else | |
4754 output_constant (val, fieldsize, align2); | |
4755 | |
4756 /* Count its size. */ | |
4757 total_bytes += fieldsize; | |
4758 } | |
4759 else if (val != 0 && TREE_CODE (val) != INTEGER_CST) | |
4760 error ("invalid initial value for member %qs", | |
4761 IDENTIFIER_POINTER (DECL_NAME (field))); | |
4762 else | |
4763 { | |
4764 /* Element that is a bit-field. */ | |
4765 | |
4766 HOST_WIDE_INT next_offset = int_bit_position (field); | |
4767 HOST_WIDE_INT end_offset | |
4768 = (next_offset + tree_low_cst (DECL_SIZE (field), 1)); | |
4769 | |
4770 if (val == 0) | |
4771 val = integer_zero_node; | |
4772 | |
4773 /* If this field does not start in this (or, next) byte, | |
4774 skip some bytes. */ | |
4775 if (next_offset / BITS_PER_UNIT != total_bytes) | |
4776 { | |
4777 /* Output remnant of any bit field in previous bytes. */ | |
4778 if (byte_buffer_in_use) | |
4779 { | |
4780 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1); | |
4781 total_bytes++; | |
4782 byte_buffer_in_use = 0; | |
4783 } | |
4784 | |
4785 /* If still not at proper byte, advance to there. */ | |
4786 if (next_offset / BITS_PER_UNIT != total_bytes) | |
4787 { | |
4788 gcc_assert (next_offset / BITS_PER_UNIT >= total_bytes); | |
4789 assemble_zeros (next_offset / BITS_PER_UNIT - total_bytes); | |
4790 total_bytes = next_offset / BITS_PER_UNIT; | |
4791 } | |
4792 } | |
4793 | |
4794 if (! byte_buffer_in_use) | |
4795 byte = 0; | |
4796 | |
4797 /* We must split the element into pieces that fall within | |
4798 separate bytes, and combine each byte with previous or | |
4799 following bit-fields. */ | |
4800 | |
4801 /* next_offset is the offset n fbits from the beginning of | |
4802 the structure to the next bit of this element to be processed. | |
4803 end_offset is the offset of the first bit past the end of | |
4804 this element. */ | |
4805 while (next_offset < end_offset) | |
4806 { | |
4807 int this_time; | |
4808 int shift; | |
4809 HOST_WIDE_INT value; | |
4810 HOST_WIDE_INT next_byte = next_offset / BITS_PER_UNIT; | |
4811 HOST_WIDE_INT next_bit = next_offset % BITS_PER_UNIT; | |
4812 | |
4813 /* Advance from byte to byte | |
4814 within this element when necessary. */ | |
4815 while (next_byte != total_bytes) | |
4816 { | |
4817 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1); | |
4818 total_bytes++; | |
4819 byte = 0; | |
4820 } | |
4821 | |
4822 /* Number of bits we can process at once | |
4823 (all part of the same byte). */ | |
4824 this_time = MIN (end_offset - next_offset, | |
4825 BITS_PER_UNIT - next_bit); | |
4826 if (BYTES_BIG_ENDIAN) | |
4827 { | |
4828 /* On big-endian machine, take the most significant bits | |
4829 first (of the bits that are significant) | |
4830 and put them into bytes from the most significant end. */ | |
4831 shift = end_offset - next_offset - this_time; | |
4832 | |
4833 /* Don't try to take a bunch of bits that cross | |
4834 the word boundary in the INTEGER_CST. We can | |
4835 only select bits from the LOW or HIGH part | |
4836 not from both. */ | |
4837 if (shift < HOST_BITS_PER_WIDE_INT | |
4838 && shift + this_time > HOST_BITS_PER_WIDE_INT) | |
4839 { | |
4840 this_time = shift + this_time - HOST_BITS_PER_WIDE_INT; | |
4841 shift = HOST_BITS_PER_WIDE_INT; | |
4842 } | |
4843 | |
4844 /* Now get the bits from the appropriate constant word. */ | |
4845 if (shift < HOST_BITS_PER_WIDE_INT) | |
4846 value = TREE_INT_CST_LOW (val); | |
4847 else | |
4848 { | |
4849 gcc_assert (shift < 2 * HOST_BITS_PER_WIDE_INT); | |
4850 value = TREE_INT_CST_HIGH (val); | |
4851 shift -= HOST_BITS_PER_WIDE_INT; | |
4852 } | |
4853 | |
4854 /* Get the result. This works only when: | |
4855 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */ | |
4856 byte |= (((value >> shift) | |
4857 & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1)) | |
4858 << (BITS_PER_UNIT - this_time - next_bit)); | |
4859 } | |
4860 else | |
4861 { | |
4862 /* On little-endian machines, | |
4863 take first the least significant bits of the value | |
4864 and pack them starting at the least significant | |
4865 bits of the bytes. */ | |
4866 shift = next_offset - int_bit_position (field); | |
4867 | |
4868 /* Don't try to take a bunch of bits that cross | |
4869 the word boundary in the INTEGER_CST. We can | |
4870 only select bits from the LOW or HIGH part | |
4871 not from both. */ | |
4872 if (shift < HOST_BITS_PER_WIDE_INT | |
4873 && shift + this_time > HOST_BITS_PER_WIDE_INT) | |
4874 this_time = (HOST_BITS_PER_WIDE_INT - shift); | |
4875 | |
4876 /* Now get the bits from the appropriate constant word. */ | |
4877 if (shift < HOST_BITS_PER_WIDE_INT) | |
4878 value = TREE_INT_CST_LOW (val); | |
4879 else | |
4880 { | |
4881 gcc_assert (shift < 2 * HOST_BITS_PER_WIDE_INT); | |
4882 value = TREE_INT_CST_HIGH (val); | |
4883 shift -= HOST_BITS_PER_WIDE_INT; | |
4884 } | |
4885 | |
4886 /* Get the result. This works only when: | |
4887 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */ | |
4888 byte |= (((value >> shift) | |
4889 & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1)) | |
4890 << next_bit); | |
4891 } | |
4892 | |
4893 next_offset += this_time; | |
4894 byte_buffer_in_use = 1; | |
4895 } | |
4896 } | |
4897 } | |
4898 | |
4899 if (byte_buffer_in_use) | |
4900 { | |
4901 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1); | |
4902 total_bytes++; | |
4903 } | |
4904 | |
4905 if ((unsigned HOST_WIDE_INT)total_bytes < size) | |
4906 assemble_zeros (size - total_bytes); | |
4907 } | |
4908 | |
4909 /* Mark DECL as weak. */ | |
4910 | |
4911 static void | |
4912 mark_weak (tree decl) | |
4913 { | |
4914 DECL_WEAK (decl) = 1; | |
4915 | |
4916 if (DECL_RTL_SET_P (decl) | |
4917 && MEM_P (DECL_RTL (decl)) | |
4918 && XEXP (DECL_RTL (decl), 0) | |
4919 && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF) | |
4920 SYMBOL_REF_WEAK (XEXP (DECL_RTL (decl), 0)) = 1; | |
4921 } | |
4922 | |
4923 /* Merge weak status between NEWDECL and OLDDECL. */ | |
4924 | |
4925 void | |
4926 merge_weak (tree newdecl, tree olddecl) | |
4927 { | |
4928 if (DECL_WEAK (newdecl) == DECL_WEAK (olddecl)) | |
4929 { | |
4930 if (DECL_WEAK (newdecl) && SUPPORTS_WEAK) | |
4931 { | |
4932 tree *pwd; | |
4933 /* We put the NEWDECL on the weak_decls list at some point | |
4934 and OLDDECL as well. Keep just OLDDECL on the list. */ | |
4935 for (pwd = &weak_decls; *pwd; pwd = &TREE_CHAIN (*pwd)) | |
4936 if (TREE_VALUE (*pwd) == newdecl) | |
4937 { | |
4938 *pwd = TREE_CHAIN (*pwd); | |
4939 break; | |
4940 } | |
4941 } | |
4942 return; | |
4943 } | |
4944 | |
4945 if (DECL_WEAK (newdecl)) | |
4946 { | |
4947 tree wd; | |
4948 | |
4949 /* NEWDECL is weak, but OLDDECL is not. */ | |
4950 | |
4951 /* If we already output the OLDDECL, we're in trouble; we can't | |
4952 go back and make it weak. This error cannot be caught in | |
4953 declare_weak because the NEWDECL and OLDDECL was not yet | |
4954 been merged; therefore, TREE_ASM_WRITTEN was not set. */ | |
4955 if (TREE_ASM_WRITTEN (olddecl)) | |
4956 error ("weak declaration of %q+D must precede definition", | |
4957 newdecl); | |
4958 | |
4959 /* If we've already generated rtl referencing OLDDECL, we may | |
4960 have done so in a way that will not function properly with | |
4961 a weak symbol. */ | |
4962 else if (TREE_USED (olddecl) | |
4963 && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl))) | |
4964 warning (0, "weak declaration of %q+D after first use results " | |
4965 "in unspecified behavior", newdecl); | |
4966 | |
4967 if (SUPPORTS_WEAK) | |
4968 { | |
4969 /* We put the NEWDECL on the weak_decls list at some point. | |
4970 Replace it with the OLDDECL. */ | |
4971 for (wd = weak_decls; wd; wd = TREE_CHAIN (wd)) | |
4972 if (TREE_VALUE (wd) == newdecl) | |
4973 { | |
4974 TREE_VALUE (wd) = olddecl; | |
4975 break; | |
4976 } | |
4977 /* We may not find the entry on the list. If NEWDECL is a | |
4978 weak alias, then we will have already called | |
4979 globalize_decl to remove the entry; in that case, we do | |
4980 not need to do anything. */ | |
4981 } | |
4982 | |
4983 /* Make the OLDDECL weak; it's OLDDECL that we'll be keeping. */ | |
4984 mark_weak (olddecl); | |
4985 } | |
4986 else | |
4987 /* OLDDECL was weak, but NEWDECL was not explicitly marked as | |
4988 weak. Just update NEWDECL to indicate that it's weak too. */ | |
4989 mark_weak (newdecl); | |
4990 } | |
4991 | |
4992 /* Declare DECL to be a weak symbol. */ | |
4993 | |
4994 void | |
4995 declare_weak (tree decl) | |
4996 { | |
4997 if (! TREE_PUBLIC (decl)) | |
4998 error ("weak declaration of %q+D must be public", decl); | |
4999 else if (TREE_CODE (decl) == FUNCTION_DECL && TREE_ASM_WRITTEN (decl)) | |
5000 error ("weak declaration of %q+D must precede definition", decl); | |
5001 else if (!SUPPORTS_WEAK) | |
5002 warning (0, "weak declaration of %q+D not supported", decl); | |
5003 | |
5004 mark_weak (decl); | |
5005 } | |
5006 | |
5007 static void | |
5008 weak_finish_1 (tree decl) | |
5009 { | |
5010 #if defined (ASM_WEAKEN_DECL) || defined (ASM_WEAKEN_LABEL) | |
5011 const char *const name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); | |
5012 #endif | |
5013 | |
5014 if (! TREE_USED (decl)) | |
5015 return; | |
5016 | |
5017 #ifdef ASM_WEAKEN_DECL | |
5018 ASM_WEAKEN_DECL (asm_out_file, decl, name, NULL); | |
5019 #else | |
5020 #ifdef ASM_WEAKEN_LABEL | |
5021 ASM_WEAKEN_LABEL (asm_out_file, name); | |
5022 #else | |
5023 #ifdef ASM_OUTPUT_WEAK_ALIAS | |
5024 { | |
5025 static bool warn_once = 0; | |
5026 if (! warn_once) | |
5027 { | |
5028 warning (0, "only weak aliases are supported in this configuration"); | |
5029 warn_once = 1; | |
5030 } | |
5031 return; | |
5032 } | |
5033 #endif | |
5034 #endif | |
5035 #endif | |
5036 } | |
5037 | |
5038 /* This TREE_LIST contains weakref targets. */ | |
5039 | |
5040 static GTY(()) tree weakref_targets; | |
5041 | |
5042 /* Forward declaration. */ | |
5043 static tree find_decl_and_mark_needed (tree decl, tree target); | |
5044 | |
5045 /* Emit any pending weak declarations. */ | |
5046 | |
5047 void | |
5048 weak_finish (void) | |
5049 { | |
5050 tree t; | |
5051 | |
5052 for (t = weakref_targets; t; t = TREE_CHAIN (t)) | |
5053 { | |
5054 tree alias_decl = TREE_PURPOSE (t); | |
5055 tree target = ultimate_transparent_alias_target (&TREE_VALUE (t)); | |
5056 | |
5057 if (! TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias_decl))) | |
5058 /* Remove alias_decl from the weak list, but leave entries for | |
5059 the target alone. */ | |
5060 target = NULL_TREE; | |
5061 #ifndef ASM_OUTPUT_WEAKREF | |
5062 else if (! TREE_SYMBOL_REFERENCED (target)) | |
5063 { | |
5064 /* Use ASM_WEAKEN_LABEL only if ASM_WEAKEN_DECL is not | |
5065 defined, otherwise we and weak_finish_1 would use | |
5066 different macros. */ | |
5067 # if defined ASM_WEAKEN_LABEL && ! defined ASM_WEAKEN_DECL | |
5068 ASM_WEAKEN_LABEL (asm_out_file, IDENTIFIER_POINTER (target)); | |
5069 # else | |
5070 tree decl = find_decl_and_mark_needed (alias_decl, target); | |
5071 | |
5072 if (! decl) | |
5073 { | |
5074 decl = build_decl (TREE_CODE (alias_decl), target, | |
5075 TREE_TYPE (alias_decl)); | |
5076 | |
5077 DECL_EXTERNAL (decl) = 1; | |
5078 TREE_PUBLIC (decl) = 1; | |
5079 DECL_ARTIFICIAL (decl) = 1; | |
5080 TREE_NOTHROW (decl) = TREE_NOTHROW (alias_decl); | |
5081 TREE_USED (decl) = 1; | |
5082 } | |
5083 | |
5084 weak_finish_1 (decl); | |
5085 # endif | |
5086 } | |
5087 #endif | |
5088 | |
5089 { | |
5090 tree *p; | |
5091 tree t2; | |
5092 | |
5093 /* Remove the alias and the target from the pending weak list | |
5094 so that we do not emit any .weak directives for the former, | |
5095 nor multiple .weak directives for the latter. */ | |
5096 for (p = &weak_decls; (t2 = *p) ; ) | |
5097 { | |
5098 if (TREE_VALUE (t2) == alias_decl | |
5099 || target == DECL_ASSEMBLER_NAME (TREE_VALUE (t2))) | |
5100 *p = TREE_CHAIN (t2); | |
5101 else | |
5102 p = &TREE_CHAIN (t2); | |
5103 } | |
5104 | |
5105 /* Remove other weakrefs to the same target, to speed things up. */ | |
5106 for (p = &TREE_CHAIN (t); (t2 = *p) ; ) | |
5107 { | |
5108 if (target == ultimate_transparent_alias_target (&TREE_VALUE (t2))) | |
5109 *p = TREE_CHAIN (t2); | |
5110 else | |
5111 p = &TREE_CHAIN (t2); | |
5112 } | |
5113 } | |
5114 } | |
5115 | |
5116 for (t = weak_decls; t; t = TREE_CHAIN (t)) | |
5117 { | |
5118 tree decl = TREE_VALUE (t); | |
5119 | |
5120 weak_finish_1 (decl); | |
5121 } | |
5122 } | |
5123 | |
5124 /* Emit the assembly bits to indicate that DECL is globally visible. */ | |
5125 | |
5126 static void | |
5127 globalize_decl (tree decl) | |
5128 { | |
5129 | |
5130 #if defined (ASM_WEAKEN_LABEL) || defined (ASM_WEAKEN_DECL) | |
5131 if (DECL_WEAK (decl)) | |
5132 { | |
5133 const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0); | |
5134 tree *p, t; | |
5135 | |
5136 #ifdef ASM_WEAKEN_DECL | |
5137 ASM_WEAKEN_DECL (asm_out_file, decl, name, 0); | |
5138 #else | |
5139 ASM_WEAKEN_LABEL (asm_out_file, name); | |
5140 #endif | |
5141 | |
5142 /* Remove this function from the pending weak list so that | |
5143 we do not emit multiple .weak directives for it. */ | |
5144 for (p = &weak_decls; (t = *p) ; ) | |
5145 { | |
5146 if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t))) | |
5147 *p = TREE_CHAIN (t); | |
5148 else | |
5149 p = &TREE_CHAIN (t); | |
5150 } | |
5151 | |
5152 /* Remove weakrefs to the same target from the pending weakref | |
5153 list, for the same reason. */ | |
5154 for (p = &weakref_targets; (t = *p) ; ) | |
5155 { | |
5156 if (DECL_ASSEMBLER_NAME (decl) | |
5157 == ultimate_transparent_alias_target (&TREE_VALUE (t))) | |
5158 *p = TREE_CHAIN (t); | |
5159 else | |
5160 p = &TREE_CHAIN (t); | |
5161 } | |
5162 | |
5163 return; | |
5164 } | |
5165 #endif | |
5166 | |
5167 targetm.asm_out.globalize_decl_name (asm_out_file, decl); | |
5168 } | |
5169 | |
5170 /* We have to be able to tell cgraph about the needed-ness of the target | |
5171 of an alias. This requires that the decl have been defined. Aliases | |
5172 that precede their definition have to be queued for later processing. */ | |
5173 | |
5174 typedef struct alias_pair GTY(()) | |
5175 { | |
5176 tree decl; | |
5177 tree target; | |
5178 } alias_pair; | |
5179 | |
5180 /* Define gc'd vector type. */ | |
5181 DEF_VEC_O(alias_pair); | |
5182 DEF_VEC_ALLOC_O(alias_pair,gc); | |
5183 | |
5184 static GTY(()) VEC(alias_pair,gc) *alias_pairs; | |
5185 | |
5186 /* Given an assembly name, find the decl it is associated with. At the | |
5187 same time, mark it needed for cgraph. */ | |
5188 | |
5189 static tree | |
5190 find_decl_and_mark_needed (tree decl, tree target) | |
5191 { | |
5192 struct cgraph_node *fnode = NULL; | |
5193 struct varpool_node *vnode = NULL; | |
5194 | |
5195 if (TREE_CODE (decl) == FUNCTION_DECL) | |
5196 { | |
5197 fnode = cgraph_node_for_asm (target); | |
5198 if (fnode == NULL) | |
5199 vnode = varpool_node_for_asm (target); | |
5200 } | |
5201 else | |
5202 { | |
5203 vnode = varpool_node_for_asm (target); | |
5204 if (vnode == NULL) | |
5205 fnode = cgraph_node_for_asm (target); | |
5206 } | |
5207 | |
5208 if (fnode) | |
5209 { | |
5210 /* We can't mark function nodes as used after cgraph global info | |
5211 is finished. This wouldn't generally be necessary, but C++ | |
5212 virtual table thunks are introduced late in the game and | |
5213 might seem like they need marking, although in fact they | |
5214 don't. */ | |
5215 if (! cgraph_global_info_ready) | |
5216 cgraph_mark_needed_node (fnode); | |
5217 return fnode->decl; | |
5218 } | |
5219 else if (vnode) | |
5220 { | |
5221 varpool_mark_needed_node (vnode); | |
5222 return vnode->decl; | |
5223 } | |
5224 else | |
5225 return NULL_TREE; | |
5226 } | |
5227 | |
5228 /* Output the assembler code for a define (equate) using ASM_OUTPUT_DEF | |
5229 or ASM_OUTPUT_DEF_FROM_DECLS. The function defines the symbol whose | |
5230 tree node is DECL to have the value of the tree node TARGET. */ | |
5231 | |
5232 static void | |
5233 do_assemble_alias (tree decl, tree target) | |
5234 { | |
5235 if (TREE_ASM_WRITTEN (decl)) | |
5236 return; | |
5237 | |
5238 TREE_ASM_WRITTEN (decl) = 1; | |
5239 TREE_ASM_WRITTEN (DECL_ASSEMBLER_NAME (decl)) = 1; | |
5240 | |
5241 if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))) | |
5242 { | |
5243 ultimate_transparent_alias_target (&target); | |
5244 | |
5245 if (!targetm.have_tls | |
5246 && TREE_CODE (decl) == VAR_DECL | |
5247 && DECL_THREAD_LOCAL_P (decl)) | |
5248 { | |
5249 decl = emutls_decl (decl); | |
5250 target = get_emutls_object_name (target); | |
5251 } | |
5252 | |
5253 if (!TREE_SYMBOL_REFERENCED (target)) | |
5254 weakref_targets = tree_cons (decl, target, weakref_targets); | |
5255 | |
5256 #ifdef ASM_OUTPUT_WEAKREF | |
5257 ASM_OUTPUT_WEAKREF (asm_out_file, decl, | |
5258 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), | |
5259 IDENTIFIER_POINTER (target)); | |
5260 #else | |
5261 if (!SUPPORTS_WEAK) | |
5262 { | |
5263 error ("%Jweakref is not supported in this configuration", decl); | |
5264 return; | |
5265 } | |
5266 #endif | |
5267 return; | |
5268 } | |
5269 | |
5270 if (!targetm.have_tls | |
5271 && TREE_CODE (decl) == VAR_DECL | |
5272 && DECL_THREAD_LOCAL_P (decl)) | |
5273 { | |
5274 decl = emutls_decl (decl); | |
5275 target = get_emutls_object_name (target); | |
5276 } | |
5277 | |
5278 #ifdef ASM_OUTPUT_DEF | |
5279 /* Make name accessible from other files, if appropriate. */ | |
5280 | |
5281 if (TREE_PUBLIC (decl)) | |
5282 { | |
5283 globalize_decl (decl); | |
5284 maybe_assemble_visibility (decl); | |
5285 } | |
5286 | |
5287 # ifdef ASM_OUTPUT_DEF_FROM_DECLS | |
5288 ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file, decl, target); | |
5289 # else | |
5290 ASM_OUTPUT_DEF (asm_out_file, | |
5291 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), | |
5292 IDENTIFIER_POINTER (target)); | |
5293 # endif | |
5294 #elif defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL) | |
5295 { | |
5296 const char *name; | |
5297 tree *p, t; | |
5298 | |
5299 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); | |
5300 # ifdef ASM_WEAKEN_DECL | |
5301 ASM_WEAKEN_DECL (asm_out_file, decl, name, IDENTIFIER_POINTER (target)); | |
5302 # else | |
5303 ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target)); | |
5304 # endif | |
5305 /* Remove this function from the pending weak list so that | |
5306 we do not emit multiple .weak directives for it. */ | |
5307 for (p = &weak_decls; (t = *p) ; ) | |
5308 if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t))) | |
5309 *p = TREE_CHAIN (t); | |
5310 else | |
5311 p = &TREE_CHAIN (t); | |
5312 | |
5313 /* Remove weakrefs to the same target from the pending weakref | |
5314 list, for the same reason. */ | |
5315 for (p = &weakref_targets; (t = *p) ; ) | |
5316 { | |
5317 if (DECL_ASSEMBLER_NAME (decl) | |
5318 == ultimate_transparent_alias_target (&TREE_VALUE (t))) | |
5319 *p = TREE_CHAIN (t); | |
5320 else | |
5321 p = &TREE_CHAIN (t); | |
5322 } | |
5323 } | |
5324 #endif | |
5325 } | |
5326 | |
5327 /* First pass of completing pending aliases. Make sure that cgraph knows | |
5328 which symbols will be required. */ | |
5329 | |
5330 void | |
5331 finish_aliases_1 (void) | |
5332 { | |
5333 unsigned i; | |
5334 alias_pair *p; | |
5335 | |
5336 for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); i++) | |
5337 { | |
5338 tree target_decl; | |
5339 | |
5340 target_decl = find_decl_and_mark_needed (p->decl, p->target); | |
5341 if (target_decl == NULL) | |
5342 { | |
5343 if (! lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl))) | |
5344 error ("%q+D aliased to undefined symbol %qs", | |
5345 p->decl, IDENTIFIER_POINTER (p->target)); | |
5346 } | |
5347 else if (DECL_EXTERNAL (target_decl) | |
5348 && ! lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl))) | |
5349 error ("%q+D aliased to external symbol %qs", | |
5350 p->decl, IDENTIFIER_POINTER (p->target)); | |
5351 } | |
5352 } | |
5353 | |
5354 /* Second pass of completing pending aliases. Emit the actual assembly. | |
5355 This happens at the end of compilation and thus it is assured that the | |
5356 target symbol has been emitted. */ | |
5357 | |
5358 void | |
5359 finish_aliases_2 (void) | |
5360 { | |
5361 unsigned i; | |
5362 alias_pair *p; | |
5363 | |
5364 for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); i++) | |
5365 do_assemble_alias (p->decl, p->target); | |
5366 | |
5367 VEC_truncate (alias_pair, alias_pairs, 0); | |
5368 } | |
5369 | |
5370 /* Emit an assembler directive to make the symbol for DECL an alias to | |
5371 the symbol for TARGET. */ | |
5372 | |
5373 void | |
5374 assemble_alias (tree decl, tree target) | |
5375 { | |
5376 tree target_decl; | |
5377 bool is_weakref = false; | |
5378 | |
5379 if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))) | |
5380 { | |
5381 tree alias = DECL_ASSEMBLER_NAME (decl); | |
5382 | |
5383 is_weakref = true; | |
5384 | |
5385 ultimate_transparent_alias_target (&target); | |
5386 | |
5387 if (alias == target) | |
5388 error ("weakref %q+D ultimately targets itself", decl); | |
5389 else | |
5390 { | |
5391 #ifndef ASM_OUTPUT_WEAKREF | |
5392 IDENTIFIER_TRANSPARENT_ALIAS (alias) = 1; | |
5393 TREE_CHAIN (alias) = target; | |
5394 #endif | |
5395 } | |
5396 if (TREE_PUBLIC (decl)) | |
5397 error ("weakref %q+D must have static linkage", decl); | |
5398 } | |
5399 else | |
5400 { | |
5401 #if !defined (ASM_OUTPUT_DEF) | |
5402 # if !defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL) | |
5403 error ("%Jalias definitions not supported in this configuration", decl); | |
5404 return; | |
5405 # else | |
5406 if (!DECL_WEAK (decl)) | |
5407 { | |
5408 error ("%Jonly weak aliases are supported in this configuration", decl); | |
5409 return; | |
5410 } | |
5411 # endif | |
5412 #endif | |
5413 } | |
5414 | |
5415 /* We must force creation of DECL_RTL for debug info generation, even though | |
5416 we don't use it here. */ | |
5417 make_decl_rtl (decl); | |
5418 TREE_USED (decl) = 1; | |
5419 | |
5420 /* A quirk of the initial implementation of aliases required that the user | |
5421 add "extern" to all of them. Which is silly, but now historical. Do | |
5422 note that the symbol is in fact locally defined. */ | |
5423 if (! is_weakref) | |
5424 DECL_EXTERNAL (decl) = 0; | |
5425 | |
5426 /* Allow aliases to aliases. */ | |
5427 if (TREE_CODE (decl) == FUNCTION_DECL) | |
5428 cgraph_node (decl)->alias = true; | |
5429 else | |
5430 varpool_node (decl)->alias = true; | |
5431 | |
5432 /* If the target has already been emitted, we don't have to queue the | |
5433 alias. This saves a tad of memory. */ | |
5434 if (cgraph_global_info_ready) | |
5435 target_decl = find_decl_and_mark_needed (decl, target); | |
5436 else | |
5437 target_decl= NULL; | |
5438 if (target_decl && TREE_ASM_WRITTEN (target_decl)) | |
5439 do_assemble_alias (decl, target); | |
5440 else | |
5441 { | |
5442 alias_pair *p = VEC_safe_push (alias_pair, gc, alias_pairs, NULL); | |
5443 p->decl = decl; | |
5444 p->target = target; | |
5445 } | |
5446 } | |
5447 | |
5448 /* Emit an assembler directive to set symbol for DECL visibility to | |
5449 the visibility type VIS, which must not be VISIBILITY_DEFAULT. */ | |
5450 | |
5451 void | |
5452 default_assemble_visibility (tree decl, int vis) | |
5453 { | |
5454 static const char * const visibility_types[] = { | |
5455 NULL, "protected", "hidden", "internal" | |
5456 }; | |
5457 | |
5458 const char *name, *type; | |
5459 | |
5460 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); | |
5461 type = visibility_types[vis]; | |
5462 | |
5463 #ifdef HAVE_GAS_HIDDEN | |
5464 fprintf (asm_out_file, "\t.%s\t", type); | |
5465 assemble_name (asm_out_file, name); | |
5466 fprintf (asm_out_file, "\n"); | |
5467 #else | |
5468 warning (OPT_Wattributes, "visibility attribute not supported " | |
5469 "in this configuration; ignored"); | |
5470 #endif | |
5471 } | |
5472 | |
5473 /* A helper function to call assemble_visibility when needed for a decl. */ | |
5474 | |
5475 int | |
5476 maybe_assemble_visibility (tree decl) | |
5477 { | |
5478 enum symbol_visibility vis = DECL_VISIBILITY (decl); | |
5479 | |
5480 if (vis != VISIBILITY_DEFAULT) | |
5481 { | |
5482 targetm.asm_out.visibility (decl, vis); | |
5483 return 1; | |
5484 } | |
5485 else | |
5486 return 0; | |
5487 } | |
5488 | |
5489 /* Returns 1 if the target configuration supports defining public symbols | |
5490 so that one of them will be chosen at link time instead of generating a | |
5491 multiply-defined symbol error, whether through the use of weak symbols or | |
5492 a target-specific mechanism for having duplicates discarded. */ | |
5493 | |
5494 int | |
5495 supports_one_only (void) | |
5496 { | |
5497 if (SUPPORTS_ONE_ONLY) | |
5498 return 1; | |
5499 return SUPPORTS_WEAK; | |
5500 } | |
5501 | |
5502 /* Set up DECL as a public symbol that can be defined in multiple | |
5503 translation units without generating a linker error. */ | |
5504 | |
5505 void | |
5506 make_decl_one_only (tree decl) | |
5507 { | |
5508 gcc_assert (TREE_CODE (decl) == VAR_DECL | |
5509 || TREE_CODE (decl) == FUNCTION_DECL); | |
5510 | |
5511 TREE_PUBLIC (decl) = 1; | |
5512 | |
5513 if (SUPPORTS_ONE_ONLY) | |
5514 { | |
5515 #ifdef MAKE_DECL_ONE_ONLY | |
5516 MAKE_DECL_ONE_ONLY (decl); | |
5517 #endif | |
5518 DECL_ONE_ONLY (decl) = 1; | |
5519 } | |
5520 else if (TREE_CODE (decl) == VAR_DECL | |
5521 && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node)) | |
5522 DECL_COMMON (decl) = 1; | |
5523 else | |
5524 { | |
5525 gcc_assert (SUPPORTS_WEAK); | |
5526 DECL_WEAK (decl) = 1; | |
5527 } | |
5528 } | |
5529 | |
5530 void | |
5531 init_varasm_once (void) | |
5532 { | |
5533 section_htab = htab_create_ggc (31, section_entry_hash, | |
5534 section_entry_eq, NULL); | |
5535 object_block_htab = htab_create_ggc (31, object_block_entry_hash, | |
5536 object_block_entry_eq, NULL); | |
5537 const_desc_htab = htab_create_ggc (1009, const_desc_hash, | |
5538 const_desc_eq, NULL); | |
5539 | |
5540 const_alias_set = new_alias_set (); | |
5541 shared_constant_pool = create_constant_pool (); | |
5542 | |
5543 #ifdef TEXT_SECTION_ASM_OP | |
5544 text_section = get_unnamed_section (SECTION_CODE, output_section_asm_op, | |
5545 TEXT_SECTION_ASM_OP); | |
5546 #endif | |
5547 | |
5548 #ifdef DATA_SECTION_ASM_OP | |
5549 data_section = get_unnamed_section (SECTION_WRITE, output_section_asm_op, | |
5550 DATA_SECTION_ASM_OP); | |
5551 #endif | |
5552 | |
5553 #ifdef SDATA_SECTION_ASM_OP | |
5554 sdata_section = get_unnamed_section (SECTION_WRITE, output_section_asm_op, | |
5555 SDATA_SECTION_ASM_OP); | |
5556 #endif | |
5557 | |
5558 #ifdef READONLY_DATA_SECTION_ASM_OP | |
5559 readonly_data_section = get_unnamed_section (0, output_section_asm_op, | |
5560 READONLY_DATA_SECTION_ASM_OP); | |
5561 #endif | |
5562 | |
5563 #ifdef CTORS_SECTION_ASM_OP | |
5564 ctors_section = get_unnamed_section (0, output_section_asm_op, | |
5565 CTORS_SECTION_ASM_OP); | |
5566 #endif | |
5567 | |
5568 #ifdef DTORS_SECTION_ASM_OP | |
5569 dtors_section = get_unnamed_section (0, output_section_asm_op, | |
5570 DTORS_SECTION_ASM_OP); | |
5571 #endif | |
5572 | |
5573 #ifdef BSS_SECTION_ASM_OP | |
5574 bss_section = get_unnamed_section (SECTION_WRITE | SECTION_BSS, | |
5575 output_section_asm_op, | |
5576 BSS_SECTION_ASM_OP); | |
5577 #endif | |
5578 | |
5579 #ifdef SBSS_SECTION_ASM_OP | |
5580 sbss_section = get_unnamed_section (SECTION_WRITE | SECTION_BSS, | |
5581 output_section_asm_op, | |
5582 SBSS_SECTION_ASM_OP); | |
5583 #endif | |
5584 | |
5585 tls_comm_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS | |
5586 | SECTION_COMMON, emit_tls_common); | |
5587 lcomm_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS | |
5588 | SECTION_COMMON, emit_local); | |
5589 comm_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS | |
5590 | SECTION_COMMON, emit_common); | |
5591 | |
5592 #if defined ASM_OUTPUT_ALIGNED_BSS || defined ASM_OUTPUT_BSS | |
5593 bss_noswitch_section = get_noswitch_section (SECTION_WRITE | SECTION_BSS, | |
5594 emit_bss); | |
5595 #endif | |
5596 | |
5597 targetm.asm_out.init_sections (); | |
5598 | |
5599 if (readonly_data_section == NULL) | |
5600 readonly_data_section = text_section; | |
5601 } | |
5602 | |
5603 enum tls_model | |
5604 decl_default_tls_model (const_tree decl) | |
5605 { | |
5606 enum tls_model kind; | |
5607 bool is_local; | |
5608 | |
5609 is_local = targetm.binds_local_p (decl); | |
5610 if (!flag_shlib) | |
5611 { | |
5612 if (is_local) | |
5613 kind = TLS_MODEL_LOCAL_EXEC; | |
5614 else | |
5615 kind = TLS_MODEL_INITIAL_EXEC; | |
5616 } | |
5617 | |
5618 /* Local dynamic is inefficient when we're not combining the | |
5619 parts of the address. */ | |
5620 else if (optimize && is_local) | |
5621 kind = TLS_MODEL_LOCAL_DYNAMIC; | |
5622 else | |
5623 kind = TLS_MODEL_GLOBAL_DYNAMIC; | |
5624 if (kind < flag_tls_default) | |
5625 kind = flag_tls_default; | |
5626 | |
5627 return kind; | |
5628 } | |
5629 | |
5630 /* Select a set of attributes for section NAME based on the properties | |
5631 of DECL and whether or not RELOC indicates that DECL's initializer | |
5632 might contain runtime relocations. | |
5633 | |
5634 We make the section read-only and executable for a function decl, | |
5635 read-only for a const data decl, and writable for a non-const data decl. */ | |
5636 | |
5637 unsigned int | |
5638 default_section_type_flags (tree decl, const char *name, int reloc) | |
5639 { | |
5640 unsigned int flags; | |
5641 | |
5642 if (decl && TREE_CODE (decl) == FUNCTION_DECL) | |
5643 flags = SECTION_CODE; | |
5644 else if (decl && decl_readonly_section (decl, reloc)) | |
5645 flags = 0; | |
5646 else if (current_function_decl | |
5647 && cfun | |
5648 && crtl->subsections.unlikely_text_section_name | |
5649 && strcmp (name, crtl->subsections.unlikely_text_section_name) == 0) | |
5650 flags = SECTION_CODE; | |
5651 else if (!decl | |
5652 && (!current_function_decl || !cfun) | |
5653 && strcmp (name, UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0) | |
5654 flags = SECTION_CODE; | |
5655 else | |
5656 flags = SECTION_WRITE; | |
5657 | |
5658 if (decl && DECL_ONE_ONLY (decl)) | |
5659 flags |= SECTION_LINKONCE; | |
5660 | |
5661 if (decl && TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl)) | |
5662 flags |= SECTION_TLS | SECTION_WRITE; | |
5663 | |
5664 if (strcmp (name, ".bss") == 0 | |
5665 || strncmp (name, ".bss.", 5) == 0 | |
5666 || strncmp (name, ".gnu.linkonce.b.", 16) == 0 | |
5667 || strcmp (name, ".sbss") == 0 | |
5668 || strncmp (name, ".sbss.", 6) == 0 | |
5669 || strncmp (name, ".gnu.linkonce.sb.", 17) == 0) | |
5670 flags |= SECTION_BSS; | |
5671 | |
5672 if (strcmp (name, ".tdata") == 0 | |
5673 || strncmp (name, ".tdata.", 7) == 0 | |
5674 || strncmp (name, ".gnu.linkonce.td.", 17) == 0) | |
5675 flags |= SECTION_TLS; | |
5676 | |
5677 if (strcmp (name, ".tbss") == 0 | |
5678 || strncmp (name, ".tbss.", 6) == 0 | |
5679 || strncmp (name, ".gnu.linkonce.tb.", 17) == 0) | |
5680 flags |= SECTION_TLS | SECTION_BSS; | |
5681 | |
5682 /* These three sections have special ELF types. They are neither | |
5683 SHT_PROGBITS nor SHT_NOBITS, so when changing sections we don't | |
5684 want to print a section type (@progbits or @nobits). If someone | |
5685 is silly enough to emit code or TLS variables to one of these | |
5686 sections, then don't handle them specially. */ | |
5687 if (!(flags & (SECTION_CODE | SECTION_BSS | SECTION_TLS)) | |
5688 && (strcmp (name, ".init_array") == 0 | |
5689 || strcmp (name, ".fini_array") == 0 | |
5690 || strcmp (name, ".preinit_array") == 0)) | |
5691 flags |= SECTION_NOTYPE; | |
5692 | |
5693 return flags; | |
5694 } | |
5695 | |
5696 /* Return true if the target supports some form of global BSS, | |
5697 either through bss_noswitch_section, or by selecting a BSS | |
5698 section in TARGET_ASM_SELECT_SECTION. */ | |
5699 | |
5700 bool | |
5701 have_global_bss_p (void) | |
5702 { | |
5703 return bss_noswitch_section || targetm.have_switchable_bss_sections; | |
5704 } | |
5705 | |
5706 /* Output assembly to switch to section NAME with attribute FLAGS. | |
5707 Four variants for common object file formats. */ | |
5708 | |
5709 void | |
5710 default_no_named_section (const char *name ATTRIBUTE_UNUSED, | |
5711 unsigned int flags ATTRIBUTE_UNUSED, | |
5712 tree decl ATTRIBUTE_UNUSED) | |
5713 { | |
5714 /* Some object formats don't support named sections at all. The | |
5715 front-end should already have flagged this as an error. */ | |
5716 gcc_unreachable (); | |
5717 } | |
5718 | |
5719 void | |
5720 default_elf_asm_named_section (const char *name, unsigned int flags, | |
5721 tree decl ATTRIBUTE_UNUSED) | |
5722 { | |
5723 char flagchars[10], *f = flagchars; | |
5724 | |
5725 /* If we have already declared this section, we can use an | |
5726 abbreviated form to switch back to it -- unless this section is | |
5727 part of a COMDAT groups, in which case GAS requires the full | |
5728 declaration every time. */ | |
5729 if (!(HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE)) | |
5730 && (flags & SECTION_DECLARED)) | |
5731 { | |
5732 fprintf (asm_out_file, "\t.section\t%s\n", name); | |
5733 return; | |
5734 } | |
5735 | |
5736 if (!(flags & SECTION_DEBUG)) | |
5737 *f++ = 'a'; | |
5738 if (flags & SECTION_WRITE) | |
5739 *f++ = 'w'; | |
5740 if (flags & SECTION_CODE) | |
5741 *f++ = 'x'; | |
5742 if (flags & SECTION_SMALL) | |
5743 *f++ = 's'; | |
5744 if (flags & SECTION_MERGE) | |
5745 *f++ = 'M'; | |
5746 if (flags & SECTION_STRINGS) | |
5747 *f++ = 'S'; | |
5748 if (flags & SECTION_TLS) | |
5749 *f++ = 'T'; | |
5750 if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE)) | |
5751 *f++ = 'G'; | |
5752 *f = '\0'; | |
5753 | |
5754 fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars); | |
5755 | |
5756 if (!(flags & SECTION_NOTYPE)) | |
5757 { | |
5758 const char *type; | |
5759 const char *format; | |
5760 | |
5761 if (flags & SECTION_BSS) | |
5762 type = "nobits"; | |
5763 else | |
5764 type = "progbits"; | |
5765 | |
5766 format = ",@%s"; | |
5767 #ifdef ASM_COMMENT_START | |
5768 /* On platforms that use "@" as the assembly comment character, | |
5769 use "%" instead. */ | |
5770 if (strcmp (ASM_COMMENT_START, "@") == 0) | |
5771 format = ",%%%s"; | |
5772 #endif | |
5773 fprintf (asm_out_file, format, type); | |
5774 | |
5775 if (flags & SECTION_ENTSIZE) | |
5776 fprintf (asm_out_file, ",%d", flags & SECTION_ENTSIZE); | |
5777 if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE)) | |
5778 fprintf (asm_out_file, ",%s,comdat", | |
5779 lang_hooks.decls.comdat_group (decl)); | |
5780 } | |
5781 | |
5782 putc ('\n', asm_out_file); | |
5783 } | |
5784 | |
5785 void | |
5786 default_coff_asm_named_section (const char *name, unsigned int flags, | |
5787 tree decl ATTRIBUTE_UNUSED) | |
5788 { | |
5789 char flagchars[8], *f = flagchars; | |
5790 | |
5791 if (flags & SECTION_WRITE) | |
5792 *f++ = 'w'; | |
5793 if (flags & SECTION_CODE) | |
5794 *f++ = 'x'; | |
5795 *f = '\0'; | |
5796 | |
5797 fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars); | |
5798 } | |
5799 | |
5800 void | |
5801 default_pe_asm_named_section (const char *name, unsigned int flags, | |
5802 tree decl) | |
5803 { | |
5804 default_coff_asm_named_section (name, flags, decl); | |
5805 | |
5806 if (flags & SECTION_LINKONCE) | |
5807 { | |
5808 /* Functions may have been compiled at various levels of | |
5809 optimization so we can't use `same_size' here. | |
5810 Instead, have the linker pick one. */ | |
5811 fprintf (asm_out_file, "\t.linkonce %s\n", | |
5812 (flags & SECTION_CODE ? "discard" : "same_size")); | |
5813 } | |
5814 } | |
5815 | |
5816 /* The lame default section selector. */ | |
5817 | |
5818 section * | |
5819 default_select_section (tree decl, int reloc, | |
5820 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED) | |
5821 { | |
5822 if (DECL_P (decl)) | |
5823 { | |
5824 if (decl_readonly_section (decl, reloc)) | |
5825 return readonly_data_section; | |
5826 } | |
5827 else if (TREE_CODE (decl) == CONSTRUCTOR) | |
5828 { | |
5829 if (! ((flag_pic && reloc) | |
5830 || !TREE_READONLY (decl) | |
5831 || TREE_SIDE_EFFECTS (decl) | |
5832 || !TREE_CONSTANT (decl))) | |
5833 return readonly_data_section; | |
5834 } | |
5835 else if (TREE_CODE (decl) == STRING_CST) | |
5836 return readonly_data_section; | |
5837 else if (! (flag_pic && reloc)) | |
5838 return readonly_data_section; | |
5839 | |
5840 return data_section; | |
5841 } | |
5842 | |
5843 enum section_category | |
5844 categorize_decl_for_section (const_tree decl, int reloc) | |
5845 { | |
5846 enum section_category ret; | |
5847 | |
5848 if (TREE_CODE (decl) == FUNCTION_DECL) | |
5849 return SECCAT_TEXT; | |
5850 else if (TREE_CODE (decl) == STRING_CST) | |
5851 { | |
5852 if (flag_mudflap) /* or !flag_merge_constants */ | |
5853 return SECCAT_RODATA; | |
5854 else | |
5855 return SECCAT_RODATA_MERGE_STR; | |
5856 } | |
5857 else if (TREE_CODE (decl) == VAR_DECL) | |
5858 { | |
5859 if (bss_initializer_p (decl)) | |
5860 ret = SECCAT_BSS; | |
5861 else if (! TREE_READONLY (decl) | |
5862 || TREE_SIDE_EFFECTS (decl) | |
5863 || ! TREE_CONSTANT (DECL_INITIAL (decl))) | |
5864 { | |
5865 /* Here the reloc_rw_mask is not testing whether the section should | |
5866 be read-only or not, but whether the dynamic link will have to | |
5867 do something. If so, we wish to segregate the data in order to | |
5868 minimize cache misses inside the dynamic linker. */ | |
5869 if (reloc & targetm.asm_out.reloc_rw_mask ()) | |
5870 ret = reloc == 1 ? SECCAT_DATA_REL_LOCAL : SECCAT_DATA_REL; | |
5871 else | |
5872 ret = SECCAT_DATA; | |
5873 } | |
5874 else if (reloc & targetm.asm_out.reloc_rw_mask ()) | |
5875 ret = reloc == 1 ? SECCAT_DATA_REL_RO_LOCAL : SECCAT_DATA_REL_RO; | |
5876 else if (reloc || flag_merge_constants < 2) | |
5877 /* C and C++ don't allow different variables to share the same | |
5878 location. -fmerge-all-constants allows even that (at the | |
5879 expense of not conforming). */ | |
5880 ret = SECCAT_RODATA; | |
5881 else if (TREE_CODE (DECL_INITIAL (decl)) == STRING_CST) | |
5882 ret = SECCAT_RODATA_MERGE_STR_INIT; | |
5883 else | |
5884 ret = SECCAT_RODATA_MERGE_CONST; | |
5885 } | |
5886 else if (TREE_CODE (decl) == CONSTRUCTOR) | |
5887 { | |
5888 if ((reloc & targetm.asm_out.reloc_rw_mask ()) | |
5889 || TREE_SIDE_EFFECTS (decl) | |
5890 || ! TREE_CONSTANT (decl)) | |
5891 ret = SECCAT_DATA; | |
5892 else | |
5893 ret = SECCAT_RODATA; | |
5894 } | |
5895 else | |
5896 ret = SECCAT_RODATA; | |
5897 | |
5898 /* There are no read-only thread-local sections. */ | |
5899 if (TREE_CODE (decl) == VAR_DECL && DECL_TLS_MODEL (decl)) | |
5900 { | |
5901 if (DECL_TLS_MODEL (decl) == TLS_MODEL_EMULATED) | |
5902 { | |
5903 if (DECL_EMUTLS_VAR_P (decl)) | |
5904 { | |
5905 if (targetm.emutls.var_section) | |
5906 ret = SECCAT_EMUTLS_VAR; | |
5907 } | |
5908 else | |
5909 { | |
5910 if (targetm.emutls.tmpl_prefix) | |
5911 ret = SECCAT_EMUTLS_TMPL; | |
5912 } | |
5913 } | |
5914 /* Note that this would be *just* SECCAT_BSS, except that there's | |
5915 no concept of a read-only thread-local-data section. */ | |
5916 else if (ret == SECCAT_BSS | |
5917 || (flag_zero_initialized_in_bss | |
5918 && initializer_zerop (DECL_INITIAL (decl)))) | |
5919 ret = SECCAT_TBSS; | |
5920 else | |
5921 ret = SECCAT_TDATA; | |
5922 } | |
5923 | |
5924 /* If the target uses small data sections, select it. */ | |
5925 else if (targetm.in_small_data_p (decl)) | |
5926 { | |
5927 if (ret == SECCAT_BSS) | |
5928 ret = SECCAT_SBSS; | |
5929 else if (targetm.have_srodata_section && ret == SECCAT_RODATA) | |
5930 ret = SECCAT_SRODATA; | |
5931 else | |
5932 ret = SECCAT_SDATA; | |
5933 } | |
5934 | |
5935 return ret; | |
5936 } | |
5937 | |
5938 bool | |
5939 decl_readonly_section (const_tree decl, int reloc) | |
5940 { | |
5941 switch (categorize_decl_for_section (decl, reloc)) | |
5942 { | |
5943 case SECCAT_RODATA: | |
5944 case SECCAT_RODATA_MERGE_STR: | |
5945 case SECCAT_RODATA_MERGE_STR_INIT: | |
5946 case SECCAT_RODATA_MERGE_CONST: | |
5947 case SECCAT_SRODATA: | |
5948 return true; | |
5949 break; | |
5950 default: | |
5951 return false; | |
5952 break; | |
5953 } | |
5954 } | |
5955 | |
5956 /* Select a section based on the above categorization. */ | |
5957 | |
5958 section * | |
5959 default_elf_select_section (tree decl, int reloc, | |
5960 unsigned HOST_WIDE_INT align) | |
5961 { | |
5962 const char *sname; | |
5963 switch (categorize_decl_for_section (decl, reloc)) | |
5964 { | |
5965 case SECCAT_TEXT: | |
5966 /* We're not supposed to be called on FUNCTION_DECLs. */ | |
5967 gcc_unreachable (); | |
5968 case SECCAT_RODATA: | |
5969 return readonly_data_section; | |
5970 case SECCAT_RODATA_MERGE_STR: | |
5971 return mergeable_string_section (decl, align, 0); | |
5972 case SECCAT_RODATA_MERGE_STR_INIT: | |
5973 return mergeable_string_section (DECL_INITIAL (decl), align, 0); | |
5974 case SECCAT_RODATA_MERGE_CONST: | |
5975 return mergeable_constant_section (DECL_MODE (decl), align, 0); | |
5976 case SECCAT_SRODATA: | |
5977 sname = ".sdata2"; | |
5978 break; | |
5979 case SECCAT_DATA: | |
5980 return data_section; | |
5981 case SECCAT_DATA_REL: | |
5982 sname = ".data.rel"; | |
5983 break; | |
5984 case SECCAT_DATA_REL_LOCAL: | |
5985 sname = ".data.rel.local"; | |
5986 break; | |
5987 case SECCAT_DATA_REL_RO: | |
5988 sname = ".data.rel.ro"; | |
5989 break; | |
5990 case SECCAT_DATA_REL_RO_LOCAL: | |
5991 sname = ".data.rel.ro.local"; | |
5992 break; | |
5993 case SECCAT_SDATA: | |
5994 sname = ".sdata"; | |
5995 break; | |
5996 case SECCAT_TDATA: | |
5997 sname = ".tdata"; | |
5998 break; | |
5999 case SECCAT_BSS: | |
6000 if (bss_section) | |
6001 return bss_section; | |
6002 sname = ".bss"; | |
6003 break; | |
6004 case SECCAT_SBSS: | |
6005 sname = ".sbss"; | |
6006 break; | |
6007 case SECCAT_TBSS: | |
6008 sname = ".tbss"; | |
6009 break; | |
6010 case SECCAT_EMUTLS_VAR: | |
6011 sname = targetm.emutls.var_section; | |
6012 break; | |
6013 case SECCAT_EMUTLS_TMPL: | |
6014 sname = targetm.emutls.tmpl_section; | |
6015 break; | |
6016 default: | |
6017 gcc_unreachable (); | |
6018 } | |
6019 | |
6020 if (!DECL_P (decl)) | |
6021 decl = NULL_TREE; | |
6022 return get_named_section (decl, sname, reloc); | |
6023 } | |
6024 | |
6025 /* Construct a unique section name based on the decl name and the | |
6026 categorization performed above. */ | |
6027 | |
6028 void | |
6029 default_unique_section (tree decl, int reloc) | |
6030 { | |
6031 /* We only need to use .gnu.linkonce if we don't have COMDAT groups. */ | |
6032 bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP; | |
6033 const char *prefix, *name, *linkonce; | |
6034 char *string; | |
6035 | |
6036 switch (categorize_decl_for_section (decl, reloc)) | |
6037 { | |
6038 case SECCAT_TEXT: | |
6039 prefix = one_only ? ".t" : ".text"; | |
6040 break; | |
6041 case SECCAT_RODATA: | |
6042 case SECCAT_RODATA_MERGE_STR: | |
6043 case SECCAT_RODATA_MERGE_STR_INIT: | |
6044 case SECCAT_RODATA_MERGE_CONST: | |
6045 prefix = one_only ? ".r" : ".rodata"; | |
6046 break; | |
6047 case SECCAT_SRODATA: | |
6048 prefix = one_only ? ".s2" : ".sdata2"; | |
6049 break; | |
6050 case SECCAT_DATA: | |
6051 prefix = one_only ? ".d" : ".data"; | |
6052 break; | |
6053 case SECCAT_DATA_REL: | |
6054 prefix = one_only ? ".d.rel" : ".data.rel"; | |
6055 break; | |
6056 case SECCAT_DATA_REL_LOCAL: | |
6057 prefix = one_only ? ".d.rel.local" : ".data.rel.local"; | |
6058 break; | |
6059 case SECCAT_DATA_REL_RO: | |
6060 prefix = one_only ? ".d.rel.ro" : ".data.rel.ro"; | |
6061 break; | |
6062 case SECCAT_DATA_REL_RO_LOCAL: | |
6063 prefix = one_only ? ".d.rel.ro.local" : ".data.rel.ro.local"; | |
6064 break; | |
6065 case SECCAT_SDATA: | |
6066 prefix = one_only ? ".s" : ".sdata"; | |
6067 break; | |
6068 case SECCAT_BSS: | |
6069 prefix = one_only ? ".b" : ".bss"; | |
6070 break; | |
6071 case SECCAT_SBSS: | |
6072 prefix = one_only ? ".sb" : ".sbss"; | |
6073 break; | |
6074 case SECCAT_TDATA: | |
6075 prefix = one_only ? ".td" : ".tdata"; | |
6076 break; | |
6077 case SECCAT_TBSS: | |
6078 prefix = one_only ? ".tb" : ".tbss"; | |
6079 break; | |
6080 case SECCAT_EMUTLS_VAR: | |
6081 prefix = targetm.emutls.var_section; | |
6082 break; | |
6083 case SECCAT_EMUTLS_TMPL: | |
6084 prefix = targetm.emutls.tmpl_section; | |
6085 break; | |
6086 default: | |
6087 gcc_unreachable (); | |
6088 } | |
6089 | |
6090 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); | |
6091 name = targetm.strip_name_encoding (name); | |
6092 | |
6093 /* If we're using one_only, then there needs to be a .gnu.linkonce | |
6094 prefix to the section name. */ | |
6095 linkonce = one_only ? ".gnu.linkonce" : ""; | |
6096 | |
6097 string = ACONCAT ((linkonce, prefix, ".", name, NULL)); | |
6098 | |
6099 DECL_SECTION_NAME (decl) = build_string (strlen (string), string); | |
6100 } | |
6101 | |
6102 /* Like compute_reloc_for_constant, except for an RTX. The return value | |
6103 is a mask for which bit 1 indicates a global relocation, and bit 0 | |
6104 indicates a local relocation. */ | |
6105 | |
6106 static int | |
6107 compute_reloc_for_rtx_1 (rtx *xp, void *data) | |
6108 { | |
6109 int *preloc = (int *) data; | |
6110 rtx x = *xp; | |
6111 | |
6112 switch (GET_CODE (x)) | |
6113 { | |
6114 case SYMBOL_REF: | |
6115 *preloc |= SYMBOL_REF_LOCAL_P (x) ? 1 : 2; | |
6116 break; | |
6117 case LABEL_REF: | |
6118 *preloc |= 1; | |
6119 break; | |
6120 default: | |
6121 break; | |
6122 } | |
6123 | |
6124 return 0; | |
6125 } | |
6126 | |
6127 static int | |
6128 compute_reloc_for_rtx (rtx x) | |
6129 { | |
6130 int reloc; | |
6131 | |
6132 switch (GET_CODE (x)) | |
6133 { | |
6134 case CONST: | |
6135 case SYMBOL_REF: | |
6136 case LABEL_REF: | |
6137 reloc = 0; | |
6138 for_each_rtx (&x, compute_reloc_for_rtx_1, &reloc); | |
6139 return reloc; | |
6140 | |
6141 default: | |
6142 return 0; | |
6143 } | |
6144 } | |
6145 | |
6146 section * | |
6147 default_select_rtx_section (enum machine_mode mode ATTRIBUTE_UNUSED, | |
6148 rtx x, | |
6149 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED) | |
6150 { | |
6151 if (compute_reloc_for_rtx (x) & targetm.asm_out.reloc_rw_mask ()) | |
6152 return data_section; | |
6153 else | |
6154 return readonly_data_section; | |
6155 } | |
6156 | |
6157 section * | |
6158 default_elf_select_rtx_section (enum machine_mode mode, rtx x, | |
6159 unsigned HOST_WIDE_INT align) | |
6160 { | |
6161 int reloc = compute_reloc_for_rtx (x); | |
6162 | |
6163 /* ??? Handle small data here somehow. */ | |
6164 | |
6165 if (reloc & targetm.asm_out.reloc_rw_mask ()) | |
6166 { | |
6167 if (reloc == 1) | |
6168 return get_named_section (NULL, ".data.rel.ro.local", 1); | |
6169 else | |
6170 return get_named_section (NULL, ".data.rel.ro", 3); | |
6171 } | |
6172 | |
6173 return mergeable_constant_section (mode, align, 0); | |
6174 } | |
6175 | |
6176 /* Set the generally applicable flags on the SYMBOL_REF for EXP. */ | |
6177 | |
6178 void | |
6179 default_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED) | |
6180 { | |
6181 rtx symbol; | |
6182 int flags; | |
6183 | |
6184 /* Careful not to prod global register variables. */ | |
6185 if (!MEM_P (rtl)) | |
6186 return; | |
6187 symbol = XEXP (rtl, 0); | |
6188 if (GET_CODE (symbol) != SYMBOL_REF) | |
6189 return; | |
6190 | |
6191 flags = SYMBOL_REF_FLAGS (symbol) & SYMBOL_FLAG_HAS_BLOCK_INFO; | |
6192 if (TREE_CODE (decl) == FUNCTION_DECL) | |
6193 flags |= SYMBOL_FLAG_FUNCTION; | |
6194 if (targetm.binds_local_p (decl)) | |
6195 flags |= SYMBOL_FLAG_LOCAL; | |
6196 if (targetm.have_tls && TREE_CODE (decl) == VAR_DECL | |
6197 && DECL_THREAD_LOCAL_P (decl)) | |
6198 flags |= DECL_TLS_MODEL (decl) << SYMBOL_FLAG_TLS_SHIFT; | |
6199 else if (targetm.in_small_data_p (decl)) | |
6200 flags |= SYMBOL_FLAG_SMALL; | |
6201 /* ??? Why is DECL_EXTERNAL ever set for non-PUBLIC names? Without | |
6202 being PUBLIC, the thing *must* be defined in this translation unit. | |
6203 Prevent this buglet from being propagated into rtl code as well. */ | |
6204 if (DECL_P (decl) && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl)) | |
6205 flags |= SYMBOL_FLAG_EXTERNAL; | |
6206 | |
6207 SYMBOL_REF_FLAGS (symbol) = flags; | |
6208 } | |
6209 | |
6210 /* By default, we do nothing for encode_section_info, so we need not | |
6211 do anything but discard the '*' marker. */ | |
6212 | |
6213 const char * | |
6214 default_strip_name_encoding (const char *str) | |
6215 { | |
6216 return str + (*str == '*'); | |
6217 } | |
6218 | |
6219 #ifdef ASM_OUTPUT_DEF | |
6220 /* The default implementation of TARGET_ASM_OUTPUT_ANCHOR. Define the | |
6221 anchor relative to ".", the current section position. */ | |
6222 | |
6223 void | |
6224 default_asm_output_anchor (rtx symbol) | |
6225 { | |
6226 char buffer[100]; | |
6227 | |
6228 sprintf (buffer, "*. + " HOST_WIDE_INT_PRINT_DEC, | |
6229 SYMBOL_REF_BLOCK_OFFSET (symbol)); | |
6230 ASM_OUTPUT_DEF (asm_out_file, XSTR (symbol, 0), buffer); | |
6231 } | |
6232 #endif | |
6233 | |
6234 /* The default implementation of TARGET_USE_ANCHORS_FOR_SYMBOL_P. */ | |
6235 | |
6236 bool | |
6237 default_use_anchors_for_symbol_p (const_rtx symbol) | |
6238 { | |
6239 section *sect; | |
6240 tree decl; | |
6241 | |
6242 /* Don't use anchors for mergeable sections. The linker might move | |
6243 the objects around. */ | |
6244 sect = SYMBOL_REF_BLOCK (symbol)->sect; | |
6245 if (sect->common.flags & SECTION_MERGE) | |
6246 return false; | |
6247 | |
6248 /* Don't use anchors for small data sections. The small data register | |
6249 acts as an anchor for such sections. */ | |
6250 if (sect->common.flags & SECTION_SMALL) | |
6251 return false; | |
6252 | |
6253 decl = SYMBOL_REF_DECL (symbol); | |
6254 if (decl && DECL_P (decl)) | |
6255 { | |
6256 /* Don't use section anchors for decls that might be defined by | |
6257 other modules. */ | |
6258 if (!targetm.binds_local_p (decl)) | |
6259 return false; | |
6260 | |
6261 /* Don't use section anchors for decls that will be placed in a | |
6262 small data section. */ | |
6263 /* ??? Ideally, this check would be redundant with the SECTION_SMALL | |
6264 one above. The problem is that we only use SECTION_SMALL for | |
6265 sections that should be marked as small in the section directive. */ | |
6266 if (targetm.in_small_data_p (decl)) | |
6267 return false; | |
6268 } | |
6269 return true; | |
6270 } | |
6271 | |
6272 /* Assume ELF-ish defaults, since that's pretty much the most liberal | |
6273 wrt cross-module name binding. */ | |
6274 | |
6275 bool | |
6276 default_binds_local_p (const_tree exp) | |
6277 { | |
6278 return default_binds_local_p_1 (exp, flag_shlib); | |
6279 } | |
6280 | |
6281 bool | |
6282 default_binds_local_p_1 (const_tree exp, int shlib) | |
6283 { | |
6284 bool local_p; | |
6285 | |
6286 /* A non-decl is an entry in the constant pool. */ | |
6287 if (!DECL_P (exp)) | |
6288 local_p = true; | |
6289 /* Weakrefs may not bind locally, even though the weakref itself is | |
6290 always static and therefore local. */ | |
6291 else if (lookup_attribute ("weakref", DECL_ATTRIBUTES (exp))) | |
6292 local_p = false; | |
6293 /* Static variables are always local. */ | |
6294 else if (! TREE_PUBLIC (exp)) | |
6295 local_p = true; | |
6296 /* A variable is local if the user has said explicitly that it will | |
6297 be. */ | |
6298 else if (DECL_VISIBILITY_SPECIFIED (exp) | |
6299 && DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT) | |
6300 local_p = true; | |
6301 /* Variables defined outside this object might not be local. */ | |
6302 else if (DECL_EXTERNAL (exp)) | |
6303 local_p = false; | |
6304 /* If defined in this object and visibility is not default, must be | |
6305 local. */ | |
6306 else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT) | |
6307 local_p = true; | |
6308 /* Default visibility weak data can be overridden by a strong symbol | |
6309 in another module and so are not local. */ | |
6310 else if (DECL_WEAK (exp)) | |
6311 local_p = false; | |
6312 /* If PIC, then assume that any global name can be overridden by | |
6313 symbols resolved from other modules, unless we are compiling with | |
6314 -fwhole-program, which assumes that names are local. */ | |
6315 else if (shlib) | |
6316 local_p = flag_whole_program; | |
6317 /* Uninitialized COMMON variable may be unified with symbols | |
6318 resolved from other modules. */ | |
6319 else if (DECL_COMMON (exp) | |
6320 && (DECL_INITIAL (exp) == NULL | |
6321 || DECL_INITIAL (exp) == error_mark_node)) | |
6322 local_p = false; | |
6323 /* Otherwise we're left with initialized (or non-common) global data | |
6324 which is of necessity defined locally. */ | |
6325 else | |
6326 local_p = true; | |
6327 | |
6328 return local_p; | |
6329 } | |
6330 | |
6331 /* Determine whether or not a pointer mode is valid. Assume defaults | |
6332 of ptr_mode or Pmode - can be overridden. */ | |
6333 bool | |
6334 default_valid_pointer_mode (enum machine_mode mode) | |
6335 { | |
6336 return (mode == ptr_mode || mode == Pmode); | |
6337 } | |
6338 | |
6339 /* Default function to output code that will globalize a label. A | |
6340 target must define GLOBAL_ASM_OP or provide its own function to | |
6341 globalize a label. */ | |
6342 #ifdef GLOBAL_ASM_OP | |
6343 void | |
6344 default_globalize_label (FILE * stream, const char *name) | |
6345 { | |
6346 fputs (GLOBAL_ASM_OP, stream); | |
6347 assemble_name (stream, name); | |
6348 putc ('\n', stream); | |
6349 } | |
6350 #endif /* GLOBAL_ASM_OP */ | |
6351 | |
6352 /* Default function to output code that will globalize a declaration. */ | |
6353 void | |
6354 default_globalize_decl_name (FILE * stream, tree decl) | |
6355 { | |
6356 const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0); | |
6357 targetm.asm_out.globalize_label (stream, name); | |
6358 } | |
6359 | |
6360 /* Default function to output a label for unwind information. The | |
6361 default is to do nothing. A target that needs nonlocal labels for | |
6362 unwind information must provide its own function to do this. */ | |
6363 void | |
6364 default_emit_unwind_label (FILE * stream ATTRIBUTE_UNUSED, | |
6365 tree decl ATTRIBUTE_UNUSED, | |
6366 int for_eh ATTRIBUTE_UNUSED, | |
6367 int empty ATTRIBUTE_UNUSED) | |
6368 { | |
6369 } | |
6370 | |
6371 /* Default function to output a label to divide up the exception table. | |
6372 The default is to do nothing. A target that needs/wants to divide | |
6373 up the table must provide it's own function to do this. */ | |
6374 void | |
6375 default_emit_except_table_label (FILE * stream ATTRIBUTE_UNUSED) | |
6376 { | |
6377 } | |
6378 | |
6379 /* This is how to output an internal numbered label where PREFIX is | |
6380 the class of label and LABELNO is the number within the class. */ | |
6381 | |
6382 void | |
6383 default_internal_label (FILE *stream, const char *prefix, | |
6384 unsigned long labelno) | |
6385 { | |
6386 char *const buf = (char *) alloca (40 + strlen (prefix)); | |
6387 ASM_GENERATE_INTERNAL_LABEL (buf, prefix, labelno); | |
6388 ASM_OUTPUT_INTERNAL_LABEL (stream, buf); | |
6389 } | |
6390 | |
6391 /* This is the default behavior at the beginning of a file. It's | |
6392 controlled by two other target-hook toggles. */ | |
6393 void | |
6394 default_file_start (void) | |
6395 { | |
6396 if (targetm.file_start_app_off | |
6397 && !(flag_verbose_asm || flag_debug_asm || flag_dump_rtl_in_asm)) | |
6398 fputs (ASM_APP_OFF, asm_out_file); | |
6399 | |
6400 if (targetm.file_start_file_directive) | |
6401 output_file_directive (asm_out_file, main_input_filename); | |
6402 } | |
6403 | |
6404 /* This is a generic routine suitable for use as TARGET_ASM_FILE_END | |
6405 which emits a special section directive used to indicate whether or | |
6406 not this object file needs an executable stack. This is primarily | |
6407 a GNU extension to ELF but could be used on other targets. */ | |
6408 | |
6409 int trampolines_created; | |
6410 | |
6411 void | |
6412 file_end_indicate_exec_stack (void) | |
6413 { | |
6414 unsigned int flags = SECTION_DEBUG; | |
6415 if (trampolines_created) | |
6416 flags |= SECTION_CODE; | |
6417 | |
6418 switch_to_section (get_section (".note.GNU-stack", flags, NULL)); | |
6419 } | |
6420 | |
6421 /* Output DIRECTIVE (a C string) followed by a newline. This is used as | |
6422 a get_unnamed_section callback. */ | |
6423 | |
6424 void | |
6425 output_section_asm_op (const void *directive) | |
6426 { | |
6427 fprintf (asm_out_file, "%s\n", (const char *) directive); | |
6428 } | |
6429 | |
6430 /* Emit assembly code to switch to section NEW_SECTION. Do nothing if | |
6431 the current section is NEW_SECTION. */ | |
6432 | |
6433 void | |
6434 switch_to_section (section *new_section) | |
6435 { | |
6436 if (in_section == new_section) | |
6437 return; | |
6438 | |
6439 if (new_section->common.flags & SECTION_FORGET) | |
6440 in_section = NULL; | |
6441 else | |
6442 in_section = new_section; | |
6443 | |
6444 switch (SECTION_STYLE (new_section)) | |
6445 { | |
6446 case SECTION_NAMED: | |
6447 if (cfun | |
6448 && !crtl->subsections.unlikely_text_section_name | |
6449 && strcmp (new_section->named.name, | |
6450 UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0) | |
6451 crtl->subsections.unlikely_text_section_name = UNLIKELY_EXECUTED_TEXT_SECTION_NAME; | |
6452 | |
6453 targetm.asm_out.named_section (new_section->named.name, | |
6454 new_section->named.common.flags, | |
6455 new_section->named.decl); | |
6456 break; | |
6457 | |
6458 case SECTION_UNNAMED: | |
6459 new_section->unnamed.callback (new_section->unnamed.data); | |
6460 break; | |
6461 | |
6462 case SECTION_NOSWITCH: | |
6463 gcc_unreachable (); | |
6464 break; | |
6465 } | |
6466 | |
6467 new_section->common.flags |= SECTION_DECLARED; | |
6468 } | |
6469 | |
6470 /* If block symbol SYMBOL has not yet been assigned an offset, place | |
6471 it at the end of its block. */ | |
6472 | |
6473 void | |
6474 place_block_symbol (rtx symbol) | |
6475 { | |
6476 unsigned HOST_WIDE_INT size, mask, offset; | |
6477 struct constant_descriptor_rtx *desc; | |
6478 unsigned int alignment; | |
6479 struct object_block *block; | |
6480 tree decl; | |
6481 | |
6482 gcc_assert (SYMBOL_REF_BLOCK (symbol)); | |
6483 if (SYMBOL_REF_BLOCK_OFFSET (symbol) >= 0) | |
6484 return; | |
6485 | |
6486 /* Work out the symbol's size and alignment. */ | |
6487 if (CONSTANT_POOL_ADDRESS_P (symbol)) | |
6488 { | |
6489 desc = SYMBOL_REF_CONSTANT (symbol); | |
6490 alignment = desc->align; | |
6491 size = GET_MODE_SIZE (desc->mode); | |
6492 } | |
6493 else if (TREE_CONSTANT_POOL_ADDRESS_P (symbol)) | |
6494 { | |
6495 decl = SYMBOL_REF_DECL (symbol); | |
6496 alignment = get_constant_alignment (decl); | |
6497 size = get_constant_size (decl); | |
6498 } | |
6499 else | |
6500 { | |
6501 decl = SYMBOL_REF_DECL (symbol); | |
6502 alignment = DECL_ALIGN (decl); | |
6503 size = tree_low_cst (DECL_SIZE_UNIT (decl), 1); | |
6504 } | |
6505 | |
6506 /* Calculate the object's offset from the start of the block. */ | |
6507 block = SYMBOL_REF_BLOCK (symbol); | |
6508 mask = alignment / BITS_PER_UNIT - 1; | |
6509 offset = (block->size + mask) & ~mask; | |
6510 SYMBOL_REF_BLOCK_OFFSET (symbol) = offset; | |
6511 | |
6512 /* Record the block's new alignment and size. */ | |
6513 block->alignment = MAX (block->alignment, alignment); | |
6514 block->size = offset + size; | |
6515 | |
6516 VEC_safe_push (rtx, gc, block->objects, symbol); | |
6517 } | |
6518 | |
6519 /* Return the anchor that should be used to address byte offset OFFSET | |
6520 from the first object in BLOCK. MODEL is the TLS model used | |
6521 to access it. */ | |
6522 | |
6523 rtx | |
6524 get_section_anchor (struct object_block *block, HOST_WIDE_INT offset, | |
6525 enum tls_model model) | |
6526 { | |
6527 char label[100]; | |
6528 unsigned int begin, middle, end; | |
6529 unsigned HOST_WIDE_INT min_offset, max_offset, range, bias, delta; | |
6530 rtx anchor; | |
6531 | |
6532 /* Work out the anchor's offset. Use an offset of 0 for the first | |
6533 anchor so that we don't pessimize the case where we take the address | |
6534 of a variable at the beginning of the block. This is particularly | |
6535 useful when a block has only one variable assigned to it. | |
6536 | |
6537 We try to place anchors RANGE bytes apart, so there can then be | |
6538 anchors at +/-RANGE, +/-2 * RANGE, and so on, up to the limits of | |
6539 a ptr_mode offset. With some target settings, the lowest such | |
6540 anchor might be out of range for the lowest ptr_mode offset; | |
6541 likewise the highest anchor for the highest offset. Use anchors | |
6542 at the extreme ends of the ptr_mode range in such cases. | |
6543 | |
6544 All arithmetic uses unsigned integers in order to avoid | |
6545 signed overflow. */ | |
6546 max_offset = (unsigned HOST_WIDE_INT) targetm.max_anchor_offset; | |
6547 min_offset = (unsigned HOST_WIDE_INT) targetm.min_anchor_offset; | |
6548 range = max_offset - min_offset + 1; | |
6549 if (range == 0) | |
6550 offset = 0; | |
6551 else | |
6552 { | |
6553 bias = 1 << (GET_MODE_BITSIZE (ptr_mode) - 1); | |
6554 if (offset < 0) | |
6555 { | |
6556 delta = -(unsigned HOST_WIDE_INT) offset + max_offset; | |
6557 delta -= delta % range; | |
6558 if (delta > bias) | |
6559 delta = bias; | |
6560 offset = (HOST_WIDE_INT) (-delta); | |
6561 } | |
6562 else | |
6563 { | |
6564 delta = (unsigned HOST_WIDE_INT) offset - min_offset; | |
6565 delta -= delta % range; | |
6566 if (delta > bias - 1) | |
6567 delta = bias - 1; | |
6568 offset = (HOST_WIDE_INT) delta; | |
6569 } | |
6570 } | |
6571 | |
6572 /* Do a binary search to see if there's already an anchor we can use. | |
6573 Set BEGIN to the new anchor's index if not. */ | |
6574 begin = 0; | |
6575 end = VEC_length (rtx, block->anchors); | |
6576 while (begin != end) | |
6577 { | |
6578 middle = (end + begin) / 2; | |
6579 anchor = VEC_index (rtx, block->anchors, middle); | |
6580 if (SYMBOL_REF_BLOCK_OFFSET (anchor) > offset) | |
6581 end = middle; | |
6582 else if (SYMBOL_REF_BLOCK_OFFSET (anchor) < offset) | |
6583 begin = middle + 1; | |
6584 else if (SYMBOL_REF_TLS_MODEL (anchor) > model) | |
6585 end = middle; | |
6586 else if (SYMBOL_REF_TLS_MODEL (anchor) < model) | |
6587 begin = middle + 1; | |
6588 else | |
6589 return anchor; | |
6590 } | |
6591 | |
6592 /* Create a new anchor with a unique label. */ | |
6593 ASM_GENERATE_INTERNAL_LABEL (label, "LANCHOR", anchor_labelno++); | |
6594 anchor = create_block_symbol (ggc_strdup (label), block, offset); | |
6595 SYMBOL_REF_FLAGS (anchor) |= SYMBOL_FLAG_LOCAL | SYMBOL_FLAG_ANCHOR; | |
6596 SYMBOL_REF_FLAGS (anchor) |= model << SYMBOL_FLAG_TLS_SHIFT; | |
6597 | |
6598 /* Insert it at index BEGIN. */ | |
6599 VEC_safe_insert (rtx, gc, block->anchors, begin, anchor); | |
6600 return anchor; | |
6601 } | |
6602 | |
6603 /* Output the objects in BLOCK. */ | |
6604 | |
6605 static void | |
6606 output_object_block (struct object_block *block) | |
6607 { | |
6608 struct constant_descriptor_rtx *desc; | |
6609 unsigned int i; | |
6610 HOST_WIDE_INT offset; | |
6611 tree decl; | |
6612 rtx symbol; | |
6613 | |
6614 if (block->objects == NULL) | |
6615 return; | |
6616 | |
6617 /* Switch to the section and make sure that the first byte is | |
6618 suitably aligned. */ | |
6619 switch_to_section (block->sect); | |
6620 assemble_align (block->alignment); | |
6621 | |
6622 /* Define the values of all anchors relative to the current section | |
6623 position. */ | |
6624 for (i = 0; VEC_iterate (rtx, block->anchors, i, symbol); i++) | |
6625 targetm.asm_out.output_anchor (symbol); | |
6626 | |
6627 /* Output the objects themselves. */ | |
6628 offset = 0; | |
6629 for (i = 0; VEC_iterate (rtx, block->objects, i, symbol); i++) | |
6630 { | |
6631 /* Move to the object's offset, padding with zeros if necessary. */ | |
6632 assemble_zeros (SYMBOL_REF_BLOCK_OFFSET (symbol) - offset); | |
6633 offset = SYMBOL_REF_BLOCK_OFFSET (symbol); | |
6634 if (CONSTANT_POOL_ADDRESS_P (symbol)) | |
6635 { | |
6636 desc = SYMBOL_REF_CONSTANT (symbol); | |
6637 output_constant_pool_1 (desc, 1); | |
6638 offset += GET_MODE_SIZE (desc->mode); | |
6639 } | |
6640 else if (TREE_CONSTANT_POOL_ADDRESS_P (symbol)) | |
6641 { | |
6642 decl = SYMBOL_REF_DECL (symbol); | |
6643 assemble_constant_contents (decl, XSTR (symbol, 0), | |
6644 get_constant_alignment (decl)); | |
6645 offset += get_constant_size (decl); | |
6646 } | |
6647 else | |
6648 { | |
6649 decl = SYMBOL_REF_DECL (symbol); | |
6650 assemble_variable_contents (decl, XSTR (symbol, 0), false); | |
6651 offset += tree_low_cst (DECL_SIZE_UNIT (decl), 1); | |
6652 } | |
6653 } | |
6654 } | |
6655 | |
6656 /* A htab_traverse callback used to call output_object_block for | |
6657 each member of object_block_htab. */ | |
6658 | |
6659 static int | |
6660 output_object_block_htab (void **slot, void *data ATTRIBUTE_UNUSED) | |
6661 { | |
6662 output_object_block ((struct object_block *) (*slot)); | |
6663 return 1; | |
6664 } | |
6665 | |
6666 /* Output the definitions of all object_blocks. */ | |
6667 | |
6668 void | |
6669 output_object_blocks (void) | |
6670 { | |
6671 htab_traverse (object_block_htab, output_object_block_htab, NULL); | |
6672 } | |
6673 | |
6674 /* This function provides a possible implementation of the | |
6675 TARGET_ASM_RECORD_GCC_SWITCHES target hook for ELF targets. When triggered | |
6676 by -frecord-gcc-switches it creates a new mergeable, string section in the | |
6677 assembler output file called TARGET_ASM_RECORD_GCC_SWITCHES_SECTION which | |
6678 contains the switches in ASCII format. | |
6679 | |
6680 FIXME: This code does not correctly handle double quote characters | |
6681 that appear inside strings, (it strips them rather than preserving them). | |
6682 FIXME: ASM_OUTPUT_ASCII, as defined in config/elfos.h will not emit NUL | |
6683 characters - instead it treats them as sub-string separators. Since | |
6684 we want to emit NUL strings terminators into the object file we have to use | |
6685 ASM_OUTPUT_SKIP. */ | |
6686 | |
6687 int | |
6688 elf_record_gcc_switches (print_switch_type type, const char * name) | |
6689 { | |
6690 static char buffer[1024]; | |
6691 | |
6692 /* This variable is used as part of a simplistic heuristic to detect | |
6693 command line switches which take an argument: | |
6694 | |
6695 "If a command line option does not start with a dash then | |
6696 it is an argument for the previous command line option." | |
6697 | |
6698 This fails in the case of the command line option which is the name | |
6699 of the file to compile, but otherwise it is pretty reasonable. */ | |
6700 static bool previous_name_held_back = FALSE; | |
6701 | |
6702 switch (type) | |
6703 { | |
6704 case SWITCH_TYPE_PASSED: | |
6705 if (* name != '-') | |
6706 { | |
6707 if (previous_name_held_back) | |
6708 { | |
6709 unsigned int len = strlen (buffer); | |
6710 | |
6711 snprintf (buffer + len, sizeof buffer - len, " %s", name); | |
6712 ASM_OUTPUT_ASCII (asm_out_file, buffer, strlen (buffer)); | |
6713 ASM_OUTPUT_SKIP (asm_out_file, (unsigned HOST_WIDE_INT) 1); | |
6714 previous_name_held_back = FALSE; | |
6715 } | |
6716 else | |
6717 { | |
6718 strncpy (buffer, name, sizeof buffer); | |
6719 ASM_OUTPUT_ASCII (asm_out_file, buffer, strlen (buffer)); | |
6720 ASM_OUTPUT_SKIP (asm_out_file, (unsigned HOST_WIDE_INT) 1); | |
6721 } | |
6722 } | |
6723 else | |
6724 { | |
6725 if (previous_name_held_back) | |
6726 { | |
6727 ASM_OUTPUT_ASCII (asm_out_file, buffer, strlen (buffer)); | |
6728 ASM_OUTPUT_SKIP (asm_out_file, (unsigned HOST_WIDE_INT) 1); | |
6729 } | |
6730 | |
6731 strncpy (buffer, name, sizeof buffer); | |
6732 previous_name_held_back = TRUE; | |
6733 } | |
6734 break; | |
6735 | |
6736 case SWITCH_TYPE_DESCRIPTIVE: | |
6737 if (name == NULL) | |
6738 { | |
6739 /* Distinguish between invocations where name is NULL. */ | |
6740 static bool started = false; | |
6741 | |
6742 if (started) | |
6743 { | |
6744 if (previous_name_held_back) | |
6745 { | |
6746 ASM_OUTPUT_ASCII (asm_out_file, buffer, strlen (buffer)); | |
6747 ASM_OUTPUT_SKIP (asm_out_file, (unsigned HOST_WIDE_INT) 1); | |
6748 } | |
6749 } | |
6750 else | |
6751 { | |
6752 section * sec; | |
6753 | |
6754 sec = get_section (targetm.asm_out.record_gcc_switches_section, | |
6755 SECTION_DEBUG | |
6756 | SECTION_MERGE | |
6757 | SECTION_STRINGS | |
6758 | (SECTION_ENTSIZE & 1), | |
6759 NULL); | |
6760 switch_to_section (sec); | |
6761 started = true; | |
6762 } | |
6763 } | |
6764 | |
6765 default: | |
6766 break; | |
6767 } | |
6768 | |
6769 /* The return value is currently ignored by the caller, but must be 0. | |
6770 For -fverbose-asm the return value would be the number of characters | |
6771 emitted into the assembler file. */ | |
6772 return 0; | |
6773 } | |
6774 | |
6775 /* Emit text to declare externally defined symbols. It is needed to | |
6776 properly support non-default visibility. */ | |
6777 void | |
6778 default_elf_asm_output_external (FILE *file ATTRIBUTE_UNUSED, | |
6779 tree decl, | |
6780 const char *name ATTRIBUTE_UNUSED) | |
6781 { | |
6782 /* We output the name if and only if TREE_SYMBOL_REFERENCED is | |
6783 set in order to avoid putting out names that are never really | |
6784 used. */ | |
6785 if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)) | |
6786 && targetm.binds_local_p (decl)) | |
6787 maybe_assemble_visibility (decl); | |
6788 } | |
6789 | |
6790 #include "gt-varasm.h" |