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"