re PR target/21412 (ICE loading TLS address)
[gcc.git] / gcc / varasm.c
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
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 2, 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 COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA. */
22
23
24 /* This file handles generation of all the assembler code
25 *except* the instructions of a function.
26 This includes declarations of variables and their initial values.
27
28 We also output the assembler code for constants stored in memory
29 and are responsible for combining constants with the same value. */
30
31 #include "config.h"
32 #include "system.h"
33 #include "coretypes.h"
34 #include "tm.h"
35 #include "rtl.h"
36 #include "tree.h"
37 #include "flags.h"
38 #include "function.h"
39 #include "expr.h"
40 #include "hard-reg-set.h"
41 #include "regs.h"
42 #include "real.h"
43 #include "output.h"
44 #include "toplev.h"
45 #include "hashtab.h"
46 #include "c-pragma.h"
47 #include "ggc.h"
48 #include "langhooks.h"
49 #include "tm_p.h"
50 #include "debug.h"
51 #include "target.h"
52 #include "tree-mudflap.h"
53 #include "cgraph.h"
54 #include "cfglayout.h"
55 #include "basic-block.h"
56
57 #ifdef XCOFF_DEBUGGING_INFO
58 #include "xcoffout.h" /* Needed for external data
59 declarations for e.g. AIX 4.x. */
60 #endif
61
62 /* The (assembler) name of the first globally-visible object output. */
63 const char *first_global_object_name;
64 const char *weak_global_object_name;
65
66 struct addr_const;
67 struct constant_descriptor_rtx;
68 struct rtx_constant_pool;
69
70 struct varasm_status GTY(())
71 {
72 /* If we're using a per-function constant pool, this is it. */
73 struct rtx_constant_pool *pool;
74
75 /* Number of tree-constants deferred during the expansion of this
76 function. */
77 unsigned int deferred_constants;
78 };
79
80 #define n_deferred_constants (cfun->varasm->deferred_constants)
81
82 /* Number for making the label on the next
83 constant that is stored in memory. */
84
85 static GTY(()) int const_labelno;
86
87 /* Carry information from ASM_DECLARE_OBJECT_NAME
88 to ASM_FINISH_DECLARE_OBJECT. */
89
90 int size_directive_output;
91
92 /* The last decl for which assemble_variable was called,
93 if it did ASM_DECLARE_OBJECT_NAME.
94 If the last call to assemble_variable didn't do that,
95 this holds 0. */
96
97 tree last_assemble_variable_decl;
98
99 /* The following global variable indicates if the first basic block
100 in a function belongs to the cold partition or not. */
101
102 bool first_function_block_is_cold;
103
104 /* We give all constants their own alias set. Perhaps redundant with
105 MEM_READONLY_P, but pre-dates it. */
106
107 static HOST_WIDE_INT const_alias_set;
108
109 static const char *strip_reg_name (const char *);
110 static int contains_pointers_p (tree);
111 #ifdef ASM_OUTPUT_EXTERNAL
112 static bool incorporeal_function_p (tree);
113 #endif
114 static void decode_addr_const (tree, struct addr_const *);
115 static hashval_t const_desc_hash (const void *);
116 static int const_desc_eq (const void *, const void *);
117 static hashval_t const_hash_1 (const tree);
118 static int compare_constant (const tree, const tree);
119 static tree copy_constant (tree);
120 static void output_constant_def_contents (rtx);
121 static void output_addressed_constants (tree);
122 static unsigned HOST_WIDE_INT array_size_for_constructor (tree);
123 static unsigned min_align (unsigned, unsigned);
124 static void output_constructor (tree, unsigned HOST_WIDE_INT, unsigned int);
125 static void globalize_decl (tree);
126 static void maybe_assemble_visibility (tree);
127 static int in_named_entry_eq (const void *, const void *);
128 static hashval_t in_named_entry_hash (const void *);
129 static void initialize_cold_section_name (void);
130 #ifdef BSS_SECTION_ASM_OP
131 #ifdef ASM_OUTPUT_BSS
132 static void asm_output_bss (FILE *, tree, const char *,
133 unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT);
134 #endif
135 #ifdef ASM_OUTPUT_ALIGNED_BSS
136 static void asm_output_aligned_bss (FILE *, tree, const char *,
137 unsigned HOST_WIDE_INT, int)
138 ATTRIBUTE_UNUSED;
139 #endif
140 #endif /* BSS_SECTION_ASM_OP */
141 static bool asm_emit_uninitialised (tree, const char*,
142 unsigned HOST_WIDE_INT,
143 unsigned HOST_WIDE_INT);
144 static void mark_weak (tree);
145 \f
146 static GTY(()) enum in_section in_section = no_section;
147 enum in_section last_text_section;
148
149 /* Return a nonzero value if DECL has a section attribute. */
150 #ifndef IN_NAMED_SECTION
151 #define IN_NAMED_SECTION(DECL) \
152 ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \
153 && DECL_SECTION_NAME (DECL) != NULL_TREE)
154 #endif
155
156 /* Text of section name when in_section == in_named. */
157 static GTY(()) const char *in_named_name;
158 const char *last_text_section_name;
159
160 /* Hash table of flags that have been used for a particular named section. */
161
162 struct in_named_entry GTY(())
163 {
164 const char *name;
165 unsigned int flags;
166 bool declared;
167 };
168
169 static GTY((param_is (struct in_named_entry))) htab_t in_named_htab;
170
171 /* Define functions like text_section for any extra sections. */
172 #ifdef EXTRA_SECTION_FUNCTIONS
173 EXTRA_SECTION_FUNCTIONS
174 #endif
175
176 static void
177 initialize_cold_section_name (void)
178 {
179 const char *name;
180 const char *stripped_name;
181 char *buffer;
182 int len;
183
184 if (cfun
185 && current_function_decl)
186 {
187 if (!cfun->unlikely_text_section_name)
188 {
189 if (flag_function_sections
190 && DECL_SECTION_NAME (current_function_decl))
191 {
192 name = xstrdup (TREE_STRING_POINTER (DECL_SECTION_NAME
193 (current_function_decl)));
194 stripped_name = targetm.strip_name_encoding (name);
195 len = strlen (stripped_name);
196 buffer = (char *) xmalloc (len + 10);
197 sprintf (buffer, "%s%s", stripped_name, "_unlikely");
198 cfun->unlikely_text_section_name = ggc_strdup (buffer);
199 free (buffer);
200 free ((char *) name);
201 }
202 else
203 cfun->unlikely_text_section_name =
204 UNLIKELY_EXECUTED_TEXT_SECTION_NAME;
205 }
206 }
207 else
208 internal_error
209 ("initialize_cold_section_name called without valid current_function_decl.");
210 }
211
212 /* Tell assembler to switch to text section. */
213
214 void
215 text_section (void)
216 {
217 if (in_section != in_text)
218 {
219 in_section = in_text;
220 last_text_section = in_text;
221 fprintf (asm_out_file, "%s\n", TEXT_SECTION_ASM_OP);
222 }
223 }
224
225 /* Tell assembler to switch to unlikely-to-be-executed text section. */
226
227 void
228 unlikely_text_section (void)
229 {
230 if (cfun)
231 {
232 if (!cfun->unlikely_text_section_name)
233 initialize_cold_section_name ();
234
235 if ((in_section != in_unlikely_executed_text)
236 && (in_section != in_named
237 || strcmp (in_named_name, cfun->unlikely_text_section_name) != 0))
238 {
239 named_section (NULL_TREE, cfun->unlikely_text_section_name, 0);
240 in_section = in_unlikely_executed_text;
241 last_text_section = in_unlikely_executed_text;
242 }
243 }
244 else
245 {
246 named_section (NULL_TREE, UNLIKELY_EXECUTED_TEXT_SECTION_NAME, 0);
247 in_section = in_unlikely_executed_text;
248 last_text_section = in_unlikely_executed_text;
249 }
250 }
251
252 /* Tell assembler to switch to data section. */
253
254 void
255 data_section (void)
256 {
257 if (in_section != in_data)
258 {
259 in_section = in_data;
260 fprintf (asm_out_file, "%s\n", DATA_SECTION_ASM_OP);
261 }
262 }
263
264 /* Tell assembler to switch to read-only data section. This is normally
265 the text section. */
266
267 void
268 readonly_data_section (void)
269 {
270 #ifdef READONLY_DATA_SECTION
271 READONLY_DATA_SECTION (); /* Note this can call data_section. */
272 #else
273 #ifdef READONLY_DATA_SECTION_ASM_OP
274 if (in_section != in_readonly_data)
275 {
276 in_section = in_readonly_data;
277 fputs (READONLY_DATA_SECTION_ASM_OP, asm_out_file);
278 fputc ('\n', asm_out_file);
279 }
280 #else
281 text_section ();
282 #endif
283 #endif
284 }
285
286 /* Determine if we're in the text section. */
287
288 int
289 in_text_section (void)
290 {
291 return in_section == in_text;
292 }
293
294 /* Determine if we're in the unlikely-to-be-executed text section. */
295
296 int
297 in_unlikely_text_section (void)
298 {
299 bool ret_val;
300
301 if (cfun)
302 {
303 ret_val = ((in_section == in_unlikely_executed_text)
304 || (in_section == in_named
305 && cfun->unlikely_text_section_name
306 && strcmp (in_named_name,
307 cfun->unlikely_text_section_name) == 0));
308 }
309 else
310 {
311 ret_val = ((in_section == in_unlikely_executed_text)
312 || (in_section == in_named
313 && strcmp (in_named_name,
314 UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0));
315 }
316
317 return ret_val;
318 }
319
320 /* Determine if we're in the data section. */
321
322 int
323 in_data_section (void)
324 {
325 return in_section == in_data;
326 }
327
328 /* Helper routines for maintaining in_named_htab. */
329
330 static int
331 in_named_entry_eq (const void *p1, const void *p2)
332 {
333 const struct in_named_entry *old = p1;
334 const char *new = p2;
335
336 return strcmp (old->name, new) == 0;
337 }
338
339 static hashval_t
340 in_named_entry_hash (const void *p)
341 {
342 const struct in_named_entry *old = p;
343 return htab_hash_string (old->name);
344 }
345
346 /* If SECTION has been seen before as a named section, return the flags
347 that were used. Otherwise, return 0. Note, that 0 is a perfectly valid
348 set of flags for a section to have, so 0 does not mean that the section
349 has not been seen. */
350
351 static unsigned int
352 get_named_section_flags (const char *section)
353 {
354 struct in_named_entry **slot;
355
356 slot = (struct in_named_entry **)
357 htab_find_slot_with_hash (in_named_htab, section,
358 htab_hash_string (section), NO_INSERT);
359
360 return slot ? (*slot)->flags : 0;
361 }
362
363 /* Returns true if the section has been declared before. Sets internal
364 flag on this section in in_named_hash so subsequent calls on this
365 section will return false. */
366
367 bool
368 named_section_first_declaration (const char *name)
369 {
370 struct in_named_entry **slot;
371
372 slot = (struct in_named_entry **)
373 htab_find_slot_with_hash (in_named_htab, name,
374 htab_hash_string (name), NO_INSERT);
375 if (! (*slot)->declared)
376 {
377 (*slot)->declared = true;
378 return true;
379 }
380 else
381 {
382 return false;
383 }
384 }
385
386
387 /* Record FLAGS for SECTION. If SECTION was previously recorded with a
388 different set of flags, return false. */
389
390 bool
391 set_named_section_flags (const char *section, unsigned int flags)
392 {
393 struct in_named_entry **slot, *entry;
394
395 slot = (struct in_named_entry **)
396 htab_find_slot_with_hash (in_named_htab, section,
397 htab_hash_string (section), INSERT);
398 entry = *slot;
399
400 if (!entry)
401 {
402 entry = ggc_alloc (sizeof (*entry));
403 *slot = entry;
404 entry->name = ggc_strdup (section);
405 entry->flags = flags;
406 entry->declared = false;
407 }
408 else if (entry->flags != flags)
409 return false;
410
411 return true;
412 }
413
414 /* Tell assembler to change to section NAME with attributes FLAGS. If
415 DECL is non-NULL, it is the VAR_DECL or FUNCTION_DECL with which
416 this section is associated. */
417
418 void
419 named_section_real (const char *name, unsigned int flags, tree decl)
420 {
421 if (in_section != in_named || strcmp (name, in_named_name) != 0)
422 {
423 bool unchanged = set_named_section_flags (name, flags);
424
425 gcc_assert (unchanged);
426
427 targetm.asm_out.named_section (name, flags, decl);
428
429 if (flags & SECTION_FORGET)
430 in_section = no_section;
431 else
432 {
433 in_named_name = ggc_strdup (name);
434 in_section = in_named;
435 }
436 }
437
438 if (in_text_section () || in_unlikely_text_section ())
439 {
440 last_text_section = in_section;
441 last_text_section_name = name;
442 }
443 }
444
445 /* Tell assembler to change to section NAME for DECL.
446 If DECL is NULL, just switch to section NAME.
447 If NAME is NULL, get the name from DECL.
448 If RELOC is 1, the initializer for DECL contains relocs. */
449
450 void
451 named_section (tree decl, const char *name, int reloc)
452 {
453 unsigned int flags;
454
455 gcc_assert (!decl || DECL_P (decl));
456 if (name == NULL)
457 name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
458
459 if (strcmp (name, UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0
460 && cfun
461 && ! cfun->unlikely_text_section_name)
462 cfun->unlikely_text_section_name = UNLIKELY_EXECUTED_TEXT_SECTION_NAME;
463
464 flags = targetm.section_type_flags (decl, name, reloc);
465
466 /* Sanity check user variables for flag changes. Non-user
467 section flag changes will die in named_section_flags.
468 However, don't complain if SECTION_OVERRIDE is set.
469 We trust that the setter knows that it is safe to ignore
470 the default flags for this decl. */
471 if (decl && ! set_named_section_flags (name, flags))
472 {
473 flags = get_named_section_flags (name);
474 if ((flags & SECTION_OVERRIDE) == 0)
475 error ("%J%D causes a section type conflict", decl, decl);
476 }
477
478 named_section_real (name, flags, decl);
479 }
480
481 /* If required, set DECL_SECTION_NAME to a unique name. */
482
483 void
484 resolve_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED,
485 int flag_function_or_data_sections)
486 {
487 if (DECL_SECTION_NAME (decl) == NULL_TREE
488 && targetm.have_named_sections
489 && (flag_function_or_data_sections
490 || DECL_ONE_ONLY (decl)))
491 targetm.asm_out.unique_section (decl, reloc);
492 }
493
494 #ifdef BSS_SECTION_ASM_OP
495
496 /* Tell the assembler to switch to the bss section. */
497
498 void
499 bss_section (void)
500 {
501 if (in_section != in_bss)
502 {
503 fprintf (asm_out_file, "%s\n", BSS_SECTION_ASM_OP);
504 in_section = in_bss;
505 }
506 }
507
508 #ifdef ASM_OUTPUT_BSS
509
510 /* Utility function for ASM_OUTPUT_BSS for targets to use if
511 they don't support alignments in .bss.
512 ??? It is believed that this function will work in most cases so such
513 support is localized here. */
514
515 static void
516 asm_output_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
517 const char *name,
518 unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
519 unsigned HOST_WIDE_INT rounded)
520 {
521 targetm.asm_out.globalize_label (file, name);
522 bss_section ();
523 #ifdef ASM_DECLARE_OBJECT_NAME
524 last_assemble_variable_decl = decl;
525 ASM_DECLARE_OBJECT_NAME (file, name, decl);
526 #else
527 /* Standard thing is just output label for the object. */
528 ASM_OUTPUT_LABEL (file, name);
529 #endif /* ASM_DECLARE_OBJECT_NAME */
530 ASM_OUTPUT_SKIP (file, rounded ? rounded : 1);
531 }
532
533 #endif
534
535 #ifdef ASM_OUTPUT_ALIGNED_BSS
536
537 /* Utility function for targets to use in implementing
538 ASM_OUTPUT_ALIGNED_BSS.
539 ??? It is believed that this function will work in most cases so such
540 support is localized here. */
541
542 static void
543 asm_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
544 const char *name, unsigned HOST_WIDE_INT size,
545 int align)
546 {
547 bss_section ();
548 ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
549 #ifdef ASM_DECLARE_OBJECT_NAME
550 last_assemble_variable_decl = decl;
551 ASM_DECLARE_OBJECT_NAME (file, name, decl);
552 #else
553 /* Standard thing is just output label for the object. */
554 ASM_OUTPUT_LABEL (file, name);
555 #endif /* ASM_DECLARE_OBJECT_NAME */
556 ASM_OUTPUT_SKIP (file, size ? size : 1);
557 }
558
559 #endif
560
561 #endif /* BSS_SECTION_ASM_OP */
562
563 /* Switch to the section for function DECL.
564
565 If DECL is NULL_TREE, switch to the text section. We can be passed
566 NULL_TREE under some circumstances by dbxout.c at least. */
567
568 void
569 function_section (tree decl)
570 {
571 int reloc = 0;
572
573 if (first_function_block_is_cold)
574 reloc = 1;
575
576 #ifdef USE_SELECT_SECTION_FOR_FUNCTIONS
577 targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl));
578 #else
579 if (decl != NULL_TREE
580 && DECL_SECTION_NAME (decl) != NULL_TREE
581 && targetm.have_named_sections)
582 named_section (decl, (char *) 0, 0);
583 else
584 text_section ();
585 #endif
586 }
587
588 void
589 current_function_section (tree decl)
590 {
591 #ifdef USE_SELECT_SECTION_FOR_FUNCTIONS
592 int reloc = 0;
593
594 if (in_unlikely_text_section ()
595 || last_text_section == in_unlikely_executed_text)
596 reloc = 1;
597
598 targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl));
599 #else
600 if (last_text_section == in_unlikely_executed_text)
601 unlikely_text_section ();
602 else if (last_text_section == in_text)
603 text_section ();
604 else if (last_text_section == in_named
605 && targetm.have_named_sections)
606 named_section (NULL_TREE, last_text_section_name, 0);
607 else
608 function_section (decl);
609 #endif
610 }
611
612 /* Switch to read-only data section associated with function DECL. */
613
614 void
615 default_function_rodata_section (tree decl)
616 {
617 if (decl != NULL_TREE && DECL_SECTION_NAME (decl))
618 {
619 const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
620
621 if (DECL_ONE_ONLY (decl) && HAVE_COMDAT_GROUP)
622 {
623 size_t len = strlen (name) + 3;
624 char* rname = alloca (len);
625
626 strcpy (rname, ".rodata");
627 strcat (rname, name + 5);
628 named_section_real (rname, SECTION_LINKONCE, decl);
629 return;
630 }
631 /* For .gnu.linkonce.t.foo we want to use .gnu.linkonce.r.foo. */
632 else if (DECL_ONE_ONLY (decl)
633 && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
634 {
635 size_t len = strlen (name) + 1;
636 char *rname = alloca (len);
637
638 memcpy (rname, name, len);
639 rname[14] = 'r';
640 named_section_real (rname, SECTION_LINKONCE, decl);
641 return;
642 }
643 /* For .text.foo we want to use .rodata.foo. */
644 else if (flag_function_sections && flag_data_sections
645 && strncmp (name, ".text.", 6) == 0)
646 {
647 size_t len = strlen (name) + 1;
648 char *rname = alloca (len + 2);
649
650 memcpy (rname, ".rodata", 7);
651 memcpy (rname + 7, name + 5, len - 5);
652 named_section_flags (rname, 0);
653 return;
654 }
655 }
656
657 readonly_data_section ();
658 }
659
660 /* Switch to read-only data section associated with function DECL
661 for targets where that section should be always the single
662 readonly data section. */
663
664 void
665 default_no_function_rodata_section (tree decl ATTRIBUTE_UNUSED)
666 {
667 readonly_data_section ();
668 }
669
670 /* Switch to section for variable DECL. RELOC is the same as the
671 argument to SELECT_SECTION. */
672
673 void
674 variable_section (tree decl, int reloc)
675 {
676 if (IN_NAMED_SECTION (decl))
677 named_section (decl, NULL, reloc);
678 else
679 targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl));
680 }
681
682 /* Tell assembler to switch to the section for string merging. */
683
684 void
685 mergeable_string_section (tree decl ATTRIBUTE_UNUSED,
686 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED,
687 unsigned int flags ATTRIBUTE_UNUSED)
688 {
689 if (HAVE_GAS_SHF_MERGE && flag_merge_constants
690 && TREE_CODE (decl) == STRING_CST
691 && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
692 && align <= 256
693 && TREE_STRING_LENGTH (decl) >= int_size_in_bytes (TREE_TYPE (decl)))
694 {
695 enum machine_mode mode;
696 unsigned int modesize;
697 const char *str;
698 int i, j, len, unit;
699 char name[30];
700
701 mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (decl)));
702 modesize = GET_MODE_BITSIZE (mode);
703 if (modesize >= 8 && modesize <= 256
704 && (modesize & (modesize - 1)) == 0)
705 {
706 if (align < modesize)
707 align = modesize;
708
709 str = TREE_STRING_POINTER (decl);
710 len = TREE_STRING_LENGTH (decl);
711 unit = GET_MODE_SIZE (mode);
712
713 /* Check for embedded NUL characters. */
714 for (i = 0; i < len; i += unit)
715 {
716 for (j = 0; j < unit; j++)
717 if (str[i + j] != '\0')
718 break;
719 if (j == unit)
720 break;
721 }
722 if (i == len - unit)
723 {
724 sprintf (name, ".rodata.str%d.%d", modesize / 8,
725 (int) (align / 8));
726 flags |= (modesize / 8) | SECTION_MERGE | SECTION_STRINGS;
727 if (!i && modesize < align)
728 {
729 /* A "" string with requested alignment greater than
730 character size might cause a problem:
731 if some other string required even bigger
732 alignment than "", then linker might think the
733 "" is just part of padding after some other string
734 and not put it into the hash table initially.
735 But this means "" could have smaller alignment
736 than requested. */
737 #ifdef ASM_OUTPUT_SECTION_START
738 named_section_flags (name, flags);
739 ASM_OUTPUT_SECTION_START (asm_out_file);
740 #else
741 readonly_data_section ();
742 #endif
743 return;
744 }
745
746 named_section_flags (name, flags);
747 return;
748 }
749 }
750 }
751
752 readonly_data_section ();
753 }
754
755 /* Tell assembler to switch to the section for constant merging. */
756
757 void
758 mergeable_constant_section (enum machine_mode mode ATTRIBUTE_UNUSED,
759 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED,
760 unsigned int flags ATTRIBUTE_UNUSED)
761 {
762 unsigned int modesize = GET_MODE_BITSIZE (mode);
763
764 if (HAVE_GAS_SHF_MERGE && flag_merge_constants
765 && mode != VOIDmode
766 && mode != BLKmode
767 && modesize <= align
768 && align >= 8
769 && align <= 256
770 && (align & (align - 1)) == 0)
771 {
772 char name[24];
773
774 sprintf (name, ".rodata.cst%d", (int) (align / 8));
775 flags |= (align / 8) | SECTION_MERGE;
776 named_section_flags (name, flags);
777 return;
778 }
779
780 readonly_data_section ();
781 }
782 \f
783 /* Given NAME, a putative register name, discard any customary prefixes. */
784
785 static const char *
786 strip_reg_name (const char *name)
787 {
788 #ifdef REGISTER_PREFIX
789 if (!strncmp (name, REGISTER_PREFIX, strlen (REGISTER_PREFIX)))
790 name += strlen (REGISTER_PREFIX);
791 #endif
792 if (name[0] == '%' || name[0] == '#')
793 name++;
794 return name;
795 }
796 \f
797 /* The user has asked for a DECL to have a particular name. Set (or
798 change) it in such a way that we don't prefix an underscore to
799 it. */
800 void
801 set_user_assembler_name (tree decl, const char *name)
802 {
803 char *starred = alloca (strlen (name) + 2);
804 starred[0] = '*';
805 strcpy (starred + 1, name);
806 change_decl_assembler_name (decl, get_identifier (starred));
807 SET_DECL_RTL (decl, NULL_RTX);
808 }
809 \f
810 /* Decode an `asm' spec for a declaration as a register name.
811 Return the register number, or -1 if nothing specified,
812 or -2 if the ASMSPEC is not `cc' or `memory' and is not recognized,
813 or -3 if ASMSPEC is `cc' and is not recognized,
814 or -4 if ASMSPEC is `memory' and is not recognized.
815 Accept an exact spelling or a decimal number.
816 Prefixes such as % are optional. */
817
818 int
819 decode_reg_name (const char *asmspec)
820 {
821 if (asmspec != 0)
822 {
823 int i;
824
825 /* Get rid of confusing prefixes. */
826 asmspec = strip_reg_name (asmspec);
827
828 /* Allow a decimal number as a "register name". */
829 for (i = strlen (asmspec) - 1; i >= 0; i--)
830 if (! ISDIGIT (asmspec[i]))
831 break;
832 if (asmspec[0] != 0 && i < 0)
833 {
834 i = atoi (asmspec);
835 if (i < FIRST_PSEUDO_REGISTER && i >= 0)
836 return i;
837 else
838 return -2;
839 }
840
841 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
842 if (reg_names[i][0]
843 && ! strcmp (asmspec, strip_reg_name (reg_names[i])))
844 return i;
845
846 #ifdef ADDITIONAL_REGISTER_NAMES
847 {
848 static const struct { const char *const name; const int number; } table[]
849 = ADDITIONAL_REGISTER_NAMES;
850
851 for (i = 0; i < (int) ARRAY_SIZE (table); i++)
852 if (! strcmp (asmspec, table[i].name))
853 return table[i].number;
854 }
855 #endif /* ADDITIONAL_REGISTER_NAMES */
856
857 if (!strcmp (asmspec, "memory"))
858 return -4;
859
860 if (!strcmp (asmspec, "cc"))
861 return -3;
862
863 return -2;
864 }
865
866 return -1;
867 }
868 \f
869 /* Create the DECL_RTL for a VAR_DECL or FUNCTION_DECL. DECL should
870 have static storage duration. In other words, it should not be an
871 automatic variable, including PARM_DECLs.
872
873 There is, however, one exception: this function handles variables
874 explicitly placed in a particular register by the user.
875
876 This is never called for PARM_DECL nodes. */
877
878 void
879 make_decl_rtl (tree decl)
880 {
881 const char *name = 0;
882 int reg_number;
883 rtx x;
884
885 /* Check that we are not being given an automatic variable. */
886 gcc_assert (TREE_CODE (decl) != PARM_DECL
887 && TREE_CODE (decl) != RESULT_DECL);
888
889 /* A weak alias has TREE_PUBLIC set but not the other bits. */
890 gcc_assert (TREE_CODE (decl) != VAR_DECL
891 || TREE_STATIC (decl)
892 || TREE_PUBLIC (decl)
893 || DECL_EXTERNAL (decl)
894 || DECL_REGISTER (decl));
895
896 /* And that we were not given a type or a label. */
897 gcc_assert (TREE_CODE (decl) != TYPE_DECL
898 && TREE_CODE (decl) != LABEL_DECL);
899
900 /* For a duplicate declaration, we can be called twice on the
901 same DECL node. Don't discard the RTL already made. */
902 if (DECL_RTL_SET_P (decl))
903 {
904 /* If the old RTL had the wrong mode, fix the mode. */
905 if (GET_MODE (DECL_RTL (decl)) != DECL_MODE (decl))
906 SET_DECL_RTL (decl, adjust_address_nv (DECL_RTL (decl),
907 DECL_MODE (decl), 0));
908
909 if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl))
910 return;
911
912 /* ??? Another way to do this would be to maintain a hashed
913 table of such critters. Instead of adding stuff to a DECL
914 to give certain attributes to it, we could use an external
915 hash map from DECL to set of attributes. */
916
917 /* Let the target reassign the RTL if it wants.
918 This is necessary, for example, when one machine specific
919 decl attribute overrides another. */
920 targetm.encode_section_info (decl, DECL_RTL (decl), false);
921
922 /* Make this function static known to the mudflap runtime. */
923 if (flag_mudflap && TREE_CODE (decl) == VAR_DECL)
924 mudflap_enqueue_decl (decl);
925
926 return;
927 }
928
929 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
930
931 if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl))
932 {
933 reg_number = decode_reg_name (name);
934 /* First detect errors in declaring global registers. */
935 if (reg_number == -1)
936 error ("%Jregister name not specified for %qD", decl, decl);
937 else if (reg_number < 0)
938 error ("%Jinvalid register name for %qD", decl, decl);
939 else if (TYPE_MODE (TREE_TYPE (decl)) == BLKmode)
940 error ("%Jdata type of %qD isn%'t suitable for a register",
941 decl, decl);
942 else if (! HARD_REGNO_MODE_OK (reg_number, TYPE_MODE (TREE_TYPE (decl))))
943 error ("%Jregister specified for %qD isn%'t suitable for data type",
944 decl, decl);
945 /* Now handle properly declared static register variables. */
946 else
947 {
948 int nregs;
949
950 if (DECL_INITIAL (decl) != 0 && TREE_STATIC (decl))
951 {
952 DECL_INITIAL (decl) = 0;
953 error ("global register variable has initial value");
954 }
955 if (TREE_THIS_VOLATILE (decl))
956 warning (0, "volatile register variables don%'t "
957 "work as you might wish");
958
959 /* If the user specified one of the eliminables registers here,
960 e.g., FRAME_POINTER_REGNUM, we don't want to get this variable
961 confused with that register and be eliminated. This usage is
962 somewhat suspect... */
963
964 SET_DECL_RTL (decl, gen_rtx_raw_REG (DECL_MODE (decl), reg_number));
965 ORIGINAL_REGNO (DECL_RTL (decl)) = reg_number;
966 REG_USERVAR_P (DECL_RTL (decl)) = 1;
967
968 if (TREE_STATIC (decl))
969 {
970 /* Make this register global, so not usable for anything
971 else. */
972 #ifdef ASM_DECLARE_REGISTER_GLOBAL
973 name = IDENTIFIER_POINTER (DECL_NAME (decl));
974 ASM_DECLARE_REGISTER_GLOBAL (asm_out_file, decl, reg_number, name);
975 #endif
976 nregs = hard_regno_nregs[reg_number][DECL_MODE (decl)];
977 while (nregs > 0)
978 globalize_reg (reg_number + --nregs);
979 }
980
981 /* As a register variable, it has no section. */
982 return;
983 }
984 }
985 /* Now handle ordinary static variables and functions (in memory).
986 Also handle vars declared register invalidly. */
987 else if (name[0] == '*')
988 {
989 #ifdef REGISTER_PREFIX
990 if (strlen (REGISTER_PREFIX) != 0)
991 {
992 reg_number = decode_reg_name (name);
993 if (reg_number >= 0 || reg_number == -3)
994 error ("%Jregister name given for non-register variable %qD", decl, decl);
995 }
996 #endif
997 }
998
999 /* Specifying a section attribute on a variable forces it into a
1000 non-.bss section, and thus it cannot be common. */
1001 if (TREE_CODE (decl) == VAR_DECL
1002 && DECL_SECTION_NAME (decl) != NULL_TREE
1003 && DECL_INITIAL (decl) == NULL_TREE
1004 && DECL_COMMON (decl))
1005 DECL_COMMON (decl) = 0;
1006
1007 /* Variables can't be both common and weak. */
1008 if (TREE_CODE (decl) == VAR_DECL && DECL_WEAK (decl))
1009 DECL_COMMON (decl) = 0;
1010
1011 x = gen_rtx_SYMBOL_REF (Pmode, name);
1012 SYMBOL_REF_WEAK (x) = DECL_WEAK (decl);
1013 SYMBOL_REF_DECL (x) = decl;
1014
1015 x = gen_rtx_MEM (DECL_MODE (decl), x);
1016 if (TREE_CODE (decl) != FUNCTION_DECL)
1017 set_mem_attributes (x, decl, 1);
1018 SET_DECL_RTL (decl, x);
1019
1020 /* Optionally set flags or add text to the name to record information
1021 such as that it is a function name.
1022 If the name is changed, the macro ASM_OUTPUT_LABELREF
1023 will have to know how to strip this information. */
1024 targetm.encode_section_info (decl, DECL_RTL (decl), true);
1025
1026 /* Make this function static known to the mudflap runtime. */
1027 if (flag_mudflap && TREE_CODE (decl) == VAR_DECL)
1028 mudflap_enqueue_decl (decl);
1029 }
1030
1031 /* Make the rtl for variable VAR be volatile.
1032 Use this only for static variables. */
1033
1034 void
1035 make_var_volatile (tree var)
1036 {
1037 gcc_assert (MEM_P (DECL_RTL (var)));
1038
1039 MEM_VOLATILE_P (DECL_RTL (var)) = 1;
1040 }
1041 \f
1042 /* Output a string of literal assembler code
1043 for an `asm' keyword used between functions. */
1044
1045 void
1046 assemble_asm (tree string)
1047 {
1048 app_enable ();
1049
1050 if (TREE_CODE (string) == ADDR_EXPR)
1051 string = TREE_OPERAND (string, 0);
1052
1053 fprintf (asm_out_file, "\t%s\n", TREE_STRING_POINTER (string));
1054 }
1055
1056 /* Record an element in the table of global destructors. SYMBOL is
1057 a SYMBOL_REF of the function to be called; PRIORITY is a number
1058 between 0 and MAX_INIT_PRIORITY. */
1059
1060 void
1061 default_stabs_asm_out_destructor (rtx symbol ATTRIBUTE_UNUSED,
1062 int priority ATTRIBUTE_UNUSED)
1063 {
1064 #if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO
1065 /* Tell GNU LD that this is part of the static destructor set.
1066 This will work for any system that uses stabs, most usefully
1067 aout systems. */
1068 dbxout_begin_simple_stabs ("___DTOR_LIST__", 22 /* N_SETT */);
1069 dbxout_stab_value_label (XSTR (symbol, 0));
1070 #else
1071 sorry ("global destructors not supported on this target");
1072 #endif
1073 }
1074
1075 void
1076 default_named_section_asm_out_destructor (rtx symbol, int priority)
1077 {
1078 const char *section = ".dtors";
1079 char buf[16];
1080
1081 /* ??? This only works reliably with the GNU linker. */
1082 if (priority != DEFAULT_INIT_PRIORITY)
1083 {
1084 sprintf (buf, ".dtors.%.5u",
1085 /* Invert the numbering so the linker puts us in the proper
1086 order; constructors are run from right to left, and the
1087 linker sorts in increasing order. */
1088 MAX_INIT_PRIORITY - priority);
1089 section = buf;
1090 }
1091
1092 named_section_flags (section, SECTION_WRITE);
1093 assemble_align (POINTER_SIZE);
1094 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1095 }
1096
1097 #ifdef DTORS_SECTION_ASM_OP
1098 void
1099 dtors_section (void)
1100 {
1101 if (in_section != in_dtors)
1102 {
1103 in_section = in_dtors;
1104 fputs (DTORS_SECTION_ASM_OP, asm_out_file);
1105 fputc ('\n', asm_out_file);
1106 }
1107 }
1108
1109 void
1110 default_dtor_section_asm_out_destructor (rtx symbol,
1111 int priority ATTRIBUTE_UNUSED)
1112 {
1113 dtors_section ();
1114 assemble_align (POINTER_SIZE);
1115 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1116 }
1117 #endif
1118
1119 /* Likewise for global constructors. */
1120
1121 void
1122 default_stabs_asm_out_constructor (rtx symbol ATTRIBUTE_UNUSED,
1123 int priority ATTRIBUTE_UNUSED)
1124 {
1125 #if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO
1126 /* Tell GNU LD that this is part of the static destructor set.
1127 This will work for any system that uses stabs, most usefully
1128 aout systems. */
1129 dbxout_begin_simple_stabs ("___CTOR_LIST__", 22 /* N_SETT */);
1130 dbxout_stab_value_label (XSTR (symbol, 0));
1131 #else
1132 sorry ("global constructors not supported on this target");
1133 #endif
1134 }
1135
1136 void
1137 default_named_section_asm_out_constructor (rtx symbol, int priority)
1138 {
1139 const char *section = ".ctors";
1140 char buf[16];
1141
1142 /* ??? This only works reliably with the GNU linker. */
1143 if (priority != DEFAULT_INIT_PRIORITY)
1144 {
1145 sprintf (buf, ".ctors.%.5u",
1146 /* Invert the numbering so the linker puts us in the proper
1147 order; constructors are run from right to left, and the
1148 linker sorts in increasing order. */
1149 MAX_INIT_PRIORITY - priority);
1150 section = buf;
1151 }
1152
1153 named_section_flags (section, SECTION_WRITE);
1154 assemble_align (POINTER_SIZE);
1155 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1156 }
1157
1158 #ifdef CTORS_SECTION_ASM_OP
1159 void
1160 ctors_section (void)
1161 {
1162 if (in_section != in_ctors)
1163 {
1164 in_section = in_ctors;
1165 fputs (CTORS_SECTION_ASM_OP, asm_out_file);
1166 fputc ('\n', asm_out_file);
1167 }
1168 }
1169
1170 void
1171 default_ctor_section_asm_out_constructor (rtx symbol,
1172 int priority ATTRIBUTE_UNUSED)
1173 {
1174 ctors_section ();
1175 assemble_align (POINTER_SIZE);
1176 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1177 }
1178 #endif
1179 \f
1180 /* CONSTANT_POOL_BEFORE_FUNCTION may be defined as an expression with
1181 a nonzero value if the constant pool should be output before the
1182 start of the function, or a zero value if the pool should output
1183 after the end of the function. The default is to put it before the
1184 start. */
1185
1186 #ifndef CONSTANT_POOL_BEFORE_FUNCTION
1187 #define CONSTANT_POOL_BEFORE_FUNCTION 1
1188 #endif
1189
1190 /* DECL is an object (either VAR_DECL or FUNCTION_DECL) which is going
1191 to be output to assembler.
1192 Set first_global_object_name and weak_global_object_name as appropriate. */
1193
1194 void
1195 notice_global_symbol (tree decl)
1196 {
1197 const char **type = &first_global_object_name;
1198
1199 if (first_global_object_name
1200 || !TREE_PUBLIC (decl) || DECL_EXTERNAL (decl)
1201 || !DECL_NAME (decl)
1202 || (TREE_CODE (decl) != FUNCTION_DECL
1203 && (TREE_CODE (decl) != VAR_DECL
1204 || (DECL_COMMON (decl)
1205 && (DECL_INITIAL (decl) == 0
1206 || DECL_INITIAL (decl) == error_mark_node))))
1207 || !MEM_P (DECL_RTL (decl)))
1208 return;
1209
1210 /* We win when global object is found, but it is useful to know about weak
1211 symbol as well so we can produce nicer unique names. */
1212 if (DECL_WEAK (decl) || DECL_ONE_ONLY (decl))
1213 type = &weak_global_object_name;
1214
1215 if (!*type)
1216 {
1217 const char *p;
1218 char *name;
1219 rtx decl_rtl = DECL_RTL (decl);
1220
1221 p = targetm.strip_name_encoding (XSTR (XEXP (decl_rtl, 0), 0));
1222 name = xstrdup (p);
1223
1224 *type = name;
1225 }
1226 }
1227
1228 /* Output assembler code for the constant pool of a function and associated
1229 with defining the name of the function. DECL describes the function.
1230 NAME is the function's name. For the constant pool, we use the current
1231 constant pool data. */
1232
1233 void
1234 assemble_start_function (tree decl, const char *fnname)
1235 {
1236 int align;
1237 char tmp_label[100];
1238 bool hot_label_written = false;
1239
1240 cfun->unlikely_text_section_name = NULL;
1241
1242 first_function_block_is_cold = false;
1243 if (flag_reorder_blocks_and_partition)
1244 {
1245 ASM_GENERATE_INTERNAL_LABEL (tmp_label, "HOTB", const_labelno);
1246 cfun->hot_section_label = ggc_strdup (tmp_label);
1247 ASM_GENERATE_INTERNAL_LABEL (tmp_label, "COLDB", const_labelno);
1248 cfun->cold_section_label = ggc_strdup (tmp_label);
1249 ASM_GENERATE_INTERNAL_LABEL (tmp_label, "HOTE", const_labelno);
1250 cfun->hot_section_end_label = ggc_strdup (tmp_label);
1251 ASM_GENERATE_INTERNAL_LABEL (tmp_label, "COLDE", const_labelno);
1252 cfun->cold_section_end_label = ggc_strdup (tmp_label);
1253 const_labelno++;
1254 }
1255 else
1256 {
1257 cfun->hot_section_label = NULL;
1258 cfun->cold_section_label = NULL;
1259 cfun->hot_section_end_label = NULL;
1260 cfun->cold_section_end_label = NULL;
1261 }
1262
1263 /* The following code does not need preprocessing in the assembler. */
1264
1265 app_disable ();
1266
1267 if (CONSTANT_POOL_BEFORE_FUNCTION)
1268 output_constant_pool (fnname, decl);
1269
1270 /* Make sure the not and cold text (code) sections are properly
1271 aligned. This is necessary here in the case where the function
1272 has both hot and cold sections, because we don't want to re-set
1273 the alignment when the section switch happens mid-function. */
1274
1275 if (flag_reorder_blocks_and_partition)
1276 {
1277 unlikely_text_section ();
1278 assemble_align (FUNCTION_BOUNDARY);
1279 ASM_OUTPUT_LABEL (asm_out_file, cfun->cold_section_label);
1280 if (BB_PARTITION (ENTRY_BLOCK_PTR->next_bb) == BB_COLD_PARTITION)
1281 {
1282 /* Since the function starts with a cold section, we need to
1283 explicitly align the hot section and write out the hot
1284 section label. */
1285 text_section ();
1286 assemble_align (FUNCTION_BOUNDARY);
1287 ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_label);
1288 hot_label_written = true;
1289 first_function_block_is_cold = true;
1290 }
1291 }
1292 else if (DECL_SECTION_NAME (decl))
1293 {
1294 /* Calls to function_section rely on first_function_block_is_cold
1295 being accurate. The first block may be cold even if we aren't
1296 doing partitioning, if the entire function was decided by
1297 choose_function_section (predict.c) to be cold. */
1298
1299 int i;
1300 int len;
1301 char *s;
1302
1303 initialize_cold_section_name ();
1304
1305 /* The following is necessary, because 'strcmp
1306 (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)), blah)' always
1307 fails, presumably because TREE_STRING_POINTER is declared to
1308 be an array of size 1 of char. */
1309
1310 len = TREE_STRING_LENGTH (DECL_SECTION_NAME (decl));
1311 s = (char *) xmalloc (len + 1);
1312
1313 for (i = 0; i < len; i ++)
1314 s[i] = (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)))[i];
1315 s[len] = '\0';
1316
1317 if (cfun->unlikely_text_section_name
1318 && (strcmp (s, cfun->unlikely_text_section_name) == 0))
1319 first_function_block_is_cold = true;
1320 }
1321
1322 last_text_section = no_section;
1323 resolve_unique_section (decl, 0, flag_function_sections);
1324
1325 /* Switch to the correct text section for the start of the function. */
1326
1327 function_section (decl);
1328 if (flag_reorder_blocks_and_partition
1329 && !hot_label_written)
1330 ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_label);
1331
1332 /* Tell assembler to move to target machine's alignment for functions. */
1333 align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
1334 if (align < force_align_functions_log)
1335 align = force_align_functions_log;
1336 if (align > 0)
1337 {
1338 ASM_OUTPUT_ALIGN (asm_out_file, align);
1339 }
1340
1341 /* Handle a user-specified function alignment.
1342 Note that we still need to align to FUNCTION_BOUNDARY, as above,
1343 because ASM_OUTPUT_MAX_SKIP_ALIGN might not do any alignment at all. */
1344 if (align_functions_log > align
1345 && cfun->function_frequency != FUNCTION_FREQUENCY_UNLIKELY_EXECUTED)
1346 {
1347 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
1348 ASM_OUTPUT_MAX_SKIP_ALIGN (asm_out_file,
1349 align_functions_log, align_functions - 1);
1350 #else
1351 ASM_OUTPUT_ALIGN (asm_out_file, align_functions_log);
1352 #endif
1353 }
1354
1355 #ifdef ASM_OUTPUT_FUNCTION_PREFIX
1356 ASM_OUTPUT_FUNCTION_PREFIX (asm_out_file, fnname);
1357 #endif
1358
1359 (*debug_hooks->begin_function) (decl);
1360
1361 /* Make function name accessible from other files, if appropriate. */
1362
1363 if (TREE_PUBLIC (decl))
1364 {
1365 notice_global_symbol (decl);
1366
1367 globalize_decl (decl);
1368
1369 maybe_assemble_visibility (decl);
1370 }
1371
1372 if (DECL_PRESERVE_P (decl))
1373 targetm.asm_out.mark_decl_preserved (fnname);
1374
1375 /* Do any machine/system dependent processing of the function name. */
1376 #ifdef ASM_DECLARE_FUNCTION_NAME
1377 ASM_DECLARE_FUNCTION_NAME (asm_out_file, fnname, current_function_decl);
1378 #else
1379 /* Standard thing is just output label for the function. */
1380 ASM_OUTPUT_LABEL (asm_out_file, fnname);
1381 #endif /* ASM_DECLARE_FUNCTION_NAME */
1382
1383 insert_section_boundary_note ();
1384 }
1385
1386 /* Output assembler code associated with defining the size of the
1387 function. DECL describes the function. NAME is the function's name. */
1388
1389 void
1390 assemble_end_function (tree decl, const char *fnname)
1391 {
1392 #ifdef ASM_DECLARE_FUNCTION_SIZE
1393 ASM_DECLARE_FUNCTION_SIZE (asm_out_file, fnname, decl);
1394 #endif
1395 if (! CONSTANT_POOL_BEFORE_FUNCTION)
1396 {
1397 output_constant_pool (fnname, decl);
1398 function_section (decl); /* need to switch back */
1399 }
1400 /* Output labels for end of hot/cold text sections (to be used by
1401 debug info.) */
1402 if (flag_reorder_blocks_and_partition)
1403 {
1404 enum in_section save_text_section;
1405
1406 save_text_section = in_section;
1407 unlikely_text_section ();
1408 ASM_OUTPUT_LABEL (asm_out_file, cfun->cold_section_end_label);
1409 text_section ();
1410 ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_end_label);
1411 if (save_text_section == in_unlikely_executed_text)
1412 unlikely_text_section ();
1413 }
1414 }
1415 \f
1416 /* Assemble code to leave SIZE bytes of zeros. */
1417
1418 void
1419 assemble_zeros (unsigned HOST_WIDE_INT size)
1420 {
1421 /* Do no output if -fsyntax-only. */
1422 if (flag_syntax_only)
1423 return;
1424
1425 #ifdef ASM_NO_SKIP_IN_TEXT
1426 /* The `space' pseudo in the text section outputs nop insns rather than 0s,
1427 so we must output 0s explicitly in the text section. */
1428 if ((ASM_NO_SKIP_IN_TEXT && in_text_section ())
1429 || (ASM_NO_SKIP_IN_TEXT && in_unlikely_text_section ()))
1430 {
1431 unsigned HOST_WIDE_INT i;
1432 for (i = 0; i < size; i++)
1433 assemble_integer (const0_rtx, 1, BITS_PER_UNIT, 1);
1434 }
1435 else
1436 #endif
1437 if (size > 0)
1438 ASM_OUTPUT_SKIP (asm_out_file, size);
1439 }
1440
1441 /* Assemble an alignment pseudo op for an ALIGN-bit boundary. */
1442
1443 void
1444 assemble_align (int align)
1445 {
1446 if (align > BITS_PER_UNIT)
1447 {
1448 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
1449 }
1450 }
1451
1452 /* Assemble a string constant with the specified C string as contents. */
1453
1454 void
1455 assemble_string (const char *p, int size)
1456 {
1457 int pos = 0;
1458 int maximum = 2000;
1459
1460 /* If the string is very long, split it up. */
1461
1462 while (pos < size)
1463 {
1464 int thissize = size - pos;
1465 if (thissize > maximum)
1466 thissize = maximum;
1467
1468 ASM_OUTPUT_ASCII (asm_out_file, p, thissize);
1469
1470 pos += thissize;
1471 p += thissize;
1472 }
1473 }
1474
1475 \f
1476 #if defined ASM_OUTPUT_ALIGNED_DECL_LOCAL
1477 #define ASM_EMIT_LOCAL(decl, name, size, rounded) \
1478 ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, decl, name, size, DECL_ALIGN (decl))
1479 #else
1480 #if defined ASM_OUTPUT_ALIGNED_LOCAL
1481 #define ASM_EMIT_LOCAL(decl, name, size, rounded) \
1482 ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, DECL_ALIGN (decl))
1483 #else
1484 #define ASM_EMIT_LOCAL(decl, name, size, rounded) \
1485 ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded)
1486 #endif
1487 #endif
1488
1489 #if defined ASM_OUTPUT_ALIGNED_BSS
1490 #define ASM_EMIT_BSS(decl, name, size, rounded) \
1491 ASM_OUTPUT_ALIGNED_BSS (asm_out_file, decl, name, size, DECL_ALIGN (decl))
1492 #else
1493 #if defined ASM_OUTPUT_BSS
1494 #define ASM_EMIT_BSS(decl, name, size, rounded) \
1495 ASM_OUTPUT_BSS (asm_out_file, decl, name, size, rounded)
1496 #else
1497 #undef ASM_EMIT_BSS
1498 #endif
1499 #endif
1500
1501 #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
1502 #define ASM_EMIT_COMMON(decl, name, size, rounded) \
1503 ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, decl, name, size, DECL_ALIGN (decl))
1504 #else
1505 #if defined ASM_OUTPUT_ALIGNED_COMMON
1506 #define ASM_EMIT_COMMON(decl, name, size, rounded) \
1507 ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, name, size, DECL_ALIGN (decl))
1508 #else
1509 #define ASM_EMIT_COMMON(decl, name, size, rounded) \
1510 ASM_OUTPUT_COMMON (asm_out_file, name, size, rounded)
1511 #endif
1512 #endif
1513
1514 static bool
1515 asm_emit_uninitialised (tree decl, const char *name,
1516 unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
1517 unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED)
1518 {
1519 enum
1520 {
1521 asm_dest_common,
1522 asm_dest_bss,
1523 asm_dest_local
1524 }
1525 destination = asm_dest_local;
1526
1527 /* ??? We should handle .bss via select_section mechanisms rather than
1528 via special target hooks. That would eliminate this special case. */
1529 if (TREE_PUBLIC (decl))
1530 {
1531 if (!DECL_COMMON (decl))
1532 #ifdef ASM_EMIT_BSS
1533 destination = asm_dest_bss;
1534 #else
1535 return false;
1536 #endif
1537 else
1538 destination = asm_dest_common;
1539 }
1540
1541 if (destination != asm_dest_common)
1542 {
1543 resolve_unique_section (decl, 0, flag_data_sections);
1544 /* Custom sections don't belong here. */
1545 if (DECL_SECTION_NAME (decl))
1546 return false;
1547 }
1548
1549 if (destination == asm_dest_bss)
1550 globalize_decl (decl);
1551
1552 if (flag_shared_data)
1553 {
1554 switch (destination)
1555 {
1556 #ifdef ASM_OUTPUT_SHARED_BSS
1557 case asm_dest_bss:
1558 ASM_OUTPUT_SHARED_BSS (asm_out_file, decl, name, size, rounded);
1559 return;
1560 #endif
1561 #ifdef ASM_OUTPUT_SHARED_COMMON
1562 case asm_dest_common:
1563 ASM_OUTPUT_SHARED_COMMON (asm_out_file, name, size, rounded);
1564 return;
1565 #endif
1566 #ifdef ASM_OUTPUT_SHARED_LOCAL
1567 case asm_dest_local:
1568 ASM_OUTPUT_SHARED_LOCAL (asm_out_file, name, size, rounded);
1569 return;
1570 #endif
1571 default:
1572 break;
1573 }
1574 }
1575
1576 switch (destination)
1577 {
1578 #ifdef ASM_EMIT_BSS
1579 case asm_dest_bss:
1580 ASM_EMIT_BSS (decl, name, size, rounded);
1581 break;
1582 #endif
1583 case asm_dest_common:
1584 ASM_EMIT_COMMON (decl, name, size, rounded);
1585 break;
1586 case asm_dest_local:
1587 ASM_EMIT_LOCAL (decl, name, size, rounded);
1588 break;
1589 default:
1590 gcc_unreachable ();
1591 }
1592
1593 return true;
1594 }
1595
1596 /* Assemble everything that is needed for a variable or function declaration.
1597 Not used for automatic variables, and not used for function definitions.
1598 Should not be called for variables of incomplete structure type.
1599
1600 TOP_LEVEL is nonzero if this variable has file scope.
1601 AT_END is nonzero if this is the special handling, at end of compilation,
1602 to define things that have had only tentative definitions.
1603 DONT_OUTPUT_DATA if nonzero means don't actually output the
1604 initial value (that will be done by the caller). */
1605
1606 void
1607 assemble_variable (tree decl, int top_level ATTRIBUTE_UNUSED,
1608 int at_end ATTRIBUTE_UNUSED, int dont_output_data)
1609 {
1610 const char *name;
1611 unsigned int align;
1612 int reloc = 0;
1613 rtx decl_rtl;
1614
1615 if (lang_hooks.decls.prepare_assemble_variable)
1616 lang_hooks.decls.prepare_assemble_variable (decl);
1617
1618 last_assemble_variable_decl = 0;
1619
1620 /* Normally no need to say anything here for external references,
1621 since assemble_external is called by the language-specific code
1622 when a declaration is first seen. */
1623
1624 if (DECL_EXTERNAL (decl))
1625 return;
1626
1627 /* Output no assembler code for a function declaration.
1628 Only definitions of functions output anything. */
1629
1630 if (TREE_CODE (decl) == FUNCTION_DECL)
1631 return;
1632
1633 /* Do nothing for global register variables. */
1634 if (DECL_RTL_SET_P (decl) && REG_P (DECL_RTL (decl)))
1635 {
1636 TREE_ASM_WRITTEN (decl) = 1;
1637 return;
1638 }
1639
1640 /* If type was incomplete when the variable was declared,
1641 see if it is complete now. */
1642
1643 if (DECL_SIZE (decl) == 0)
1644 layout_decl (decl, 0);
1645
1646 /* Still incomplete => don't allocate it; treat the tentative defn
1647 (which is what it must have been) as an `extern' reference. */
1648
1649 if (!dont_output_data && DECL_SIZE (decl) == 0)
1650 {
1651 error ("%Jstorage size of %qD isn%'t known", decl, decl);
1652 TREE_ASM_WRITTEN (decl) = 1;
1653 return;
1654 }
1655
1656 /* The first declaration of a variable that comes through this function
1657 decides whether it is global (in C, has external linkage)
1658 or local (in C, has internal linkage). So do nothing more
1659 if this function has already run. */
1660
1661 if (TREE_ASM_WRITTEN (decl))
1662 return;
1663
1664 /* Make sure targetm.encode_section_info is invoked before we set
1665 ASM_WRITTEN. */
1666 decl_rtl = DECL_RTL (decl);
1667
1668 TREE_ASM_WRITTEN (decl) = 1;
1669
1670 /* Do no output if -fsyntax-only. */
1671 if (flag_syntax_only)
1672 return;
1673
1674 app_disable ();
1675
1676 if (! dont_output_data
1677 && ! host_integerp (DECL_SIZE_UNIT (decl), 1))
1678 {
1679 error ("%Jsize of variable %qD is too large", decl, decl);
1680 return;
1681 }
1682
1683 name = XSTR (XEXP (decl_rtl, 0), 0);
1684 if (TREE_PUBLIC (decl) && DECL_NAME (decl))
1685 notice_global_symbol (decl);
1686
1687 /* Compute the alignment of this data. */
1688
1689 align = DECL_ALIGN (decl);
1690
1691 /* In the case for initialing an array whose length isn't specified,
1692 where we have not yet been able to do the layout,
1693 figure out the proper alignment now. */
1694 if (dont_output_data && DECL_SIZE (decl) == 0
1695 && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
1696 align = MAX (align, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl))));
1697
1698 /* Some object file formats have a maximum alignment which they support.
1699 In particular, a.out format supports a maximum alignment of 4. */
1700 if (align > MAX_OFILE_ALIGNMENT)
1701 {
1702 warning (0, "%Jalignment of %qD is greater than maximum object "
1703 "file alignment. Using %d", decl, decl,
1704 MAX_OFILE_ALIGNMENT/BITS_PER_UNIT);
1705 align = MAX_OFILE_ALIGNMENT;
1706 }
1707
1708 /* On some machines, it is good to increase alignment sometimes. */
1709 if (! DECL_USER_ALIGN (decl))
1710 {
1711 #ifdef DATA_ALIGNMENT
1712 align = DATA_ALIGNMENT (TREE_TYPE (decl), align);
1713 #endif
1714 #ifdef CONSTANT_ALIGNMENT
1715 if (DECL_INITIAL (decl) != 0 && DECL_INITIAL (decl) != error_mark_node)
1716 align = CONSTANT_ALIGNMENT (DECL_INITIAL (decl), align);
1717 #endif
1718 }
1719
1720 /* Reset the alignment in case we have made it tighter, so we can benefit
1721 from it in get_pointer_alignment. */
1722 DECL_ALIGN (decl) = align;
1723 set_mem_align (decl_rtl, align);
1724
1725 if (TREE_PUBLIC (decl))
1726 maybe_assemble_visibility (decl);
1727
1728 if (DECL_PRESERVE_P (decl))
1729 targetm.asm_out.mark_decl_preserved (name);
1730
1731 /* Handle uninitialized definitions. */
1732
1733 /* If the decl has been given an explicit section name, then it
1734 isn't common, and shouldn't be handled as such. */
1735 if (DECL_SECTION_NAME (decl) || dont_output_data)
1736 ;
1737 /* We don't implement common thread-local data at present. */
1738 else if (DECL_THREAD_LOCAL (decl))
1739 {
1740 if (DECL_COMMON (decl))
1741 sorry ("thread-local COMMON data not implemented");
1742 }
1743 else if (DECL_INITIAL (decl) == 0
1744 || DECL_INITIAL (decl) == error_mark_node
1745 || (flag_zero_initialized_in_bss
1746 /* Leave constant zeroes in .rodata so they can be shared. */
1747 && !TREE_READONLY (decl)
1748 && initializer_zerop (DECL_INITIAL (decl))))
1749 {
1750 unsigned HOST_WIDE_INT size = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
1751 unsigned HOST_WIDE_INT rounded = size;
1752
1753 /* Don't allocate zero bytes of common,
1754 since that means "undefined external" in the linker. */
1755 if (size == 0)
1756 rounded = 1;
1757
1758 /* Round size up to multiple of BIGGEST_ALIGNMENT bits
1759 so that each uninitialized object starts on such a boundary. */
1760 rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1;
1761 rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
1762 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
1763
1764 #if !defined(ASM_OUTPUT_ALIGNED_COMMON) && !defined(ASM_OUTPUT_ALIGNED_DECL_COMMON) && !defined(ASM_OUTPUT_ALIGNED_BSS)
1765 if ((unsigned HOST_WIDE_INT) DECL_ALIGN_UNIT (decl) > rounded)
1766 warning (0, "%Jrequested alignment for %qD is greater than "
1767 "implemented alignment of %d", decl, decl, rounded);
1768 #endif
1769
1770 /* If the target cannot output uninitialized but not common global data
1771 in .bss, then we have to use .data, so fall through. */
1772 if (asm_emit_uninitialised (decl, name, size, rounded))
1773 return;
1774 }
1775
1776 /* Handle initialized definitions.
1777 Also handle uninitialized global definitions if -fno-common and the
1778 target doesn't support ASM_OUTPUT_BSS. */
1779
1780 /* First make the assembler name(s) global if appropriate. */
1781 if (TREE_PUBLIC (decl) && DECL_NAME (decl))
1782 globalize_decl (decl);
1783
1784 /* Output any data that we will need to use the address of. */
1785 if (DECL_INITIAL (decl) == error_mark_node)
1786 reloc = contains_pointers_p (TREE_TYPE (decl)) ? 3 : 0;
1787 else if (DECL_INITIAL (decl))
1788 {
1789 reloc = compute_reloc_for_constant (DECL_INITIAL (decl));
1790 output_addressed_constants (DECL_INITIAL (decl));
1791 }
1792
1793 /* Switch to the appropriate section. */
1794 resolve_unique_section (decl, reloc, flag_data_sections);
1795 variable_section (decl, reloc);
1796
1797 /* dbxout.c needs to know this. */
1798 if (in_text_section () || in_unlikely_text_section ())
1799 DECL_IN_TEXT_SECTION (decl) = 1;
1800
1801 /* Output the alignment of this data. */
1802 if (align > BITS_PER_UNIT)
1803 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (DECL_ALIGN_UNIT (decl)));
1804
1805 /* Do any machine/system dependent processing of the object. */
1806 #ifdef ASM_DECLARE_OBJECT_NAME
1807 last_assemble_variable_decl = decl;
1808 ASM_DECLARE_OBJECT_NAME (asm_out_file, name, decl);
1809 #else
1810 /* Standard thing is just output label for the object. */
1811 ASM_OUTPUT_LABEL (asm_out_file, name);
1812 #endif /* ASM_DECLARE_OBJECT_NAME */
1813
1814 if (!dont_output_data)
1815 {
1816 if (DECL_INITIAL (decl)
1817 && DECL_INITIAL (decl) != error_mark_node
1818 && !initializer_zerop (DECL_INITIAL (decl)))
1819 /* Output the actual data. */
1820 output_constant (DECL_INITIAL (decl),
1821 tree_low_cst (DECL_SIZE_UNIT (decl), 1),
1822 align);
1823 else
1824 /* Leave space for it. */
1825 assemble_zeros (tree_low_cst (DECL_SIZE_UNIT (decl), 1));
1826 }
1827 }
1828
1829 /* Return 1 if type TYPE contains any pointers. */
1830
1831 static int
1832 contains_pointers_p (tree type)
1833 {
1834 switch (TREE_CODE (type))
1835 {
1836 case POINTER_TYPE:
1837 case REFERENCE_TYPE:
1838 /* I'm not sure whether OFFSET_TYPE needs this treatment,
1839 so I'll play safe and return 1. */
1840 case OFFSET_TYPE:
1841 return 1;
1842
1843 case RECORD_TYPE:
1844 case UNION_TYPE:
1845 case QUAL_UNION_TYPE:
1846 {
1847 tree fields;
1848 /* For a type that has fields, see if the fields have pointers. */
1849 for (fields = TYPE_FIELDS (type); fields; fields = TREE_CHAIN (fields))
1850 if (TREE_CODE (fields) == FIELD_DECL
1851 && contains_pointers_p (TREE_TYPE (fields)))
1852 return 1;
1853 return 0;
1854 }
1855
1856 case ARRAY_TYPE:
1857 /* An array type contains pointers if its element type does. */
1858 return contains_pointers_p (TREE_TYPE (type));
1859
1860 default:
1861 return 0;
1862 }
1863 }
1864
1865 /* In unit-at-a-time mode, we delay assemble_external processing until
1866 the compilation unit is finalized. This is the best we can do for
1867 right now (i.e. stage 3 of GCC 4.0) - the right thing is to delay
1868 it all the way to final. See PR 17982 for further discussion. */
1869 static GTY(()) tree pending_assemble_externals;
1870
1871 #ifdef ASM_OUTPUT_EXTERNAL
1872 /* True if DECL is a function decl for which no out-of-line copy exists.
1873 It is assumed that DECL's assembler name has been set. */
1874
1875 static bool
1876 incorporeal_function_p (tree decl)
1877 {
1878 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl))
1879 {
1880 const char *name;
1881
1882 if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
1883 && DECL_FUNCTION_CODE (decl) == BUILT_IN_ALLOCA)
1884 return true;
1885
1886 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
1887 if (strncmp (name, "__builtin_", strlen ("__builtin_")) == 0)
1888 return true;
1889 }
1890 return false;
1891 }
1892
1893 /* Actually do the tests to determine if this is necessary, and invoke
1894 ASM_OUTPUT_EXTERNAL. */
1895 static void
1896 assemble_external_real (tree decl)
1897 {
1898 rtx rtl = DECL_RTL (decl);
1899
1900 if (MEM_P (rtl) && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF
1901 && !SYMBOL_REF_USED (XEXP (rtl, 0))
1902 && !incorporeal_function_p (decl))
1903 {
1904 /* Some systems do require some output. */
1905 SYMBOL_REF_USED (XEXP (rtl, 0)) = 1;
1906 ASM_OUTPUT_EXTERNAL (asm_out_file, decl, XSTR (XEXP (rtl, 0), 0));
1907 }
1908 }
1909 #endif
1910
1911 void
1912 process_pending_assemble_externals (void)
1913 {
1914 #ifdef ASM_OUTPUT_EXTERNAL
1915 tree list;
1916 for (list = pending_assemble_externals; list; list = TREE_CHAIN (list))
1917 assemble_external_real (TREE_VALUE (list));
1918
1919 pending_assemble_externals = 0;
1920 #endif
1921 }
1922
1923 /* Output something to declare an external symbol to the assembler.
1924 (Most assemblers don't need this, so we normally output nothing.)
1925 Do nothing if DECL is not external. */
1926
1927 void
1928 assemble_external (tree decl ATTRIBUTE_UNUSED)
1929 {
1930 /* Because most platforms do not define ASM_OUTPUT_EXTERNAL, the
1931 main body of this code is only rarely exercised. To provide some
1932 testing, on all platforms, we make sure that the ASM_OUT_FILE is
1933 open. If it's not, we should not be calling this function. */
1934 gcc_assert (asm_out_file);
1935
1936 #ifdef ASM_OUTPUT_EXTERNAL
1937 if (!DECL_P (decl) || !DECL_EXTERNAL (decl) || !TREE_PUBLIC (decl))
1938 return;
1939
1940 if (flag_unit_at_a_time)
1941 pending_assemble_externals = tree_cons (0, decl,
1942 pending_assemble_externals);
1943 else
1944 assemble_external_real (decl);
1945 #endif
1946 }
1947
1948 /* Similar, for calling a library function FUN. */
1949
1950 void
1951 assemble_external_libcall (rtx fun)
1952 {
1953 /* Declare library function name external when first used, if nec. */
1954 if (! SYMBOL_REF_USED (fun))
1955 {
1956 SYMBOL_REF_USED (fun) = 1;
1957 targetm.asm_out.external_libcall (fun);
1958 }
1959 }
1960
1961 /* Assemble a label named NAME. */
1962
1963 void
1964 assemble_label (const char *name)
1965 {
1966 ASM_OUTPUT_LABEL (asm_out_file, name);
1967 }
1968
1969 /* Set the symbol_referenced flag for ID. */
1970 void
1971 mark_referenced (tree id)
1972 {
1973 TREE_SYMBOL_REFERENCED (id) = 1;
1974 }
1975
1976 /* Set the symbol_referenced flag for DECL and notify callgraph. */
1977 void
1978 mark_decl_referenced (tree decl)
1979 {
1980 if (TREE_CODE (decl) == FUNCTION_DECL)
1981 {
1982 /* Extern inline functions don't become needed when referenced.
1983 If we know a method will be emitted in other TU and no new
1984 functions can be marked reachable, just use the external
1985 definition. */
1986 struct cgraph_node *node = cgraph_node (decl);
1987 if (!DECL_EXTERNAL (decl)
1988 && (!node->local.vtable_method || !cgraph_global_info_ready
1989 || !node->local.finalized))
1990 cgraph_mark_needed_node (node);
1991 }
1992 else if (TREE_CODE (decl) == VAR_DECL)
1993 {
1994 struct cgraph_varpool_node *node = cgraph_varpool_node (decl);
1995 cgraph_varpool_mark_needed_node (node);
1996 /* C++ frontend use mark_decl_references to force COMDAT variables
1997 to be output that might appear dead otherwise. */
1998 node->force_output = true;
1999 }
2000 /* else do nothing - we can get various sorts of CST nodes here,
2001 which do not need to be marked. */
2002 }
2003
2004 /* Output to FILE (an assembly file) a reference to NAME. If NAME
2005 starts with a *, the rest of NAME is output verbatim. Otherwise
2006 NAME is transformed in a target-specific way (usually by the
2007 addition of an underscore). */
2008
2009 void
2010 assemble_name_raw (FILE *file, const char *name)
2011 {
2012 if (name[0] == '*')
2013 fputs (&name[1], file);
2014 else
2015 ASM_OUTPUT_LABELREF (file, name);
2016 }
2017
2018 /* Like assemble_name_raw, but should be used when NAME might refer to
2019 an entity that is also represented as a tree (like a function or
2020 variable). If NAME does refer to such an entity, that entity will
2021 be marked as referenced. */
2022
2023 void
2024 assemble_name (FILE *file, const char *name)
2025 {
2026 const char *real_name;
2027 tree id;
2028
2029 real_name = targetm.strip_name_encoding (name);
2030
2031 id = maybe_get_identifier (real_name);
2032 if (id)
2033 mark_referenced (id);
2034
2035 assemble_name_raw (file, name);
2036 }
2037
2038 /* Allocate SIZE bytes writable static space with a gensym name
2039 and return an RTX to refer to its address. */
2040
2041 rtx
2042 assemble_static_space (unsigned HOST_WIDE_INT size)
2043 {
2044 char name[12];
2045 const char *namestring;
2046 rtx x;
2047
2048 #if 0
2049 if (flag_shared_data)
2050 data_section ();
2051 #endif
2052
2053 ASM_GENERATE_INTERNAL_LABEL (name, "LF", const_labelno);
2054 ++const_labelno;
2055 namestring = ggc_strdup (name);
2056
2057 x = gen_rtx_SYMBOL_REF (Pmode, namestring);
2058 SYMBOL_REF_FLAGS (x) = SYMBOL_FLAG_LOCAL;
2059
2060 #ifdef ASM_OUTPUT_ALIGNED_DECL_LOCAL
2061 ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, NULL_TREE, name, size,
2062 BIGGEST_ALIGNMENT);
2063 #else
2064 #ifdef ASM_OUTPUT_ALIGNED_LOCAL
2065 ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, BIGGEST_ALIGNMENT);
2066 #else
2067 {
2068 /* Round size up to multiple of BIGGEST_ALIGNMENT bits
2069 so that each uninitialized object starts on such a boundary. */
2070 /* Variable `rounded' might or might not be used in ASM_OUTPUT_LOCAL. */
2071 unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED
2072 = ((size + (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1)
2073 / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
2074 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
2075 ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
2076 }
2077 #endif
2078 #endif
2079 return x;
2080 }
2081
2082 /* Assemble the static constant template for function entry trampolines.
2083 This is done at most once per compilation.
2084 Returns an RTX for the address of the template. */
2085
2086 static GTY(()) rtx initial_trampoline;
2087
2088 #ifdef TRAMPOLINE_TEMPLATE
2089 rtx
2090 assemble_trampoline_template (void)
2091 {
2092 char label[256];
2093 const char *name;
2094 int align;
2095 rtx symbol;
2096
2097 if (initial_trampoline)
2098 return initial_trampoline;
2099
2100 /* By default, put trampoline templates in read-only data section. */
2101
2102 #ifdef TRAMPOLINE_SECTION
2103 TRAMPOLINE_SECTION ();
2104 #else
2105 readonly_data_section ();
2106 #endif
2107
2108 /* Write the assembler code to define one. */
2109 align = floor_log2 (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT);
2110 if (align > 0)
2111 {
2112 ASM_OUTPUT_ALIGN (asm_out_file, align);
2113 }
2114
2115 targetm.asm_out.internal_label (asm_out_file, "LTRAMP", 0);
2116 TRAMPOLINE_TEMPLATE (asm_out_file);
2117
2118 /* Record the rtl to refer to it. */
2119 ASM_GENERATE_INTERNAL_LABEL (label, "LTRAMP", 0);
2120 name = ggc_strdup (label);
2121 symbol = gen_rtx_SYMBOL_REF (Pmode, name);
2122 SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
2123
2124 initial_trampoline = gen_rtx_MEM (BLKmode, symbol);
2125 set_mem_align (initial_trampoline, TRAMPOLINE_ALIGNMENT);
2126
2127 return initial_trampoline;
2128 }
2129 #endif
2130 \f
2131 /* A and B are either alignments or offsets. Return the minimum alignment
2132 that may be assumed after adding the two together. */
2133
2134 static inline unsigned
2135 min_align (unsigned int a, unsigned int b)
2136 {
2137 return (a | b) & -(a | b);
2138 }
2139
2140 /* Return the assembler directive for creating a given kind of integer
2141 object. SIZE is the number of bytes in the object and ALIGNED_P
2142 indicates whether it is known to be aligned. Return NULL if the
2143 assembly dialect has no such directive.
2144
2145 The returned string should be printed at the start of a new line and
2146 be followed immediately by the object's initial value. */
2147
2148 const char *
2149 integer_asm_op (int size, int aligned_p)
2150 {
2151 struct asm_int_op *ops;
2152
2153 if (aligned_p)
2154 ops = &targetm.asm_out.aligned_op;
2155 else
2156 ops = &targetm.asm_out.unaligned_op;
2157
2158 switch (size)
2159 {
2160 case 1:
2161 return targetm.asm_out.byte_op;
2162 case 2:
2163 return ops->hi;
2164 case 4:
2165 return ops->si;
2166 case 8:
2167 return ops->di;
2168 case 16:
2169 return ops->ti;
2170 default:
2171 return NULL;
2172 }
2173 }
2174
2175 /* Use directive OP to assemble an integer object X. Print OP at the
2176 start of the line, followed immediately by the value of X. */
2177
2178 void
2179 assemble_integer_with_op (const char *op, rtx x)
2180 {
2181 fputs (op, asm_out_file);
2182 output_addr_const (asm_out_file, x);
2183 fputc ('\n', asm_out_file);
2184 }
2185
2186 /* The default implementation of the asm_out.integer target hook. */
2187
2188 bool
2189 default_assemble_integer (rtx x ATTRIBUTE_UNUSED,
2190 unsigned int size ATTRIBUTE_UNUSED,
2191 int aligned_p ATTRIBUTE_UNUSED)
2192 {
2193 const char *op = integer_asm_op (size, aligned_p);
2194 /* Avoid GAS bugs for large values. Specifically negative values whose
2195 absolute value fits in a bfd_vma, but not in a bfd_signed_vma. */
2196 if (size > UNITS_PER_WORD && size > POINTER_SIZE / BITS_PER_UNIT)
2197 return false;
2198 return op && (assemble_integer_with_op (op, x), true);
2199 }
2200
2201 /* Assemble the integer constant X into an object of SIZE bytes. ALIGN is
2202 the alignment of the integer in bits. Return 1 if we were able to output
2203 the constant, otherwise 0. We must be able to output the constant,
2204 if FORCE is nonzero. */
2205
2206 bool
2207 assemble_integer (rtx x, unsigned int size, unsigned int align, int force)
2208 {
2209 int aligned_p;
2210
2211 aligned_p = (align >= MIN (size * BITS_PER_UNIT, BIGGEST_ALIGNMENT));
2212
2213 /* See if the target hook can handle this kind of object. */
2214 if (targetm.asm_out.integer (x, size, aligned_p))
2215 return true;
2216
2217 /* If the object is a multi-byte one, try splitting it up. Split
2218 it into words it if is multi-word, otherwise split it into bytes. */
2219 if (size > 1)
2220 {
2221 enum machine_mode omode, imode;
2222 unsigned int subalign;
2223 unsigned int subsize, i;
2224
2225 subsize = size > UNITS_PER_WORD? UNITS_PER_WORD : 1;
2226 subalign = MIN (align, subsize * BITS_PER_UNIT);
2227 omode = mode_for_size (subsize * BITS_PER_UNIT, MODE_INT, 0);
2228 imode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
2229
2230 for (i = 0; i < size; i += subsize)
2231 {
2232 rtx partial = simplify_subreg (omode, x, imode, i);
2233 if (!partial || !assemble_integer (partial, subsize, subalign, 0))
2234 break;
2235 }
2236 if (i == size)
2237 return true;
2238
2239 /* If we've printed some of it, but not all of it, there's no going
2240 back now. */
2241 gcc_assert (!i);
2242 }
2243
2244 gcc_assert (!force);
2245
2246 return false;
2247 }
2248 \f
2249 void
2250 assemble_real (REAL_VALUE_TYPE d, enum machine_mode mode, unsigned int align)
2251 {
2252 long data[4];
2253 int i;
2254 int bitsize, nelts, nunits, units_per;
2255
2256 /* This is hairy. We have a quantity of known size. real_to_target
2257 will put it into an array of *host* longs, 32 bits per element
2258 (even if long is more than 32 bits). We need to determine the
2259 number of array elements that are occupied (nelts) and the number
2260 of *target* min-addressable units that will be occupied in the
2261 object file (nunits). We cannot assume that 32 divides the
2262 mode's bitsize (size * BITS_PER_UNIT) evenly.
2263
2264 size * BITS_PER_UNIT is used here to make sure that padding bits
2265 (which might appear at either end of the value; real_to_target
2266 will include the padding bits in its output array) are included. */
2267
2268 nunits = GET_MODE_SIZE (mode);
2269 bitsize = nunits * BITS_PER_UNIT;
2270 nelts = CEIL (bitsize, 32);
2271 units_per = 32 / BITS_PER_UNIT;
2272
2273 real_to_target (data, &d, mode);
2274
2275 /* Put out the first word with the specified alignment. */
2276 assemble_integer (GEN_INT (data[0]), MIN (nunits, units_per), align, 1);
2277 nunits -= units_per;
2278
2279 /* Subsequent words need only 32-bit alignment. */
2280 align = min_align (align, 32);
2281
2282 for (i = 1; i < nelts; i++)
2283 {
2284 assemble_integer (GEN_INT (data[i]), MIN (nunits, units_per), align, 1);
2285 nunits -= units_per;
2286 }
2287 }
2288 \f
2289 /* Given an expression EXP with a constant value,
2290 reduce it to the sum of an assembler symbol and an integer.
2291 Store them both in the structure *VALUE.
2292 EXP must be reducible. */
2293
2294 struct addr_const GTY(())
2295 {
2296 rtx base;
2297 HOST_WIDE_INT offset;
2298 };
2299
2300 static void
2301 decode_addr_const (tree exp, struct addr_const *value)
2302 {
2303 tree target = TREE_OPERAND (exp, 0);
2304 int offset = 0;
2305 rtx x;
2306
2307 while (1)
2308 {
2309 if (TREE_CODE (target) == COMPONENT_REF
2310 && host_integerp (byte_position (TREE_OPERAND (target, 1)), 0))
2311
2312 {
2313 offset += int_byte_position (TREE_OPERAND (target, 1));
2314 target = TREE_OPERAND (target, 0);
2315 }
2316 else if (TREE_CODE (target) == ARRAY_REF
2317 || TREE_CODE (target) == ARRAY_RANGE_REF)
2318 {
2319 offset += (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (target)), 1)
2320 * tree_low_cst (TREE_OPERAND (target, 1), 0));
2321 target = TREE_OPERAND (target, 0);
2322 }
2323 else
2324 break;
2325 }
2326
2327 switch (TREE_CODE (target))
2328 {
2329 case VAR_DECL:
2330 case FUNCTION_DECL:
2331 x = DECL_RTL (target);
2332 break;
2333
2334 case LABEL_DECL:
2335 x = gen_rtx_MEM (FUNCTION_MODE,
2336 gen_rtx_LABEL_REF (Pmode, force_label_rtx (target)));
2337 break;
2338
2339 case REAL_CST:
2340 case STRING_CST:
2341 case COMPLEX_CST:
2342 case CONSTRUCTOR:
2343 case INTEGER_CST:
2344 x = output_constant_def (target, 1);
2345 break;
2346
2347 default:
2348 gcc_unreachable ();
2349 }
2350
2351 gcc_assert (MEM_P (x));
2352 x = XEXP (x, 0);
2353
2354 value->base = x;
2355 value->offset = offset;
2356 }
2357 \f
2358 /* Uniquize all constants that appear in memory.
2359 Each constant in memory thus far output is recorded
2360 in `const_desc_table'. */
2361
2362 struct constant_descriptor_tree GTY(())
2363 {
2364 /* A MEM for the constant. */
2365 rtx rtl;
2366
2367 /* The value of the constant. */
2368 tree value;
2369 };
2370
2371 static GTY((param_is (struct constant_descriptor_tree)))
2372 htab_t const_desc_htab;
2373
2374 static struct constant_descriptor_tree * build_constant_desc (tree);
2375 static void maybe_output_constant_def_contents (struct constant_descriptor_tree *, int);
2376
2377 /* Compute a hash code for a constant expression. */
2378
2379 static hashval_t
2380 const_desc_hash (const void *ptr)
2381 {
2382 return const_hash_1 (((struct constant_descriptor_tree *)ptr)->value);
2383 }
2384
2385 static hashval_t
2386 const_hash_1 (const tree exp)
2387 {
2388 const char *p;
2389 hashval_t hi;
2390 int len, i;
2391 enum tree_code code = TREE_CODE (exp);
2392
2393 /* Either set P and LEN to the address and len of something to hash and
2394 exit the switch or return a value. */
2395
2396 switch (code)
2397 {
2398 case INTEGER_CST:
2399 p = (char *) &TREE_INT_CST (exp);
2400 len = sizeof TREE_INT_CST (exp);
2401 break;
2402
2403 case REAL_CST:
2404 return real_hash (TREE_REAL_CST_PTR (exp));
2405
2406 case STRING_CST:
2407 p = TREE_STRING_POINTER (exp);
2408 len = TREE_STRING_LENGTH (exp);
2409 break;
2410
2411 case COMPLEX_CST:
2412 return (const_hash_1 (TREE_REALPART (exp)) * 5
2413 + const_hash_1 (TREE_IMAGPART (exp)));
2414
2415 case CONSTRUCTOR:
2416 {
2417 tree link;
2418
2419 hi = 5 + int_size_in_bytes (TREE_TYPE (exp));
2420
2421 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2422 if (TREE_VALUE (link))
2423 hi = hi * 603 + const_hash_1 (TREE_VALUE (link));
2424
2425 return hi;
2426 }
2427
2428 case ADDR_EXPR:
2429 case FDESC_EXPR:
2430 {
2431 struct addr_const value;
2432
2433 decode_addr_const (exp, &value);
2434 switch (GET_CODE (value.base))
2435 {
2436 case SYMBOL_REF:
2437 /* Don't hash the address of the SYMBOL_REF;
2438 only use the offset and the symbol name. */
2439 hi = value.offset;
2440 p = XSTR (value.base, 0);
2441 for (i = 0; p[i] != 0; i++)
2442 hi = ((hi * 613) + (unsigned) (p[i]));
2443 break;
2444
2445 case LABEL_REF:
2446 hi = value.offset + CODE_LABEL_NUMBER (XEXP (value.base, 0)) * 13;
2447 break;
2448
2449 default:
2450 gcc_unreachable ();
2451 }
2452 }
2453 return hi;
2454
2455 case PLUS_EXPR:
2456 case MINUS_EXPR:
2457 return (const_hash_1 (TREE_OPERAND (exp, 0)) * 9
2458 + const_hash_1 (TREE_OPERAND (exp, 1)));
2459
2460 case NOP_EXPR:
2461 case CONVERT_EXPR:
2462 case NON_LVALUE_EXPR:
2463 return const_hash_1 (TREE_OPERAND (exp, 0)) * 7 + 2;
2464
2465 default:
2466 /* A language specific constant. Just hash the code. */
2467 return code;
2468 }
2469
2470 /* Compute hashing function. */
2471 hi = len;
2472 for (i = 0; i < len; i++)
2473 hi = ((hi * 613) + (unsigned) (p[i]));
2474
2475 return hi;
2476 }
2477
2478 /* Wrapper of compare_constant, for the htab interface. */
2479 static int
2480 const_desc_eq (const void *p1, const void *p2)
2481 {
2482 return compare_constant (((struct constant_descriptor_tree *)p1)->value,
2483 ((struct constant_descriptor_tree *)p2)->value);
2484 }
2485
2486 /* Compare t1 and t2, and return 1 only if they are known to result in
2487 the same bit pattern on output. */
2488
2489 static int
2490 compare_constant (const tree t1, const tree t2)
2491 {
2492 enum tree_code typecode;
2493
2494 if (t1 == NULL_TREE)
2495 return t2 == NULL_TREE;
2496 if (t2 == NULL_TREE)
2497 return 0;
2498
2499 if (TREE_CODE (t1) != TREE_CODE (t2))
2500 return 0;
2501
2502 switch (TREE_CODE (t1))
2503 {
2504 case INTEGER_CST:
2505 /* Integer constants are the same only if the same width of type. */
2506 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2507 return 0;
2508 return tree_int_cst_equal (t1, t2);
2509
2510 case REAL_CST:
2511 /* Real constants are the same only if the same width of type. */
2512 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2513 return 0;
2514
2515 return REAL_VALUES_IDENTICAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2));
2516
2517 case STRING_CST:
2518 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
2519 return 0;
2520
2521 return (TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
2522 && ! memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
2523 TREE_STRING_LENGTH (t1)));
2524
2525 case COMPLEX_CST:
2526 return (compare_constant (TREE_REALPART (t1), TREE_REALPART (t2))
2527 && compare_constant (TREE_IMAGPART (t1), TREE_IMAGPART (t2)));
2528
2529 case CONSTRUCTOR:
2530 {
2531 tree l1, l2;
2532
2533 typecode = TREE_CODE (TREE_TYPE (t1));
2534 if (typecode != TREE_CODE (TREE_TYPE (t2)))
2535 return 0;
2536
2537 if (typecode == ARRAY_TYPE)
2538 {
2539 HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1));
2540 /* For arrays, check that the sizes all match. */
2541 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))
2542 || size_1 == -1
2543 || size_1 != int_size_in_bytes (TREE_TYPE (t2)))
2544 return 0;
2545 }
2546 else
2547 {
2548 /* For record and union constructors, require exact type
2549 equality. */
2550 if (TREE_TYPE (t1) != TREE_TYPE (t2))
2551 return 0;
2552 }
2553
2554 for (l1 = CONSTRUCTOR_ELTS (t1), l2 = CONSTRUCTOR_ELTS (t2);
2555 l1 && l2;
2556 l1 = TREE_CHAIN (l1), l2 = TREE_CHAIN (l2))
2557 {
2558 /* Check that each value is the same... */
2559 if (! compare_constant (TREE_VALUE (l1), TREE_VALUE (l2)))
2560 return 0;
2561 /* ... and that they apply to the same fields! */
2562 if (typecode == ARRAY_TYPE)
2563 {
2564 if (! compare_constant (TREE_PURPOSE (l1),
2565 TREE_PURPOSE (l2)))
2566 return 0;
2567 }
2568 else
2569 {
2570 if (TREE_PURPOSE (l1) != TREE_PURPOSE (l2))
2571 return 0;
2572 }
2573 }
2574
2575 return l1 == NULL_TREE && l2 == NULL_TREE;
2576 }
2577
2578 case ADDR_EXPR:
2579 case FDESC_EXPR:
2580 {
2581 struct addr_const value1, value2;
2582
2583 decode_addr_const (t1, &value1);
2584 decode_addr_const (t2, &value2);
2585 return (value1.offset == value2.offset
2586 && strcmp (XSTR (value1.base, 0), XSTR (value2.base, 0)) == 0);
2587 }
2588
2589 case PLUS_EXPR:
2590 case MINUS_EXPR:
2591 case RANGE_EXPR:
2592 return (compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0))
2593 && compare_constant(TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1)));
2594
2595 case NOP_EXPR:
2596 case CONVERT_EXPR:
2597 case NON_LVALUE_EXPR:
2598 case VIEW_CONVERT_EXPR:
2599 return compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2600
2601 default:
2602 {
2603 tree nt1, nt2;
2604 nt1 = lang_hooks.expand_constant (t1);
2605 nt2 = lang_hooks.expand_constant (t2);
2606 if (nt1 != t1 || nt2 != t2)
2607 return compare_constant (nt1, nt2);
2608 else
2609 return 0;
2610 }
2611 }
2612
2613 gcc_unreachable ();
2614 }
2615 \f
2616 /* Make a copy of the whole tree structure for a constant. This
2617 handles the same types of nodes that compare_constant handles. */
2618
2619 static tree
2620 copy_constant (tree exp)
2621 {
2622 switch (TREE_CODE (exp))
2623 {
2624 case ADDR_EXPR:
2625 /* For ADDR_EXPR, we do not want to copy the decl whose address
2626 is requested. We do want to copy constants though. */
2627 if (CONSTANT_CLASS_P (TREE_OPERAND (exp, 0)))
2628 return build1 (TREE_CODE (exp), TREE_TYPE (exp),
2629 copy_constant (TREE_OPERAND (exp, 0)));
2630 else
2631 return copy_node (exp);
2632
2633 case INTEGER_CST:
2634 case REAL_CST:
2635 case STRING_CST:
2636 return copy_node (exp);
2637
2638 case COMPLEX_CST:
2639 return build_complex (TREE_TYPE (exp),
2640 copy_constant (TREE_REALPART (exp)),
2641 copy_constant (TREE_IMAGPART (exp)));
2642
2643 case PLUS_EXPR:
2644 case MINUS_EXPR:
2645 return build2 (TREE_CODE (exp), TREE_TYPE (exp),
2646 copy_constant (TREE_OPERAND (exp, 0)),
2647 copy_constant (TREE_OPERAND (exp, 1)));
2648
2649 case NOP_EXPR:
2650 case CONVERT_EXPR:
2651 case NON_LVALUE_EXPR:
2652 case VIEW_CONVERT_EXPR:
2653 return build1 (TREE_CODE (exp), TREE_TYPE (exp),
2654 copy_constant (TREE_OPERAND (exp, 0)));
2655
2656 case CONSTRUCTOR:
2657 {
2658 tree copy = copy_node (exp);
2659 tree list = copy_list (CONSTRUCTOR_ELTS (exp));
2660 tree tail;
2661
2662 CONSTRUCTOR_ELTS (copy) = list;
2663 for (tail = list; tail; tail = TREE_CHAIN (tail))
2664 TREE_VALUE (tail) = copy_constant (TREE_VALUE (tail));
2665
2666 return copy;
2667 }
2668
2669 default:
2670 {
2671 tree t = lang_hooks.expand_constant (exp);
2672
2673 gcc_assert (t == exp);
2674 return copy_constant (t);
2675 }
2676 }
2677 }
2678 \f
2679 /* Subroutine of output_constant_def:
2680 No constant equal to EXP is known to have been output.
2681 Make a constant descriptor to enter EXP in the hash table.
2682 Assign the label number and construct RTL to refer to the
2683 constant's location in memory.
2684 Caller is responsible for updating the hash table. */
2685
2686 static struct constant_descriptor_tree *
2687 build_constant_desc (tree exp)
2688 {
2689 rtx symbol;
2690 rtx rtl;
2691 char label[256];
2692 int labelno;
2693 struct constant_descriptor_tree *desc;
2694
2695 desc = ggc_alloc (sizeof (*desc));
2696 desc->value = copy_constant (exp);
2697
2698 /* Propagate marked-ness to copied constant. */
2699 if (flag_mudflap && mf_marked_p (exp))
2700 mf_mark (desc->value);
2701
2702 /* Create a string containing the label name, in LABEL. */
2703 labelno = const_labelno++;
2704 ASM_GENERATE_INTERNAL_LABEL (label, "LC", labelno);
2705
2706 /* We have a symbol name; construct the SYMBOL_REF and the MEM. */
2707 symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
2708 SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
2709 SYMBOL_REF_DECL (symbol) = desc->value;
2710 TREE_CONSTANT_POOL_ADDRESS_P (symbol) = 1;
2711
2712 rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp)), symbol);
2713 set_mem_attributes (rtl, exp, 1);
2714 set_mem_alias_set (rtl, 0);
2715 set_mem_alias_set (rtl, const_alias_set);
2716
2717 /* Set flags or add text to the name to record information, such as
2718 that it is a local symbol. If the name is changed, the macro
2719 ASM_OUTPUT_LABELREF will have to know how to strip this
2720 information. This call might invalidate our local variable
2721 SYMBOL; we can't use it afterward. */
2722
2723 targetm.encode_section_info (exp, rtl, true);
2724
2725 desc->rtl = rtl;
2726
2727 return desc;
2728 }
2729
2730 /* Return an rtx representing a reference to constant data in memory
2731 for the constant expression EXP.
2732
2733 If assembler code for such a constant has already been output,
2734 return an rtx to refer to it.
2735 Otherwise, output such a constant in memory
2736 and generate an rtx for it.
2737
2738 If DEFER is nonzero, this constant can be deferred and output only
2739 if referenced in the function after all optimizations.
2740
2741 `const_desc_table' records which constants already have label strings. */
2742
2743 rtx
2744 output_constant_def (tree exp, int defer)
2745 {
2746 struct constant_descriptor_tree *desc;
2747 struct constant_descriptor_tree key;
2748 void **loc;
2749
2750 /* Look up EXP in the table of constant descriptors. If we didn't find
2751 it, create a new one. */
2752 key.value = exp;
2753 loc = htab_find_slot (const_desc_htab, &key, INSERT);
2754
2755 desc = *loc;
2756 if (desc == 0)
2757 {
2758 desc = build_constant_desc (exp);
2759 *loc = desc;
2760 }
2761
2762 maybe_output_constant_def_contents (desc, defer);
2763 return desc->rtl;
2764 }
2765
2766 /* Subroutine of output_constant_def: Decide whether or not we need to
2767 output the constant DESC now, and if so, do it. */
2768 static void
2769 maybe_output_constant_def_contents (struct constant_descriptor_tree *desc,
2770 int defer)
2771 {
2772 rtx symbol = XEXP (desc->rtl, 0);
2773 tree exp = desc->value;
2774
2775 if (flag_syntax_only)
2776 return;
2777
2778 if (TREE_ASM_WRITTEN (exp))
2779 /* Already output; don't do it again. */
2780 return;
2781
2782 /* We can always defer constants as long as the context allows
2783 doing so. */
2784 if (defer)
2785 {
2786 /* Increment n_deferred_constants if it exists. It needs to be at
2787 least as large as the number of constants actually referred to
2788 by the function. If it's too small we'll stop looking too early
2789 and fail to emit constants; if it's too large we'll only look
2790 through the entire function when we could have stopped earlier. */
2791 if (cfun)
2792 n_deferred_constants++;
2793 return;
2794 }
2795
2796 output_constant_def_contents (symbol);
2797 }
2798
2799 /* We must output the constant data referred to by SYMBOL; do so. */
2800
2801 static void
2802 output_constant_def_contents (rtx symbol)
2803 {
2804 tree exp = SYMBOL_REF_DECL (symbol);
2805 const char *label = XSTR (symbol, 0);
2806 HOST_WIDE_INT size;
2807
2808 /* Make sure any other constants whose addresses appear in EXP
2809 are assigned label numbers. */
2810 int reloc = compute_reloc_for_constant (exp);
2811
2812 /* Align the location counter as required by EXP's data type. */
2813 unsigned int align = TYPE_ALIGN (TREE_TYPE (exp));
2814 #ifdef CONSTANT_ALIGNMENT
2815 align = CONSTANT_ALIGNMENT (exp, align);
2816 #endif
2817
2818 output_addressed_constants (exp);
2819
2820 /* We are no longer deferring this constant. */
2821 TREE_ASM_WRITTEN (exp) = 1;
2822
2823 if (IN_NAMED_SECTION (exp))
2824 named_section (exp, NULL, reloc);
2825 else
2826 targetm.asm_out.select_section (exp, reloc, align);
2827
2828 if (align > BITS_PER_UNIT)
2829 {
2830 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
2831 }
2832
2833 size = int_size_in_bytes (TREE_TYPE (exp));
2834 if (TREE_CODE (exp) == STRING_CST)
2835 size = MAX (TREE_STRING_LENGTH (exp), size);
2836
2837 /* Do any machine/system dependent processing of the constant. */
2838 #ifdef ASM_DECLARE_CONSTANT_NAME
2839 ASM_DECLARE_CONSTANT_NAME (asm_out_file, label, exp, size);
2840 #else
2841 /* Standard thing is just output label for the constant. */
2842 ASM_OUTPUT_LABEL (asm_out_file, label);
2843 #endif /* ASM_DECLARE_CONSTANT_NAME */
2844
2845 /* Output the value of EXP. */
2846 output_constant (exp, size, align);
2847 if (flag_mudflap)
2848 mudflap_enqueue_constant (exp);
2849 }
2850
2851 /* Look up EXP in the table of constant descriptors. Return the rtl
2852 if it has been emitted, else null. */
2853
2854 rtx
2855 lookup_constant_def (tree exp)
2856 {
2857 struct constant_descriptor_tree *desc;
2858 struct constant_descriptor_tree key;
2859
2860 key.value = exp;
2861 desc = htab_find (const_desc_htab, &key);
2862
2863 return (desc ? desc->rtl : NULL_RTX);
2864 }
2865 \f
2866 /* Used in the hash tables to avoid outputting the same constant
2867 twice. Unlike 'struct constant_descriptor_tree', RTX constants
2868 are output once per function, not once per file. */
2869 /* ??? Only a few targets need per-function constant pools. Most
2870 can use one per-file pool. Should add a targetm bit to tell the
2871 difference. */
2872
2873 struct rtx_constant_pool GTY(())
2874 {
2875 /* Pointers to first and last constant in pool, as ordered by offset. */
2876 struct constant_descriptor_rtx *first;
2877 struct constant_descriptor_rtx *last;
2878
2879 /* Hash facility for making memory-constants from constant rtl-expressions.
2880 It is used on RISC machines where immediate integer arguments and
2881 constant addresses are restricted so that such constants must be stored
2882 in memory. */
2883 htab_t GTY((param_is (struct constant_descriptor_rtx))) const_rtx_htab;
2884 htab_t GTY((param_is (struct constant_descriptor_rtx))) const_rtx_sym_htab;
2885
2886 /* Current offset in constant pool (does not include any
2887 machine-specific header). */
2888 HOST_WIDE_INT offset;
2889 };
2890
2891 struct constant_descriptor_rtx GTY((chain_next ("%h.next")))
2892 {
2893 struct constant_descriptor_rtx *next;
2894 rtx mem;
2895 rtx sym;
2896 rtx constant;
2897 HOST_WIDE_INT offset;
2898 hashval_t hash;
2899 enum machine_mode mode;
2900 unsigned int align;
2901 int labelno;
2902 int mark;
2903 };
2904
2905 /* Hash and compare functions for const_rtx_htab. */
2906
2907 static hashval_t
2908 const_desc_rtx_hash (const void *ptr)
2909 {
2910 const struct constant_descriptor_rtx *desc = ptr;
2911 return desc->hash;
2912 }
2913
2914 static int
2915 const_desc_rtx_eq (const void *a, const void *b)
2916 {
2917 const struct constant_descriptor_rtx *x = a;
2918 const struct constant_descriptor_rtx *y = b;
2919
2920 if (x->mode != y->mode)
2921 return 0;
2922 return rtx_equal_p (x->constant, y->constant);
2923 }
2924
2925 /* Hash and compare functions for const_rtx_sym_htab. */
2926
2927 static hashval_t
2928 const_desc_rtx_sym_hash (const void *ptr)
2929 {
2930 const struct constant_descriptor_rtx *desc = ptr;
2931 return htab_hash_string (XSTR (desc->sym, 0));
2932 }
2933
2934 static int
2935 const_desc_rtx_sym_eq (const void *a, const void *b)
2936 {
2937 const struct constant_descriptor_rtx *x = a;
2938 const struct constant_descriptor_rtx *y = b;
2939 return XSTR (x->sym, 0) == XSTR (y->sym, 0);
2940 }
2941
2942 /* This is the worker function for const_rtx_hash, called via for_each_rtx. */
2943
2944 static int
2945 const_rtx_hash_1 (rtx *xp, void *data)
2946 {
2947 unsigned HOST_WIDE_INT hwi;
2948 enum machine_mode mode;
2949 enum rtx_code code;
2950 hashval_t h, *hp;
2951 rtx x;
2952
2953 x = *xp;
2954 code = GET_CODE (x);
2955 mode = GET_MODE (x);
2956 h = (hashval_t) code * 1048573 + mode;
2957
2958 switch (code)
2959 {
2960 case CONST_INT:
2961 hwi = INTVAL (x);
2962 fold_hwi:
2963 {
2964 const int shift = sizeof (hashval_t) * CHAR_BIT;
2965 const int n = sizeof (HOST_WIDE_INT) / sizeof (hashval_t);
2966 int i;
2967
2968 h ^= (hashval_t) hwi;
2969 for (i = 1; i < n; ++i)
2970 {
2971 hwi >>= shift;
2972 h ^= (hashval_t) hwi;
2973 }
2974 }
2975 break;
2976
2977 case CONST_DOUBLE:
2978 if (mode == VOIDmode)
2979 {
2980 hwi = CONST_DOUBLE_LOW (x) ^ CONST_DOUBLE_HIGH (x);
2981 goto fold_hwi;
2982 }
2983 else
2984 h ^= real_hash (CONST_DOUBLE_REAL_VALUE (x));
2985 break;
2986
2987 case CONST_VECTOR:
2988 {
2989 int i;
2990 for (i = XVECLEN (x, 0); i-- > 0; )
2991 h = h * 251 + const_rtx_hash_1 (&XVECEXP (x, 0, i), data);
2992 }
2993 break;
2994
2995 case SYMBOL_REF:
2996 h ^= htab_hash_string (XSTR (x, 0));
2997 break;
2998
2999 case LABEL_REF:
3000 h = h * 251 + CODE_LABEL_NUMBER (XEXP (x, 0));
3001 break;
3002
3003 case UNSPEC:
3004 case UNSPEC_VOLATILE:
3005 h = h * 251 + XINT (x, 1);
3006 break;
3007
3008 default:
3009 break;
3010 }
3011
3012 hp = data;
3013 *hp = *hp * 509 + h;
3014 return 0;
3015 }
3016
3017 /* Compute a hash value for X, which should be a constant. */
3018
3019 static hashval_t
3020 const_rtx_hash (rtx x)
3021 {
3022 hashval_t h = 0;
3023 for_each_rtx (&x, const_rtx_hash_1, &h);
3024 return h;
3025 }
3026
3027 \f
3028 /* Initialize constant pool hashing for a new function. */
3029
3030 void
3031 init_varasm_status (struct function *f)
3032 {
3033 struct varasm_status *p;
3034 struct rtx_constant_pool *pool;
3035
3036 p = ggc_alloc (sizeof (struct varasm_status));
3037 f->varasm = p;
3038
3039 pool = ggc_alloc (sizeof (struct rtx_constant_pool));
3040 p->pool = pool;
3041 p->deferred_constants = 0;
3042
3043 pool->const_rtx_htab = htab_create_ggc (31, const_desc_rtx_hash,
3044 const_desc_rtx_eq, NULL);
3045 pool->const_rtx_sym_htab = htab_create_ggc (31, const_desc_rtx_sym_hash,
3046 const_desc_rtx_sym_eq, NULL);
3047 pool->first = pool->last = NULL;
3048 pool->offset = 0;
3049 }
3050 \f
3051 /* Given a MINUS expression, simplify it if both sides
3052 include the same symbol. */
3053
3054 rtx
3055 simplify_subtraction (rtx x)
3056 {
3057 rtx r = simplify_rtx (x);
3058 return r ? r : x;
3059 }
3060 \f
3061 /* Given a constant rtx X, make (or find) a memory constant for its value
3062 and return a MEM rtx to refer to it in memory. */
3063
3064 rtx
3065 force_const_mem (enum machine_mode mode, rtx x)
3066 {
3067 struct constant_descriptor_rtx *desc, tmp;
3068 struct rtx_constant_pool *pool = cfun->varasm->pool;
3069 char label[256];
3070 rtx def, symbol;
3071 hashval_t hash;
3072 unsigned int align;
3073 void **slot;
3074
3075 /* If we're not allowed to drop X into the constant pool, don't. */
3076 if (targetm.cannot_force_const_mem (x))
3077 return NULL_RTX;
3078
3079 /* Lookup the value in the hashtable. */
3080 tmp.constant = x;
3081 tmp.mode = mode;
3082 hash = const_rtx_hash (x);
3083 slot = htab_find_slot_with_hash (pool->const_rtx_htab, &tmp, hash, INSERT);
3084 desc = *slot;
3085
3086 /* If the constant was already present, return its memory. */
3087 if (desc)
3088 return copy_rtx (desc->mem);
3089
3090 /* Otherwise, create a new descriptor. */
3091 desc = ggc_alloc (sizeof (*desc));
3092 *slot = desc;
3093
3094 /* Align the location counter as required by EXP's data type. */
3095 align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);
3096 #ifdef CONSTANT_ALIGNMENT
3097 {
3098 tree type = lang_hooks.types.type_for_mode (mode, 0);
3099 if (type != NULL_TREE)
3100 align = CONSTANT_ALIGNMENT (make_tree (type, x), align);
3101 }
3102 #endif
3103
3104 pool->offset += (align / BITS_PER_UNIT) - 1;
3105 pool->offset &= ~ ((align / BITS_PER_UNIT) - 1);
3106
3107 desc->next = NULL;
3108 desc->constant = tmp.constant;
3109 desc->offset = pool->offset;
3110 desc->hash = hash;
3111 desc->mode = mode;
3112 desc->align = align;
3113 desc->labelno = const_labelno;
3114 desc->mark = 0;
3115
3116 pool->offset += GET_MODE_SIZE (mode);
3117 if (pool->last)
3118 pool->last->next = desc;
3119 else
3120 pool->first = pool->last = desc;
3121 pool->last = desc;
3122
3123 /* Create a string containing the label name, in LABEL. */
3124 ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
3125 ++const_labelno;
3126
3127 /* Construct the SYMBOL_REF. Make sure to mark it as belonging to
3128 the constants pool. */
3129 desc->sym = symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
3130 SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
3131 CONSTANT_POOL_ADDRESS_P (symbol) = 1;
3132 current_function_uses_const_pool = 1;
3133
3134 /* Insert the descriptor into the symbol cross-reference table too. */
3135 slot = htab_find_slot (pool->const_rtx_sym_htab, desc, INSERT);
3136 gcc_assert (!*slot);
3137 *slot = desc;
3138
3139 /* Construct the MEM. */
3140 desc->mem = def = gen_const_mem (mode, symbol);
3141 set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1);
3142 set_mem_align (def, align);
3143
3144 /* If we're dropping a label to the constant pool, make sure we
3145 don't delete it. */
3146 if (GET_CODE (x) == LABEL_REF)
3147 LABEL_PRESERVE_P (XEXP (x, 0)) = 1;
3148
3149 return copy_rtx (def);
3150 }
3151 \f
3152 /* Given a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true, return a pointer to
3153 the corresponding constant_descriptor_rtx structure. */
3154
3155 static struct constant_descriptor_rtx *
3156 find_pool_constant (struct rtx_constant_pool *pool, rtx sym)
3157 {
3158 struct constant_descriptor_rtx tmp;
3159 tmp.sym = sym;
3160 return htab_find (pool->const_rtx_sym_htab, &tmp);
3161 }
3162
3163 /* Given a constant pool SYMBOL_REF, return the corresponding constant. */
3164
3165 rtx
3166 get_pool_constant (rtx addr)
3167 {
3168 return find_pool_constant (cfun->varasm->pool, addr)->constant;
3169 }
3170
3171 /* Given a constant pool SYMBOL_REF, return the corresponding constant
3172 and whether it has been output or not. */
3173
3174 rtx
3175 get_pool_constant_mark (rtx addr, bool *pmarked)
3176 {
3177 struct constant_descriptor_rtx *desc;
3178
3179 desc = find_pool_constant (cfun->varasm->pool, addr);
3180 *pmarked = (desc->mark != 0);
3181 return desc->constant;
3182 }
3183
3184 /* Likewise, but for the constant pool of a specific function. */
3185
3186 rtx
3187 get_pool_constant_for_function (struct function *f, rtx addr)
3188 {
3189 return find_pool_constant (f->varasm->pool, addr)->constant;
3190 }
3191
3192 /* Similar, return the mode. */
3193
3194 enum machine_mode
3195 get_pool_mode (rtx addr)
3196 {
3197 return find_pool_constant (cfun->varasm->pool, addr)->mode;
3198 }
3199
3200 /* Return the size of the constant pool. */
3201
3202 int
3203 get_pool_size (void)
3204 {
3205 return cfun->varasm->pool->offset;
3206 }
3207 \f
3208 /* Worker function for output_constant_pool_1. Emit assembly for X
3209 in MODE with known alignment ALIGN. */
3210
3211 static void
3212 output_constant_pool_2 (enum machine_mode mode, rtx x, unsigned int align)
3213 {
3214 switch (GET_MODE_CLASS (mode))
3215 {
3216 case MODE_FLOAT:
3217 {
3218 REAL_VALUE_TYPE r;
3219
3220 gcc_assert (GET_CODE (x) == CONST_DOUBLE);
3221 REAL_VALUE_FROM_CONST_DOUBLE (r, x);
3222 assemble_real (r, mode, align);
3223 break;
3224 }
3225
3226 case MODE_INT:
3227 case MODE_PARTIAL_INT:
3228 assemble_integer (x, GET_MODE_SIZE (mode), align, 1);
3229 break;
3230
3231 case MODE_VECTOR_FLOAT:
3232 case MODE_VECTOR_INT:
3233 {
3234 int i, units;
3235 enum machine_mode submode = GET_MODE_INNER (mode);
3236 unsigned int subalign = MIN (align, GET_MODE_BITSIZE (submode));
3237
3238 gcc_assert (GET_CODE (x) == CONST_VECTOR);
3239 units = CONST_VECTOR_NUNITS (x);
3240
3241 for (i = 0; i < units; i++)
3242 {
3243 rtx elt = CONST_VECTOR_ELT (x, i);
3244 output_constant_pool_2 (submode, elt, i ? subalign : align);
3245 }
3246 }
3247 break;
3248
3249 default:
3250 gcc_unreachable ();
3251 }
3252 }
3253
3254 /* Worker function for output_constant_pool. Emit POOL. */
3255
3256 static void
3257 output_constant_pool_1 (struct constant_descriptor_rtx *desc)
3258 {
3259 rtx x, tmp;
3260
3261 if (!desc->mark)
3262 return;
3263 x = desc->constant;
3264
3265 /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
3266 whose CODE_LABEL has been deleted. This can occur if a jump table
3267 is eliminated by optimization. If so, write a constant of zero
3268 instead. Note that this can also happen by turning the
3269 CODE_LABEL into a NOTE. */
3270 /* ??? This seems completely and utterly wrong. Certainly it's
3271 not true for NOTE_INSN_DELETED_LABEL, but I disbelieve proper
3272 functioning even with INSN_DELETED_P and friends. */
3273
3274 tmp = x;
3275 switch (GET_CODE (x))
3276 {
3277 case CONST:
3278 if (GET_CODE (XEXP (x, 0)) != PLUS
3279 || GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
3280 break;
3281 tmp = XEXP (XEXP (x, 0), 0);
3282 /* FALLTHRU */
3283
3284 case LABEL_REF:
3285 tmp = XEXP (x, 0);
3286 gcc_assert (!INSN_DELETED_P (tmp));
3287 gcc_assert (!NOTE_P (tmp)
3288 || NOTE_LINE_NUMBER (tmp) != NOTE_INSN_DELETED);
3289 break;
3290
3291 default:
3292 break;
3293 }
3294
3295 /* First switch to correct section. */
3296 targetm.asm_out.select_rtx_section (desc->mode, x, desc->align);
3297
3298 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3299 ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, desc->mode,
3300 desc->align, desc->labelno, done);
3301 #endif
3302
3303 assemble_align (desc->align);
3304
3305 /* Output the label. */
3306 targetm.asm_out.internal_label (asm_out_file, "LC", desc->labelno);
3307
3308 /* Output the data. */
3309 output_constant_pool_2 (desc->mode, x, desc->align);
3310
3311 /* Make sure all constants in SECTION_MERGE and not SECTION_STRINGS
3312 sections have proper size. */
3313 if (desc->align > GET_MODE_BITSIZE (desc->mode)
3314 && in_section == in_named
3315 && get_named_section_flags (in_named_name) & SECTION_MERGE)
3316 assemble_align (desc->align);
3317
3318 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3319 done:
3320 #endif
3321 return;
3322 }
3323
3324 /* Given a SYMBOL_REF CURRENT_RTX, mark it and all constants it refers
3325 to as used. Emit referenced deferred strings. This function can
3326 be used with for_each_rtx to mark all SYMBOL_REFs in an rtx. */
3327
3328 static int
3329 mark_constant (rtx *current_rtx, void *data)
3330 {
3331 struct rtx_constant_pool *pool = data;
3332 rtx x = *current_rtx;
3333
3334 if (x == NULL_RTX || GET_CODE (x) != SYMBOL_REF)
3335 return 0;
3336
3337 if (CONSTANT_POOL_ADDRESS_P (x))
3338 {
3339 struct constant_descriptor_rtx *desc = find_pool_constant (pool, x);
3340 if (desc->mark == 0)
3341 {
3342 desc->mark = 1;
3343 for_each_rtx (&desc->constant, mark_constant, pool);
3344 }
3345 }
3346 else if (TREE_CONSTANT_POOL_ADDRESS_P (x))
3347 {
3348 tree exp = SYMBOL_REF_DECL (x);
3349 if (!TREE_ASM_WRITTEN (exp))
3350 {
3351 n_deferred_constants--;
3352 output_constant_def_contents (x);
3353 }
3354 }
3355
3356 return -1;
3357 }
3358
3359 /* Look through appropriate parts of INSN, marking all entries in the
3360 constant pool which are actually being used. Entries that are only
3361 referenced by other constants are also marked as used. Emit
3362 deferred strings that are used. */
3363
3364 static void
3365 mark_constants (struct rtx_constant_pool *pool, rtx insn)
3366 {
3367 if (!INSN_P (insn))
3368 return;
3369
3370 /* Insns may appear inside a SEQUENCE. Only check the patterns of
3371 insns, not any notes that may be attached. We don't want to mark
3372 a constant just because it happens to appear in a REG_EQUIV note. */
3373 if (GET_CODE (PATTERN (insn)) == SEQUENCE)
3374 {
3375 rtx seq = PATTERN (insn);
3376 int i, n = XVECLEN (seq, 0);
3377 for (i = 0; i < n; ++i)
3378 {
3379 rtx subinsn = XVECEXP (seq, 0, i);
3380 if (INSN_P (subinsn))
3381 for_each_rtx (&PATTERN (subinsn), mark_constant, pool);
3382 }
3383 }
3384 else
3385 for_each_rtx (&PATTERN (insn), mark_constant, pool);
3386 }
3387
3388 /* Look through the instructions for this function, and mark all the
3389 entries in POOL which are actually being used. Emit deferred constants
3390 which have indeed been used. */
3391
3392 static void
3393 mark_constant_pool (struct rtx_constant_pool *pool)
3394 {
3395 rtx insn, link;
3396
3397 if (pool->first == 0 && n_deferred_constants == 0)
3398 return;
3399
3400 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
3401 mark_constants (pool, insn);
3402
3403 for (link = current_function_epilogue_delay_list;
3404 link;
3405 link = XEXP (link, 1))
3406 mark_constants (pool, XEXP (link, 0));
3407 }
3408
3409 /* Write all the constants in the constant pool. */
3410
3411 void
3412 output_constant_pool (const char *fnname ATTRIBUTE_UNUSED,
3413 tree fndecl ATTRIBUTE_UNUSED)
3414 {
3415 struct rtx_constant_pool *pool = cfun->varasm->pool;
3416 struct constant_descriptor_rtx *desc;
3417
3418 /* It is possible for gcc to call force_const_mem and then to later
3419 discard the instructions which refer to the constant. In such a
3420 case we do not need to output the constant. */
3421 mark_constant_pool (pool);
3422
3423 #ifdef ASM_OUTPUT_POOL_PROLOGUE
3424 ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool->offset);
3425 #endif
3426
3427 for (desc = pool->first; desc ; desc = desc->next)
3428 output_constant_pool_1 (desc);
3429
3430 #ifdef ASM_OUTPUT_POOL_EPILOGUE
3431 ASM_OUTPUT_POOL_EPILOGUE (asm_out_file, fnname, fndecl, pool->offset);
3432 #endif
3433 }
3434 \f
3435 /* Determine what kind of relocations EXP may need. */
3436
3437 int
3438 compute_reloc_for_constant (tree exp)
3439 {
3440 int reloc = 0, reloc2;
3441 tree tem;
3442
3443 /* Give the front-end a chance to convert VALUE to something that
3444 looks more like a constant to the back-end. */
3445 exp = lang_hooks.expand_constant (exp);
3446
3447 switch (TREE_CODE (exp))
3448 {
3449 case ADDR_EXPR:
3450 case FDESC_EXPR:
3451 /* Go inside any operations that get_inner_reference can handle and see
3452 if what's inside is a constant: no need to do anything here for
3453 addresses of variables or functions. */
3454 for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3455 tem = TREE_OPERAND (tem, 0))
3456 ;
3457
3458 if (TREE_PUBLIC (tem))
3459 reloc |= 2;
3460 else
3461 reloc |= 1;
3462 break;
3463
3464 case PLUS_EXPR:
3465 reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3466 reloc |= compute_reloc_for_constant (TREE_OPERAND (exp, 1));
3467 break;
3468
3469 case MINUS_EXPR:
3470 reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3471 reloc2 = compute_reloc_for_constant (TREE_OPERAND (exp, 1));
3472 /* The difference of two local labels is computable at link time. */
3473 if (reloc == 1 && reloc2 == 1)
3474 reloc = 0;
3475 else
3476 reloc |= reloc2;
3477 break;
3478
3479 case NOP_EXPR:
3480 case CONVERT_EXPR:
3481 case NON_LVALUE_EXPR:
3482 reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3483 break;
3484
3485 case CONSTRUCTOR:
3486 for (tem = CONSTRUCTOR_ELTS (exp); tem; tem = TREE_CHAIN (tem))
3487 if (TREE_VALUE (tem) != 0)
3488 reloc |= compute_reloc_for_constant (TREE_VALUE (tem));
3489
3490 break;
3491
3492 default:
3493 break;
3494 }
3495 return reloc;
3496 }
3497
3498 /* Find all the constants whose addresses are referenced inside of EXP,
3499 and make sure assembler code with a label has been output for each one.
3500 Indicate whether an ADDR_EXPR has been encountered. */
3501
3502 static void
3503 output_addressed_constants (tree exp)
3504 {
3505 tree tem;
3506
3507 /* Give the front-end a chance to convert VALUE to something that
3508 looks more like a constant to the back-end. */
3509 exp = lang_hooks.expand_constant (exp);
3510
3511 switch (TREE_CODE (exp))
3512 {
3513 case ADDR_EXPR:
3514 case FDESC_EXPR:
3515 /* Go inside any operations that get_inner_reference can handle and see
3516 if what's inside is a constant: no need to do anything here for
3517 addresses of variables or functions. */
3518 for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3519 tem = TREE_OPERAND (tem, 0))
3520 ;
3521
3522 /* If we have an initialized CONST_DECL, retrieve the initializer. */
3523 if (TREE_CODE (tem) == CONST_DECL && DECL_INITIAL (tem))
3524 tem = DECL_INITIAL (tem);
3525
3526 if (CONSTANT_CLASS_P (tem) || TREE_CODE (tem) == CONSTRUCTOR)
3527 output_constant_def (tem, 0);
3528 break;
3529
3530 case PLUS_EXPR:
3531 case MINUS_EXPR:
3532 output_addressed_constants (TREE_OPERAND (exp, 1));
3533 /* Fall through. */
3534
3535 case NOP_EXPR:
3536 case CONVERT_EXPR:
3537 case NON_LVALUE_EXPR:
3538 output_addressed_constants (TREE_OPERAND (exp, 0));
3539 break;
3540
3541 case CONSTRUCTOR:
3542 for (tem = CONSTRUCTOR_ELTS (exp); tem; tem = TREE_CHAIN (tem))
3543 if (TREE_VALUE (tem) != 0)
3544 output_addressed_constants (TREE_VALUE (tem));
3545
3546 break;
3547
3548 default:
3549 break;
3550 }
3551 }
3552 \f
3553 /* Return nonzero if VALUE is a valid constant-valued expression
3554 for use in initializing a static variable; one that can be an
3555 element of a "constant" initializer.
3556
3557 Return null_pointer_node if the value is absolute;
3558 if it is relocatable, return the variable that determines the relocation.
3559 We assume that VALUE has been folded as much as possible;
3560 therefore, we do not need to check for such things as
3561 arithmetic-combinations of integers. */
3562
3563 tree
3564 initializer_constant_valid_p (tree value, tree endtype)
3565 {
3566 /* Give the front-end a chance to convert VALUE to something that
3567 looks more like a constant to the back-end. */
3568 value = lang_hooks.expand_constant (value);
3569
3570 switch (TREE_CODE (value))
3571 {
3572 case CONSTRUCTOR:
3573 if ((TREE_CODE (TREE_TYPE (value)) == UNION_TYPE
3574 || TREE_CODE (TREE_TYPE (value)) == RECORD_TYPE)
3575 && TREE_CONSTANT (value)
3576 && CONSTRUCTOR_ELTS (value))
3577 {
3578 tree elt;
3579 bool absolute = true;
3580
3581 for (elt = CONSTRUCTOR_ELTS (value); elt; elt = TREE_CHAIN (elt))
3582 {
3583 tree reloc;
3584 value = TREE_VALUE (elt);
3585 reloc = initializer_constant_valid_p (value, TREE_TYPE (value));
3586 if (!reloc)
3587 return NULL_TREE;
3588 if (reloc != null_pointer_node)
3589 absolute = false;
3590 }
3591 /* For a non-absolute relocation, there is no single
3592 variable that can be "the variable that determines the
3593 relocation." */
3594 return absolute ? null_pointer_node : error_mark_node;
3595 }
3596
3597 return TREE_STATIC (value) ? null_pointer_node : NULL_TREE;
3598
3599 case INTEGER_CST:
3600 case VECTOR_CST:
3601 case REAL_CST:
3602 case STRING_CST:
3603 case COMPLEX_CST:
3604 return null_pointer_node;
3605
3606 case ADDR_EXPR:
3607 case FDESC_EXPR:
3608 value = staticp (TREE_OPERAND (value, 0));
3609 /* "&(*a).f" is like unto pointer arithmetic. If "a" turns out to
3610 be a constant, this is old-skool offsetof-like nonsense. */
3611 if (value
3612 && TREE_CODE (value) == INDIRECT_REF
3613 && TREE_CONSTANT (TREE_OPERAND (value, 0)))
3614 return null_pointer_node;
3615 /* Taking the address of a nested function involves a trampoline. */
3616 if (value
3617 && TREE_CODE (value) == FUNCTION_DECL
3618 && ((decl_function_context (value) && !DECL_NO_STATIC_CHAIN (value))
3619 || DECL_NON_ADDR_CONST_P (value)))
3620 return NULL_TREE;
3621 return value;
3622
3623 case VIEW_CONVERT_EXPR:
3624 case NON_LVALUE_EXPR:
3625 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3626
3627 case CONVERT_EXPR:
3628 case NOP_EXPR:
3629 {
3630 tree src;
3631 tree src_type;
3632 tree dest_type;
3633
3634 src = TREE_OPERAND (value, 0);
3635 src_type = TREE_TYPE (src);
3636 dest_type = TREE_TYPE (value);
3637
3638 /* Allow conversions between pointer types, floating-point
3639 types, and offset types. */
3640 if ((POINTER_TYPE_P (dest_type) && POINTER_TYPE_P (src_type))
3641 || (FLOAT_TYPE_P (dest_type) && FLOAT_TYPE_P (src_type))
3642 || (TREE_CODE (dest_type) == OFFSET_TYPE
3643 && TREE_CODE (src_type) == OFFSET_TYPE))
3644 return initializer_constant_valid_p (src, endtype);
3645
3646 /* Allow length-preserving conversions between integer types. */
3647 if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type)
3648 && (TYPE_PRECISION (dest_type) == TYPE_PRECISION (src_type)))
3649 return initializer_constant_valid_p (src, endtype);
3650
3651 /* Allow conversions between other integer types only if
3652 explicit value. */
3653 if (INTEGRAL_TYPE_P (dest_type) && INTEGRAL_TYPE_P (src_type))
3654 {
3655 tree inner = initializer_constant_valid_p (src, endtype);
3656 if (inner == null_pointer_node)
3657 return null_pointer_node;
3658 break;
3659 }
3660
3661 /* Allow (int) &foo provided int is as wide as a pointer. */
3662 if (INTEGRAL_TYPE_P (dest_type) && POINTER_TYPE_P (src_type)
3663 && (TYPE_PRECISION (dest_type) >= TYPE_PRECISION (src_type)))
3664 return initializer_constant_valid_p (src, endtype);
3665
3666 /* Likewise conversions from int to pointers, but also allow
3667 conversions from 0. */
3668 if ((POINTER_TYPE_P (dest_type)
3669 || TREE_CODE (dest_type) == OFFSET_TYPE)
3670 && INTEGRAL_TYPE_P (src_type))
3671 {
3672 if (integer_zerop (src))
3673 return null_pointer_node;
3674 else if (TYPE_PRECISION (dest_type) <= TYPE_PRECISION (src_type))
3675 return initializer_constant_valid_p (src, endtype);
3676 }
3677
3678 /* Allow conversions to struct or union types if the value
3679 inside is okay. */
3680 if (TREE_CODE (dest_type) == RECORD_TYPE
3681 || TREE_CODE (dest_type) == UNION_TYPE)
3682 return initializer_constant_valid_p (src, endtype);
3683 }
3684 break;
3685
3686 case PLUS_EXPR:
3687 if (! INTEGRAL_TYPE_P (endtype)
3688 || TYPE_PRECISION (endtype) >= POINTER_SIZE)
3689 {
3690 tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3691 endtype);
3692 tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
3693 endtype);
3694 /* If either term is absolute, use the other terms relocation. */
3695 if (valid0 == null_pointer_node)
3696 return valid1;
3697 if (valid1 == null_pointer_node)
3698 return valid0;
3699 }
3700 break;
3701
3702 case MINUS_EXPR:
3703 if (! INTEGRAL_TYPE_P (endtype)
3704 || TYPE_PRECISION (endtype) >= POINTER_SIZE)
3705 {
3706 tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3707 endtype);
3708 tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
3709 endtype);
3710 /* Win if second argument is absolute. */
3711 if (valid1 == null_pointer_node)
3712 return valid0;
3713 /* Win if both arguments have the same relocation.
3714 Then the value is absolute. */
3715 if (valid0 == valid1 && valid0 != 0)
3716 return null_pointer_node;
3717
3718 /* Since GCC guarantees that string constants are unique in the
3719 generated code, a subtraction between two copies of the same
3720 constant string is absolute. */
3721 if (valid0 && TREE_CODE (valid0) == STRING_CST
3722 && valid1 && TREE_CODE (valid1) == STRING_CST
3723 && operand_equal_p (valid0, valid1, 1))
3724 return null_pointer_node;
3725 }
3726
3727 /* Support narrowing differences. */
3728 if (INTEGRAL_TYPE_P (endtype))
3729 {
3730 tree op0, op1;
3731
3732 op0 = TREE_OPERAND (value, 0);
3733 op1 = TREE_OPERAND (value, 1);
3734
3735 /* Like STRIP_NOPS except allow the operand mode to widen.
3736 This works around a feature of fold that simplifies
3737 (int)(p1 - p2) to ((int)p1 - (int)p2) under the theory
3738 that the narrower operation is cheaper. */
3739
3740 while (TREE_CODE (op0) == NOP_EXPR
3741 || TREE_CODE (op0) == CONVERT_EXPR
3742 || TREE_CODE (op0) == NON_LVALUE_EXPR)
3743 {
3744 tree inner = TREE_OPERAND (op0, 0);
3745 if (inner == error_mark_node
3746 || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
3747 || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))
3748 > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
3749 break;
3750 op0 = inner;
3751 }
3752
3753 while (TREE_CODE (op1) == NOP_EXPR
3754 || TREE_CODE (op1) == CONVERT_EXPR
3755 || TREE_CODE (op1) == NON_LVALUE_EXPR)
3756 {
3757 tree inner = TREE_OPERAND (op1, 0);
3758 if (inner == error_mark_node
3759 || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
3760 || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))
3761 > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
3762 break;
3763 op1 = inner;
3764 }
3765
3766 op0 = initializer_constant_valid_p (op0, endtype);
3767 op1 = initializer_constant_valid_p (op1, endtype);
3768
3769 /* Both initializers must be known. */
3770 if (op0 && op1)
3771 {
3772 if (op0 == op1)
3773 return null_pointer_node;
3774
3775 /* Support differences between labels. */
3776 if (TREE_CODE (op0) == LABEL_DECL
3777 && TREE_CODE (op1) == LABEL_DECL)
3778 return null_pointer_node;
3779
3780 if (TREE_CODE (op0) == STRING_CST
3781 && TREE_CODE (op1) == STRING_CST
3782 && operand_equal_p (op0, op1, 1))
3783 return null_pointer_node;
3784 }
3785 }
3786 break;
3787
3788 default:
3789 break;
3790 }
3791
3792 return 0;
3793 }
3794 \f
3795 /* Output assembler code for constant EXP to FILE, with no label.
3796 This includes the pseudo-op such as ".int" or ".byte", and a newline.
3797 Assumes output_addressed_constants has been done on EXP already.
3798
3799 Generate exactly SIZE bytes of assembler data, padding at the end
3800 with zeros if necessary. SIZE must always be specified.
3801
3802 SIZE is important for structure constructors,
3803 since trailing members may have been omitted from the constructor.
3804 It is also important for initialization of arrays from string constants
3805 since the full length of the string constant might not be wanted.
3806 It is also needed for initialization of unions, where the initializer's
3807 type is just one member, and that may not be as long as the union.
3808
3809 There a case in which we would fail to output exactly SIZE bytes:
3810 for a structure constructor that wants to produce more than SIZE bytes.
3811 But such constructors will never be generated for any possible input.
3812
3813 ALIGN is the alignment of the data in bits. */
3814
3815 void
3816 output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align)
3817 {
3818 enum tree_code code;
3819 unsigned HOST_WIDE_INT thissize;
3820
3821 /* Some front-ends use constants other than the standard language-independent
3822 varieties, but which may still be output directly. Give the front-end a
3823 chance to convert EXP to a language-independent representation. */
3824 exp = lang_hooks.expand_constant (exp);
3825
3826 if (size == 0 || flag_syntax_only)
3827 return;
3828
3829 /* Eliminate any conversions since we'll be outputting the underlying
3830 constant. */
3831 while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR
3832 || TREE_CODE (exp) == NON_LVALUE_EXPR
3833 || TREE_CODE (exp) == VIEW_CONVERT_EXPR)
3834 exp = TREE_OPERAND (exp, 0);
3835
3836 code = TREE_CODE (TREE_TYPE (exp));
3837 thissize = int_size_in_bytes (TREE_TYPE (exp));
3838
3839 /* Allow a constructor with no elements for any data type.
3840 This means to fill the space with zeros. */
3841 if (TREE_CODE (exp) == CONSTRUCTOR && CONSTRUCTOR_ELTS (exp) == 0)
3842 {
3843 assemble_zeros (size);
3844 return;
3845 }
3846
3847 if (TREE_CODE (exp) == FDESC_EXPR)
3848 {
3849 #ifdef ASM_OUTPUT_FDESC
3850 HOST_WIDE_INT part = tree_low_cst (TREE_OPERAND (exp, 1), 0);
3851 tree decl = TREE_OPERAND (exp, 0);
3852 ASM_OUTPUT_FDESC (asm_out_file, decl, part);
3853 #else
3854 gcc_unreachable ();
3855 #endif
3856 return;
3857 }
3858
3859 /* Now output the underlying data. If we've handling the padding, return.
3860 Otherwise, break and ensure SIZE is the size written. */
3861 switch (code)
3862 {
3863 case CHAR_TYPE:
3864 case BOOLEAN_TYPE:
3865 case INTEGER_TYPE:
3866 case ENUMERAL_TYPE:
3867 case POINTER_TYPE:
3868 case REFERENCE_TYPE:
3869 case OFFSET_TYPE:
3870 if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
3871 EXPAND_INITIALIZER),
3872 MIN (size, thissize), align, 0))
3873 error ("initializer for integer value is too complicated");
3874 break;
3875
3876 case REAL_TYPE:
3877 if (TREE_CODE (exp) != REAL_CST)
3878 error ("initializer for floating value is not a floating constant");
3879
3880 assemble_real (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)), align);
3881 break;
3882
3883 case COMPLEX_TYPE:
3884 output_constant (TREE_REALPART (exp), thissize / 2, align);
3885 output_constant (TREE_IMAGPART (exp), thissize / 2,
3886 min_align (align, BITS_PER_UNIT * (thissize / 2)));
3887 break;
3888
3889 case ARRAY_TYPE:
3890 case VECTOR_TYPE:
3891 switch (TREE_CODE (exp))
3892 {
3893 case CONSTRUCTOR:
3894 output_constructor (exp, size, align);
3895 return;
3896 case STRING_CST:
3897 thissize = MIN ((unsigned HOST_WIDE_INT)TREE_STRING_LENGTH (exp),
3898 size);
3899 assemble_string (TREE_STRING_POINTER (exp), thissize);
3900 break;
3901
3902 case VECTOR_CST:
3903 {
3904 int elt_size;
3905 tree link;
3906 unsigned int nalign;
3907 enum machine_mode inner;
3908
3909 inner = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp)));
3910 nalign = MIN (align, GET_MODE_ALIGNMENT (inner));
3911
3912 elt_size = GET_MODE_SIZE (inner);
3913
3914 link = TREE_VECTOR_CST_ELTS (exp);
3915 output_constant (TREE_VALUE (link), elt_size, align);
3916 while ((link = TREE_CHAIN (link)) != NULL)
3917 output_constant (TREE_VALUE (link), elt_size, nalign);
3918 break;
3919 }
3920 default:
3921 gcc_unreachable ();
3922 }
3923 break;
3924
3925 case RECORD_TYPE:
3926 case UNION_TYPE:
3927 gcc_assert (TREE_CODE (exp) == CONSTRUCTOR);
3928 output_constructor (exp, size, align);
3929 return;
3930
3931 case ERROR_MARK:
3932 return;
3933
3934 default:
3935 gcc_unreachable ();
3936 }
3937
3938 if (size > thissize)
3939 assemble_zeros (size - thissize);
3940 }
3941
3942 \f
3943 /* Subroutine of output_constructor, used for computing the size of
3944 arrays of unspecified length. VAL must be a CONSTRUCTOR of an array
3945 type with an unspecified upper bound. */
3946
3947 static unsigned HOST_WIDE_INT
3948 array_size_for_constructor (tree val)
3949 {
3950 tree max_index, i;
3951
3952 /* This code used to attempt to handle string constants that are not
3953 arrays of single-bytes, but nothing else does, so there's no point in
3954 doing it here. */
3955 if (TREE_CODE (val) == STRING_CST)
3956 return TREE_STRING_LENGTH (val);
3957
3958 max_index = NULL_TREE;
3959 for (i = CONSTRUCTOR_ELTS (val); i; i = TREE_CHAIN (i))
3960 {
3961 tree index = TREE_PURPOSE (i);
3962
3963 if (TREE_CODE (index) == RANGE_EXPR)
3964 index = TREE_OPERAND (index, 1);
3965 if (max_index == NULL_TREE || tree_int_cst_lt (max_index, index))
3966 max_index = index;
3967 }
3968
3969 if (max_index == NULL_TREE)
3970 return 0;
3971
3972 /* Compute the total number of array elements. */
3973 i = size_binop (MINUS_EXPR, convert (sizetype, max_index),
3974 convert (sizetype,
3975 TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (val)))));
3976 i = size_binop (PLUS_EXPR, i, convert (sizetype, integer_one_node));
3977
3978 /* Multiply by the array element unit size to find number of bytes. */
3979 i = size_binop (MULT_EXPR, i, TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (val))));
3980
3981 return tree_low_cst (i, 1);
3982 }
3983
3984 /* Subroutine of output_constant, used for CONSTRUCTORs (aggregate constants).
3985 Generate at least SIZE bytes, padding if necessary. */
3986
3987 static void
3988 output_constructor (tree exp, unsigned HOST_WIDE_INT size,
3989 unsigned int align)
3990 {
3991 tree type = TREE_TYPE (exp);
3992 tree link, field = 0;
3993 tree min_index = 0;
3994 /* Number of bytes output or skipped so far.
3995 In other words, current position within the constructor. */
3996 HOST_WIDE_INT total_bytes = 0;
3997 /* Nonzero means BYTE contains part of a byte, to be output. */
3998 int byte_buffer_in_use = 0;
3999 int byte = 0;
4000
4001 gcc_assert (HOST_BITS_PER_WIDE_INT >= BITS_PER_UNIT);
4002
4003 if (TREE_CODE (type) == RECORD_TYPE)
4004 field = TYPE_FIELDS (type);
4005
4006 if (TREE_CODE (type) == ARRAY_TYPE
4007 && TYPE_DOMAIN (type) != 0)
4008 min_index = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
4009
4010 /* As LINK goes through the elements of the constant,
4011 FIELD goes through the structure fields, if the constant is a structure.
4012 if the constant is a union, then we override this,
4013 by getting the field from the TREE_LIST element.
4014 But the constant could also be an array. Then FIELD is zero.
4015
4016 There is always a maximum of one element in the chain LINK for unions
4017 (even if the initializer in a source program incorrectly contains
4018 more one). */
4019 for (link = CONSTRUCTOR_ELTS (exp);
4020 link;
4021 link = TREE_CHAIN (link),
4022 field = field ? TREE_CHAIN (field) : 0)
4023 {
4024 tree val = TREE_VALUE (link);
4025 tree index = 0;
4026
4027 /* The element in a union constructor specifies the proper field
4028 or index. */
4029 if ((TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE
4030 || TREE_CODE (type) == QUAL_UNION_TYPE)
4031 && TREE_PURPOSE (link) != 0)
4032 field = TREE_PURPOSE (link);
4033
4034 else if (TREE_CODE (type) == ARRAY_TYPE)
4035 index = TREE_PURPOSE (link);
4036
4037 #ifdef ASM_COMMENT_START
4038 if (field && flag_verbose_asm)
4039 fprintf (asm_out_file, "%s %s:\n",
4040 ASM_COMMENT_START,
4041 DECL_NAME (field)
4042 ? IDENTIFIER_POINTER (DECL_NAME (field))
4043 : "<anonymous>");
4044 #endif
4045
4046 /* Eliminate the marker that makes a cast not be an lvalue. */
4047 if (val != 0)
4048 STRIP_NOPS (val);
4049
4050 if (index && TREE_CODE (index) == RANGE_EXPR)
4051 {
4052 unsigned HOST_WIDE_INT fieldsize
4053 = int_size_in_bytes (TREE_TYPE (type));
4054 HOST_WIDE_INT lo_index = tree_low_cst (TREE_OPERAND (index, 0), 0);
4055 HOST_WIDE_INT hi_index = tree_low_cst (TREE_OPERAND (index, 1), 0);
4056 HOST_WIDE_INT index;
4057 unsigned int align2 = min_align (align, fieldsize * BITS_PER_UNIT);
4058
4059 for (index = lo_index; index <= hi_index; index++)
4060 {
4061 /* Output the element's initial value. */
4062 if (val == 0)
4063 assemble_zeros (fieldsize);
4064 else
4065 output_constant (val, fieldsize, align2);
4066
4067 /* Count its size. */
4068 total_bytes += fieldsize;
4069 }
4070 }
4071 else if (field == 0 || !DECL_BIT_FIELD (field))
4072 {
4073 /* An element that is not a bit-field. */
4074
4075 unsigned HOST_WIDE_INT fieldsize;
4076 /* Since this structure is static,
4077 we know the positions are constant. */
4078 HOST_WIDE_INT pos = field ? int_byte_position (field) : 0;
4079 unsigned int align2;
4080
4081 if (index != 0)
4082 pos = (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (val)), 1)
4083 * (tree_low_cst (index, 0) - tree_low_cst (min_index, 0)));
4084
4085 /* Output any buffered-up bit-fields preceding this element. */
4086 if (byte_buffer_in_use)
4087 {
4088 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4089 total_bytes++;
4090 byte_buffer_in_use = 0;
4091 }
4092
4093 /* Advance to offset of this element.
4094 Note no alignment needed in an array, since that is guaranteed
4095 if each element has the proper size. */
4096 if ((field != 0 || index != 0) && pos != total_bytes)
4097 {
4098 assemble_zeros (pos - total_bytes);
4099 total_bytes = pos;
4100 }
4101
4102 /* Find the alignment of this element. */
4103 align2 = min_align (align, BITS_PER_UNIT * pos);
4104
4105 /* Determine size this element should occupy. */
4106 if (field)
4107 {
4108 fieldsize = 0;
4109
4110 /* If this is an array with an unspecified upper bound,
4111 the initializer determines the size. */
4112 /* ??? This ought to only checked if DECL_SIZE_UNIT is NULL,
4113 but we cannot do this until the deprecated support for
4114 initializing zero-length array members is removed. */
4115 if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE
4116 && TYPE_DOMAIN (TREE_TYPE (field))
4117 && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (field))))
4118 {
4119 fieldsize = array_size_for_constructor (val);
4120 /* Given a non-empty initialization, this field had
4121 better be last. */
4122 gcc_assert (!fieldsize || !TREE_CHAIN (field));
4123 }
4124 else if (DECL_SIZE_UNIT (field))
4125 {
4126 /* ??? This can't be right. If the decl size overflows
4127 a host integer we will silently emit no data. */
4128 if (host_integerp (DECL_SIZE_UNIT (field), 1))
4129 fieldsize = tree_low_cst (DECL_SIZE_UNIT (field), 1);
4130 }
4131 }
4132 else
4133 fieldsize = int_size_in_bytes (TREE_TYPE (type));
4134
4135 /* Output the element's initial value. */
4136 if (val == 0)
4137 assemble_zeros (fieldsize);
4138 else
4139 output_constant (val, fieldsize, align2);
4140
4141 /* Count its size. */
4142 total_bytes += fieldsize;
4143 }
4144 else if (val != 0 && TREE_CODE (val) != INTEGER_CST)
4145 error ("invalid initial value for member %qs",
4146 IDENTIFIER_POINTER (DECL_NAME (field)));
4147 else
4148 {
4149 /* Element that is a bit-field. */
4150
4151 HOST_WIDE_INT next_offset = int_bit_position (field);
4152 HOST_WIDE_INT end_offset
4153 = (next_offset + tree_low_cst (DECL_SIZE (field), 1));
4154
4155 if (val == 0)
4156 val = integer_zero_node;
4157
4158 /* If this field does not start in this (or, next) byte,
4159 skip some bytes. */
4160 if (next_offset / BITS_PER_UNIT != total_bytes)
4161 {
4162 /* Output remnant of any bit field in previous bytes. */
4163 if (byte_buffer_in_use)
4164 {
4165 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4166 total_bytes++;
4167 byte_buffer_in_use = 0;
4168 }
4169
4170 /* If still not at proper byte, advance to there. */
4171 if (next_offset / BITS_PER_UNIT != total_bytes)
4172 {
4173 assemble_zeros (next_offset / BITS_PER_UNIT - total_bytes);
4174 total_bytes = next_offset / BITS_PER_UNIT;
4175 }
4176 }
4177
4178 if (! byte_buffer_in_use)
4179 byte = 0;
4180
4181 /* We must split the element into pieces that fall within
4182 separate bytes, and combine each byte with previous or
4183 following bit-fields. */
4184
4185 /* next_offset is the offset n fbits from the beginning of
4186 the structure to the next bit of this element to be processed.
4187 end_offset is the offset of the first bit past the end of
4188 this element. */
4189 while (next_offset < end_offset)
4190 {
4191 int this_time;
4192 int shift;
4193 HOST_WIDE_INT value;
4194 HOST_WIDE_INT next_byte = next_offset / BITS_PER_UNIT;
4195 HOST_WIDE_INT next_bit = next_offset % BITS_PER_UNIT;
4196
4197 /* Advance from byte to byte
4198 within this element when necessary. */
4199 while (next_byte != total_bytes)
4200 {
4201 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4202 total_bytes++;
4203 byte = 0;
4204 }
4205
4206 /* Number of bits we can process at once
4207 (all part of the same byte). */
4208 this_time = MIN (end_offset - next_offset,
4209 BITS_PER_UNIT - next_bit);
4210 if (BYTES_BIG_ENDIAN)
4211 {
4212 /* On big-endian machine, take the most significant bits
4213 first (of the bits that are significant)
4214 and put them into bytes from the most significant end. */
4215 shift = end_offset - next_offset - this_time;
4216
4217 /* Don't try to take a bunch of bits that cross
4218 the word boundary in the INTEGER_CST. We can
4219 only select bits from the LOW or HIGH part
4220 not from both. */
4221 if (shift < HOST_BITS_PER_WIDE_INT
4222 && shift + this_time > HOST_BITS_PER_WIDE_INT)
4223 {
4224 this_time = shift + this_time - HOST_BITS_PER_WIDE_INT;
4225 shift = HOST_BITS_PER_WIDE_INT;
4226 }
4227
4228 /* Now get the bits from the appropriate constant word. */
4229 if (shift < HOST_BITS_PER_WIDE_INT)
4230 value = TREE_INT_CST_LOW (val);
4231 else
4232 {
4233 gcc_assert (shift < 2 * HOST_BITS_PER_WIDE_INT);
4234 value = TREE_INT_CST_HIGH (val);
4235 shift -= HOST_BITS_PER_WIDE_INT;
4236 }
4237
4238 /* Get the result. This works only when:
4239 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
4240 byte |= (((value >> shift)
4241 & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
4242 << (BITS_PER_UNIT - this_time - next_bit));
4243 }
4244 else
4245 {
4246 /* On little-endian machines,
4247 take first the least significant bits of the value
4248 and pack them starting at the least significant
4249 bits of the bytes. */
4250 shift = next_offset - int_bit_position (field);
4251
4252 /* Don't try to take a bunch of bits that cross
4253 the word boundary in the INTEGER_CST. We can
4254 only select bits from the LOW or HIGH part
4255 not from both. */
4256 if (shift < HOST_BITS_PER_WIDE_INT
4257 && shift + this_time > HOST_BITS_PER_WIDE_INT)
4258 this_time = (HOST_BITS_PER_WIDE_INT - shift);
4259
4260 /* Now get the bits from the appropriate constant word. */
4261 if (shift < HOST_BITS_PER_WIDE_INT)
4262 value = TREE_INT_CST_LOW (val);
4263 else
4264 {
4265 gcc_assert (shift < 2 * HOST_BITS_PER_WIDE_INT);
4266 value = TREE_INT_CST_HIGH (val);
4267 shift -= HOST_BITS_PER_WIDE_INT;
4268 }
4269
4270 /* Get the result. This works only when:
4271 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
4272 byte |= (((value >> shift)
4273 & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
4274 << next_bit);
4275 }
4276
4277 next_offset += this_time;
4278 byte_buffer_in_use = 1;
4279 }
4280 }
4281 }
4282
4283 if (byte_buffer_in_use)
4284 {
4285 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4286 total_bytes++;
4287 }
4288
4289 if ((unsigned HOST_WIDE_INT)total_bytes < size)
4290 assemble_zeros (size - total_bytes);
4291 }
4292
4293 /* This TREE_LIST contains any weak symbol declarations waiting
4294 to be emitted. */
4295 static GTY(()) tree weak_decls;
4296
4297 /* Mark DECL as weak. */
4298
4299 static void
4300 mark_weak (tree decl)
4301 {
4302 DECL_WEAK (decl) = 1;
4303
4304 if (DECL_RTL_SET_P (decl)
4305 && MEM_P (DECL_RTL (decl))
4306 && XEXP (DECL_RTL (decl), 0)
4307 && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF)
4308 SYMBOL_REF_WEAK (XEXP (DECL_RTL (decl), 0)) = 1;
4309 }
4310
4311 /* Merge weak status between NEWDECL and OLDDECL. */
4312
4313 void
4314 merge_weak (tree newdecl, tree olddecl)
4315 {
4316 if (DECL_WEAK (newdecl) == DECL_WEAK (olddecl))
4317 {
4318 if (DECL_WEAK (newdecl) && SUPPORTS_WEAK)
4319 {
4320 tree *pwd;
4321 /* We put the NEWDECL on the weak_decls list at some point
4322 and OLDDECL as well. Keep just OLDDECL on the list. */
4323 for (pwd = &weak_decls; *pwd; pwd = &TREE_CHAIN (*pwd))
4324 if (TREE_VALUE (*pwd) == newdecl)
4325 {
4326 *pwd = TREE_CHAIN (*pwd);
4327 break;
4328 }
4329 }
4330 return;
4331 }
4332
4333 if (DECL_WEAK (newdecl))
4334 {
4335 tree wd;
4336
4337 /* NEWDECL is weak, but OLDDECL is not. */
4338
4339 /* If we already output the OLDDECL, we're in trouble; we can't
4340 go back and make it weak. This error cannot caught in
4341 declare_weak because the NEWDECL and OLDDECL was not yet
4342 been merged; therefore, TREE_ASM_WRITTEN was not set. */
4343 if (TREE_ASM_WRITTEN (olddecl))
4344 error ("%Jweak declaration of %qD must precede definition",
4345 newdecl, newdecl);
4346
4347 /* If we've already generated rtl referencing OLDDECL, we may
4348 have done so in a way that will not function properly with
4349 a weak symbol. */
4350 else if (TREE_USED (olddecl)
4351 && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl)))
4352 warning (0, "%Jweak declaration of %qD after first use results "
4353 "in unspecified behavior", newdecl, newdecl);
4354
4355 if (SUPPORTS_WEAK)
4356 {
4357 /* We put the NEWDECL on the weak_decls list at some point.
4358 Replace it with the OLDDECL. */
4359 for (wd = weak_decls; wd; wd = TREE_CHAIN (wd))
4360 if (TREE_VALUE (wd) == newdecl)
4361 {
4362 TREE_VALUE (wd) = olddecl;
4363 break;
4364 }
4365 /* We may not find the entry on the list. If NEWDECL is a
4366 weak alias, then we will have already called
4367 globalize_decl to remove the entry; in that case, we do
4368 not need to do anything. */
4369 }
4370
4371 /* Make the OLDDECL weak; it's OLDDECL that we'll be keeping. */
4372 mark_weak (olddecl);
4373 }
4374 else
4375 /* OLDDECL was weak, but NEWDECL was not explicitly marked as
4376 weak. Just update NEWDECL to indicate that it's weak too. */
4377 mark_weak (newdecl);
4378 }
4379
4380 /* Declare DECL to be a weak symbol. */
4381
4382 void
4383 declare_weak (tree decl)
4384 {
4385 if (! TREE_PUBLIC (decl))
4386 error ("%Jweak declaration of %qD must be public", decl, decl);
4387 else if (TREE_CODE (decl) == FUNCTION_DECL && TREE_ASM_WRITTEN (decl))
4388 error ("%Jweak declaration of %qD must precede definition", decl, decl);
4389 else if (SUPPORTS_WEAK)
4390 {
4391 if (! DECL_WEAK (decl))
4392 weak_decls = tree_cons (NULL, decl, weak_decls);
4393 }
4394 else
4395 warning (0, "%Jweak declaration of %qD not supported", decl, decl);
4396
4397 mark_weak (decl);
4398 }
4399
4400 /* Emit any pending weak declarations. */
4401
4402 void
4403 weak_finish (void)
4404 {
4405 tree t;
4406
4407 for (t = weak_decls; t; t = TREE_CHAIN (t))
4408 {
4409 tree decl = TREE_VALUE (t);
4410 #if defined (ASM_WEAKEN_DECL) || defined (ASM_WEAKEN_LABEL)
4411 const char *const name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4412 #endif
4413
4414 if (! TREE_USED (decl))
4415 continue;
4416
4417 #ifdef ASM_WEAKEN_DECL
4418 ASM_WEAKEN_DECL (asm_out_file, decl, name, NULL);
4419 #else
4420 #ifdef ASM_WEAKEN_LABEL
4421 ASM_WEAKEN_LABEL (asm_out_file, name);
4422 #else
4423 #ifdef ASM_OUTPUT_WEAK_ALIAS
4424 warning (0, "only weak aliases are supported in this configuration");
4425 return;
4426 #endif
4427 #endif
4428 #endif
4429 }
4430 }
4431
4432 /* Emit the assembly bits to indicate that DECL is globally visible. */
4433
4434 static void
4435 globalize_decl (tree decl)
4436 {
4437 const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
4438
4439 #if defined (ASM_WEAKEN_LABEL) || defined (ASM_WEAKEN_DECL)
4440 if (DECL_WEAK (decl))
4441 {
4442 tree *p, t;
4443
4444 #ifdef ASM_WEAKEN_DECL
4445 ASM_WEAKEN_DECL (asm_out_file, decl, name, 0);
4446 #else
4447 ASM_WEAKEN_LABEL (asm_out_file, name);
4448 #endif
4449
4450 /* Remove this function from the pending weak list so that
4451 we do not emit multiple .weak directives for it. */
4452 for (p = &weak_decls; (t = *p) ; )
4453 {
4454 if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
4455 *p = TREE_CHAIN (t);
4456 else
4457 p = &TREE_CHAIN (t);
4458 }
4459 return;
4460 }
4461 #elif defined(ASM_MAKE_LABEL_LINKONCE)
4462 if (DECL_ONE_ONLY (decl))
4463 ASM_MAKE_LABEL_LINKONCE (asm_out_file, name);
4464 #endif
4465
4466 targetm.asm_out.globalize_label (asm_out_file, name);
4467 }
4468
4469 /* We have to be able to tell cgraph about the needed-ness of the target
4470 of an alias. This requires that the decl have been defined. Aliases
4471 that precede their definition have to be queued for later processing. */
4472
4473 typedef struct alias_pair GTY(())
4474 {
4475 tree decl;
4476 tree target;
4477 } alias_pair;
4478
4479 /* Define gc'd vector type. */
4480 DEF_VEC_O(alias_pair);
4481 DEF_VEC_ALLOC_O(alias_pair,gc);
4482
4483 static GTY(()) VEC(alias_pair,gc) *alias_pairs;
4484
4485 /* Given an assembly name, find the decl it is associated with. At the
4486 same time, mark it needed for cgraph. */
4487
4488 static tree
4489 find_decl_and_mark_needed (tree decl, tree target)
4490 {
4491 struct cgraph_node *fnode = NULL;
4492 struct cgraph_varpool_node *vnode = NULL;
4493
4494 /* C++ thunk emitting code produces aliases late in the game.
4495 Avoid confusing cgraph code in that case. */
4496 if (!cgraph_global_info_ready)
4497 {
4498 if (TREE_CODE (decl) == FUNCTION_DECL)
4499 {
4500 fnode = cgraph_node_for_asm (target);
4501 if (fnode == NULL)
4502 vnode = cgraph_varpool_node_for_asm (target);
4503 }
4504 else
4505 {
4506 vnode = cgraph_varpool_node_for_asm (target);
4507 if (vnode == NULL)
4508 fnode = cgraph_node_for_asm (target);
4509 }
4510 }
4511
4512 if (fnode)
4513 {
4514 cgraph_mark_needed_node (fnode);
4515 return fnode->decl;
4516 }
4517 else if (vnode)
4518 {
4519 cgraph_varpool_mark_needed_node (vnode);
4520 return vnode->decl;
4521 }
4522 else
4523 return NULL_TREE;
4524 }
4525
4526 /* Output the assembler code for a define (equate) using ASM_OUTPUT_DEF
4527 or ASM_OUTPUT_DEF_FROM_DECLS. The function defines the symbol whose
4528 tree node is DECL to have the value of the tree node TARGET. */
4529
4530 static void
4531 do_assemble_alias (tree decl, tree target ATTRIBUTE_UNUSED)
4532 {
4533 if (TREE_ASM_WRITTEN (decl))
4534 return;
4535
4536 TREE_ASM_WRITTEN (decl) = 1;
4537 TREE_ASM_WRITTEN (DECL_ASSEMBLER_NAME (decl)) = 1;
4538
4539 #ifdef ASM_OUTPUT_DEF
4540 /* Make name accessible from other files, if appropriate. */
4541
4542 if (TREE_PUBLIC (decl))
4543 {
4544 globalize_decl (decl);
4545 maybe_assemble_visibility (decl);
4546 }
4547
4548 # ifdef ASM_OUTPUT_DEF_FROM_DECLS
4549 ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file, decl, target);
4550 # else
4551 ASM_OUTPUT_DEF (asm_out_file,
4552 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
4553 IDENTIFIER_POINTER (target));
4554 # endif
4555 #elif defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL)
4556 {
4557 const char *name;
4558 tree *p, t;
4559
4560 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4561 # ifdef ASM_WEAKEN_DECL
4562 ASM_WEAKEN_DECL (asm_out_file, decl, name, IDENTIFIER_POINTER (target));
4563 # else
4564 ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target));
4565 # endif
4566 /* Remove this function from the pending weak list so that
4567 we do not emit multiple .weak directives for it. */
4568 for (p = &weak_decls; (t = *p) ; )
4569 if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
4570 *p = TREE_CHAIN (t);
4571 else
4572 p = &TREE_CHAIN (t);
4573 }
4574 #endif
4575 }
4576
4577 /* First pass of completing pending aliases. Make sure that cgraph knows
4578 which symbols will be required. */
4579
4580 void
4581 finish_aliases_1 (void)
4582 {
4583 unsigned i;
4584 alias_pair *p;
4585
4586 for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); i++)
4587 {
4588 tree target_decl;
4589
4590 target_decl = find_decl_and_mark_needed (p->decl, p->target);
4591 if (target_decl == NULL)
4592 error ("%J%qD aliased to undefined symbol %qE",
4593 p->decl, p->decl, p->target);
4594 else if (DECL_EXTERNAL (target_decl))
4595 error ("%J%qD aliased to external symbol %qE",
4596 p->decl, p->decl, p->target);
4597 }
4598 }
4599
4600 /* Second pass of completing pending aliases. Emit the actual assembly.
4601 This happens at the end of compilation and thus it is assured that the
4602 target symbol has been emitted. */
4603
4604 void
4605 finish_aliases_2 (void)
4606 {
4607 unsigned i;
4608 alias_pair *p;
4609
4610 for (i = 0; VEC_iterate (alias_pair, alias_pairs, i, p); i++)
4611 do_assemble_alias (p->decl, p->target);
4612
4613 VEC_truncate (alias_pair, alias_pairs, 0);
4614 }
4615
4616 /* Emit an assembler directive to make the symbol for DECL an alias to
4617 the symbol for TARGET. */
4618
4619 void
4620 assemble_alias (tree decl, tree target)
4621 {
4622 tree target_decl;
4623
4624 #if !defined (ASM_OUTPUT_DEF)
4625 # if !defined(ASM_OUTPUT_WEAK_ALIAS) && !defined (ASM_WEAKEN_DECL)
4626 error ("%Jalias definitions not supported in this configuration", decl);
4627 return;
4628 # else
4629 if (!DECL_WEAK (decl))
4630 {
4631 error ("%Jonly weak aliases are supported in this configuration", decl);
4632 return;
4633 }
4634 # endif
4635 #endif
4636
4637 /* We must force creation of DECL_RTL for debug info generation, even though
4638 we don't use it here. */
4639 make_decl_rtl (decl);
4640 TREE_USED (decl) = 1;
4641
4642 /* A quirk of the initial implementation of aliases required that the user
4643 add "extern" to all of them. Which is silly, but now historical. Do
4644 note that the symbol is in fact locally defined. */
4645 DECL_EXTERNAL (decl) = 0;
4646
4647 /* Allow aliases to aliases. */
4648 if (TREE_CODE (decl) == FUNCTION_DECL)
4649 cgraph_node (decl)->alias = true;
4650 else
4651 cgraph_varpool_node (decl)->alias = true;
4652
4653 /* If the target has already been emitted, we don't have to queue the
4654 alias. This saves a tad o memory. */
4655 target_decl = find_decl_and_mark_needed (decl, target);
4656 if (target_decl && TREE_ASM_WRITTEN (target_decl))
4657 do_assemble_alias (decl, target);
4658 else
4659 {
4660 alias_pair *p = VEC_safe_push (alias_pair, gc, alias_pairs, NULL);
4661 p->decl = decl;
4662 p->target = target;
4663 }
4664 }
4665
4666 /* Emit an assembler directive to set symbol for DECL visibility to
4667 the visibility type VIS, which must not be VISIBILITY_DEFAULT. */
4668
4669 void
4670 default_assemble_visibility (tree decl, int vis)
4671 {
4672 static const char * const visibility_types[] = {
4673 NULL, "internal", "hidden", "protected"
4674 };
4675
4676 const char *name, *type;
4677
4678 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4679 type = visibility_types[vis];
4680
4681 #ifdef HAVE_GAS_HIDDEN
4682 fprintf (asm_out_file, "\t.%s\t", type);
4683 assemble_name (asm_out_file, name);
4684 fprintf (asm_out_file, "\n");
4685 #else
4686 warning (0, "visibility attribute not supported in this configuration; ignored");
4687 #endif
4688 }
4689
4690 /* A helper function to call assemble_visibility when needed for a decl. */
4691
4692 static void
4693 maybe_assemble_visibility (tree decl)
4694 {
4695 enum symbol_visibility vis = DECL_VISIBILITY (decl);
4696
4697 if (vis != VISIBILITY_DEFAULT)
4698 targetm.asm_out.visibility (decl, vis);
4699 }
4700
4701 /* Returns 1 if the target configuration supports defining public symbols
4702 so that one of them will be chosen at link time instead of generating a
4703 multiply-defined symbol error, whether through the use of weak symbols or
4704 a target-specific mechanism for having duplicates discarded. */
4705
4706 int
4707 supports_one_only (void)
4708 {
4709 if (SUPPORTS_ONE_ONLY)
4710 return 1;
4711 return SUPPORTS_WEAK;
4712 }
4713
4714 /* Set up DECL as a public symbol that can be defined in multiple
4715 translation units without generating a linker error. */
4716
4717 void
4718 make_decl_one_only (tree decl)
4719 {
4720 gcc_assert (TREE_CODE (decl) == VAR_DECL
4721 || TREE_CODE (decl) == FUNCTION_DECL);
4722
4723 TREE_PUBLIC (decl) = 1;
4724
4725 if (SUPPORTS_ONE_ONLY)
4726 {
4727 #ifdef MAKE_DECL_ONE_ONLY
4728 MAKE_DECL_ONE_ONLY (decl);
4729 #endif
4730 DECL_ONE_ONLY (decl) = 1;
4731 }
4732 else if (TREE_CODE (decl) == VAR_DECL
4733 && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
4734 DECL_COMMON (decl) = 1;
4735 else
4736 {
4737 gcc_assert (SUPPORTS_WEAK);
4738 DECL_WEAK (decl) = 1;
4739 }
4740 }
4741
4742 void
4743 init_varasm_once (void)
4744 {
4745 in_named_htab = htab_create_ggc (31, in_named_entry_hash,
4746 in_named_entry_eq, NULL);
4747 const_desc_htab = htab_create_ggc (1009, const_desc_hash,
4748 const_desc_eq, NULL);
4749
4750 const_alias_set = new_alias_set ();
4751 }
4752
4753 static enum tls_model
4754 decl_tls_model (tree decl)
4755 {
4756 enum tls_model kind;
4757 tree attr = lookup_attribute ("tls_model", DECL_ATTRIBUTES (decl));
4758 bool is_local;
4759
4760 if (attr)
4761 {
4762 attr = TREE_VALUE (TREE_VALUE (attr));
4763 gcc_assert (TREE_CODE (attr) == STRING_CST);
4764
4765 if (!strcmp (TREE_STRING_POINTER (attr), "local-exec"))
4766 kind = TLS_MODEL_LOCAL_EXEC;
4767 else if (!strcmp (TREE_STRING_POINTER (attr), "initial-exec"))
4768 kind = TLS_MODEL_INITIAL_EXEC;
4769 else if (!strcmp (TREE_STRING_POINTER (attr), "local-dynamic"))
4770 kind = optimize ? TLS_MODEL_LOCAL_DYNAMIC : TLS_MODEL_GLOBAL_DYNAMIC;
4771 else if (!strcmp (TREE_STRING_POINTER (attr), "global-dynamic"))
4772 kind = TLS_MODEL_GLOBAL_DYNAMIC;
4773 else
4774 gcc_unreachable ();
4775 return kind;
4776 }
4777
4778 is_local = targetm.binds_local_p (decl);
4779 if (!flag_shlib)
4780 {
4781 if (is_local)
4782 kind = TLS_MODEL_LOCAL_EXEC;
4783 else
4784 kind = TLS_MODEL_INITIAL_EXEC;
4785 }
4786 /* Local dynamic is inefficient when we're not combining the
4787 parts of the address. */
4788 else if (optimize && is_local)
4789 kind = TLS_MODEL_LOCAL_DYNAMIC;
4790 else
4791 kind = TLS_MODEL_GLOBAL_DYNAMIC;
4792 if (kind < flag_tls_default)
4793 kind = flag_tls_default;
4794
4795 return kind;
4796 }
4797
4798 /* Select a set of attributes for section NAME based on the properties
4799 of DECL and whether or not RELOC indicates that DECL's initializer
4800 might contain runtime relocations.
4801
4802 We make the section read-only and executable for a function decl,
4803 read-only for a const data decl, and writable for a non-const data decl. */
4804
4805 unsigned int
4806 default_section_type_flags (tree decl, const char *name, int reloc)
4807 {
4808 return default_section_type_flags_1 (decl, name, reloc, flag_pic);
4809 }
4810
4811 unsigned int
4812 default_section_type_flags_1 (tree decl, const char *name, int reloc,
4813 int shlib)
4814 {
4815 unsigned int flags;
4816
4817 if (decl && TREE_CODE (decl) == FUNCTION_DECL)
4818 flags = SECTION_CODE;
4819 else if (decl && decl_readonly_section_1 (decl, reloc, shlib))
4820 flags = 0;
4821 else if (current_function_decl
4822 && cfun
4823 && cfun->unlikely_text_section_name
4824 && strcmp (name, cfun->unlikely_text_section_name) == 0)
4825 flags = SECTION_CODE;
4826 else if (!decl
4827 && (!current_function_decl || !cfun)
4828 && strcmp (name, UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0)
4829 flags = SECTION_CODE;
4830 else
4831 flags = SECTION_WRITE;
4832
4833 if (decl && DECL_ONE_ONLY (decl))
4834 flags |= SECTION_LINKONCE;
4835
4836 if (decl && TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
4837 flags |= SECTION_TLS | SECTION_WRITE;
4838
4839 if (strcmp (name, ".bss") == 0
4840 || strncmp (name, ".bss.", 5) == 0
4841 || strncmp (name, ".gnu.linkonce.b.", 16) == 0
4842 || strcmp (name, ".sbss") == 0
4843 || strncmp (name, ".sbss.", 6) == 0
4844 || strncmp (name, ".gnu.linkonce.sb.", 17) == 0)
4845 flags |= SECTION_BSS;
4846
4847 if (strcmp (name, ".tdata") == 0
4848 || strncmp (name, ".tdata.", 7) == 0
4849 || strncmp (name, ".gnu.linkonce.td.", 17) == 0)
4850 flags |= SECTION_TLS;
4851
4852 if (strcmp (name, ".tbss") == 0
4853 || strncmp (name, ".tbss.", 6) == 0
4854 || strncmp (name, ".gnu.linkonce.tb.", 17) == 0)
4855 flags |= SECTION_TLS | SECTION_BSS;
4856
4857 /* These three sections have special ELF types. They are neither
4858 SHT_PROGBITS nor SHT_NOBITS, so when changing sections we don't
4859 want to print a section type (@progbits or @nobits). If someone
4860 is silly enough to emit code or TLS variables to one of these
4861 sections, then don't handle them specially. */
4862 if (!(flags & (SECTION_CODE | SECTION_BSS | SECTION_TLS))
4863 && (strcmp (name, ".init_array") == 0
4864 || strcmp (name, ".fini_array") == 0
4865 || strcmp (name, ".preinit_array") == 0))
4866 flags |= SECTION_NOTYPE;
4867
4868 return flags;
4869 }
4870
4871 /* Output assembly to switch to section NAME with attribute FLAGS.
4872 Four variants for common object file formats. */
4873
4874 void
4875 default_no_named_section (const char *name ATTRIBUTE_UNUSED,
4876 unsigned int flags ATTRIBUTE_UNUSED,
4877 tree decl ATTRIBUTE_UNUSED)
4878 {
4879 /* Some object formats don't support named sections at all. The
4880 front-end should already have flagged this as an error. */
4881 gcc_unreachable ();
4882 }
4883
4884 void
4885 default_elf_asm_named_section (const char *name, unsigned int flags,
4886 tree decl ATTRIBUTE_UNUSED)
4887 {
4888 char flagchars[10], *f = flagchars;
4889
4890 /* If we have already declared this section, we can use an
4891 abbreviated form to switch back to it -- unless this section is
4892 part of a COMDAT groups, in which case GAS requires the full
4893 declaration every time. */
4894 if (!(HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
4895 && ! named_section_first_declaration (name))
4896 {
4897 fprintf (asm_out_file, "\t.section\t%s\n", name);
4898 return;
4899 }
4900
4901 if (!(flags & SECTION_DEBUG))
4902 *f++ = 'a';
4903 if (flags & SECTION_WRITE)
4904 *f++ = 'w';
4905 if (flags & SECTION_CODE)
4906 *f++ = 'x';
4907 if (flags & SECTION_SMALL)
4908 *f++ = 's';
4909 if (flags & SECTION_MERGE)
4910 *f++ = 'M';
4911 if (flags & SECTION_STRINGS)
4912 *f++ = 'S';
4913 if (flags & SECTION_TLS)
4914 *f++ = 'T';
4915 if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
4916 *f++ = 'G';
4917 *f = '\0';
4918
4919 fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars);
4920
4921 if (!(flags & SECTION_NOTYPE))
4922 {
4923 const char *type;
4924 const char *format;
4925
4926 if (flags & SECTION_BSS)
4927 type = "nobits";
4928 else
4929 type = "progbits";
4930
4931 format = ",@%s";
4932 #ifdef ASM_COMMENT_START
4933 /* On platforms that use "@" as the assembly comment character,
4934 use "%" instead. */
4935 if (strcmp (ASM_COMMENT_START, "@") == 0)
4936 format = ",%%%s";
4937 #endif
4938 fprintf (asm_out_file, format, type);
4939
4940 if (flags & SECTION_ENTSIZE)
4941 fprintf (asm_out_file, ",%d", flags & SECTION_ENTSIZE);
4942 if (HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE))
4943 fprintf (asm_out_file, ",%s,comdat",
4944 lang_hooks.decls.comdat_group (decl));
4945 }
4946
4947 putc ('\n', asm_out_file);
4948 }
4949
4950 void
4951 default_coff_asm_named_section (const char *name, unsigned int flags,
4952 tree decl ATTRIBUTE_UNUSED)
4953 {
4954 char flagchars[8], *f = flagchars;
4955
4956 if (flags & SECTION_WRITE)
4957 *f++ = 'w';
4958 if (flags & SECTION_CODE)
4959 *f++ = 'x';
4960 *f = '\0';
4961
4962 fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars);
4963 }
4964
4965 void
4966 default_pe_asm_named_section (const char *name, unsigned int flags,
4967 tree decl)
4968 {
4969 default_coff_asm_named_section (name, flags, decl);
4970
4971 if (flags & SECTION_LINKONCE)
4972 {
4973 /* Functions may have been compiled at various levels of
4974 optimization so we can't use `same_size' here.
4975 Instead, have the linker pick one. */
4976 fprintf (asm_out_file, "\t.linkonce %s\n",
4977 (flags & SECTION_CODE ? "discard" : "same_size"));
4978 }
4979 }
4980 \f
4981 /* The lame default section selector. */
4982
4983 void
4984 default_select_section (tree decl, int reloc,
4985 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
4986 {
4987 bool readonly = false;
4988
4989 if (DECL_P (decl))
4990 {
4991 if (decl_readonly_section (decl, reloc))
4992 readonly = true;
4993 }
4994 else if (TREE_CODE (decl) == CONSTRUCTOR)
4995 {
4996 if (! ((flag_pic && reloc)
4997 || !TREE_READONLY (decl)
4998 || TREE_SIDE_EFFECTS (decl)
4999 || !TREE_CONSTANT (decl)))
5000 readonly = true;
5001 }
5002 else if (TREE_CODE (decl) == STRING_CST)
5003 readonly = true;
5004 else if (! (flag_pic && reloc))
5005 readonly = true;
5006
5007 if (readonly)
5008 readonly_data_section ();
5009 else
5010 data_section ();
5011 }
5012
5013 /* A helper function for default_elf_select_section and
5014 default_elf_unique_section. Categorizes the DECL. */
5015
5016 enum section_category
5017 {
5018 SECCAT_TEXT,
5019
5020 SECCAT_RODATA,
5021 SECCAT_RODATA_MERGE_STR,
5022 SECCAT_RODATA_MERGE_STR_INIT,
5023 SECCAT_RODATA_MERGE_CONST,
5024 SECCAT_SRODATA,
5025
5026 SECCAT_DATA,
5027
5028 /* To optimize loading of shared programs, define following subsections
5029 of data section:
5030 _REL Contains data that has relocations, so they get grouped
5031 together and dynamic linker will visit fewer pages in memory.
5032 _RO Contains data that is otherwise read-only. This is useful
5033 with prelinking as most relocations won't be dynamically
5034 linked and thus stay read only.
5035 _LOCAL Marks data containing relocations only to local objects.
5036 These relocations will get fully resolved by prelinking. */
5037 SECCAT_DATA_REL,
5038 SECCAT_DATA_REL_LOCAL,
5039 SECCAT_DATA_REL_RO,
5040 SECCAT_DATA_REL_RO_LOCAL,
5041
5042 SECCAT_SDATA,
5043 SECCAT_TDATA,
5044
5045 SECCAT_BSS,
5046 SECCAT_SBSS,
5047 SECCAT_TBSS
5048 };
5049
5050 static enum section_category
5051 categorize_decl_for_section (tree, int, int);
5052
5053 static enum section_category
5054 categorize_decl_for_section (tree decl, int reloc, int shlib)
5055 {
5056 enum section_category ret;
5057
5058 if (TREE_CODE (decl) == FUNCTION_DECL)
5059 return SECCAT_TEXT;
5060 else if (TREE_CODE (decl) == STRING_CST)
5061 {
5062 if (flag_mudflap) /* or !flag_merge_constants */
5063 return SECCAT_RODATA;
5064 else
5065 return SECCAT_RODATA_MERGE_STR;
5066 }
5067 else if (TREE_CODE (decl) == VAR_DECL)
5068 {
5069 if (DECL_INITIAL (decl) == NULL
5070 || DECL_INITIAL (decl) == error_mark_node
5071 || (flag_zero_initialized_in_bss
5072 /* Leave constant zeroes in .rodata so they can be shared. */
5073 && !TREE_READONLY (decl)
5074 && initializer_zerop (DECL_INITIAL (decl))))
5075 ret = SECCAT_BSS;
5076 else if (! TREE_READONLY (decl)
5077 || TREE_SIDE_EFFECTS (decl)
5078 || ! TREE_CONSTANT (DECL_INITIAL (decl)))
5079 {
5080 if (shlib && (reloc & 2))
5081 ret = SECCAT_DATA_REL;
5082 else if (shlib && reloc)
5083 ret = SECCAT_DATA_REL_LOCAL;
5084 else
5085 ret = SECCAT_DATA;
5086 }
5087 else if (shlib && (reloc & 2))
5088 ret = SECCAT_DATA_REL_RO;
5089 else if (shlib && reloc)
5090 ret = SECCAT_DATA_REL_RO_LOCAL;
5091 else if (reloc || flag_merge_constants < 2)
5092 /* C and C++ don't allow different variables to share the same
5093 location. -fmerge-all-constants allows even that (at the
5094 expense of not conforming). */
5095 ret = SECCAT_RODATA;
5096 else if (TREE_CODE (DECL_INITIAL (decl)) == STRING_CST)
5097 ret = SECCAT_RODATA_MERGE_STR_INIT;
5098 else
5099 ret = SECCAT_RODATA_MERGE_CONST;
5100 }
5101 else if (TREE_CODE (decl) == CONSTRUCTOR)
5102 {
5103 if ((shlib && reloc)
5104 || TREE_SIDE_EFFECTS (decl)
5105 || ! TREE_CONSTANT (decl))
5106 ret = SECCAT_DATA;
5107 else
5108 ret = SECCAT_RODATA;
5109 }
5110 else
5111 ret = SECCAT_RODATA;
5112
5113 /* There are no read-only thread-local sections. */
5114 if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
5115 {
5116 /* Note that this would be *just* SECCAT_BSS, except that there's
5117 no concept of a read-only thread-local-data section. */
5118 if (ret == SECCAT_BSS
5119 || (flag_zero_initialized_in_bss
5120 && initializer_zerop (DECL_INITIAL (decl))))
5121 ret = SECCAT_TBSS;
5122 else
5123 ret = SECCAT_TDATA;
5124 }
5125
5126 /* If the target uses small data sections, select it. */
5127 else if (targetm.in_small_data_p (decl))
5128 {
5129 if (ret == SECCAT_BSS)
5130 ret = SECCAT_SBSS;
5131 else if (targetm.have_srodata_section && ret == SECCAT_RODATA)
5132 ret = SECCAT_SRODATA;
5133 else
5134 ret = SECCAT_SDATA;
5135 }
5136
5137 return ret;
5138 }
5139
5140 bool
5141 decl_readonly_section (tree decl, int reloc)
5142 {
5143 return decl_readonly_section_1 (decl, reloc, flag_pic);
5144 }
5145
5146 bool
5147 decl_readonly_section_1 (tree decl, int reloc, int shlib)
5148 {
5149 switch (categorize_decl_for_section (decl, reloc, shlib))
5150 {
5151 case SECCAT_RODATA:
5152 case SECCAT_RODATA_MERGE_STR:
5153 case SECCAT_RODATA_MERGE_STR_INIT:
5154 case SECCAT_RODATA_MERGE_CONST:
5155 case SECCAT_SRODATA:
5156 return true;
5157 break;
5158 default:
5159 return false;
5160 break;
5161 }
5162 }
5163
5164 /* Select a section based on the above categorization. */
5165
5166 void
5167 default_elf_select_section (tree decl, int reloc,
5168 unsigned HOST_WIDE_INT align)
5169 {
5170 default_elf_select_section_1 (decl, reloc, align, flag_pic);
5171 }
5172
5173 void
5174 default_elf_select_section_1 (tree decl, int reloc,
5175 unsigned HOST_WIDE_INT align, int shlib)
5176 {
5177 const char *sname;
5178 switch (categorize_decl_for_section (decl, reloc, shlib))
5179 {
5180 case SECCAT_TEXT:
5181 /* We're not supposed to be called on FUNCTION_DECLs. */
5182 gcc_unreachable ();
5183 case SECCAT_RODATA:
5184 readonly_data_section ();
5185 return;
5186 case SECCAT_RODATA_MERGE_STR:
5187 mergeable_string_section (decl, align, 0);
5188 return;
5189 case SECCAT_RODATA_MERGE_STR_INIT:
5190 mergeable_string_section (DECL_INITIAL (decl), align, 0);
5191 return;
5192 case SECCAT_RODATA_MERGE_CONST:
5193 mergeable_constant_section (DECL_MODE (decl), align, 0);
5194 return;
5195 case SECCAT_SRODATA:
5196 sname = ".sdata2";
5197 break;
5198 case SECCAT_DATA:
5199 data_section ();
5200 return;
5201 case SECCAT_DATA_REL:
5202 sname = ".data.rel";
5203 break;
5204 case SECCAT_DATA_REL_LOCAL:
5205 sname = ".data.rel.local";
5206 break;
5207 case SECCAT_DATA_REL_RO:
5208 sname = ".data.rel.ro";
5209 break;
5210 case SECCAT_DATA_REL_RO_LOCAL:
5211 sname = ".data.rel.ro.local";
5212 break;
5213 case SECCAT_SDATA:
5214 sname = ".sdata";
5215 break;
5216 case SECCAT_TDATA:
5217 sname = ".tdata";
5218 break;
5219 case SECCAT_BSS:
5220 #ifdef BSS_SECTION_ASM_OP
5221 bss_section ();
5222 return;
5223 #else
5224 sname = ".bss";
5225 break;
5226 #endif
5227 case SECCAT_SBSS:
5228 sname = ".sbss";
5229 break;
5230 case SECCAT_TBSS:
5231 sname = ".tbss";
5232 break;
5233 default:
5234 gcc_unreachable ();
5235 }
5236
5237 if (!DECL_P (decl))
5238 decl = NULL_TREE;
5239 named_section (decl, sname, reloc);
5240 }
5241
5242 /* Construct a unique section name based on the decl name and the
5243 categorization performed above. */
5244
5245 void
5246 default_unique_section (tree decl, int reloc)
5247 {
5248 default_unique_section_1 (decl, reloc, flag_pic);
5249 }
5250
5251 void
5252 default_unique_section_1 (tree decl, int reloc, int shlib)
5253 {
5254 /* We only need to use .gnu.linkonce if we don't have COMDAT groups. */
5255 bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;
5256 const char *prefix, *name;
5257 size_t nlen, plen;
5258 char *string;
5259
5260 switch (categorize_decl_for_section (decl, reloc, shlib))
5261 {
5262 case SECCAT_TEXT:
5263 prefix = one_only ? ".gnu.linkonce.t." : ".text.";
5264 break;
5265 case SECCAT_RODATA:
5266 case SECCAT_RODATA_MERGE_STR:
5267 case SECCAT_RODATA_MERGE_STR_INIT:
5268 case SECCAT_RODATA_MERGE_CONST:
5269 prefix = one_only ? ".gnu.linkonce.r." : ".rodata.";
5270 break;
5271 case SECCAT_SRODATA:
5272 prefix = one_only ? ".gnu.linkonce.s2." : ".sdata2.";
5273 break;
5274 case SECCAT_DATA:
5275 case SECCAT_DATA_REL:
5276 case SECCAT_DATA_REL_LOCAL:
5277 case SECCAT_DATA_REL_RO:
5278 case SECCAT_DATA_REL_RO_LOCAL:
5279 prefix = one_only ? ".gnu.linkonce.d." : ".data.";
5280 break;
5281 case SECCAT_SDATA:
5282 prefix = one_only ? ".gnu.linkonce.s." : ".sdata.";
5283 break;
5284 case SECCAT_BSS:
5285 prefix = one_only ? ".gnu.linkonce.b." : ".bss.";
5286 break;
5287 case SECCAT_SBSS:
5288 prefix = one_only ? ".gnu.linkonce.sb." : ".sbss.";
5289 break;
5290 case SECCAT_TDATA:
5291 prefix = one_only ? ".gnu.linkonce.td." : ".tdata.";
5292 break;
5293 case SECCAT_TBSS:
5294 prefix = one_only ? ".gnu.linkonce.tb." : ".tbss.";
5295 break;
5296 default:
5297 gcc_unreachable ();
5298 }
5299 plen = strlen (prefix);
5300
5301 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
5302 name = targetm.strip_name_encoding (name);
5303 nlen = strlen (name);
5304
5305 string = alloca (nlen + plen + 1);
5306 memcpy (string, prefix, plen);
5307 memcpy (string + plen, name, nlen + 1);
5308
5309 DECL_SECTION_NAME (decl) = build_string (nlen + plen, string);
5310 }
5311
5312 void
5313 default_select_rtx_section (enum machine_mode mode ATTRIBUTE_UNUSED,
5314 rtx x,
5315 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
5316 {
5317 if (flag_pic)
5318 switch (GET_CODE (x))
5319 {
5320 case CONST:
5321 case SYMBOL_REF:
5322 case LABEL_REF:
5323 data_section ();
5324 return;
5325
5326 default:
5327 break;
5328 }
5329
5330 readonly_data_section ();
5331 }
5332
5333 void
5334 default_elf_select_rtx_section (enum machine_mode mode, rtx x,
5335 unsigned HOST_WIDE_INT align)
5336 {
5337 /* ??? Handle small data here somehow. */
5338
5339 if (flag_pic)
5340 switch (GET_CODE (x))
5341 {
5342 case CONST:
5343 case SYMBOL_REF:
5344 named_section (NULL_TREE, ".data.rel.ro", 3);
5345 return;
5346
5347 case LABEL_REF:
5348 named_section (NULL_TREE, ".data.rel.ro.local", 1);
5349 return;
5350
5351 default:
5352 break;
5353 }
5354
5355 mergeable_constant_section (mode, align, 0);
5356 }
5357
5358 /* Set the generally applicable flags on the SYMBOL_REF for EXP. */
5359
5360 void
5361 default_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
5362 {
5363 rtx symbol;
5364 int flags;
5365
5366 /* Careful not to prod global register variables. */
5367 if (!MEM_P (rtl))
5368 return;
5369 symbol = XEXP (rtl, 0);
5370 if (GET_CODE (symbol) != SYMBOL_REF)
5371 return;
5372
5373 flags = 0;
5374 if (TREE_CODE (decl) == FUNCTION_DECL)
5375 flags |= SYMBOL_FLAG_FUNCTION;
5376 if (targetm.binds_local_p (decl))
5377 flags |= SYMBOL_FLAG_LOCAL;
5378 if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
5379 flags |= decl_tls_model (decl) << SYMBOL_FLAG_TLS_SHIFT;
5380 else if (targetm.in_small_data_p (decl))
5381 flags |= SYMBOL_FLAG_SMALL;
5382 /* ??? Why is DECL_EXTERNAL ever set for non-PUBLIC names? Without
5383 being PUBLIC, the thing *must* be defined in this translation unit.
5384 Prevent this buglet from being propagated into rtl code as well. */
5385 if (DECL_P (decl) && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
5386 flags |= SYMBOL_FLAG_EXTERNAL;
5387
5388 SYMBOL_REF_FLAGS (symbol) = flags;
5389 }
5390
5391 /* By default, we do nothing for encode_section_info, so we need not
5392 do anything but discard the '*' marker. */
5393
5394 const char *
5395 default_strip_name_encoding (const char *str)
5396 {
5397 return str + (*str == '*');
5398 }
5399
5400 /* Assume ELF-ish defaults, since that's pretty much the most liberal
5401 wrt cross-module name binding. */
5402
5403 bool
5404 default_binds_local_p (tree exp)
5405 {
5406 return default_binds_local_p_1 (exp, flag_shlib);
5407 }
5408
5409 bool
5410 default_binds_local_p_1 (tree exp, int shlib)
5411 {
5412 bool local_p;
5413
5414 /* A non-decl is an entry in the constant pool. */
5415 if (!DECL_P (exp))
5416 local_p = true;
5417 /* Static variables are always local. */
5418 else if (! TREE_PUBLIC (exp))
5419 local_p = true;
5420 /* A variable is local if the user explicitly tells us so. */
5421 else if (DECL_VISIBILITY_SPECIFIED (exp) && DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
5422 local_p = true;
5423 /* Otherwise, variables defined outside this object may not be local. */
5424 else if (DECL_EXTERNAL (exp))
5425 local_p = false;
5426 /* Linkonce and weak data are never local. */
5427 else if (DECL_ONE_ONLY (exp) || DECL_WEAK (exp))
5428 local_p = false;
5429 /* If none of the above and visibility is not default, make local. */
5430 else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
5431 local_p = true;
5432 /* If PIC, then assume that any global name can be overridden by
5433 symbols resolved from other modules. */
5434 else if (shlib)
5435 local_p = false;
5436 /* Uninitialized COMMON variable may be unified with symbols
5437 resolved from other modules. */
5438 else if (DECL_COMMON (exp)
5439 && (DECL_INITIAL (exp) == NULL
5440 || DECL_INITIAL (exp) == error_mark_node))
5441 local_p = false;
5442 /* Otherwise we're left with initialized (or non-common) global data
5443 which is of necessity defined locally. */
5444 else
5445 local_p = true;
5446
5447 return local_p;
5448 }
5449
5450 /* Determine whether or not a pointer mode is valid. Assume defaults
5451 of ptr_mode or Pmode - can be overridden. */
5452 bool
5453 default_valid_pointer_mode (enum machine_mode mode)
5454 {
5455 return (mode == ptr_mode || mode == Pmode);
5456 }
5457
5458 /* Default function to output code that will globalize a label. A
5459 target must define GLOBAL_ASM_OP or provide its own function to
5460 globalize a label. */
5461 #ifdef GLOBAL_ASM_OP
5462 void
5463 default_globalize_label (FILE * stream, const char *name)
5464 {
5465 fputs (GLOBAL_ASM_OP, stream);
5466 assemble_name (stream, name);
5467 putc ('\n', stream);
5468 }
5469 #endif /* GLOBAL_ASM_OP */
5470
5471 /* Default function to output a label for unwind information. The
5472 default is to do nothing. A target that needs nonlocal labels for
5473 unwind information must provide its own function to do this. */
5474 void
5475 default_emit_unwind_label (FILE * stream ATTRIBUTE_UNUSED,
5476 tree decl ATTRIBUTE_UNUSED,
5477 int for_eh ATTRIBUTE_UNUSED,
5478 int empty ATTRIBUTE_UNUSED)
5479 {
5480 }
5481
5482 /* This is how to output an internal numbered label where PREFIX is
5483 the class of label and LABELNO is the number within the class. */
5484
5485 void
5486 default_internal_label (FILE *stream, const char *prefix,
5487 unsigned long labelno)
5488 {
5489 char *const buf = alloca (40 + strlen (prefix));
5490 ASM_GENERATE_INTERNAL_LABEL (buf, prefix, labelno);
5491 ASM_OUTPUT_INTERNAL_LABEL (stream, buf);
5492 }
5493
5494 /* This is the default behavior at the beginning of a file. It's
5495 controlled by two other target-hook toggles. */
5496 void
5497 default_file_start (void)
5498 {
5499 if (targetm.file_start_app_off && !flag_verbose_asm)
5500 fputs (ASM_APP_OFF, asm_out_file);
5501
5502 if (targetm.file_start_file_directive)
5503 output_file_directive (asm_out_file, main_input_filename);
5504 }
5505
5506 /* This is a generic routine suitable for use as TARGET_ASM_FILE_END
5507 which emits a special section directive used to indicate whether or
5508 not this object file needs an executable stack. This is primarily
5509 a GNU extension to ELF but could be used on other targets. */
5510
5511 int trampolines_created;
5512
5513 void
5514 file_end_indicate_exec_stack (void)
5515 {
5516 unsigned int flags = SECTION_DEBUG;
5517 if (trampolines_created)
5518 flags |= SECTION_CODE;
5519
5520 named_section_flags (".note.GNU-stack", flags);
5521 }
5522
5523 #include "gt-varasm.h"