* varasm.c (default_stabs_asm_out_destructor): Mark symbol as
[official-gcc.git] / gcc / varasm.c
blobdf97f9e0f0862e11b4e3d75e9d7521978814818d
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 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
23 /* This file handles generation of all the assembler code
24 *except* the instructions of a function.
25 This includes declarations of variables and their initial values.
27 We also output the assembler code for constants stored in memory
28 and are responsible for combining constants with the same value. */
30 #include "config.h"
31 #include "system.h"
32 #include "coretypes.h"
33 #include "tm.h"
34 #include "rtl.h"
35 #include "tree.h"
36 #include "flags.h"
37 #include "function.h"
38 #include "expr.h"
39 #include "hard-reg-set.h"
40 #include "regs.h"
41 #include "real.h"
42 #include "output.h"
43 #include "toplev.h"
44 #include "hashtab.h"
45 #include "c-pragma.h"
46 #include "ggc.h"
47 #include "langhooks.h"
48 #include "tm_p.h"
49 #include "debug.h"
50 #include "target.h"
51 #include "tree-mudflap.h"
52 #include "cgraph.h"
53 #include "cfglayout.h"
55 #ifdef XCOFF_DEBUGGING_INFO
56 #include "xcoffout.h" /* Needed for external data
57 declarations for e.g. AIX 4.x. */
58 #endif
60 /* The (assembler) name of the first globally-visible object output. */
61 const char *first_global_object_name;
62 const char *weak_global_object_name;
64 struct addr_const;
65 struct constant_descriptor_rtx;
66 struct rtx_constant_pool;
68 struct varasm_status GTY(())
70 /* If we're using a per-function constant pool, this is it. */
71 struct rtx_constant_pool *pool;
73 /* Number of tree-constants deferred during the expansion of this
74 function. */
75 unsigned int deferred_constants;
78 #define n_deferred_constants (cfun->varasm->deferred_constants)
80 /* Number for making the label on the next
81 constant that is stored in memory. */
83 static GTY(()) int const_labelno;
85 /* Carry information from ASM_DECLARE_OBJECT_NAME
86 to ASM_FINISH_DECLARE_OBJECT. */
88 int size_directive_output;
90 /* The last decl for which assemble_variable was called,
91 if it did ASM_DECLARE_OBJECT_NAME.
92 If the last call to assemble_variable didn't do that,
93 this holds 0. */
95 tree last_assemble_variable_decl;
97 /* The following global variable indicates if the section label for the
98 "cold" section of code has been output yet to the assembler. The
99 label is useful when running gdb. This is part of the optimization that
100 partitions hot and cold basic blocks into separate sections of the .o
101 file. */
103 static bool unlikely_section_label_printed = false;
105 /* The following global variable indicates the label name to be put at
106 the start of the first cold section within each function, when
107 partitioning basic blocks into hot and cold sections. */
109 static char *unlikely_section_label = NULL;
111 /* The following global variable indicates the section name to be used
112 for the current cold section, when partitioning hot and cold basic
113 blocks into separate sections. */
115 static char *unlikely_text_section_name = NULL;
117 /* We give all constants their own alias set. Perhaps redundant with
118 MEM_READONLY_P, but pre-dates it. */
120 static HOST_WIDE_INT const_alias_set;
122 static const char *strip_reg_name (const char *);
123 static int contains_pointers_p (tree);
124 #ifdef ASM_OUTPUT_EXTERNAL
125 static bool incorporeal_function_p (tree);
126 #endif
127 static void decode_addr_const (tree, struct addr_const *);
128 static hashval_t const_desc_hash (const void *);
129 static int const_desc_eq (const void *, const void *);
130 static hashval_t const_hash_1 (const tree);
131 static int compare_constant (const tree, const tree);
132 static tree copy_constant (tree);
133 static void output_constant_def_contents (rtx);
134 static void output_addressed_constants (tree);
135 static unsigned HOST_WIDE_INT array_size_for_constructor (tree);
136 static unsigned min_align (unsigned, unsigned);
137 static void output_constructor (tree, unsigned HOST_WIDE_INT, unsigned int);
138 static void globalize_decl (tree);
139 static void maybe_assemble_visibility (tree);
140 static int in_named_entry_eq (const void *, const void *);
141 static hashval_t in_named_entry_hash (const void *);
142 #ifdef BSS_SECTION_ASM_OP
143 #ifdef ASM_OUTPUT_BSS
144 static void asm_output_bss (FILE *, tree, const char *,
145 unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT);
146 #endif
147 #ifdef ASM_OUTPUT_ALIGNED_BSS
148 static void asm_output_aligned_bss (FILE *, tree, const char *,
149 unsigned HOST_WIDE_INT, int)
150 ATTRIBUTE_UNUSED;
151 #endif
152 #endif /* BSS_SECTION_ASM_OP */
153 static bool asm_emit_uninitialised (tree, const char*,
154 unsigned HOST_WIDE_INT,
155 unsigned HOST_WIDE_INT);
156 static void mark_weak (tree);
158 enum in_section { no_section, in_text, in_unlikely_executed_text, in_data,
159 in_named
160 #ifdef BSS_SECTION_ASM_OP
161 , in_bss
162 #endif
163 #ifdef CTORS_SECTION_ASM_OP
164 , in_ctors
165 #endif
166 #ifdef DTORS_SECTION_ASM_OP
167 , in_dtors
168 #endif
169 #ifdef READONLY_DATA_SECTION_ASM_OP
170 , in_readonly_data
171 #endif
172 #ifdef EXTRA_SECTIONS
173 , EXTRA_SECTIONS
174 #endif
176 static GTY(()) enum in_section in_section = no_section;
178 /* Return a nonzero value if DECL has a section attribute. */
179 #ifndef IN_NAMED_SECTION
180 #define IN_NAMED_SECTION(DECL) \
181 ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \
182 && DECL_SECTION_NAME (DECL) != NULL_TREE)
183 #endif
185 /* Text of section name when in_section == in_named. */
186 static GTY(()) const char *in_named_name;
188 /* Hash table of flags that have been used for a particular named section. */
190 struct in_named_entry GTY(())
192 const char *name;
193 unsigned int flags;
194 bool declared;
197 static GTY((param_is (struct in_named_entry))) htab_t in_named_htab;
199 /* Define functions like text_section for any extra sections. */
200 #ifdef EXTRA_SECTION_FUNCTIONS
201 EXTRA_SECTION_FUNCTIONS
202 #endif
204 /* Tell assembler to switch to text section. */
206 void
207 text_section (void)
209 if (in_section != in_text)
211 in_section = in_text;
212 fprintf (asm_out_file, "%s\n", TEXT_SECTION_ASM_OP);
216 /* Tell assembler to switch to unlikely-to-be-executed text section. */
218 void
219 unlikely_text_section (void)
221 const char *name;
222 int len;
224 if (! unlikely_text_section_name)
226 if (DECL_SECTION_NAME (current_function_decl)
227 && (strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME
228 (current_function_decl)),
229 HOT_TEXT_SECTION_NAME) != 0)
230 && (strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME
231 (current_function_decl)),
232 UNLIKELY_EXECUTED_TEXT_SECTION_NAME) != 0))
234 name = TREE_STRING_POINTER (DECL_SECTION_NAME
235 (current_function_decl));
236 len = strlen (name);
237 unlikely_text_section_name = xmalloc ((len + 10) * sizeof (char));
238 strcpy (unlikely_text_section_name, name);
239 strcat (unlikely_text_section_name, "_unlikely");
241 else
243 len = strlen (UNLIKELY_EXECUTED_TEXT_SECTION_NAME);
244 unlikely_text_section_name = xmalloc (len+1 * sizeof (char));
245 strcpy (unlikely_text_section_name,
246 UNLIKELY_EXECUTED_TEXT_SECTION_NAME);
250 if ((in_section != in_unlikely_executed_text)
251 && (in_section != in_named
252 || strcmp (in_named_name, unlikely_text_section_name) != 0))
254 named_section (NULL_TREE, unlikely_text_section_name, 0);
255 in_section = in_unlikely_executed_text;
257 if (!unlikely_section_label_printed)
259 ASM_OUTPUT_LABEL (asm_out_file, unlikely_section_label);
260 unlikely_section_label_printed = true;
265 /* Tell assembler to switch to data section. */
267 void
268 data_section (void)
270 if (in_section != in_data)
272 in_section = in_data;
273 fprintf (asm_out_file, "%s\n", DATA_SECTION_ASM_OP);
277 /* Tell assembler to switch to read-only data section. This is normally
278 the text section. */
280 void
281 readonly_data_section (void)
283 #ifdef READONLY_DATA_SECTION
284 READONLY_DATA_SECTION (); /* Note this can call data_section. */
285 #else
286 #ifdef READONLY_DATA_SECTION_ASM_OP
287 if (in_section != in_readonly_data)
289 in_section = in_readonly_data;
290 fputs (READONLY_DATA_SECTION_ASM_OP, asm_out_file);
291 fputc ('\n', asm_out_file);
293 #else
294 text_section ();
295 #endif
296 #endif
299 /* Determine if we're in the text section. */
302 in_text_section (void)
304 return in_section == in_text;
307 /* Determine if we're in the unlikely-to-be-executed text section. */
310 in_unlikely_text_section (void)
312 bool ret_val;
314 ret_val = ((in_section == in_unlikely_executed_text)
315 || (in_section == in_named
316 && unlikely_text_section_name
317 && strcmp (in_named_name, unlikely_text_section_name) == 0));
319 return ret_val;
322 /* Determine if we're in the data section. */
325 in_data_section (void)
327 return in_section == in_data;
330 /* Helper routines for maintaining in_named_htab. */
332 static int
333 in_named_entry_eq (const void *p1, const void *p2)
335 const struct in_named_entry *old = p1;
336 const char *new = p2;
338 return strcmp (old->name, new) == 0;
341 static hashval_t
342 in_named_entry_hash (const void *p)
344 const struct in_named_entry *old = p;
345 return htab_hash_string (old->name);
348 /* If SECTION has been seen before as a named section, return the flags
349 that were used. Otherwise, return 0. Note, that 0 is a perfectly valid
350 set of flags for a section to have, so 0 does not mean that the section
351 has not been seen. */
353 unsigned int
354 get_named_section_flags (const char *section)
356 struct in_named_entry **slot;
358 slot = (struct in_named_entry **)
359 htab_find_slot_with_hash (in_named_htab, section,
360 htab_hash_string (section), NO_INSERT);
362 return slot ? (*slot)->flags : 0;
365 /* Returns true if the section has been declared before. Sets internal
366 flag on this section in in_named_hash so subsequent calls on this
367 section will return false. */
369 bool
370 named_section_first_declaration (const char *name)
372 struct in_named_entry **slot;
374 slot = (struct in_named_entry **)
375 htab_find_slot_with_hash (in_named_htab, name,
376 htab_hash_string (name), NO_INSERT);
377 if (! (*slot)->declared)
379 (*slot)->declared = true;
380 return true;
382 else
384 return false;
389 /* Record FLAGS for SECTION. If SECTION was previously recorded with a
390 different set of flags, return false. */
392 bool
393 set_named_section_flags (const char *section, unsigned int flags)
395 struct in_named_entry **slot, *entry;
397 slot = (struct in_named_entry **)
398 htab_find_slot_with_hash (in_named_htab, section,
399 htab_hash_string (section), INSERT);
400 entry = *slot;
402 if (!entry)
404 entry = ggc_alloc (sizeof (*entry));
405 *slot = entry;
406 entry->name = ggc_strdup (section);
407 entry->flags = flags;
408 entry->declared = false;
410 else if (entry->flags != flags)
411 return false;
413 return true;
416 /* Tell assembler to change to section NAME with attributes FLAGS. If
417 DECL is non-NULL, it is the VAR_DECL or FUNCTION_DECL with which
418 this section is associated. */
420 void
421 named_section_real (const char *name, unsigned int flags, tree decl)
423 if (in_section != in_named || strcmp (name, in_named_name) != 0)
425 if (! set_named_section_flags (name, flags))
426 abort ();
428 targetm.asm_out.named_section (name, flags, decl);
430 if (flags & SECTION_FORGET)
431 in_section = no_section;
432 else
434 in_named_name = ggc_strdup (name);
435 in_section = in_named;
440 /* Tell assembler to change to section NAME for DECL.
441 If DECL is NULL, just switch to section NAME.
442 If NAME is NULL, get the name from DECL.
443 If RELOC is 1, the initializer for DECL contains relocs. */
445 void
446 named_section (tree decl, const char *name, int reloc)
448 unsigned int flags;
450 if (decl != NULL_TREE && !DECL_P (decl))
451 abort ();
452 if (name == NULL)
453 name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
455 if (strcmp (name, UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0
456 && !unlikely_text_section_name)
458 unlikely_text_section_name = xmalloc
459 (strlen (UNLIKELY_EXECUTED_TEXT_SECTION_NAME) + 1
460 * sizeof (char));
461 strcpy (unlikely_text_section_name,
462 UNLIKELY_EXECUTED_TEXT_SECTION_NAME);
465 flags = targetm.section_type_flags (decl, name, reloc);
467 /* Sanity check user variables for flag changes. Non-user
468 section flag changes will abort in named_section_flags.
469 However, don't complain if SECTION_OVERRIDE is set.
470 We trust that the setter knows that it is safe to ignore
471 the default flags for this decl. */
472 if (decl && ! set_named_section_flags (name, flags))
474 flags = get_named_section_flags (name);
475 if ((flags & SECTION_OVERRIDE) == 0)
476 error ("%J%D causes a section type conflict", decl, decl);
479 named_section_real (name, flags, decl);
482 /* If required, set DECL_SECTION_NAME to a unique name. */
484 void
485 resolve_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED,
486 int flag_function_or_data_sections)
488 if (DECL_SECTION_NAME (decl) == NULL_TREE
489 && targetm.have_named_sections
490 && (flag_function_or_data_sections
491 || DECL_ONE_ONLY (decl)))
492 targetm.asm_out.unique_section (decl, reloc);
495 #ifdef BSS_SECTION_ASM_OP
497 /* Tell the assembler to switch to the bss section. */
499 void
500 bss_section (void)
502 if (in_section != in_bss)
504 fprintf (asm_out_file, "%s\n", BSS_SECTION_ASM_OP);
505 in_section = in_bss;
509 #ifdef ASM_OUTPUT_BSS
511 /* Utility function for ASM_OUTPUT_BSS for targets to use if
512 they don't support alignments in .bss.
513 ??? It is believed that this function will work in most cases so such
514 support is localized here. */
516 static void
517 asm_output_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
518 const char *name,
519 unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
520 unsigned HOST_WIDE_INT rounded)
522 targetm.asm_out.globalize_label (file, name);
523 bss_section ();
524 #ifdef ASM_DECLARE_OBJECT_NAME
525 last_assemble_variable_decl = decl;
526 ASM_DECLARE_OBJECT_NAME (file, name, decl);
527 #else
528 /* Standard thing is just output label for the object. */
529 ASM_OUTPUT_LABEL (file, name);
530 #endif /* ASM_DECLARE_OBJECT_NAME */
531 ASM_OUTPUT_SKIP (file, rounded ? rounded : 1);
534 #endif
536 #ifdef ASM_OUTPUT_ALIGNED_BSS
538 /* Utility function for targets to use in implementing
539 ASM_OUTPUT_ALIGNED_BSS.
540 ??? It is believed that this function will work in most cases so such
541 support is localized here. */
543 static void
544 asm_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
545 const char *name, unsigned HOST_WIDE_INT size,
546 int align)
548 bss_section ();
549 ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
550 #ifdef ASM_DECLARE_OBJECT_NAME
551 last_assemble_variable_decl = decl;
552 ASM_DECLARE_OBJECT_NAME (file, name, decl);
553 #else
554 /* Standard thing is just output label for the object. */
555 ASM_OUTPUT_LABEL (file, name);
556 #endif /* ASM_DECLARE_OBJECT_NAME */
557 ASM_OUTPUT_SKIP (file, size ? size : 1);
560 #endif
562 #endif /* BSS_SECTION_ASM_OP */
564 /* Switch to the section for function DECL.
566 If DECL is NULL_TREE, switch to the text section.
567 ??? It's not clear that we will ever be passed NULL_TREE, but it's
568 safer to handle it. */
570 void
571 function_section (tree decl)
573 #ifdef USE_SELECT_SECTION_FOR_FUNCTIONS
574 bool unlikely = scan_ahead_for_unlikely_executed_note (get_insns());
576 targetm.asm_out.select_section (decl, unlikely, DECL_ALIGN (decl));
577 #else
578 if (scan_ahead_for_unlikely_executed_note (get_insns()))
579 unlikely_text_section ();
580 else if (decl != NULL_TREE
581 && DECL_SECTION_NAME (decl) != NULL_TREE)
582 named_section (decl, (char *) 0, 0);
583 else
584 text_section ();
585 #endif
588 /* Switch to read-only data section associated with function DECL. */
590 void
591 default_function_rodata_section (tree decl)
593 if (decl != NULL_TREE && DECL_SECTION_NAME (decl))
595 const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
597 /* For .gnu.linkonce.t.foo we want to use .gnu.linkonce.r.foo. */
598 if (DECL_ONE_ONLY (decl) && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
600 size_t len = strlen (name) + 1;
601 char *rname = alloca (len);
603 memcpy (rname, name, len);
604 rname[14] = 'r';
605 named_section_real (rname, SECTION_LINKONCE, decl);
606 return;
608 /* For .text.foo we want to use .rodata.foo. */
609 else if (flag_function_sections && flag_data_sections
610 && strncmp (name, ".text.", 6) == 0)
612 size_t len = strlen (name) + 1;
613 char *rname = alloca (len + 2);
615 memcpy (rname, ".rodata", 7);
616 memcpy (rname + 7, name + 5, len - 5);
617 named_section_flags (rname, 0);
618 return;
622 readonly_data_section ();
625 /* Switch to read-only data section associated with function DECL
626 for targets where that section should be always the single
627 readonly data section. */
629 void
630 default_no_function_rodata_section (tree decl ATTRIBUTE_UNUSED)
632 readonly_data_section ();
635 /* Switch to section for variable DECL. RELOC is the same as the
636 argument to SELECT_SECTION. */
638 void
639 variable_section (tree decl, int reloc)
641 if (IN_NAMED_SECTION (decl))
642 named_section (decl, NULL, reloc);
643 else
644 targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl));
647 /* Tell assembler to switch to the section for string merging. */
649 void
650 mergeable_string_section (tree decl ATTRIBUTE_UNUSED,
651 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED,
652 unsigned int flags ATTRIBUTE_UNUSED)
654 if (HAVE_GAS_SHF_MERGE && flag_merge_constants
655 && TREE_CODE (decl) == STRING_CST
656 && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
657 && align <= 256
658 && TREE_STRING_LENGTH (decl) >= int_size_in_bytes (TREE_TYPE (decl)))
660 enum machine_mode mode;
661 unsigned int modesize;
662 const char *str;
663 int i, j, len, unit;
664 char name[30];
666 mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (decl)));
667 modesize = GET_MODE_BITSIZE (mode);
668 if (modesize >= 8 && modesize <= 256
669 && (modesize & (modesize - 1)) == 0)
671 if (align < modesize)
672 align = modesize;
674 str = TREE_STRING_POINTER (decl);
675 len = TREE_STRING_LENGTH (decl);
676 unit = GET_MODE_SIZE (mode);
678 /* Check for embedded NUL characters. */
679 for (i = 0; i < len; i += unit)
681 for (j = 0; j < unit; j++)
682 if (str[i + j] != '\0')
683 break;
684 if (j == unit)
685 break;
687 if (i == len - unit)
689 sprintf (name, ".rodata.str%d.%d", modesize / 8,
690 (int) (align / 8));
691 flags |= (modesize / 8) | SECTION_MERGE | SECTION_STRINGS;
692 if (!i && modesize < align)
694 /* A "" string with requested alignment greater than
695 character size might cause a problem:
696 if some other string required even bigger
697 alignment than "", then linker might think the
698 "" is just part of padding after some other string
699 and not put it into the hash table initially.
700 But this means "" could have smaller alignment
701 than requested. */
702 #ifdef ASM_OUTPUT_SECTION_START
703 named_section_flags (name, flags);
704 ASM_OUTPUT_SECTION_START (asm_out_file);
705 #else
706 readonly_data_section ();
707 #endif
708 return;
711 named_section_flags (name, flags);
712 return;
717 readonly_data_section ();
720 /* Tell assembler to switch to the section for constant merging. */
722 void
723 mergeable_constant_section (enum machine_mode mode ATTRIBUTE_UNUSED,
724 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED,
725 unsigned int flags ATTRIBUTE_UNUSED)
727 unsigned int modesize = GET_MODE_BITSIZE (mode);
729 if (HAVE_GAS_SHF_MERGE && flag_merge_constants
730 && mode != VOIDmode
731 && mode != BLKmode
732 && modesize <= align
733 && align >= 8
734 && align <= 256
735 && (align & (align - 1)) == 0)
737 char name[24];
739 sprintf (name, ".rodata.cst%d", (int) (align / 8));
740 flags |= (align / 8) | SECTION_MERGE;
741 named_section_flags (name, flags);
742 return;
745 readonly_data_section ();
748 /* Given NAME, a putative register name, discard any customary prefixes. */
750 static const char *
751 strip_reg_name (const char *name)
753 #ifdef REGISTER_PREFIX
754 if (!strncmp (name, REGISTER_PREFIX, strlen (REGISTER_PREFIX)))
755 name += strlen (REGISTER_PREFIX);
756 #endif
757 if (name[0] == '%' || name[0] == '#')
758 name++;
759 return name;
762 /* The user has asked for a DECL to have a particular name. Set (or
763 change) it in such a way that we don't prefix an underscore to
764 it. */
765 void
766 set_user_assembler_name (tree decl, const char *name)
768 char *starred = alloca (strlen (name) + 2);
769 starred[0] = '*';
770 strcpy (starred + 1, name);
771 change_decl_assembler_name (decl, get_identifier (starred));
772 SET_DECL_RTL (decl, NULL_RTX);
775 /* Decode an `asm' spec for a declaration as a register name.
776 Return the register number, or -1 if nothing specified,
777 or -2 if the ASMSPEC is not `cc' or `memory' and is not recognized,
778 or -3 if ASMSPEC is `cc' and is not recognized,
779 or -4 if ASMSPEC is `memory' and is not recognized.
780 Accept an exact spelling or a decimal number.
781 Prefixes such as % are optional. */
784 decode_reg_name (const char *asmspec)
786 if (asmspec != 0 && strlen (asmspec) != 0)
788 int i;
790 /* Get rid of confusing prefixes. */
791 asmspec = strip_reg_name (asmspec);
793 /* Allow a decimal number as a "register name". */
794 for (i = strlen (asmspec) - 1; i >= 0; i--)
795 if (! ISDIGIT (asmspec[i]))
796 break;
797 if (asmspec[0] != 0 && i < 0)
799 i = atoi (asmspec);
800 if (i < FIRST_PSEUDO_REGISTER && i >= 0)
801 return i;
802 else
803 return -2;
806 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
807 if (reg_names[i][0]
808 && ! strcmp (asmspec, strip_reg_name (reg_names[i])))
809 return i;
811 #ifdef ADDITIONAL_REGISTER_NAMES
813 static const struct { const char *const name; const int number; } table[]
814 = ADDITIONAL_REGISTER_NAMES;
816 for (i = 0; i < (int) ARRAY_SIZE (table); i++)
817 if (! strcmp (asmspec, table[i].name))
818 return table[i].number;
820 #endif /* ADDITIONAL_REGISTER_NAMES */
822 if (!strcmp (asmspec, "memory"))
823 return -4;
825 if (!strcmp (asmspec, "cc"))
826 return -3;
828 return -2;
831 return -1;
834 /* Create the DECL_RTL for a VAR_DECL or FUNCTION_DECL. DECL should
835 have static storage duration. In other words, it should not be an
836 automatic variable, including PARM_DECLs.
838 There is, however, one exception: this function handles variables
839 explicitly placed in a particular register by the user.
841 This is never called for PARM_DECL nodes. */
843 void
844 make_decl_rtl (tree decl)
846 const char *name = 0;
847 int reg_number;
848 rtx x;
850 /* Check that we are not being given an automatic variable. */
851 /* A weak alias has TREE_PUBLIC set but not the other bits. */
852 if (TREE_CODE (decl) == PARM_DECL
853 || TREE_CODE (decl) == RESULT_DECL
854 || (TREE_CODE (decl) == VAR_DECL
855 && !TREE_STATIC (decl)
856 && !TREE_PUBLIC (decl)
857 && !DECL_EXTERNAL (decl)
858 && !DECL_REGISTER (decl)))
859 abort ();
860 /* And that we were not given a type or a label. */
861 else if (TREE_CODE (decl) == TYPE_DECL
862 || TREE_CODE (decl) == LABEL_DECL)
863 abort ();
865 /* For a duplicate declaration, we can be called twice on the
866 same DECL node. Don't discard the RTL already made. */
867 if (DECL_RTL_SET_P (decl))
869 /* If the old RTL had the wrong mode, fix the mode. */
870 if (GET_MODE (DECL_RTL (decl)) != DECL_MODE (decl))
871 SET_DECL_RTL (decl, adjust_address_nv (DECL_RTL (decl),
872 DECL_MODE (decl), 0));
874 if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl))
875 return;
877 /* ??? Another way to do this would be to maintain a hashed
878 table of such critters. Instead of adding stuff to a DECL
879 to give certain attributes to it, we could use an external
880 hash map from DECL to set of attributes. */
882 /* Let the target reassign the RTL if it wants.
883 This is necessary, for example, when one machine specific
884 decl attribute overrides another. */
885 targetm.encode_section_info (decl, DECL_RTL (decl), false);
887 /* Make this function static known to the mudflap runtime. */
888 if (flag_mudflap && TREE_CODE (decl) == VAR_DECL)
889 mudflap_enqueue_decl (decl);
891 return;
894 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
896 reg_number = decode_reg_name (name);
898 if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl))
900 /* First detect errors in declaring global registers. */
901 if (reg_number == -1)
902 error ("%Jregister name not specified for %qD", decl, decl);
903 else if (reg_number < 0)
904 error ("%Jinvalid register name for %qD", decl, decl);
905 else if (TYPE_MODE (TREE_TYPE (decl)) == BLKmode)
906 error ("%Jdata type of %qD isn%'t suitable for a register",
907 decl, decl);
908 else if (! HARD_REGNO_MODE_OK (reg_number, TYPE_MODE (TREE_TYPE (decl))))
909 error ("%Jregister specified for %qD isn%'t suitable for data type",
910 decl, decl);
911 /* Now handle properly declared static register variables. */
912 else
914 int nregs;
916 if (DECL_INITIAL (decl) != 0 && TREE_STATIC (decl))
918 DECL_INITIAL (decl) = 0;
919 error ("global register variable has initial value");
921 if (TREE_THIS_VOLATILE (decl))
922 warning ("volatile register variables don%'t "
923 "work as you might wish");
925 /* If the user specified one of the eliminables registers here,
926 e.g., FRAME_POINTER_REGNUM, we don't want to get this variable
927 confused with that register and be eliminated. This usage is
928 somewhat suspect... */
930 SET_DECL_RTL (decl, gen_rtx_raw_REG (DECL_MODE (decl), reg_number));
931 ORIGINAL_REGNO (DECL_RTL (decl)) = reg_number;
932 REG_USERVAR_P (DECL_RTL (decl)) = 1;
934 if (TREE_STATIC (decl))
936 /* Make this register global, so not usable for anything
937 else. */
938 #ifdef ASM_DECLARE_REGISTER_GLOBAL
939 ASM_DECLARE_REGISTER_GLOBAL (asm_out_file, decl, reg_number, name);
940 #endif
941 nregs = hard_regno_nregs[reg_number][DECL_MODE (decl)];
942 while (nregs > 0)
943 globalize_reg (reg_number + --nregs);
946 /* As a register variable, it has no section. */
947 return;
951 /* Now handle ordinary static variables and functions (in memory).
952 Also handle vars declared register invalidly. */
954 if (name[0] == '*' && (reg_number >= 0 || reg_number == -3))
955 error ("%Jregister name given for non-register variable %qD", decl, decl);
957 /* Specifying a section attribute on a variable forces it into a
958 non-.bss section, and thus it cannot be common. */
959 if (TREE_CODE (decl) == VAR_DECL
960 && DECL_SECTION_NAME (decl) != NULL_TREE
961 && DECL_INITIAL (decl) == NULL_TREE
962 && DECL_COMMON (decl))
963 DECL_COMMON (decl) = 0;
965 /* Variables can't be both common and weak. */
966 if (TREE_CODE (decl) == VAR_DECL && DECL_WEAK (decl))
967 DECL_COMMON (decl) = 0;
969 x = gen_rtx_SYMBOL_REF (Pmode, name);
970 SYMBOL_REF_WEAK (x) = DECL_WEAK (decl);
971 SYMBOL_REF_DECL (x) = decl;
973 x = gen_rtx_MEM (DECL_MODE (decl), x);
974 if (TREE_CODE (decl) != FUNCTION_DECL)
975 set_mem_attributes (x, decl, 1);
976 SET_DECL_RTL (decl, x);
978 /* Optionally set flags or add text to the name to record information
979 such as that it is a function name.
980 If the name is changed, the macro ASM_OUTPUT_LABELREF
981 will have to know how to strip this information. */
982 targetm.encode_section_info (decl, DECL_RTL (decl), true);
984 /* Make this function static known to the mudflap runtime. */
985 if (flag_mudflap && TREE_CODE (decl) == VAR_DECL)
986 mudflap_enqueue_decl (decl);
989 /* Make the rtl for variable VAR be volatile.
990 Use this only for static variables. */
992 void
993 make_var_volatile (tree var)
995 if (!MEM_P (DECL_RTL (var)))
996 abort ();
998 MEM_VOLATILE_P (DECL_RTL (var)) = 1;
1001 /* Output a string of literal assembler code
1002 for an `asm' keyword used between functions. */
1004 void
1005 assemble_asm (tree string)
1007 app_enable ();
1009 if (TREE_CODE (string) == ADDR_EXPR)
1010 string = TREE_OPERAND (string, 0);
1012 fprintf (asm_out_file, "\t%s\n", TREE_STRING_POINTER (string));
1015 /* Record an element in the table of global destructors. SYMBOL is
1016 a SYMBOL_REF of the function to be called; PRIORITY is a number
1017 between 0 and MAX_INIT_PRIORITY. */
1019 void
1020 default_stabs_asm_out_destructor (rtx symbol ATTRIBUTE_UNUSED,
1021 int priority ATTRIBUTE_UNUSED)
1023 #if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO
1024 /* Tell GNU LD that this is part of the static destructor set.
1025 This will work for any system that uses stabs, most usefully
1026 aout systems. */
1027 dbxout_begin_simple_stabs ("___DTOR_LIST__", 22 /* N_SETT */);
1028 dbxout_stab_value_label (XSTR (symbol, 0));
1029 #else
1030 sorry ("global destructors not supported on this target");
1031 #endif
1034 void
1035 default_named_section_asm_out_destructor (rtx symbol, int priority)
1037 const char *section = ".dtors";
1038 char buf[16];
1040 /* ??? This only works reliably with the GNU linker. */
1041 if (priority != DEFAULT_INIT_PRIORITY)
1043 sprintf (buf, ".dtors.%.5u",
1044 /* Invert the numbering so the linker puts us in the proper
1045 order; constructors are run from right to left, and the
1046 linker sorts in increasing order. */
1047 MAX_INIT_PRIORITY - priority);
1048 section = buf;
1051 named_section_flags (section, SECTION_WRITE);
1052 assemble_align (POINTER_SIZE);
1053 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1056 #ifdef DTORS_SECTION_ASM_OP
1057 void
1058 dtors_section (void)
1060 if (in_section != in_dtors)
1062 in_section = in_dtors;
1063 fputs (DTORS_SECTION_ASM_OP, asm_out_file);
1064 fputc ('\n', asm_out_file);
1068 void
1069 default_dtor_section_asm_out_destructor (rtx symbol,
1070 int priority ATTRIBUTE_UNUSED)
1072 dtors_section ();
1073 assemble_align (POINTER_SIZE);
1074 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1076 #endif
1078 /* Likewise for global constructors. */
1080 void
1081 default_stabs_asm_out_constructor (rtx symbol ATTRIBUTE_UNUSED,
1082 int priority ATTRIBUTE_UNUSED)
1084 #if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO
1085 /* Tell GNU LD that this is part of the static destructor set.
1086 This will work for any system that uses stabs, most usefully
1087 aout systems. */
1088 dbxout_begin_simple_stabs ("___CTOR_LIST__", 22 /* N_SETT */);
1089 dbxout_stab_value_label (XSTR (symbol, 0));
1090 #else
1091 sorry ("global constructors not supported on this target");
1092 #endif
1095 void
1096 default_named_section_asm_out_constructor (rtx symbol, int priority)
1098 const char *section = ".ctors";
1099 char buf[16];
1101 /* ??? This only works reliably with the GNU linker. */
1102 if (priority != DEFAULT_INIT_PRIORITY)
1104 sprintf (buf, ".ctors.%.5u",
1105 /* Invert the numbering so the linker puts us in the proper
1106 order; constructors are run from right to left, and the
1107 linker sorts in increasing order. */
1108 MAX_INIT_PRIORITY - priority);
1109 section = buf;
1112 named_section_flags (section, SECTION_WRITE);
1113 assemble_align (POINTER_SIZE);
1114 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1117 #ifdef CTORS_SECTION_ASM_OP
1118 void
1119 ctors_section (void)
1121 if (in_section != in_ctors)
1123 in_section = in_ctors;
1124 fputs (CTORS_SECTION_ASM_OP, asm_out_file);
1125 fputc ('\n', asm_out_file);
1129 void
1130 default_ctor_section_asm_out_constructor (rtx symbol,
1131 int priority ATTRIBUTE_UNUSED)
1133 ctors_section ();
1134 assemble_align (POINTER_SIZE);
1135 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1137 #endif
1139 /* CONSTANT_POOL_BEFORE_FUNCTION may be defined as an expression with
1140 a nonzero value if the constant pool should be output before the
1141 start of the function, or a zero value if the pool should output
1142 after the end of the function. The default is to put it before the
1143 start. */
1145 #ifndef CONSTANT_POOL_BEFORE_FUNCTION
1146 #define CONSTANT_POOL_BEFORE_FUNCTION 1
1147 #endif
1149 /* DECL is an object (either VAR_DECL or FUNCTION_DECL) which is going
1150 to be output to assembler.
1151 Set first_global_object_name and weak_global_object_name as appropriate. */
1153 void
1154 notice_global_symbol (tree decl)
1156 const char **type = &first_global_object_name;
1158 if (first_global_object_name
1159 || !TREE_PUBLIC (decl) || DECL_EXTERNAL (decl)
1160 || !DECL_NAME (decl)
1161 || (TREE_CODE (decl) != FUNCTION_DECL
1162 && (TREE_CODE (decl) != VAR_DECL
1163 || (DECL_COMMON (decl)
1164 && (DECL_INITIAL (decl) == 0
1165 || DECL_INITIAL (decl) == error_mark_node))))
1166 || !MEM_P (DECL_RTL (decl)))
1167 return;
1169 /* We win when global object is found, but it is useful to know about weak
1170 symbol as well so we can produce nicer unique names. */
1171 if (DECL_WEAK (decl) || DECL_ONE_ONLY (decl))
1172 type = &weak_global_object_name;
1174 if (!*type)
1176 const char *p;
1177 char *name;
1178 rtx decl_rtl = DECL_RTL (decl);
1180 p = targetm.strip_name_encoding (XSTR (XEXP (decl_rtl, 0), 0));
1181 name = xstrdup (p);
1183 *type = name;
1187 /* Output assembler code for the constant pool of a function and associated
1188 with defining the name of the function. DECL describes the function.
1189 NAME is the function's name. For the constant pool, we use the current
1190 constant pool data. */
1192 void
1193 assemble_start_function (tree decl, const char *fnname)
1195 int align;
1197 if (unlikely_text_section_name)
1198 free (unlikely_text_section_name);
1200 unlikely_section_label_printed = false;
1201 unlikely_text_section_name = NULL;
1203 unlikely_section_label = reconcat (unlikely_section_label,
1204 fnname, ".unlikely_section", NULL);
1206 /* The following code does not need preprocessing in the assembler. */
1208 app_disable ();
1210 if (CONSTANT_POOL_BEFORE_FUNCTION)
1211 output_constant_pool (fnname, decl);
1213 /* Make sure the cold text (code) section is properly aligned. This
1214 is necessary here in the case where the function has both hot and
1215 cold sections, because we don't want to re-set the alignment when the
1216 section switch happens mid-function. We don't need to set the hot
1217 section alignment here, because code further down in this function
1218 sets the alignment for whichever section comes first, and if there
1219 is a hot section it is guaranteed to be first. */
1221 if (flag_reorder_blocks_and_partition)
1223 unlikely_text_section ();
1224 assemble_align (FUNCTION_BOUNDARY);
1227 resolve_unique_section (decl, 0, flag_function_sections);
1228 function_section (decl);
1230 /* Tell assembler to move to target machine's alignment for functions. */
1231 align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
1232 if (align < force_align_functions_log)
1233 align = force_align_functions_log;
1234 if (align > 0)
1236 ASM_OUTPUT_ALIGN (asm_out_file, align);
1239 /* Handle a user-specified function alignment.
1240 Note that we still need to align to FUNCTION_BOUNDARY, as above,
1241 because ASM_OUTPUT_MAX_SKIP_ALIGN might not do any alignment at all. */
1242 if (align_functions_log > align
1243 && cfun->function_frequency != FUNCTION_FREQUENCY_UNLIKELY_EXECUTED)
1245 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
1246 ASM_OUTPUT_MAX_SKIP_ALIGN (asm_out_file,
1247 align_functions_log, align_functions - 1);
1248 #else
1249 ASM_OUTPUT_ALIGN (asm_out_file, align_functions_log);
1250 #endif
1253 #ifdef ASM_OUTPUT_FUNCTION_PREFIX
1254 ASM_OUTPUT_FUNCTION_PREFIX (asm_out_file, fnname);
1255 #endif
1257 (*debug_hooks->begin_function) (decl);
1259 /* Make function name accessible from other files, if appropriate. */
1261 if (TREE_PUBLIC (decl))
1263 notice_global_symbol (decl);
1265 globalize_decl (decl);
1267 maybe_assemble_visibility (decl);
1270 if (DECL_PRESERVE_P (decl))
1271 targetm.asm_out.mark_decl_preserved (fnname);
1273 /* Do any machine/system dependent processing of the function name. */
1274 #ifdef ASM_DECLARE_FUNCTION_NAME
1275 ASM_DECLARE_FUNCTION_NAME (asm_out_file, fnname, current_function_decl);
1276 #else
1277 /* Standard thing is just output label for the function. */
1278 ASM_OUTPUT_LABEL (asm_out_file, fnname);
1279 #endif /* ASM_DECLARE_FUNCTION_NAME */
1281 if (in_unlikely_text_section ()
1282 && !unlikely_section_label_printed)
1284 ASM_OUTPUT_LABEL (asm_out_file, unlikely_section_label);
1285 unlikely_section_label_printed = true;
1289 /* Output assembler code associated with defining the size of the
1290 function. DECL describes the function. NAME is the function's name. */
1292 void
1293 assemble_end_function (tree decl, const char *fnname)
1295 #ifdef ASM_DECLARE_FUNCTION_SIZE
1296 ASM_DECLARE_FUNCTION_SIZE (asm_out_file, fnname, decl);
1297 #endif
1298 if (! CONSTANT_POOL_BEFORE_FUNCTION)
1300 output_constant_pool (fnname, decl);
1301 function_section (decl); /* need to switch back */
1305 /* Assemble code to leave SIZE bytes of zeros. */
1307 void
1308 assemble_zeros (unsigned HOST_WIDE_INT size)
1310 /* Do no output if -fsyntax-only. */
1311 if (flag_syntax_only)
1312 return;
1314 #ifdef ASM_NO_SKIP_IN_TEXT
1315 /* The `space' pseudo in the text section outputs nop insns rather than 0s,
1316 so we must output 0s explicitly in the text section. */
1317 if ((ASM_NO_SKIP_IN_TEXT && in_text_section ())
1318 || (ASM_NO_SKIP_IN_TEXT && in_unlikely_text_section ()))
1320 unsigned HOST_WIDE_INT i;
1321 for (i = 0; i < size; i++)
1322 assemble_integer (const0_rtx, 1, BITS_PER_UNIT, 1);
1324 else
1325 #endif
1326 if (size > 0)
1327 ASM_OUTPUT_SKIP (asm_out_file, size);
1330 /* Assemble an alignment pseudo op for an ALIGN-bit boundary. */
1332 void
1333 assemble_align (int align)
1335 if (align > BITS_PER_UNIT)
1337 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
1341 /* Assemble a string constant with the specified C string as contents. */
1343 void
1344 assemble_string (const char *p, int size)
1346 int pos = 0;
1347 int maximum = 2000;
1349 /* If the string is very long, split it up. */
1351 while (pos < size)
1353 int thissize = size - pos;
1354 if (thissize > maximum)
1355 thissize = maximum;
1357 ASM_OUTPUT_ASCII (asm_out_file, p, thissize);
1359 pos += thissize;
1360 p += thissize;
1365 #if defined ASM_OUTPUT_ALIGNED_DECL_LOCAL
1366 #define ASM_EMIT_LOCAL(decl, name, size, rounded) \
1367 ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, decl, name, size, DECL_ALIGN (decl))
1368 #else
1369 #if defined ASM_OUTPUT_ALIGNED_LOCAL
1370 #define ASM_EMIT_LOCAL(decl, name, size, rounded) \
1371 ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, DECL_ALIGN (decl))
1372 #else
1373 #define ASM_EMIT_LOCAL(decl, name, size, rounded) \
1374 ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded)
1375 #endif
1376 #endif
1378 #if defined ASM_OUTPUT_ALIGNED_BSS
1379 #define ASM_EMIT_BSS(decl, name, size, rounded) \
1380 ASM_OUTPUT_ALIGNED_BSS (asm_out_file, decl, name, size, DECL_ALIGN (decl))
1381 #else
1382 #if defined ASM_OUTPUT_BSS
1383 #define ASM_EMIT_BSS(decl, name, size, rounded) \
1384 ASM_OUTPUT_BSS (asm_out_file, decl, name, size, rounded)
1385 #else
1386 #undef ASM_EMIT_BSS
1387 #endif
1388 #endif
1390 #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
1391 #define ASM_EMIT_COMMON(decl, name, size, rounded) \
1392 ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, decl, name, size, DECL_ALIGN (decl))
1393 #else
1394 #if defined ASM_OUTPUT_ALIGNED_COMMON
1395 #define ASM_EMIT_COMMON(decl, name, size, rounded) \
1396 ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, name, size, DECL_ALIGN (decl))
1397 #else
1398 #define ASM_EMIT_COMMON(decl, name, size, rounded) \
1399 ASM_OUTPUT_COMMON (asm_out_file, name, size, rounded)
1400 #endif
1401 #endif
1403 static bool
1404 asm_emit_uninitialised (tree decl, const char *name,
1405 unsigned HOST_WIDE_INT size ATTRIBUTE_UNUSED,
1406 unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED)
1408 enum
1410 asm_dest_common,
1411 asm_dest_bss,
1412 asm_dest_local
1414 destination = asm_dest_local;
1416 /* ??? We should handle .bss via select_section mechanisms rather than
1417 via special target hooks. That would eliminate this special case. */
1418 if (TREE_PUBLIC (decl))
1420 if (!DECL_COMMON (decl))
1421 #ifdef ASM_EMIT_BSS
1422 destination = asm_dest_bss;
1423 #else
1424 return false;
1425 #endif
1426 else
1427 destination = asm_dest_common;
1430 if (destination == asm_dest_bss)
1431 globalize_decl (decl);
1432 resolve_unique_section (decl, 0, flag_data_sections);
1434 if (flag_shared_data)
1436 switch (destination)
1438 #ifdef ASM_OUTPUT_SHARED_BSS
1439 case asm_dest_bss:
1440 ASM_OUTPUT_SHARED_BSS (asm_out_file, decl, name, size, rounded);
1441 return;
1442 #endif
1443 #ifdef ASM_OUTPUT_SHARED_COMMON
1444 case asm_dest_common:
1445 ASM_OUTPUT_SHARED_COMMON (asm_out_file, name, size, rounded);
1446 return;
1447 #endif
1448 #ifdef ASM_OUTPUT_SHARED_LOCAL
1449 case asm_dest_local:
1450 ASM_OUTPUT_SHARED_LOCAL (asm_out_file, name, size, rounded);
1451 return;
1452 #endif
1453 default:
1454 break;
1458 switch (destination)
1460 #ifdef ASM_EMIT_BSS
1461 case asm_dest_bss:
1462 ASM_EMIT_BSS (decl, name, size, rounded);
1463 break;
1464 #endif
1465 case asm_dest_common:
1466 ASM_EMIT_COMMON (decl, name, size, rounded);
1467 break;
1468 case asm_dest_local:
1469 ASM_EMIT_LOCAL (decl, name, size, rounded);
1470 break;
1471 default:
1472 abort ();
1475 return true;
1478 /* Assemble everything that is needed for a variable or function declaration.
1479 Not used for automatic variables, and not used for function definitions.
1480 Should not be called for variables of incomplete structure type.
1482 TOP_LEVEL is nonzero if this variable has file scope.
1483 AT_END is nonzero if this is the special handling, at end of compilation,
1484 to define things that have had only tentative definitions.
1485 DONT_OUTPUT_DATA if nonzero means don't actually output the
1486 initial value (that will be done by the caller). */
1488 void
1489 assemble_variable (tree decl, int top_level ATTRIBUTE_UNUSED,
1490 int at_end ATTRIBUTE_UNUSED, int dont_output_data)
1492 const char *name;
1493 unsigned int align;
1494 int reloc = 0;
1495 rtx decl_rtl;
1497 if (lang_hooks.decls.prepare_assemble_variable)
1498 lang_hooks.decls.prepare_assemble_variable (decl);
1500 last_assemble_variable_decl = 0;
1502 /* Normally no need to say anything here for external references,
1503 since assemble_external is called by the language-specific code
1504 when a declaration is first seen. */
1506 if (DECL_EXTERNAL (decl))
1507 return;
1509 /* Output no assembler code for a function declaration.
1510 Only definitions of functions output anything. */
1512 if (TREE_CODE (decl) == FUNCTION_DECL)
1513 return;
1515 /* Do nothing for global register variables. */
1516 if (DECL_RTL_SET_P (decl) && REG_P (DECL_RTL (decl)))
1518 TREE_ASM_WRITTEN (decl) = 1;
1519 return;
1522 /* If type was incomplete when the variable was declared,
1523 see if it is complete now. */
1525 if (DECL_SIZE (decl) == 0)
1526 layout_decl (decl, 0);
1528 /* Still incomplete => don't allocate it; treat the tentative defn
1529 (which is what it must have been) as an `extern' reference. */
1531 if (!dont_output_data && DECL_SIZE (decl) == 0)
1533 error ("%Jstorage size of %qD isn%'t known", decl, decl);
1534 TREE_ASM_WRITTEN (decl) = 1;
1535 return;
1538 /* The first declaration of a variable that comes through this function
1539 decides whether it is global (in C, has external linkage)
1540 or local (in C, has internal linkage). So do nothing more
1541 if this function has already run. */
1543 if (TREE_ASM_WRITTEN (decl))
1544 return;
1546 /* Make sure targetm.encode_section_info is invoked before we set
1547 ASM_WRITTEN. */
1548 decl_rtl = DECL_RTL (decl);
1550 TREE_ASM_WRITTEN (decl) = 1;
1552 /* Do no output if -fsyntax-only. */
1553 if (flag_syntax_only)
1554 return;
1556 app_disable ();
1558 if (! dont_output_data
1559 && ! host_integerp (DECL_SIZE_UNIT (decl), 1))
1561 error ("%Jsize of variable %qD is too large", decl, decl);
1562 return;
1565 name = XSTR (XEXP (decl_rtl, 0), 0);
1566 if (TREE_PUBLIC (decl) && DECL_NAME (decl))
1567 notice_global_symbol (decl);
1569 /* Compute the alignment of this data. */
1571 align = DECL_ALIGN (decl);
1573 /* In the case for initialing an array whose length isn't specified,
1574 where we have not yet been able to do the layout,
1575 figure out the proper alignment now. */
1576 if (dont_output_data && DECL_SIZE (decl) == 0
1577 && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
1578 align = MAX (align, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl))));
1580 /* Some object file formats have a maximum alignment which they support.
1581 In particular, a.out format supports a maximum alignment of 4. */
1582 if (align > MAX_OFILE_ALIGNMENT)
1584 warning ("%Jalignment of %qD is greater than maximum object "
1585 "file alignment. Using %d", decl, decl,
1586 MAX_OFILE_ALIGNMENT/BITS_PER_UNIT);
1587 align = MAX_OFILE_ALIGNMENT;
1590 /* On some machines, it is good to increase alignment sometimes. */
1591 if (! DECL_USER_ALIGN (decl))
1593 #ifdef DATA_ALIGNMENT
1594 align = DATA_ALIGNMENT (TREE_TYPE (decl), align);
1595 #endif
1596 #ifdef CONSTANT_ALIGNMENT
1597 if (DECL_INITIAL (decl) != 0 && DECL_INITIAL (decl) != error_mark_node)
1598 align = CONSTANT_ALIGNMENT (DECL_INITIAL (decl), align);
1599 #endif
1602 /* Reset the alignment in case we have made it tighter, so we can benefit
1603 from it in get_pointer_alignment. */
1604 DECL_ALIGN (decl) = align;
1605 set_mem_align (decl_rtl, align);
1607 if (TREE_PUBLIC (decl))
1608 maybe_assemble_visibility (decl);
1610 if (DECL_PRESERVE_P (decl))
1611 targetm.asm_out.mark_decl_preserved (name);
1613 /* Output any data that we will need to use the address of. */
1614 if (DECL_INITIAL (decl) == error_mark_node)
1615 reloc = contains_pointers_p (TREE_TYPE (decl)) ? 3 : 0;
1616 else if (DECL_INITIAL (decl))
1618 reloc = compute_reloc_for_constant (DECL_INITIAL (decl));
1619 output_addressed_constants (DECL_INITIAL (decl));
1621 resolve_unique_section (decl, reloc, flag_data_sections);
1623 /* Handle uninitialized definitions. */
1625 /* If the decl has been given an explicit section name, then it
1626 isn't common, and shouldn't be handled as such. */
1627 if (DECL_SECTION_NAME (decl) || dont_output_data)
1629 /* We don't implement common thread-local data at present. */
1630 else if (DECL_THREAD_LOCAL (decl))
1632 if (DECL_COMMON (decl))
1633 sorry ("thread-local COMMON data not implemented");
1635 else if (DECL_INITIAL (decl) == 0
1636 || DECL_INITIAL (decl) == error_mark_node
1637 || (flag_zero_initialized_in_bss
1638 /* Leave constant zeroes in .rodata so they can be shared. */
1639 && !TREE_READONLY (decl)
1640 && initializer_zerop (DECL_INITIAL (decl))))
1642 unsigned HOST_WIDE_INT size = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
1643 unsigned HOST_WIDE_INT rounded = size;
1645 /* Don't allocate zero bytes of common,
1646 since that means "undefined external" in the linker. */
1647 if (size == 0)
1648 rounded = 1;
1650 /* Round size up to multiple of BIGGEST_ALIGNMENT bits
1651 so that each uninitialized object starts on such a boundary. */
1652 rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1;
1653 rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
1654 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
1656 #if !defined(ASM_OUTPUT_ALIGNED_COMMON) && !defined(ASM_OUTPUT_ALIGNED_DECL_COMMON) && !defined(ASM_OUTPUT_ALIGNED_BSS)
1657 if ((unsigned HOST_WIDE_INT) DECL_ALIGN_UNIT (decl) > rounded)
1658 warning ("%Jrequested alignment for %qD is greater than "
1659 "implemented alignment of %d", decl, decl, rounded);
1660 #endif
1662 /* If the target cannot output uninitialized but not common global data
1663 in .bss, then we have to use .data, so fall through. */
1664 if (asm_emit_uninitialised (decl, name, size, rounded))
1665 return;
1668 /* Handle initialized definitions.
1669 Also handle uninitialized global definitions if -fno-common and the
1670 target doesn't support ASM_OUTPUT_BSS. */
1672 /* First make the assembler name(s) global if appropriate. */
1673 if (TREE_PUBLIC (decl) && DECL_NAME (decl))
1674 globalize_decl (decl);
1676 /* Switch to the appropriate section. */
1677 variable_section (decl, reloc);
1679 /* dbxout.c needs to know this. */
1680 if (in_text_section () || in_unlikely_text_section ())
1681 DECL_IN_TEXT_SECTION (decl) = 1;
1683 /* Output the alignment of this data. */
1684 if (align > BITS_PER_UNIT)
1685 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (DECL_ALIGN_UNIT (decl)));
1687 /* Do any machine/system dependent processing of the object. */
1688 #ifdef ASM_DECLARE_OBJECT_NAME
1689 last_assemble_variable_decl = decl;
1690 ASM_DECLARE_OBJECT_NAME (asm_out_file, name, decl);
1691 #else
1692 /* Standard thing is just output label for the object. */
1693 ASM_OUTPUT_LABEL (asm_out_file, name);
1694 #endif /* ASM_DECLARE_OBJECT_NAME */
1696 if (!dont_output_data)
1698 if (DECL_INITIAL (decl)
1699 && DECL_INITIAL (decl) != error_mark_node
1700 && !initializer_zerop (DECL_INITIAL (decl)))
1701 /* Output the actual data. */
1702 output_constant (DECL_INITIAL (decl),
1703 tree_low_cst (DECL_SIZE_UNIT (decl), 1),
1704 align);
1705 else
1706 /* Leave space for it. */
1707 assemble_zeros (tree_low_cst (DECL_SIZE_UNIT (decl), 1));
1711 /* Return 1 if type TYPE contains any pointers. */
1713 static int
1714 contains_pointers_p (tree type)
1716 switch (TREE_CODE (type))
1718 case POINTER_TYPE:
1719 case REFERENCE_TYPE:
1720 /* I'm not sure whether OFFSET_TYPE needs this treatment,
1721 so I'll play safe and return 1. */
1722 case OFFSET_TYPE:
1723 return 1;
1725 case RECORD_TYPE:
1726 case UNION_TYPE:
1727 case QUAL_UNION_TYPE:
1729 tree fields;
1730 /* For a type that has fields, see if the fields have pointers. */
1731 for (fields = TYPE_FIELDS (type); fields; fields = TREE_CHAIN (fields))
1732 if (TREE_CODE (fields) == FIELD_DECL
1733 && contains_pointers_p (TREE_TYPE (fields)))
1734 return 1;
1735 return 0;
1738 case ARRAY_TYPE:
1739 /* An array type contains pointers if its element type does. */
1740 return contains_pointers_p (TREE_TYPE (type));
1742 default:
1743 return 0;
1747 #ifdef ASM_OUTPUT_EXTERNAL
1748 /* True if DECL is a function decl for which no out-of-line copy exists.
1749 It is assumed that DECL's assembler name has been set. */
1751 static bool
1752 incorporeal_function_p (tree decl)
1754 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl))
1756 const char *name;
1758 if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
1759 && DECL_FUNCTION_CODE (decl) == BUILT_IN_ALLOCA)
1760 return true;
1762 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
1763 if (strncmp (name, "__builtin_", strlen ("__builtin_")) == 0)
1764 return true;
1766 return false;
1768 #endif
1770 /* Output something to declare an external symbol to the assembler.
1771 (Most assemblers don't need this, so we normally output nothing.)
1772 Do nothing if DECL is not external. */
1774 void
1775 assemble_external (tree decl ATTRIBUTE_UNUSED)
1777 /* Because most platforms do not define ASM_OUTPUT_EXTERNAL, the
1778 main body of this code is only rarely exercised. To provide some
1779 testing, on all platforms, we make sure that the ASM_OUT_FILE is
1780 open. If it's not, we should not be calling this function. */
1781 if (!asm_out_file)
1782 abort ();
1784 #ifdef ASM_OUTPUT_EXTERNAL
1785 if (DECL_P (decl) && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
1787 rtx rtl = DECL_RTL (decl);
1789 if (MEM_P (rtl) && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF
1790 && !SYMBOL_REF_USED (XEXP (rtl, 0))
1791 && !incorporeal_function_p (decl))
1793 /* Some systems do require some output. */
1794 SYMBOL_REF_USED (XEXP (rtl, 0)) = 1;
1795 ASM_OUTPUT_EXTERNAL (asm_out_file, decl, XSTR (XEXP (rtl, 0), 0));
1798 #endif
1801 /* Similar, for calling a library function FUN. */
1803 void
1804 assemble_external_libcall (rtx fun)
1806 /* Declare library function name external when first used, if nec. */
1807 if (! SYMBOL_REF_USED (fun))
1809 SYMBOL_REF_USED (fun) = 1;
1810 targetm.asm_out.external_libcall (fun);
1814 /* Assemble a label named NAME. */
1816 void
1817 assemble_label (const char *name)
1819 ASM_OUTPUT_LABEL (asm_out_file, name);
1822 /* Set the symbol_referenced flag for ID. */
1823 void
1824 mark_referenced (tree id)
1826 TREE_SYMBOL_REFERENCED (id) = 1;
1829 /* Set the symbol_referenced flag for DECL and notify callgraph. */
1830 void
1831 mark_decl_referenced (tree decl)
1833 if (TREE_CODE (decl) == FUNCTION_DECL)
1834 cgraph_mark_needed_node (cgraph_node (decl));
1835 else if (TREE_CODE (decl) == VAR_DECL)
1836 cgraph_varpool_mark_needed_node (cgraph_varpool_node (decl));
1837 /* else do nothing - we can get various sorts of CST nodes here,
1838 which do not need to be marked. */
1841 /* Output to FILE a reference to the assembler name of a C-level name NAME.
1842 If NAME starts with a *, the rest of NAME is output verbatim.
1843 Otherwise NAME is transformed in an implementation-defined way
1844 (usually by the addition of an underscore).
1845 Many macros in the tm file are defined to call this function. */
1847 void
1848 assemble_name (FILE *file, const char *name)
1850 const char *real_name;
1851 tree id;
1853 real_name = targetm.strip_name_encoding (name);
1855 id = maybe_get_identifier (real_name);
1856 if (id)
1857 mark_referenced (id);
1859 if (name[0] == '*')
1860 fputs (&name[1], file);
1861 else
1862 ASM_OUTPUT_LABELREF (file, name);
1865 /* Allocate SIZE bytes writable static space with a gensym name
1866 and return an RTX to refer to its address. */
1869 assemble_static_space (unsigned HOST_WIDE_INT size)
1871 char name[12];
1872 const char *namestring;
1873 rtx x;
1875 #if 0
1876 if (flag_shared_data)
1877 data_section ();
1878 #endif
1880 ASM_GENERATE_INTERNAL_LABEL (name, "LF", const_labelno);
1881 ++const_labelno;
1882 namestring = ggc_strdup (name);
1884 x = gen_rtx_SYMBOL_REF (Pmode, namestring);
1885 SYMBOL_REF_FLAGS (x) = SYMBOL_FLAG_LOCAL;
1887 #ifdef ASM_OUTPUT_ALIGNED_DECL_LOCAL
1888 ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, NULL_TREE, name, size,
1889 BIGGEST_ALIGNMENT);
1890 #else
1891 #ifdef ASM_OUTPUT_ALIGNED_LOCAL
1892 ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, BIGGEST_ALIGNMENT);
1893 #else
1895 /* Round size up to multiple of BIGGEST_ALIGNMENT bits
1896 so that each uninitialized object starts on such a boundary. */
1897 /* Variable `rounded' might or might not be used in ASM_OUTPUT_LOCAL. */
1898 unsigned HOST_WIDE_INT rounded ATTRIBUTE_UNUSED
1899 = ((size + (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1)
1900 / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
1901 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
1902 ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
1904 #endif
1905 #endif
1906 return x;
1909 /* Assemble the static constant template for function entry trampolines.
1910 This is done at most once per compilation.
1911 Returns an RTX for the address of the template. */
1913 static GTY(()) rtx initial_trampoline;
1915 #ifdef TRAMPOLINE_TEMPLATE
1917 assemble_trampoline_template (void)
1919 char label[256];
1920 const char *name;
1921 int align;
1922 rtx symbol;
1924 if (initial_trampoline)
1925 return initial_trampoline;
1927 /* By default, put trampoline templates in read-only data section. */
1929 #ifdef TRAMPOLINE_SECTION
1930 TRAMPOLINE_SECTION ();
1931 #else
1932 readonly_data_section ();
1933 #endif
1935 /* Write the assembler code to define one. */
1936 align = floor_log2 (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT);
1937 if (align > 0)
1939 ASM_OUTPUT_ALIGN (asm_out_file, align);
1942 targetm.asm_out.internal_label (asm_out_file, "LTRAMP", 0);
1943 TRAMPOLINE_TEMPLATE (asm_out_file);
1945 /* Record the rtl to refer to it. */
1946 ASM_GENERATE_INTERNAL_LABEL (label, "LTRAMP", 0);
1947 name = ggc_strdup (label);
1948 symbol = gen_rtx_SYMBOL_REF (Pmode, name);
1949 SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
1951 initial_trampoline = gen_rtx_MEM (BLKmode, symbol);
1952 set_mem_align (initial_trampoline, TRAMPOLINE_ALIGNMENT);
1954 return initial_trampoline;
1956 #endif
1958 /* A and B are either alignments or offsets. Return the minimum alignment
1959 that may be assumed after adding the two together. */
1961 static inline unsigned
1962 min_align (unsigned int a, unsigned int b)
1964 return (a | b) & -(a | b);
1967 /* Return the assembler directive for creating a given kind of integer
1968 object. SIZE is the number of bytes in the object and ALIGNED_P
1969 indicates whether it is known to be aligned. Return NULL if the
1970 assembly dialect has no such directive.
1972 The returned string should be printed at the start of a new line and
1973 be followed immediately by the object's initial value. */
1975 const char *
1976 integer_asm_op (int size, int aligned_p)
1978 struct asm_int_op *ops;
1980 if (aligned_p)
1981 ops = &targetm.asm_out.aligned_op;
1982 else
1983 ops = &targetm.asm_out.unaligned_op;
1985 switch (size)
1987 case 1:
1988 return targetm.asm_out.byte_op;
1989 case 2:
1990 return ops->hi;
1991 case 4:
1992 return ops->si;
1993 case 8:
1994 return ops->di;
1995 case 16:
1996 return ops->ti;
1997 default:
1998 return NULL;
2002 /* Use directive OP to assemble an integer object X. Print OP at the
2003 start of the line, followed immediately by the value of X. */
2005 void
2006 assemble_integer_with_op (const char *op, rtx x)
2008 fputs (op, asm_out_file);
2009 output_addr_const (asm_out_file, x);
2010 fputc ('\n', asm_out_file);
2013 /* The default implementation of the asm_out.integer target hook. */
2015 bool
2016 default_assemble_integer (rtx x ATTRIBUTE_UNUSED,
2017 unsigned int size ATTRIBUTE_UNUSED,
2018 int aligned_p ATTRIBUTE_UNUSED)
2020 const char *op = integer_asm_op (size, aligned_p);
2021 /* Avoid GAS bugs for values > word size. */
2022 if (size > UNITS_PER_WORD)
2023 return false;
2024 return op && (assemble_integer_with_op (op, x), true);
2027 /* Assemble the integer constant X into an object of SIZE bytes. ALIGN is
2028 the alignment of the integer in bits. Return 1 if we were able to output
2029 the constant, otherwise 0. If FORCE is nonzero, abort if we can't output
2030 the constant. */
2032 bool
2033 assemble_integer (rtx x, unsigned int size, unsigned int align, int force)
2035 int aligned_p;
2037 aligned_p = (align >= MIN (size * BITS_PER_UNIT, BIGGEST_ALIGNMENT));
2039 /* See if the target hook can handle this kind of object. */
2040 if (targetm.asm_out.integer (x, size, aligned_p))
2041 return true;
2043 /* If the object is a multi-byte one, try splitting it up. Split
2044 it into words it if is multi-word, otherwise split it into bytes. */
2045 if (size > 1)
2047 enum machine_mode omode, imode;
2048 unsigned int subalign;
2049 unsigned int subsize, i;
2051 subsize = size > UNITS_PER_WORD? UNITS_PER_WORD : 1;
2052 subalign = MIN (align, subsize * BITS_PER_UNIT);
2053 omode = mode_for_size (subsize * BITS_PER_UNIT, MODE_INT, 0);
2054 imode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
2056 for (i = 0; i < size; i += subsize)
2058 rtx partial = simplify_subreg (omode, x, imode, i);
2059 if (!partial || !assemble_integer (partial, subsize, subalign, 0))
2060 break;
2062 if (i == size)
2063 return true;
2065 /* If we've printed some of it, but not all of it, there's no going
2066 back now. */
2067 if (i > 0)
2068 abort ();
2071 if (force)
2072 abort ();
2074 return false;
2077 void
2078 assemble_real (REAL_VALUE_TYPE d, enum machine_mode mode, unsigned int align)
2080 long data[4];
2081 int i;
2082 int bitsize, nelts, nunits, units_per;
2084 /* This is hairy. We have a quantity of known size. real_to_target
2085 will put it into an array of *host* longs, 32 bits per element
2086 (even if long is more than 32 bits). We need to determine the
2087 number of array elements that are occupied (nelts) and the number
2088 of *target* min-addressable units that will be occupied in the
2089 object file (nunits). We cannot assume that 32 divides the
2090 mode's bitsize (size * BITS_PER_UNIT) evenly.
2092 size * BITS_PER_UNIT is used here to make sure that padding bits
2093 (which might appear at either end of the value; real_to_target
2094 will include the padding bits in its output array) are included. */
2096 nunits = GET_MODE_SIZE (mode);
2097 bitsize = nunits * BITS_PER_UNIT;
2098 nelts = CEIL (bitsize, 32);
2099 units_per = 32 / BITS_PER_UNIT;
2101 real_to_target (data, &d, mode);
2103 /* Put out the first word with the specified alignment. */
2104 assemble_integer (GEN_INT (data[0]), MIN (nunits, units_per), align, 1);
2105 nunits -= units_per;
2107 /* Subsequent words need only 32-bit alignment. */
2108 align = min_align (align, 32);
2110 for (i = 1; i < nelts; i++)
2112 assemble_integer (GEN_INT (data[i]), MIN (nunits, units_per), align, 1);
2113 nunits -= units_per;
2117 /* Given an expression EXP with a constant value,
2118 reduce it to the sum of an assembler symbol and an integer.
2119 Store them both in the structure *VALUE.
2120 Abort if EXP does not reduce. */
2122 struct addr_const GTY(())
2124 rtx base;
2125 HOST_WIDE_INT offset;
2128 static void
2129 decode_addr_const (tree exp, struct addr_const *value)
2131 tree target = TREE_OPERAND (exp, 0);
2132 int offset = 0;
2133 rtx x;
2135 while (1)
2137 if (TREE_CODE (target) == COMPONENT_REF
2138 && host_integerp (byte_position (TREE_OPERAND (target, 1)), 0))
2141 offset += int_byte_position (TREE_OPERAND (target, 1));
2142 target = TREE_OPERAND (target, 0);
2144 else if (TREE_CODE (target) == ARRAY_REF
2145 || TREE_CODE (target) == ARRAY_RANGE_REF)
2147 offset += (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (target)), 1)
2148 * tree_low_cst (TREE_OPERAND (target, 1), 0));
2149 target = TREE_OPERAND (target, 0);
2151 else
2152 break;
2155 switch (TREE_CODE (target))
2157 case VAR_DECL:
2158 case FUNCTION_DECL:
2159 x = DECL_RTL (target);
2160 break;
2162 case LABEL_DECL:
2163 x = gen_rtx_MEM (FUNCTION_MODE,
2164 gen_rtx_LABEL_REF (VOIDmode, force_label_rtx (target)));
2165 break;
2167 case REAL_CST:
2168 case STRING_CST:
2169 case COMPLEX_CST:
2170 case CONSTRUCTOR:
2171 case INTEGER_CST:
2172 x = output_constant_def (target, 1);
2173 break;
2175 default:
2176 abort ();
2179 if (!MEM_P (x))
2180 abort ();
2181 x = XEXP (x, 0);
2183 value->base = x;
2184 value->offset = offset;
2187 /* Uniquize all constants that appear in memory.
2188 Each constant in memory thus far output is recorded
2189 in `const_desc_table'. */
2191 struct constant_descriptor_tree GTY(())
2193 /* A MEM for the constant. */
2194 rtx rtl;
2196 /* The value of the constant. */
2197 tree value;
2200 static GTY((param_is (struct constant_descriptor_tree)))
2201 htab_t const_desc_htab;
2203 static struct constant_descriptor_tree * build_constant_desc (tree);
2204 static void maybe_output_constant_def_contents (struct constant_descriptor_tree *, int);
2206 /* Compute a hash code for a constant expression. */
2208 static hashval_t
2209 const_desc_hash (const void *ptr)
2211 return const_hash_1 (((struct constant_descriptor_tree *)ptr)->value);
2214 static hashval_t
2215 const_hash_1 (const tree exp)
2217 const char *p;
2218 hashval_t hi;
2219 int len, i;
2220 enum tree_code code = TREE_CODE (exp);
2222 /* Either set P and LEN to the address and len of something to hash and
2223 exit the switch or return a value. */
2225 switch (code)
2227 case INTEGER_CST:
2228 p = (char *) &TREE_INT_CST (exp);
2229 len = sizeof TREE_INT_CST (exp);
2230 break;
2232 case REAL_CST:
2233 return real_hash (TREE_REAL_CST_PTR (exp));
2235 case STRING_CST:
2236 p = TREE_STRING_POINTER (exp);
2237 len = TREE_STRING_LENGTH (exp);
2238 break;
2240 case COMPLEX_CST:
2241 return (const_hash_1 (TREE_REALPART (exp)) * 5
2242 + const_hash_1 (TREE_IMAGPART (exp)));
2244 case CONSTRUCTOR:
2245 if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
2247 char *tmp;
2249 len = int_size_in_bytes (TREE_TYPE (exp));
2250 tmp = alloca (len);
2251 get_set_constructor_bytes (exp, (unsigned char *) tmp, len);
2252 p = tmp;
2253 break;
2255 else
2257 tree link;
2259 hi = 5 + int_size_in_bytes (TREE_TYPE (exp));
2261 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2262 if (TREE_VALUE (link))
2263 hi = hi * 603 + const_hash_1 (TREE_VALUE (link));
2265 return hi;
2268 case ADDR_EXPR:
2269 case FDESC_EXPR:
2271 struct addr_const value;
2273 decode_addr_const (exp, &value);
2274 if (GET_CODE (value.base) == SYMBOL_REF)
2276 /* Don't hash the address of the SYMBOL_REF;
2277 only use the offset and the symbol name. */
2278 hi = value.offset;
2279 p = XSTR (value.base, 0);
2280 for (i = 0; p[i] != 0; i++)
2281 hi = ((hi * 613) + (unsigned) (p[i]));
2283 else if (GET_CODE (value.base) == LABEL_REF)
2284 hi = value.offset + CODE_LABEL_NUMBER (XEXP (value.base, 0)) * 13;
2285 else
2286 abort ();
2288 return hi;
2290 case PLUS_EXPR:
2291 case MINUS_EXPR:
2292 return (const_hash_1 (TREE_OPERAND (exp, 0)) * 9
2293 + const_hash_1 (TREE_OPERAND (exp, 1)));
2295 case NOP_EXPR:
2296 case CONVERT_EXPR:
2297 case NON_LVALUE_EXPR:
2298 return const_hash_1 (TREE_OPERAND (exp, 0)) * 7 + 2;
2300 default:
2301 /* A language specific constant. Just hash the code. */
2302 return code;
2305 /* Compute hashing function. */
2306 hi = len;
2307 for (i = 0; i < len; i++)
2308 hi = ((hi * 613) + (unsigned) (p[i]));
2310 return hi;
2313 /* Wrapper of compare_constant, for the htab interface. */
2314 static int
2315 const_desc_eq (const void *p1, const void *p2)
2317 return compare_constant (((struct constant_descriptor_tree *)p1)->value,
2318 ((struct constant_descriptor_tree *)p2)->value);
2321 /* Compare t1 and t2, and return 1 only if they are known to result in
2322 the same bit pattern on output. */
2324 static int
2325 compare_constant (const tree t1, const tree t2)
2327 enum tree_code typecode;
2329 if (t1 == NULL_TREE)
2330 return t2 == NULL_TREE;
2331 if (t2 == NULL_TREE)
2332 return 0;
2334 if (TREE_CODE (t1) != TREE_CODE (t2))
2335 return 0;
2337 switch (TREE_CODE (t1))
2339 case INTEGER_CST:
2340 /* Integer constants are the same only if the same width of type. */
2341 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2342 return 0;
2343 return tree_int_cst_equal (t1, t2);
2345 case REAL_CST:
2346 /* Real constants are the same only if the same width of type. */
2347 if (TYPE_PRECISION (TREE_TYPE (t1)) != TYPE_PRECISION (TREE_TYPE (t2)))
2348 return 0;
2350 return REAL_VALUES_IDENTICAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2));
2352 case STRING_CST:
2353 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
2354 return 0;
2356 return (TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
2357 && ! memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
2358 TREE_STRING_LENGTH (t1)));
2360 case COMPLEX_CST:
2361 return (compare_constant (TREE_REALPART (t1), TREE_REALPART (t2))
2362 && compare_constant (TREE_IMAGPART (t1), TREE_IMAGPART (t2)));
2364 case CONSTRUCTOR:
2365 typecode = TREE_CODE (TREE_TYPE (t1));
2366 if (typecode != TREE_CODE (TREE_TYPE (t2)))
2367 return 0;
2369 if (typecode == SET_TYPE)
2371 int len = int_size_in_bytes (TREE_TYPE (t2));
2372 unsigned char *tmp1, *tmp2;
2374 if (int_size_in_bytes (TREE_TYPE (t1)) != len)
2375 return 0;
2377 tmp1 = alloca (len);
2378 tmp2 = alloca (len);
2380 if (get_set_constructor_bytes (t1, tmp1, len) != NULL_TREE)
2381 return 0;
2382 if (get_set_constructor_bytes (t2, tmp2, len) != NULL_TREE)
2383 return 0;
2385 return memcmp (tmp1, tmp2, len) == 0;
2387 else
2389 tree l1, l2;
2391 if (typecode == ARRAY_TYPE)
2393 HOST_WIDE_INT size_1 = int_size_in_bytes (TREE_TYPE (t1));
2394 /* For arrays, check that the sizes all match. */
2395 if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2))
2396 || size_1 == -1
2397 || size_1 != int_size_in_bytes (TREE_TYPE (t2)))
2398 return 0;
2400 else
2402 /* For record and union constructors, require exact type
2403 equality. */
2404 if (TREE_TYPE (t1) != TREE_TYPE (t2))
2405 return 0;
2408 for (l1 = CONSTRUCTOR_ELTS (t1), l2 = CONSTRUCTOR_ELTS (t2);
2409 l1 && l2;
2410 l1 = TREE_CHAIN (l1), l2 = TREE_CHAIN (l2))
2412 /* Check that each value is the same... */
2413 if (! compare_constant (TREE_VALUE (l1), TREE_VALUE (l2)))
2414 return 0;
2415 /* ... and that they apply to the same fields! */
2416 if (typecode == ARRAY_TYPE)
2418 if (! compare_constant (TREE_PURPOSE (l1),
2419 TREE_PURPOSE (l2)))
2420 return 0;
2422 else
2424 if (TREE_PURPOSE (l1) != TREE_PURPOSE (l2))
2425 return 0;
2429 return l1 == NULL_TREE && l2 == NULL_TREE;
2432 case ADDR_EXPR:
2433 case FDESC_EXPR:
2435 struct addr_const value1, value2;
2437 decode_addr_const (t1, &value1);
2438 decode_addr_const (t2, &value2);
2439 return (value1.offset == value2.offset
2440 && strcmp (XSTR (value1.base, 0), XSTR (value2.base, 0)) == 0);
2443 case PLUS_EXPR:
2444 case MINUS_EXPR:
2445 case RANGE_EXPR:
2446 return (compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0))
2447 && compare_constant(TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1)));
2449 case NOP_EXPR:
2450 case CONVERT_EXPR:
2451 case NON_LVALUE_EXPR:
2452 case VIEW_CONVERT_EXPR:
2453 return compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2455 default:
2457 tree nt1, nt2;
2458 nt1 = lang_hooks.expand_constant (t1);
2459 nt2 = lang_hooks.expand_constant (t2);
2460 if (nt1 != t1 || nt2 != t2)
2461 return compare_constant (nt1, nt2);
2462 else
2463 return 0;
2467 /* Should not get here. */
2468 abort ();
2471 /* Make a copy of the whole tree structure for a constant. This
2472 handles the same types of nodes that compare_constant handles. */
2474 static tree
2475 copy_constant (tree exp)
2477 switch (TREE_CODE (exp))
2479 case ADDR_EXPR:
2480 /* For ADDR_EXPR, we do not want to copy the decl whose address
2481 is requested. We do want to copy constants though. */
2482 if (CONSTANT_CLASS_P (TREE_OPERAND (exp, 0)))
2483 return build1 (TREE_CODE (exp), TREE_TYPE (exp),
2484 copy_constant (TREE_OPERAND (exp, 0)));
2485 else
2486 return copy_node (exp);
2488 case INTEGER_CST:
2489 case REAL_CST:
2490 case STRING_CST:
2491 return copy_node (exp);
2493 case COMPLEX_CST:
2494 return build_complex (TREE_TYPE (exp),
2495 copy_constant (TREE_REALPART (exp)),
2496 copy_constant (TREE_IMAGPART (exp)));
2498 case PLUS_EXPR:
2499 case MINUS_EXPR:
2500 return build2 (TREE_CODE (exp), TREE_TYPE (exp),
2501 copy_constant (TREE_OPERAND (exp, 0)),
2502 copy_constant (TREE_OPERAND (exp, 1)));
2504 case NOP_EXPR:
2505 case CONVERT_EXPR:
2506 case NON_LVALUE_EXPR:
2507 case VIEW_CONVERT_EXPR:
2508 return build1 (TREE_CODE (exp), TREE_TYPE (exp),
2509 copy_constant (TREE_OPERAND (exp, 0)));
2511 case CONSTRUCTOR:
2513 tree copy = copy_node (exp);
2514 tree list = copy_list (CONSTRUCTOR_ELTS (exp));
2515 tree tail;
2517 CONSTRUCTOR_ELTS (copy) = list;
2518 for (tail = list; tail; tail = TREE_CHAIN (tail))
2519 TREE_VALUE (tail) = copy_constant (TREE_VALUE (tail));
2520 if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
2521 for (tail = list; tail; tail = TREE_CHAIN (tail))
2522 TREE_PURPOSE (tail) = copy_constant (TREE_PURPOSE (tail));
2524 return copy;
2527 default:
2529 tree t;
2530 t = lang_hooks.expand_constant (exp);
2531 if (t != exp)
2532 return copy_constant (t);
2533 else
2534 abort ();
2539 /* Subroutine of output_constant_def:
2540 No constant equal to EXP is known to have been output.
2541 Make a constant descriptor to enter EXP in the hash table.
2542 Assign the label number and construct RTL to refer to the
2543 constant's location in memory.
2544 Caller is responsible for updating the hash table. */
2546 static struct constant_descriptor_tree *
2547 build_constant_desc (tree exp)
2549 rtx symbol;
2550 rtx rtl;
2551 char label[256];
2552 int labelno;
2553 struct constant_descriptor_tree *desc;
2555 desc = ggc_alloc (sizeof (*desc));
2556 desc->value = copy_constant (exp);
2558 /* Propagate marked-ness to copied constant. */
2559 if (flag_mudflap && mf_marked_p (exp))
2560 mf_mark (desc->value);
2562 /* Create a string containing the label name, in LABEL. */
2563 labelno = const_labelno++;
2564 ASM_GENERATE_INTERNAL_LABEL (label, "LC", labelno);
2566 /* We have a symbol name; construct the SYMBOL_REF and the MEM. */
2567 symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
2568 SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
2569 SYMBOL_REF_DECL (symbol) = desc->value;
2570 TREE_CONSTANT_POOL_ADDRESS_P (symbol) = 1;
2572 rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp)), symbol);
2573 set_mem_attributes (rtl, exp, 1);
2574 set_mem_alias_set (rtl, 0);
2575 set_mem_alias_set (rtl, const_alias_set);
2577 /* Set flags or add text to the name to record information, such as
2578 that it is a local symbol. If the name is changed, the macro
2579 ASM_OUTPUT_LABELREF will have to know how to strip this
2580 information. This call might invalidate our local variable
2581 SYMBOL; we can't use it afterward. */
2583 targetm.encode_section_info (exp, rtl, true);
2585 desc->rtl = rtl;
2587 return desc;
2590 /* Return an rtx representing a reference to constant data in memory
2591 for the constant expression EXP.
2593 If assembler code for such a constant has already been output,
2594 return an rtx to refer to it.
2595 Otherwise, output such a constant in memory
2596 and generate an rtx for it.
2598 If DEFER is nonzero, this constant can be deferred and output only
2599 if referenced in the function after all optimizations.
2601 `const_desc_table' records which constants already have label strings. */
2604 output_constant_def (tree exp, int defer)
2606 struct constant_descriptor_tree *desc;
2607 struct constant_descriptor_tree key;
2608 void **loc;
2610 /* Look up EXP in the table of constant descriptors. If we didn't find
2611 it, create a new one. */
2612 key.value = exp;
2613 loc = htab_find_slot (const_desc_htab, &key, INSERT);
2615 desc = *loc;
2616 if (desc == 0)
2618 desc = build_constant_desc (exp);
2619 *loc = desc;
2622 maybe_output_constant_def_contents (desc, defer);
2623 return desc->rtl;
2626 /* Subroutine of output_constant_def: Decide whether or not we need to
2627 output the constant DESC now, and if so, do it. */
2628 static void
2629 maybe_output_constant_def_contents (struct constant_descriptor_tree *desc,
2630 int defer)
2632 rtx symbol = XEXP (desc->rtl, 0);
2633 tree exp = desc->value;
2635 if (flag_syntax_only)
2636 return;
2638 if (TREE_ASM_WRITTEN (exp))
2639 /* Already output; don't do it again. */
2640 return;
2642 /* We can always defer constants as long as the context allows
2643 doing so. */
2644 if (defer)
2646 /* Increment n_deferred_constants if it exists. It needs to be at
2647 least as large as the number of constants actually referred to
2648 by the function. If it's too small we'll stop looking too early
2649 and fail to emit constants; if it's too large we'll only look
2650 through the entire function when we could have stopped earlier. */
2651 if (cfun)
2652 n_deferred_constants++;
2653 return;
2656 output_constant_def_contents (symbol);
2659 /* We must output the constant data referred to by SYMBOL; do so. */
2661 static void
2662 output_constant_def_contents (rtx symbol)
2664 tree exp = SYMBOL_REF_DECL (symbol);
2665 const char *label = XSTR (symbol, 0);
2666 HOST_WIDE_INT size;
2668 /* Make sure any other constants whose addresses appear in EXP
2669 are assigned label numbers. */
2670 int reloc = compute_reloc_for_constant (exp);
2672 /* Align the location counter as required by EXP's data type. */
2673 unsigned int align = TYPE_ALIGN (TREE_TYPE (exp));
2674 #ifdef CONSTANT_ALIGNMENT
2675 align = CONSTANT_ALIGNMENT (exp, align);
2676 #endif
2678 output_addressed_constants (exp);
2680 /* We are no longer deferring this constant. */
2681 TREE_ASM_WRITTEN (exp) = 1;
2683 if (IN_NAMED_SECTION (exp))
2684 named_section (exp, NULL, reloc);
2685 else
2686 targetm.asm_out.select_section (exp, reloc, align);
2688 if (align > BITS_PER_UNIT)
2690 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
2693 size = int_size_in_bytes (TREE_TYPE (exp));
2694 if (TREE_CODE (exp) == STRING_CST)
2695 size = MAX (TREE_STRING_LENGTH (exp), size);
2697 /* Do any machine/system dependent processing of the constant. */
2698 #ifdef ASM_DECLARE_CONSTANT_NAME
2699 ASM_DECLARE_CONSTANT_NAME (asm_out_file, label, exp, size);
2700 #else
2701 /* Standard thing is just output label for the constant. */
2702 ASM_OUTPUT_LABEL (asm_out_file, label);
2703 #endif /* ASM_DECLARE_CONSTANT_NAME */
2705 /* Output the value of EXP. */
2706 output_constant (exp, size, align);
2707 if (flag_mudflap)
2708 mudflap_enqueue_constant (exp);
2711 /* Look up EXP in the table of constant descriptors. Return the rtl
2712 if it has been emitted, else null. */
2715 lookup_constant_def (tree exp)
2717 struct constant_descriptor_tree *desc;
2718 struct constant_descriptor_tree key;
2720 key.value = exp;
2721 desc = htab_find (const_desc_htab, &key);
2723 return (desc ? desc->rtl : NULL_RTX);
2726 /* Used in the hash tables to avoid outputting the same constant
2727 twice. Unlike 'struct constant_descriptor_tree', RTX constants
2728 are output once per function, not once per file. */
2729 /* ??? Only a few targets need per-function constant pools. Most
2730 can use one per-file pool. Should add a targetm bit to tell the
2731 difference. */
2733 struct rtx_constant_pool GTY(())
2735 /* Pointers to first and last constant in pool, as ordered by offset. */
2736 struct constant_descriptor_rtx *first;
2737 struct constant_descriptor_rtx *last;
2739 /* Hash facility for making memory-constants from constant rtl-expressions.
2740 It is used on RISC machines where immediate integer arguments and
2741 constant addresses are restricted so that such constants must be stored
2742 in memory. */
2743 htab_t GTY((param_is (struct constant_descriptor_rtx))) const_rtx_htab;
2744 htab_t GTY((param_is (struct constant_descriptor_rtx))) const_rtx_sym_htab;
2746 /* Current offset in constant pool (does not include any
2747 machine-specific header). */
2748 HOST_WIDE_INT offset;
2751 struct constant_descriptor_rtx GTY((chain_next ("%h.next")))
2753 struct constant_descriptor_rtx *next;
2754 rtx mem;
2755 rtx sym;
2756 rtx constant;
2757 HOST_WIDE_INT offset;
2758 hashval_t hash;
2759 enum machine_mode mode;
2760 unsigned int align;
2761 int labelno;
2762 int mark;
2765 /* Hash and compare functions for const_rtx_htab. */
2767 static hashval_t
2768 const_desc_rtx_hash (const void *ptr)
2770 const struct constant_descriptor_rtx *desc = ptr;
2771 return desc->hash;
2774 static int
2775 const_desc_rtx_eq (const void *a, const void *b)
2777 const struct constant_descriptor_rtx *x = a;
2778 const struct constant_descriptor_rtx *y = b;
2780 if (x->mode != y->mode)
2781 return 0;
2782 return rtx_equal_p (x->constant, y->constant);
2785 /* Hash and compare functions for const_rtx_sym_htab. */
2787 static hashval_t
2788 const_desc_rtx_sym_hash (const void *ptr)
2790 const struct constant_descriptor_rtx *desc = ptr;
2791 return htab_hash_string (XSTR (desc->sym, 0));
2794 static int
2795 const_desc_rtx_sym_eq (const void *a, const void *b)
2797 const struct constant_descriptor_rtx *x = a;
2798 const struct constant_descriptor_rtx *y = b;
2799 return XSTR (x->sym, 0) == XSTR (y->sym, 0);
2802 /* This is the worker function for const_rtx_hash, called via for_each_rtx. */
2804 static int
2805 const_rtx_hash_1 (rtx *xp, void *data)
2807 unsigned HOST_WIDE_INT hwi;
2808 enum machine_mode mode;
2809 enum rtx_code code;
2810 hashval_t h, *hp;
2811 rtx x;
2813 x = *xp;
2814 code = GET_CODE (x);
2815 mode = GET_MODE (x);
2816 h = (hashval_t) code * 1048573 + mode;
2818 switch (code)
2820 case CONST_INT:
2821 hwi = INTVAL (x);
2822 fold_hwi:
2824 const int shift = sizeof (hashval_t) * CHAR_BIT;
2825 const int n = sizeof (HOST_WIDE_INT) / sizeof (hashval_t);
2826 int i;
2828 h ^= (hashval_t) hwi;
2829 for (i = 1; i < n; ++i)
2831 hwi >>= shift;
2832 h ^= (hashval_t) hwi;
2835 break;
2837 case CONST_DOUBLE:
2838 if (mode == VOIDmode)
2840 hwi = CONST_DOUBLE_LOW (x) ^ CONST_DOUBLE_HIGH (x);
2841 goto fold_hwi;
2843 else
2844 h ^= real_hash (CONST_DOUBLE_REAL_VALUE (x));
2845 break;
2847 case SYMBOL_REF:
2848 h ^= htab_hash_string (XSTR (x, 0));
2849 break;
2851 case LABEL_REF:
2852 h = h * 251 + CODE_LABEL_NUMBER (XEXP (x, 0));
2853 break;
2855 case UNSPEC:
2856 case UNSPEC_VOLATILE:
2857 h = h * 251 + XINT (x, 1);
2858 break;
2860 default:
2861 break;
2864 hp = data;
2865 *hp = *hp * 509 + h;
2866 return 0;
2869 /* Compute a hash value for X, which should be a constant. */
2871 static hashval_t
2872 const_rtx_hash (rtx x)
2874 hashval_t h = 0;
2875 for_each_rtx (&x, const_rtx_hash_1, &h);
2876 return h;
2880 /* Initialize constant pool hashing for a new function. */
2882 void
2883 init_varasm_status (struct function *f)
2885 struct varasm_status *p;
2886 struct rtx_constant_pool *pool;
2888 p = ggc_alloc (sizeof (struct varasm_status));
2889 f->varasm = p;
2891 pool = ggc_alloc (sizeof (struct rtx_constant_pool));
2892 p->pool = pool;
2893 p->deferred_constants = 0;
2895 pool->const_rtx_htab = htab_create_ggc (31, const_desc_rtx_hash,
2896 const_desc_rtx_eq, NULL);
2897 pool->const_rtx_sym_htab = htab_create_ggc (31, const_desc_rtx_sym_hash,
2898 const_desc_rtx_sym_eq, NULL);
2899 pool->first = pool->last = NULL;
2900 pool->offset = 0;
2903 /* Given a MINUS expression, simplify it if both sides
2904 include the same symbol. */
2907 simplify_subtraction (rtx x)
2909 rtx r = simplify_rtx (x);
2910 return r ? r : x;
2913 /* Given a constant rtx X, make (or find) a memory constant for its value
2914 and return a MEM rtx to refer to it in memory. */
2917 force_const_mem (enum machine_mode mode, rtx x)
2919 struct constant_descriptor_rtx *desc, tmp;
2920 struct rtx_constant_pool *pool = cfun->varasm->pool;
2921 char label[256];
2922 rtx def, symbol;
2923 hashval_t hash;
2924 unsigned int align;
2925 void **slot;
2927 /* If we're not allowed to drop X into the constant pool, don't. */
2928 if (targetm.cannot_force_const_mem (x))
2929 return NULL_RTX;
2931 /* Lookup the value in the hashtable. */
2932 tmp.constant = x;
2933 tmp.mode = mode;
2934 hash = const_rtx_hash (x);
2935 slot = htab_find_slot_with_hash (pool->const_rtx_htab, &tmp, hash, INSERT);
2936 desc = *slot;
2938 /* If the constant was already present, return its memory. */
2939 if (desc)
2940 return copy_rtx (desc->mem);
2942 /* Otherwise, create a new descriptor. */
2943 desc = ggc_alloc (sizeof (*desc));
2944 *slot = desc;
2946 /* Align the location counter as required by EXP's data type. */
2947 align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);
2948 #ifdef CONSTANT_ALIGNMENT
2950 tree type = lang_hooks.types.type_for_mode (mode, 0);
2951 if (type != NULL_TREE)
2952 align = CONSTANT_ALIGNMENT (make_tree (type, x), align);
2954 #endif
2956 pool->offset += (align / BITS_PER_UNIT) - 1;
2957 pool->offset &= ~ ((align / BITS_PER_UNIT) - 1);
2959 desc->next = NULL;
2960 desc->constant = tmp.constant;
2961 desc->offset = pool->offset;
2962 desc->hash = hash;
2963 desc->mode = mode;
2964 desc->align = align;
2965 desc->labelno = const_labelno;
2966 desc->mark = 0;
2968 pool->offset += GET_MODE_SIZE (mode);
2969 if (pool->last)
2970 pool->last->next = desc;
2971 else
2972 pool->first = pool->last = desc;
2973 pool->last = desc;
2975 /* Create a string containing the label name, in LABEL. */
2976 ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
2977 ++const_labelno;
2979 /* Construct the SYMBOL_REF. Make sure to mark it as belonging to
2980 the constants pool. */
2981 desc->sym = symbol = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (label));
2982 SYMBOL_REF_FLAGS (symbol) = SYMBOL_FLAG_LOCAL;
2983 CONSTANT_POOL_ADDRESS_P (symbol) = 1;
2984 current_function_uses_const_pool = 1;
2986 /* Insert the descriptor into the symbol cross-reference table too. */
2987 slot = htab_find_slot (pool->const_rtx_sym_htab, desc, INSERT);
2988 if (*slot)
2989 abort ();
2990 *slot = desc;
2992 /* Construct the MEM. */
2993 desc->mem = def = gen_const_mem (mode, symbol);
2994 set_mem_attributes (def, lang_hooks.types.type_for_mode (mode, 0), 1);
2996 /* If we're dropping a label to the constant pool, make sure we
2997 don't delete it. */
2998 if (GET_CODE (x) == LABEL_REF)
2999 LABEL_PRESERVE_P (XEXP (x, 0)) = 1;
3001 return copy_rtx (def);
3004 /* Given a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true, return a pointer to
3005 the corresponding constant_descriptor_rtx structure. */
3007 static struct constant_descriptor_rtx *
3008 find_pool_constant (struct rtx_constant_pool *pool, rtx sym)
3010 struct constant_descriptor_rtx tmp;
3011 tmp.sym = sym;
3012 return htab_find (pool->const_rtx_sym_htab, &tmp);
3015 /* Given a constant pool SYMBOL_REF, return the corresponding constant. */
3018 get_pool_constant (rtx addr)
3020 return find_pool_constant (cfun->varasm->pool, addr)->constant;
3023 /* Given a constant pool SYMBOL_REF, return the corresponding constant
3024 and whether it has been output or not. */
3027 get_pool_constant_mark (rtx addr, bool *pmarked)
3029 struct constant_descriptor_rtx *desc;
3031 desc = find_pool_constant (cfun->varasm->pool, addr);
3032 *pmarked = (desc->mark != 0);
3033 return desc->constant;
3036 /* Likewise, but for the constant pool of a specific function. */
3039 get_pool_constant_for_function (struct function *f, rtx addr)
3041 return find_pool_constant (f->varasm->pool, addr)->constant;
3044 /* Similar, return the mode. */
3046 enum machine_mode
3047 get_pool_mode (rtx addr)
3049 return find_pool_constant (cfun->varasm->pool, addr)->mode;
3052 /* Return the size of the constant pool. */
3055 get_pool_size (void)
3057 return cfun->varasm->pool->offset;
3060 /* Worker function for output_constant_pool_1. Emit assembly for X
3061 in MODE with known alignment ALIGN. */
3063 static void
3064 output_constant_pool_2 (enum machine_mode mode, rtx x, unsigned int align)
3066 switch (GET_MODE_CLASS (mode))
3068 case MODE_FLOAT:
3069 if (GET_CODE (x) != CONST_DOUBLE)
3070 abort ();
3071 else
3073 REAL_VALUE_TYPE r;
3074 REAL_VALUE_FROM_CONST_DOUBLE (r, x);
3075 assemble_real (r, mode, align);
3077 break;
3079 case MODE_INT:
3080 case MODE_PARTIAL_INT:
3081 assemble_integer (x, GET_MODE_SIZE (mode), align, 1);
3082 break;
3084 case MODE_VECTOR_FLOAT:
3085 case MODE_VECTOR_INT:
3087 int i, units;
3088 enum machine_mode submode = GET_MODE_INNER (mode);
3089 unsigned int subalign = MIN (align, GET_MODE_BITSIZE (submode));
3091 if (GET_CODE (x) != CONST_VECTOR)
3092 abort ();
3093 units = CONST_VECTOR_NUNITS (x);
3095 for (i = 0; i < units; i++)
3097 rtx elt = CONST_VECTOR_ELT (x, i);
3098 output_constant_pool_2 (submode, elt, i ? subalign : align);
3101 break;
3103 default:
3104 abort ();
3108 /* Worker function for output_constant_pool. Emit POOL. */
3110 static void
3111 output_constant_pool_1 (struct constant_descriptor_rtx *desc)
3113 rtx x, tmp;
3115 if (!desc->mark)
3116 return;
3117 x = desc->constant;
3119 /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
3120 whose CODE_LABEL has been deleted. This can occur if a jump table
3121 is eliminated by optimization. If so, write a constant of zero
3122 instead. Note that this can also happen by turning the
3123 CODE_LABEL into a NOTE. */
3124 /* ??? This seems completely and utterly wrong. Certainly it's
3125 not true for NOTE_INSN_DELETED_LABEL, but I disbelieve proper
3126 functioning even with INSN_DELETED_P and friends. */
3128 tmp = x;
3129 switch (GET_CODE (x))
3131 case CONST:
3132 if (GET_CODE (XEXP (x, 0)) != PLUS
3133 || GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
3134 break;
3135 tmp = XEXP (XEXP (x, 0), 0);
3136 /* FALLTHRU */
3138 case LABEL_REF:
3139 tmp = XEXP (x, 0);
3140 if (INSN_DELETED_P (tmp)
3141 || (NOTE_P (tmp)
3142 && NOTE_LINE_NUMBER (tmp) == NOTE_INSN_DELETED))
3144 abort ();
3145 x = const0_rtx;
3147 break;
3149 default:
3150 break;
3153 /* First switch to correct section. */
3154 targetm.asm_out.select_rtx_section (desc->mode, x, desc->align);
3156 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3157 ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, desc->mode,
3158 desc->align, desc->labelno, done);
3159 #endif
3161 assemble_align (desc->align);
3163 /* Output the label. */
3164 targetm.asm_out.internal_label (asm_out_file, "LC", desc->labelno);
3166 /* Output the data. */
3167 output_constant_pool_2 (desc->mode, x, desc->align);
3169 /* Make sure all constants in SECTION_MERGE and not SECTION_STRINGS
3170 sections have proper size. */
3171 if (desc->align > GET_MODE_BITSIZE (desc->mode)
3172 && in_section == in_named
3173 && get_named_section_flags (in_named_name) & SECTION_MERGE)
3174 assemble_align (desc->align);
3176 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3177 done:
3178 #endif
3179 return;
3182 /* Given a SYMBOL_REF CURRENT_RTX, mark it and all constants it refers
3183 to as used. Emit referenced deferred strings. This function can
3184 be used with for_each_rtx to mark all SYMBOL_REFs in an rtx. */
3186 static int
3187 mark_constant (rtx *current_rtx, void *data)
3189 struct rtx_constant_pool *pool = data;
3190 rtx x = *current_rtx;
3192 if (x == NULL_RTX || GET_CODE (x) != SYMBOL_REF)
3193 return 0;
3195 if (CONSTANT_POOL_ADDRESS_P (x))
3197 struct constant_descriptor_rtx *desc = find_pool_constant (pool, x);
3198 if (desc->mark == 0)
3200 desc->mark = 1;
3201 for_each_rtx (&desc->constant, mark_constant, pool);
3204 else if (TREE_CONSTANT_POOL_ADDRESS_P (x))
3206 tree exp = SYMBOL_REF_DECL (x);
3207 if (!TREE_ASM_WRITTEN (exp))
3209 n_deferred_constants--;
3210 output_constant_def_contents (x);
3214 return -1;
3217 /* Look through appropriate parts of INSN, marking all entries in the
3218 constant pool which are actually being used. Entries that are only
3219 referenced by other constants are also marked as used. Emit
3220 deferred strings that are used. */
3222 static void
3223 mark_constants (struct rtx_constant_pool *pool, rtx insn)
3225 if (!INSN_P (insn))
3226 return;
3228 /* Insns may appear inside a SEQUENCE. Only check the patterns of
3229 insns, not any notes that may be attached. We don't want to mark
3230 a constant just because it happens to appear in a REG_EQUIV note. */
3231 if (GET_CODE (PATTERN (insn)) == SEQUENCE)
3233 rtx seq = PATTERN (insn);
3234 int i, n = XVECLEN (seq, 0);
3235 for (i = 0; i < n; ++i)
3237 rtx subinsn = XVECEXP (seq, 0, i);
3238 if (INSN_P (subinsn))
3239 for_each_rtx (&PATTERN (subinsn), mark_constant, pool);
3242 else
3243 for_each_rtx (&PATTERN (insn), mark_constant, pool);
3246 /* Look through the instructions for this function, and mark all the
3247 entries in POOL which are actually being used. Emit deferred constants
3248 which have indeed been used. */
3250 static void
3251 mark_constant_pool (struct rtx_constant_pool *pool)
3253 rtx insn, link;
3255 if (pool->first == 0 && n_deferred_constants == 0)
3256 return;
3258 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
3259 mark_constants (pool, insn);
3261 for (link = current_function_epilogue_delay_list;
3262 link;
3263 link = XEXP (link, 1))
3264 mark_constants (pool, XEXP (link, 0));
3267 /* Write all the constants in the constant pool. */
3269 void
3270 output_constant_pool (const char *fnname ATTRIBUTE_UNUSED,
3271 tree fndecl ATTRIBUTE_UNUSED)
3273 struct rtx_constant_pool *pool = cfun->varasm->pool;
3274 struct constant_descriptor_rtx *desc;
3276 /* It is possible for gcc to call force_const_mem and then to later
3277 discard the instructions which refer to the constant. In such a
3278 case we do not need to output the constant. */
3279 mark_constant_pool (pool);
3281 #ifdef ASM_OUTPUT_POOL_PROLOGUE
3282 ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool->offset);
3283 #endif
3285 for (desc = pool->first; desc ; desc = desc->next)
3286 output_constant_pool_1 (desc);
3288 #ifdef ASM_OUTPUT_POOL_EPILOGUE
3289 ASM_OUTPUT_POOL_EPILOGUE (asm_out_file, fnname, fndecl, pool->offset);
3290 #endif
3293 /* Determine what kind of relocations EXP may need. */
3296 compute_reloc_for_constant (tree exp)
3298 int reloc = 0, reloc2;
3299 tree tem;
3301 /* Give the front-end a chance to convert VALUE to something that
3302 looks more like a constant to the back-end. */
3303 exp = lang_hooks.expand_constant (exp);
3305 switch (TREE_CODE (exp))
3307 case ADDR_EXPR:
3308 case FDESC_EXPR:
3309 /* Go inside any operations that get_inner_reference can handle and see
3310 if what's inside is a constant: no need to do anything here for
3311 addresses of variables or functions. */
3312 for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3313 tem = TREE_OPERAND (tem, 0))
3316 if (TREE_PUBLIC (tem))
3317 reloc |= 2;
3318 else
3319 reloc |= 1;
3320 break;
3322 case PLUS_EXPR:
3323 reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3324 reloc |= compute_reloc_for_constant (TREE_OPERAND (exp, 1));
3325 break;
3327 case MINUS_EXPR:
3328 reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3329 reloc2 = compute_reloc_for_constant (TREE_OPERAND (exp, 1));
3330 /* The difference of two local labels is computable at link time. */
3331 if (reloc == 1 && reloc2 == 1)
3332 reloc = 0;
3333 else
3334 reloc |= reloc2;
3335 break;
3337 case NOP_EXPR:
3338 case CONVERT_EXPR:
3339 case NON_LVALUE_EXPR:
3340 reloc = compute_reloc_for_constant (TREE_OPERAND (exp, 0));
3341 break;
3343 case CONSTRUCTOR:
3344 for (tem = CONSTRUCTOR_ELTS (exp); tem; tem = TREE_CHAIN (tem))
3345 if (TREE_VALUE (tem) != 0)
3346 reloc |= compute_reloc_for_constant (TREE_VALUE (tem));
3348 break;
3350 default:
3351 break;
3353 return reloc;
3356 /* Find all the constants whose addresses are referenced inside of EXP,
3357 and make sure assembler code with a label has been output for each one.
3358 Indicate whether an ADDR_EXPR has been encountered. */
3360 static void
3361 output_addressed_constants (tree exp)
3363 tree tem;
3365 /* Give the front-end a chance to convert VALUE to something that
3366 looks more like a constant to the back-end. */
3367 exp = lang_hooks.expand_constant (exp);
3369 switch (TREE_CODE (exp))
3371 case ADDR_EXPR:
3372 case FDESC_EXPR:
3373 /* Go inside any operations that get_inner_reference can handle and see
3374 if what's inside is a constant: no need to do anything here for
3375 addresses of variables or functions. */
3376 for (tem = TREE_OPERAND (exp, 0); handled_component_p (tem);
3377 tem = TREE_OPERAND (tem, 0))
3380 if (CONSTANT_CLASS_P (tem) || TREE_CODE (tem) == CONSTRUCTOR)
3381 output_constant_def (tem, 0);
3382 break;
3384 case PLUS_EXPR:
3385 case MINUS_EXPR:
3386 output_addressed_constants (TREE_OPERAND (exp, 1));
3387 /* Fall through. */
3389 case NOP_EXPR:
3390 case CONVERT_EXPR:
3391 case NON_LVALUE_EXPR:
3392 output_addressed_constants (TREE_OPERAND (exp, 0));
3393 break;
3395 case CONSTRUCTOR:
3396 for (tem = CONSTRUCTOR_ELTS (exp); tem; tem = TREE_CHAIN (tem))
3397 if (TREE_VALUE (tem) != 0)
3398 output_addressed_constants (TREE_VALUE (tem));
3400 break;
3402 default:
3403 break;
3407 /* Return nonzero if VALUE is a valid constant-valued expression
3408 for use in initializing a static variable; one that can be an
3409 element of a "constant" initializer.
3411 Return null_pointer_node if the value is absolute;
3412 if it is relocatable, return the variable that determines the relocation.
3413 We assume that VALUE has been folded as much as possible;
3414 therefore, we do not need to check for such things as
3415 arithmetic-combinations of integers. */
3417 tree
3418 initializer_constant_valid_p (tree value, tree endtype)
3420 /* Give the front-end a chance to convert VALUE to something that
3421 looks more like a constant to the back-end. */
3422 value = lang_hooks.expand_constant (value);
3424 switch (TREE_CODE (value))
3426 case CONSTRUCTOR:
3427 if ((TREE_CODE (TREE_TYPE (value)) == UNION_TYPE
3428 || TREE_CODE (TREE_TYPE (value)) == RECORD_TYPE)
3429 && TREE_CONSTANT (value)
3430 && CONSTRUCTOR_ELTS (value))
3432 tree elt;
3433 bool absolute = true;
3435 for (elt = CONSTRUCTOR_ELTS (value); elt; elt = TREE_CHAIN (elt))
3437 tree reloc;
3438 value = TREE_VALUE (elt);
3439 reloc = initializer_constant_valid_p (value, TREE_TYPE (value));
3440 if (!reloc)
3441 return NULL_TREE;
3442 if (reloc != null_pointer_node)
3443 absolute = false;
3445 /* For a non-absolute relocation, there is no single
3446 variable that can be "the variable that determines the
3447 relocation." */
3448 return absolute ? null_pointer_node : error_mark_node;
3451 return TREE_STATIC (value) ? null_pointer_node : NULL_TREE;
3453 case INTEGER_CST:
3454 case VECTOR_CST:
3455 case REAL_CST:
3456 case STRING_CST:
3457 case COMPLEX_CST:
3458 return null_pointer_node;
3460 case ADDR_EXPR:
3461 case FDESC_EXPR:
3462 value = staticp (TREE_OPERAND (value, 0));
3463 /* "&(*a).f" is like unto pointer arithmetic. If "a" turns out to
3464 be a constant, this is old-skool offsetof-like nonsense. */
3465 if (value
3466 && TREE_CODE (value) == INDIRECT_REF
3467 && TREE_CONSTANT (TREE_OPERAND (value, 0)))
3468 return null_pointer_node;
3469 return value;
3471 case VIEW_CONVERT_EXPR:
3472 case NON_LVALUE_EXPR:
3473 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3475 case CONVERT_EXPR:
3476 case NOP_EXPR:
3477 /* Allow conversions between pointer types. */
3478 if (POINTER_TYPE_P (TREE_TYPE (value))
3479 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3480 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3482 /* Allow conversions between real types. */
3483 if (FLOAT_TYPE_P (TREE_TYPE (value))
3484 && FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3485 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3487 /* Allow length-preserving conversions between integer types. */
3488 if (INTEGRAL_TYPE_P (TREE_TYPE (value))
3489 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0)))
3490 && (TYPE_PRECISION (TREE_TYPE (value))
3491 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0)))))
3492 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
3494 /* Allow conversions between other integer types only if
3495 explicit value. */
3496 if (INTEGRAL_TYPE_P (TREE_TYPE (value))
3497 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3499 tree inner = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3500 endtype);
3501 if (inner == null_pointer_node)
3502 return null_pointer_node;
3503 break;
3506 /* Allow (int) &foo provided int is as wide as a pointer. */
3507 if (INTEGRAL_TYPE_P (TREE_TYPE (value))
3508 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0)))
3509 && (TYPE_PRECISION (TREE_TYPE (value))
3510 >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0)))))
3511 return initializer_constant_valid_p (TREE_OPERAND (value, 0),
3512 endtype);
3514 /* Likewise conversions from int to pointers, but also allow
3515 conversions from 0. */
3516 if ((POINTER_TYPE_P (TREE_TYPE (value))
3517 || TREE_CODE (TREE_TYPE (value)) == OFFSET_TYPE)
3518 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
3520 if (integer_zerop (TREE_OPERAND (value, 0)))
3521 return null_pointer_node;
3522 else if (TYPE_PRECISION (TREE_TYPE (value))
3523 <= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0))))
3524 return initializer_constant_valid_p (TREE_OPERAND (value, 0),
3525 endtype);
3528 /* Allow conversions to struct or union types if the value
3529 inside is okay. */
3530 if (TREE_CODE (TREE_TYPE (value)) == RECORD_TYPE
3531 || TREE_CODE (TREE_TYPE (value)) == UNION_TYPE)
3532 return initializer_constant_valid_p (TREE_OPERAND (value, 0),
3533 endtype);
3534 break;
3536 case PLUS_EXPR:
3537 if (! INTEGRAL_TYPE_P (endtype)
3538 || TYPE_PRECISION (endtype) >= POINTER_SIZE)
3540 tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3541 endtype);
3542 tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
3543 endtype);
3544 /* If either term is absolute, use the other terms relocation. */
3545 if (valid0 == null_pointer_node)
3546 return valid1;
3547 if (valid1 == null_pointer_node)
3548 return valid0;
3550 break;
3552 case MINUS_EXPR:
3553 if (! INTEGRAL_TYPE_P (endtype)
3554 || TYPE_PRECISION (endtype) >= POINTER_SIZE)
3556 tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
3557 endtype);
3558 tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
3559 endtype);
3560 /* Win if second argument is absolute. */
3561 if (valid1 == null_pointer_node)
3562 return valid0;
3563 /* Win if both arguments have the same relocation.
3564 Then the value is absolute. */
3565 if (valid0 == valid1 && valid0 != 0)
3566 return null_pointer_node;
3568 /* Since GCC guarantees that string constants are unique in the
3569 generated code, a subtraction between two copies of the same
3570 constant string is absolute. */
3571 if (valid0 && TREE_CODE (valid0) == STRING_CST
3572 && valid1 && TREE_CODE (valid1) == STRING_CST
3573 && operand_equal_p (valid0, valid1, 1))
3574 return null_pointer_node;
3577 /* Support narrowing differences. */
3578 if (INTEGRAL_TYPE_P (endtype))
3580 tree op0, op1;
3582 op0 = TREE_OPERAND (value, 0);
3583 op1 = TREE_OPERAND (value, 1);
3585 /* Like STRIP_NOPS except allow the operand mode to widen.
3586 This works around a feature of fold that simplifies
3587 (int)(p1 - p2) to ((int)p1 - (int)p2) under the theory
3588 that the narrower operation is cheaper. */
3590 while (TREE_CODE (op0) == NOP_EXPR
3591 || TREE_CODE (op0) == CONVERT_EXPR
3592 || TREE_CODE (op0) == NON_LVALUE_EXPR)
3594 tree inner = TREE_OPERAND (op0, 0);
3595 if (inner == error_mark_node
3596 || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
3597 || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))
3598 > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
3599 break;
3600 op0 = inner;
3603 while (TREE_CODE (op1) == NOP_EXPR
3604 || TREE_CODE (op1) == CONVERT_EXPR
3605 || TREE_CODE (op1) == NON_LVALUE_EXPR)
3607 tree inner = TREE_OPERAND (op1, 0);
3608 if (inner == error_mark_node
3609 || ! INTEGRAL_MODE_P (TYPE_MODE (TREE_TYPE (inner)))
3610 || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))
3611 > GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (inner)))))
3612 break;
3613 op1 = inner;
3616 op0 = initializer_constant_valid_p (op0, endtype);
3617 op1 = initializer_constant_valid_p (op1, endtype);
3619 /* Both initializers must be known. */
3620 if (op0 && op1)
3622 if (op0 == op1)
3623 return null_pointer_node;
3625 /* Support differences between labels. */
3626 if (TREE_CODE (op0) == LABEL_DECL
3627 && TREE_CODE (op1) == LABEL_DECL)
3628 return null_pointer_node;
3630 if (TREE_CODE (op0) == STRING_CST
3631 && TREE_CODE (op1) == STRING_CST
3632 && operand_equal_p (op0, op1, 1))
3633 return null_pointer_node;
3636 break;
3638 default:
3639 break;
3642 return 0;
3645 /* Output assembler code for constant EXP to FILE, with no label.
3646 This includes the pseudo-op such as ".int" or ".byte", and a newline.
3647 Assumes output_addressed_constants has been done on EXP already.
3649 Generate exactly SIZE bytes of assembler data, padding at the end
3650 with zeros if necessary. SIZE must always be specified.
3652 SIZE is important for structure constructors,
3653 since trailing members may have been omitted from the constructor.
3654 It is also important for initialization of arrays from string constants
3655 since the full length of the string constant might not be wanted.
3656 It is also needed for initialization of unions, where the initializer's
3657 type is just one member, and that may not be as long as the union.
3659 There a case in which we would fail to output exactly SIZE bytes:
3660 for a structure constructor that wants to produce more than SIZE bytes.
3661 But such constructors will never be generated for any possible input.
3663 ALIGN is the alignment of the data in bits. */
3665 void
3666 output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align)
3668 enum tree_code code;
3669 unsigned HOST_WIDE_INT thissize;
3671 /* Some front-ends use constants other than the standard language-independent
3672 varieties, but which may still be output directly. Give the front-end a
3673 chance to convert EXP to a language-independent representation. */
3674 exp = lang_hooks.expand_constant (exp);
3676 if (size == 0 || flag_syntax_only)
3677 return;
3679 /* Eliminate any conversions since we'll be outputting the underlying
3680 constant. */
3681 while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR
3682 || TREE_CODE (exp) == NON_LVALUE_EXPR
3683 || TREE_CODE (exp) == VIEW_CONVERT_EXPR)
3684 exp = TREE_OPERAND (exp, 0);
3686 code = TREE_CODE (TREE_TYPE (exp));
3687 thissize = int_size_in_bytes (TREE_TYPE (exp));
3689 /* Allow a constructor with no elements for any data type.
3690 This means to fill the space with zeros. */
3691 if (TREE_CODE (exp) == CONSTRUCTOR && CONSTRUCTOR_ELTS (exp) == 0)
3693 assemble_zeros (size);
3694 return;
3697 if (TREE_CODE (exp) == FDESC_EXPR)
3699 #ifdef ASM_OUTPUT_FDESC
3700 HOST_WIDE_INT part = tree_low_cst (TREE_OPERAND (exp, 1), 0);
3701 tree decl = TREE_OPERAND (exp, 0);
3702 ASM_OUTPUT_FDESC (asm_out_file, decl, part);
3703 #else
3704 abort ();
3705 #endif
3706 return;
3709 /* Now output the underlying data. If we've handling the padding, return.
3710 Otherwise, break and ensure SIZE is the size written. */
3711 switch (code)
3713 case CHAR_TYPE:
3714 case BOOLEAN_TYPE:
3715 case INTEGER_TYPE:
3716 case ENUMERAL_TYPE:
3717 case POINTER_TYPE:
3718 case REFERENCE_TYPE:
3719 case OFFSET_TYPE:
3720 if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
3721 EXPAND_INITIALIZER),
3722 MIN (size, thissize), align, 0))
3723 error ("initializer for integer value is too complicated");
3724 break;
3726 case REAL_TYPE:
3727 if (TREE_CODE (exp) != REAL_CST)
3728 error ("initializer for floating value is not a floating constant");
3730 assemble_real (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)), align);
3731 break;
3733 case COMPLEX_TYPE:
3734 output_constant (TREE_REALPART (exp), thissize / 2, align);
3735 output_constant (TREE_IMAGPART (exp), thissize / 2,
3736 min_align (align, BITS_PER_UNIT * (thissize / 2)));
3737 break;
3739 case ARRAY_TYPE:
3740 case VECTOR_TYPE:
3741 if (TREE_CODE (exp) == CONSTRUCTOR)
3743 output_constructor (exp, size, align);
3744 return;
3746 else if (TREE_CODE (exp) == STRING_CST)
3748 thissize = MIN ((unsigned HOST_WIDE_INT)TREE_STRING_LENGTH (exp),
3749 size);
3750 assemble_string (TREE_STRING_POINTER (exp), thissize);
3752 else if (TREE_CODE (exp) == VECTOR_CST)
3754 int elt_size;
3755 tree link;
3756 unsigned int nalign;
3757 enum machine_mode inner;
3759 inner = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp)));
3760 nalign = MIN (align, GET_MODE_ALIGNMENT (inner));
3762 elt_size = GET_MODE_SIZE (inner);
3764 link = TREE_VECTOR_CST_ELTS (exp);
3765 output_constant (TREE_VALUE (link), elt_size, align);
3766 while ((link = TREE_CHAIN (link)) != NULL)
3767 output_constant (TREE_VALUE (link), elt_size, nalign);
3769 else
3770 abort ();
3771 break;
3773 case RECORD_TYPE:
3774 case UNION_TYPE:
3775 if (TREE_CODE (exp) == CONSTRUCTOR)
3776 output_constructor (exp, size, align);
3777 else
3778 abort ();
3779 return;
3781 case SET_TYPE:
3782 if (TREE_CODE (exp) == INTEGER_CST)
3783 assemble_integer (expand_expr (exp, NULL_RTX,
3784 VOIDmode, EXPAND_INITIALIZER),
3785 thissize, align, 1);
3786 else if (TREE_CODE (exp) == CONSTRUCTOR)
3788 unsigned char *buffer = alloca (thissize);
3789 if (get_set_constructor_bytes (exp, buffer, thissize))
3790 abort ();
3791 assemble_string ((char *) buffer, thissize);
3793 else
3794 error ("unknown set constructor type");
3795 return;
3797 case ERROR_MARK:
3798 return;
3800 default:
3801 abort ();
3804 if (size > thissize)
3805 assemble_zeros (size - thissize);
3809 /* Subroutine of output_constructor, used for computing the size of
3810 arrays of unspecified length. VAL must be a CONSTRUCTOR of an array
3811 type with an unspecified upper bound. */
3813 static unsigned HOST_WIDE_INT
3814 array_size_for_constructor (tree val)
3816 tree max_index, i;
3818 /* This code used to attempt to handle string constants that are not
3819 arrays of single-bytes, but nothing else does, so there's no point in
3820 doing it here. */
3821 if (TREE_CODE (val) == STRING_CST)
3822 return TREE_STRING_LENGTH (val);
3824 max_index = NULL_TREE;
3825 for (i = CONSTRUCTOR_ELTS (val); i; i = TREE_CHAIN (i))
3827 tree index = TREE_PURPOSE (i);
3829 if (TREE_CODE (index) == RANGE_EXPR)
3830 index = TREE_OPERAND (index, 1);
3831 if (max_index == NULL_TREE || tree_int_cst_lt (max_index, index))
3832 max_index = index;
3835 if (max_index == NULL_TREE)
3836 return 0;
3838 /* Compute the total number of array elements. */
3839 i = size_binop (MINUS_EXPR, convert (sizetype, max_index),
3840 convert (sizetype,
3841 TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (val)))));
3842 i = size_binop (PLUS_EXPR, i, convert (sizetype, integer_one_node));
3844 /* Multiply by the array element unit size to find number of bytes. */
3845 i = size_binop (MULT_EXPR, i, TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (val))));
3847 return tree_low_cst (i, 1);
3850 /* Subroutine of output_constant, used for CONSTRUCTORs (aggregate constants).
3851 Generate at least SIZE bytes, padding if necessary. */
3853 static void
3854 output_constructor (tree exp, unsigned HOST_WIDE_INT size,
3855 unsigned int align)
3857 tree type = TREE_TYPE (exp);
3858 tree link, field = 0;
3859 tree min_index = 0;
3860 /* Number of bytes output or skipped so far.
3861 In other words, current position within the constructor. */
3862 HOST_WIDE_INT total_bytes = 0;
3863 /* Nonzero means BYTE contains part of a byte, to be output. */
3864 int byte_buffer_in_use = 0;
3865 int byte = 0;
3867 if (HOST_BITS_PER_WIDE_INT < BITS_PER_UNIT)
3868 abort ();
3870 if (TREE_CODE (type) == RECORD_TYPE)
3871 field = TYPE_FIELDS (type);
3873 if (TREE_CODE (type) == ARRAY_TYPE
3874 && TYPE_DOMAIN (type) != 0)
3875 min_index = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
3877 /* As LINK goes through the elements of the constant,
3878 FIELD goes through the structure fields, if the constant is a structure.
3879 if the constant is a union, then we override this,
3880 by getting the field from the TREE_LIST element.
3881 But the constant could also be an array. Then FIELD is zero.
3883 There is always a maximum of one element in the chain LINK for unions
3884 (even if the initializer in a source program incorrectly contains
3885 more one). */
3886 for (link = CONSTRUCTOR_ELTS (exp);
3887 link;
3888 link = TREE_CHAIN (link),
3889 field = field ? TREE_CHAIN (field) : 0)
3891 tree val = TREE_VALUE (link);
3892 tree index = 0;
3894 /* The element in a union constructor specifies the proper field
3895 or index. */
3896 if ((TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE
3897 || TREE_CODE (type) == QUAL_UNION_TYPE)
3898 && TREE_PURPOSE (link) != 0)
3899 field = TREE_PURPOSE (link);
3901 else if (TREE_CODE (type) == ARRAY_TYPE)
3902 index = TREE_PURPOSE (link);
3904 #ifdef ASM_COMMENT_START
3905 if (field && flag_verbose_asm)
3906 fprintf (asm_out_file, "%s %s:\n",
3907 ASM_COMMENT_START,
3908 DECL_NAME (field)
3909 ? IDENTIFIER_POINTER (DECL_NAME (field))
3910 : "<anonymous>");
3911 #endif
3913 /* Eliminate the marker that makes a cast not be an lvalue. */
3914 if (val != 0)
3915 STRIP_NOPS (val);
3917 if (index && TREE_CODE (index) == RANGE_EXPR)
3919 unsigned HOST_WIDE_INT fieldsize
3920 = int_size_in_bytes (TREE_TYPE (type));
3921 HOST_WIDE_INT lo_index = tree_low_cst (TREE_OPERAND (index, 0), 0);
3922 HOST_WIDE_INT hi_index = tree_low_cst (TREE_OPERAND (index, 1), 0);
3923 HOST_WIDE_INT index;
3924 unsigned int align2 = min_align (align, fieldsize * BITS_PER_UNIT);
3926 for (index = lo_index; index <= hi_index; index++)
3928 /* Output the element's initial value. */
3929 if (val == 0)
3930 assemble_zeros (fieldsize);
3931 else
3932 output_constant (val, fieldsize, align2);
3934 /* Count its size. */
3935 total_bytes += fieldsize;
3938 else if (field == 0 || !DECL_BIT_FIELD (field))
3940 /* An element that is not a bit-field. */
3942 unsigned HOST_WIDE_INT fieldsize;
3943 /* Since this structure is static,
3944 we know the positions are constant. */
3945 HOST_WIDE_INT pos = field ? int_byte_position (field) : 0;
3946 unsigned int align2;
3948 if (index != 0)
3949 pos = (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (val)), 1)
3950 * (tree_low_cst (index, 0) - tree_low_cst (min_index, 0)));
3952 /* Output any buffered-up bit-fields preceding this element. */
3953 if (byte_buffer_in_use)
3955 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
3956 total_bytes++;
3957 byte_buffer_in_use = 0;
3960 /* Advance to offset of this element.
3961 Note no alignment needed in an array, since that is guaranteed
3962 if each element has the proper size. */
3963 if ((field != 0 || index != 0) && pos != total_bytes)
3965 assemble_zeros (pos - total_bytes);
3966 total_bytes = pos;
3969 /* Find the alignment of this element. */
3970 align2 = min_align (align, BITS_PER_UNIT * pos);
3972 /* Determine size this element should occupy. */
3973 if (field)
3975 fieldsize = 0;
3977 /* If this is an array with an unspecified upper bound,
3978 the initializer determines the size. */
3979 /* ??? This ought to only checked if DECL_SIZE_UNIT is NULL,
3980 but we cannot do this until the deprecated support for
3981 initializing zero-length array members is removed. */
3982 if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE
3983 && TYPE_DOMAIN (TREE_TYPE (field))
3984 && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (field))))
3986 fieldsize = array_size_for_constructor (val);
3987 /* Given a non-empty initialization, this field had
3988 better be last. */
3989 if (fieldsize != 0 && TREE_CHAIN (field) != NULL_TREE)
3990 abort ();
3992 else if (DECL_SIZE_UNIT (field))
3994 /* ??? This can't be right. If the decl size overflows
3995 a host integer we will silently emit no data. */
3996 if (host_integerp (DECL_SIZE_UNIT (field), 1))
3997 fieldsize = tree_low_cst (DECL_SIZE_UNIT (field), 1);
4000 else
4001 fieldsize = int_size_in_bytes (TREE_TYPE (type));
4003 /* Output the element's initial value. */
4004 if (val == 0)
4005 assemble_zeros (fieldsize);
4006 else
4007 output_constant (val, fieldsize, align2);
4009 /* Count its size. */
4010 total_bytes += fieldsize;
4012 else if (val != 0 && TREE_CODE (val) != INTEGER_CST)
4013 error ("invalid initial value for member %qs",
4014 IDENTIFIER_POINTER (DECL_NAME (field)));
4015 else
4017 /* Element that is a bit-field. */
4019 HOST_WIDE_INT next_offset = int_bit_position (field);
4020 HOST_WIDE_INT end_offset
4021 = (next_offset + tree_low_cst (DECL_SIZE (field), 1));
4023 if (val == 0)
4024 val = integer_zero_node;
4026 /* If this field does not start in this (or, next) byte,
4027 skip some bytes. */
4028 if (next_offset / BITS_PER_UNIT != total_bytes)
4030 /* Output remnant of any bit field in previous bytes. */
4031 if (byte_buffer_in_use)
4033 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4034 total_bytes++;
4035 byte_buffer_in_use = 0;
4038 /* If still not at proper byte, advance to there. */
4039 if (next_offset / BITS_PER_UNIT != total_bytes)
4041 assemble_zeros (next_offset / BITS_PER_UNIT - total_bytes);
4042 total_bytes = next_offset / BITS_PER_UNIT;
4046 if (! byte_buffer_in_use)
4047 byte = 0;
4049 /* We must split the element into pieces that fall within
4050 separate bytes, and combine each byte with previous or
4051 following bit-fields. */
4053 /* next_offset is the offset n fbits from the beginning of
4054 the structure to the next bit of this element to be processed.
4055 end_offset is the offset of the first bit past the end of
4056 this element. */
4057 while (next_offset < end_offset)
4059 int this_time;
4060 int shift;
4061 HOST_WIDE_INT value;
4062 HOST_WIDE_INT next_byte = next_offset / BITS_PER_UNIT;
4063 HOST_WIDE_INT next_bit = next_offset % BITS_PER_UNIT;
4065 /* Advance from byte to byte
4066 within this element when necessary. */
4067 while (next_byte != total_bytes)
4069 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4070 total_bytes++;
4071 byte = 0;
4074 /* Number of bits we can process at once
4075 (all part of the same byte). */
4076 this_time = MIN (end_offset - next_offset,
4077 BITS_PER_UNIT - next_bit);
4078 if (BYTES_BIG_ENDIAN)
4080 /* On big-endian machine, take the most significant bits
4081 first (of the bits that are significant)
4082 and put them into bytes from the most significant end. */
4083 shift = end_offset - next_offset - this_time;
4085 /* Don't try to take a bunch of bits that cross
4086 the word boundary in the INTEGER_CST. We can
4087 only select bits from the LOW or HIGH part
4088 not from both. */
4089 if (shift < HOST_BITS_PER_WIDE_INT
4090 && shift + this_time > HOST_BITS_PER_WIDE_INT)
4092 this_time = shift + this_time - HOST_BITS_PER_WIDE_INT;
4093 shift = HOST_BITS_PER_WIDE_INT;
4096 /* Now get the bits from the appropriate constant word. */
4097 if (shift < HOST_BITS_PER_WIDE_INT)
4098 value = TREE_INT_CST_LOW (val);
4099 else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
4101 value = TREE_INT_CST_HIGH (val);
4102 shift -= HOST_BITS_PER_WIDE_INT;
4104 else
4105 abort ();
4107 /* Get the result. This works only when:
4108 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
4109 byte |= (((value >> shift)
4110 & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
4111 << (BITS_PER_UNIT - this_time - next_bit));
4113 else
4115 /* On little-endian machines,
4116 take first the least significant bits of the value
4117 and pack them starting at the least significant
4118 bits of the bytes. */
4119 shift = next_offset - int_bit_position (field);
4121 /* Don't try to take a bunch of bits that cross
4122 the word boundary in the INTEGER_CST. We can
4123 only select bits from the LOW or HIGH part
4124 not from both. */
4125 if (shift < HOST_BITS_PER_WIDE_INT
4126 && shift + this_time > HOST_BITS_PER_WIDE_INT)
4127 this_time = (HOST_BITS_PER_WIDE_INT - shift);
4129 /* Now get the bits from the appropriate constant word. */
4130 if (shift < HOST_BITS_PER_WIDE_INT)
4131 value = TREE_INT_CST_LOW (val);
4132 else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
4134 value = TREE_INT_CST_HIGH (val);
4135 shift -= HOST_BITS_PER_WIDE_INT;
4137 else
4138 abort ();
4140 /* Get the result. This works only when:
4141 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
4142 byte |= (((value >> shift)
4143 & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
4144 << next_bit);
4147 next_offset += this_time;
4148 byte_buffer_in_use = 1;
4153 if (byte_buffer_in_use)
4155 assemble_integer (GEN_INT (byte), 1, BITS_PER_UNIT, 1);
4156 total_bytes++;
4159 if ((unsigned HOST_WIDE_INT)total_bytes < size)
4160 assemble_zeros (size - total_bytes);
4163 /* This TREE_LIST contains any weak symbol declarations waiting
4164 to be emitted. */
4165 static GTY(()) tree weak_decls;
4167 /* Mark DECL as weak. */
4169 static void
4170 mark_weak (tree decl)
4172 DECL_WEAK (decl) = 1;
4174 if (DECL_RTL_SET_P (decl)
4175 && MEM_P (DECL_RTL (decl))
4176 && XEXP (DECL_RTL (decl), 0)
4177 && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF)
4178 SYMBOL_REF_WEAK (XEXP (DECL_RTL (decl), 0)) = 1;
4181 /* Merge weak status between NEWDECL and OLDDECL. */
4183 void
4184 merge_weak (tree newdecl, tree olddecl)
4186 if (DECL_WEAK (newdecl) == DECL_WEAK (olddecl))
4187 return;
4189 if (DECL_WEAK (newdecl))
4191 tree wd;
4193 /* NEWDECL is weak, but OLDDECL is not. */
4195 /* If we already output the OLDDECL, we're in trouble; we can't
4196 go back and make it weak. This error cannot caught in
4197 declare_weak because the NEWDECL and OLDDECL was not yet
4198 been merged; therefore, TREE_ASM_WRITTEN was not set. */
4199 if (TREE_ASM_WRITTEN (olddecl))
4200 error ("%Jweak declaration of %qD must precede definition",
4201 newdecl, newdecl);
4203 /* If we've already generated rtl referencing OLDDECL, we may
4204 have done so in a way that will not function properly with
4205 a weak symbol. */
4206 else if (TREE_USED (olddecl)
4207 && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl)))
4208 warning ("%Jweak declaration of %qD after first use results "
4209 "in unspecified behavior", newdecl, newdecl);
4211 if (SUPPORTS_WEAK)
4213 /* We put the NEWDECL on the weak_decls list at some point.
4214 Replace it with the OLDDECL. */
4215 for (wd = weak_decls; wd; wd = TREE_CHAIN (wd))
4216 if (TREE_VALUE (wd) == newdecl)
4218 TREE_VALUE (wd) = olddecl;
4219 break;
4221 /* We may not find the entry on the list. If NEWDECL is a
4222 weak alias, then we will have already called
4223 globalize_decl to remove the entry; in that case, we do
4224 not need to do anything. */
4227 /* Make the OLDDECL weak; it's OLDDECL that we'll be keeping. */
4228 mark_weak (olddecl);
4230 else
4231 /* OLDDECL was weak, but NEWDECL was not explicitly marked as
4232 weak. Just update NEWDECL to indicate that it's weak too. */
4233 mark_weak (newdecl);
4236 /* Declare DECL to be a weak symbol. */
4238 void
4239 declare_weak (tree decl)
4241 if (! TREE_PUBLIC (decl))
4242 error ("%Jweak declaration of %qD must be public", decl, decl);
4243 else if (TREE_CODE (decl) == FUNCTION_DECL && TREE_ASM_WRITTEN (decl))
4244 error ("%Jweak declaration of %qD must precede definition", decl, decl);
4245 else if (SUPPORTS_WEAK)
4247 if (! DECL_WEAK (decl))
4248 weak_decls = tree_cons (NULL, decl, weak_decls);
4250 else
4251 warning ("%Jweak declaration of %qD not supported", decl, decl);
4253 mark_weak (decl);
4256 /* Emit any pending weak declarations. */
4258 void
4259 weak_finish (void)
4261 tree t;
4263 for (t = weak_decls; t; t = TREE_CHAIN (t))
4265 tree decl = TREE_VALUE (t);
4266 #if defined (ASM_WEAKEN_DECL) || defined (ASM_WEAKEN_LABEL)
4267 const char *const name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4268 #endif
4270 if (! TREE_USED (decl))
4271 continue;
4273 #ifdef ASM_WEAKEN_DECL
4274 ASM_WEAKEN_DECL (asm_out_file, decl, name, NULL);
4275 #else
4276 #ifdef ASM_WEAKEN_LABEL
4277 ASM_WEAKEN_LABEL (asm_out_file, name);
4278 #else
4279 #ifdef ASM_OUTPUT_WEAK_ALIAS
4280 warning ("only weak aliases are supported in this configuration");
4281 return;
4282 #endif
4283 #endif
4284 #endif
4288 /* Emit the assembly bits to indicate that DECL is globally visible. */
4290 static void
4291 globalize_decl (tree decl)
4293 const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
4295 #if defined (ASM_WEAKEN_LABEL) || defined (ASM_WEAKEN_DECL)
4296 if (DECL_WEAK (decl))
4298 tree *p, t;
4300 #ifdef ASM_WEAKEN_DECL
4301 ASM_WEAKEN_DECL (asm_out_file, decl, name, 0);
4302 #else
4303 ASM_WEAKEN_LABEL (asm_out_file, name);
4304 #endif
4306 /* Remove this function from the pending weak list so that
4307 we do not emit multiple .weak directives for it. */
4308 for (p = &weak_decls; (t = *p) ; )
4310 if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
4311 *p = TREE_CHAIN (t);
4312 else
4313 p = &TREE_CHAIN (t);
4315 return;
4317 #elif defined(ASM_MAKE_LABEL_LINKONCE)
4318 if (DECL_ONE_ONLY (decl))
4319 ASM_MAKE_LABEL_LINKONCE (asm_out_file, name);
4320 #endif
4322 targetm.asm_out.globalize_label (asm_out_file, name);
4325 /* Emit an assembler directive to make the symbol for DECL an alias to
4326 the symbol for TARGET. */
4328 void
4329 assemble_alias (tree decl, tree target ATTRIBUTE_UNUSED)
4331 const char *name;
4333 /* We must force creation of DECL_RTL for debug info generation, even though
4334 we don't use it here. */
4335 make_decl_rtl (decl);
4337 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
4339 #ifdef ASM_OUTPUT_DEF
4340 /* Make name accessible from other files, if appropriate. */
4342 if (TREE_PUBLIC (decl))
4344 globalize_decl (decl);
4345 maybe_assemble_visibility (decl);
4348 #ifdef ASM_OUTPUT_DEF_FROM_DECLS
4349 ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file, decl, target);
4350 #else
4351 ASM_OUTPUT_DEF (asm_out_file, name, IDENTIFIER_POINTER (target));
4352 #endif
4353 #else /* !ASM_OUTPUT_DEF */
4354 #if defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL)
4355 if (DECL_WEAK (decl))
4357 tree *p, t;
4358 #ifdef ASM_WEAKEN_DECL
4359 ASM_WEAKEN_DECL (asm_out_file, decl, name, IDENTIFIER_POINTER (target));
4360 #else
4361 ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target));
4362 #endif
4363 /* Remove this function from the pending weak list so that
4364 we do not emit multiple .weak directives for it. */
4365 for (p = &weak_decls; (t = *p) ; )
4366 if (DECL_ASSEMBLER_NAME (decl)
4367 == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
4368 *p = TREE_CHAIN (t);
4369 else
4370 p = &TREE_CHAIN (t);
4372 else
4373 warning ("only weak aliases are supported in this configuration");
4375 #else
4376 warning ("alias definitions not supported in this configuration; ignored");
4377 #endif
4378 #endif
4380 TREE_USED (decl) = 1;
4381 TREE_ASM_WRITTEN (decl) = 1;
4382 TREE_ASM_WRITTEN (DECL_ASSEMBLER_NAME (decl)) = 1;
4385 /* Emit an assembler directive to set symbol for DECL visibility to
4386 the visibility type VIS, which must not be VISIBILITY_DEFAULT. */
4388 void
4389 default_assemble_visibility (tree decl, int vis)
4391 static const char * const visibility_types[] = {
4392 NULL, "internal", "hidden", "protected"
4395 const char *name, *type;
4397 name = (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
4398 type = visibility_types[vis];
4400 #ifdef HAVE_GAS_HIDDEN
4401 fprintf (asm_out_file, "\t.%s\t", type);
4402 assemble_name (asm_out_file, name);
4403 fprintf (asm_out_file, "\n");
4404 #else
4405 warning ("visibility attribute not supported in this configuration; ignored");
4406 #endif
4409 /* A helper function to call assemble_visibility when needed for a decl. */
4411 static void
4412 maybe_assemble_visibility (tree decl)
4414 enum symbol_visibility vis = DECL_VISIBILITY (decl);
4416 if (vis != VISIBILITY_DEFAULT)
4417 targetm.asm_out.visibility (decl, vis);
4420 /* Returns 1 if the target configuration supports defining public symbols
4421 so that one of them will be chosen at link time instead of generating a
4422 multiply-defined symbol error, whether through the use of weak symbols or
4423 a target-specific mechanism for having duplicates discarded. */
4426 supports_one_only (void)
4428 if (SUPPORTS_ONE_ONLY)
4429 return 1;
4430 return SUPPORTS_WEAK;
4433 /* Set up DECL as a public symbol that can be defined in multiple
4434 translation units without generating a linker error. */
4436 void
4437 make_decl_one_only (tree decl)
4439 if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL)
4440 abort ();
4442 TREE_PUBLIC (decl) = 1;
4444 if (SUPPORTS_ONE_ONLY)
4446 #ifdef MAKE_DECL_ONE_ONLY
4447 MAKE_DECL_ONE_ONLY (decl);
4448 #endif
4449 DECL_ONE_ONLY (decl) = 1;
4451 else if (TREE_CODE (decl) == VAR_DECL
4452 && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
4453 DECL_COMMON (decl) = 1;
4454 else if (SUPPORTS_WEAK)
4455 DECL_WEAK (decl) = 1;
4456 else
4457 abort ();
4460 void
4461 init_varasm_once (void)
4463 in_named_htab = htab_create_ggc (31, in_named_entry_hash,
4464 in_named_entry_eq, NULL);
4465 const_desc_htab = htab_create_ggc (1009, const_desc_hash,
4466 const_desc_eq, NULL);
4468 const_alias_set = new_alias_set ();
4471 enum tls_model
4472 decl_tls_model (tree decl)
4474 enum tls_model kind;
4475 tree attr = lookup_attribute ("tls_model", DECL_ATTRIBUTES (decl));
4476 bool is_local;
4478 if (attr)
4480 attr = TREE_VALUE (TREE_VALUE (attr));
4481 if (TREE_CODE (attr) != STRING_CST)
4482 abort ();
4483 if (!strcmp (TREE_STRING_POINTER (attr), "local-exec"))
4484 kind = TLS_MODEL_LOCAL_EXEC;
4485 else if (!strcmp (TREE_STRING_POINTER (attr), "initial-exec"))
4486 kind = TLS_MODEL_INITIAL_EXEC;
4487 else if (!strcmp (TREE_STRING_POINTER (attr), "local-dynamic"))
4488 kind = optimize ? TLS_MODEL_LOCAL_DYNAMIC : TLS_MODEL_GLOBAL_DYNAMIC;
4489 else if (!strcmp (TREE_STRING_POINTER (attr), "global-dynamic"))
4490 kind = TLS_MODEL_GLOBAL_DYNAMIC;
4491 else
4492 abort ();
4493 return kind;
4496 is_local = targetm.binds_local_p (decl);
4497 if (!flag_pic)
4499 if (is_local)
4500 kind = TLS_MODEL_LOCAL_EXEC;
4501 else
4502 kind = TLS_MODEL_INITIAL_EXEC;
4504 /* Local dynamic is inefficient when we're not combining the
4505 parts of the address. */
4506 else if (optimize && is_local)
4507 kind = TLS_MODEL_LOCAL_DYNAMIC;
4508 else
4509 kind = TLS_MODEL_GLOBAL_DYNAMIC;
4510 if (kind < flag_tls_default)
4511 kind = flag_tls_default;
4513 return kind;
4516 /* Select a set of attributes for section NAME based on the properties
4517 of DECL and whether or not RELOC indicates that DECL's initializer
4518 might contain runtime relocations.
4520 We make the section read-only and executable for a function decl,
4521 read-only for a const data decl, and writable for a non-const data decl. */
4523 unsigned int
4524 default_section_type_flags (tree decl, const char *name, int reloc)
4526 return default_section_type_flags_1 (decl, name, reloc, flag_pic);
4529 unsigned int
4530 default_section_type_flags_1 (tree decl, const char *name, int reloc,
4531 int shlib)
4533 unsigned int flags;
4535 if (decl && TREE_CODE (decl) == FUNCTION_DECL)
4536 flags = SECTION_CODE;
4537 else if (decl && decl_readonly_section_1 (decl, reloc, shlib))
4538 flags = 0;
4539 else if (unlikely_text_section_name
4540 && strcmp (name, unlikely_text_section_name) == 0)
4541 flags = SECTION_CODE;
4542 else
4543 flags = SECTION_WRITE;
4545 if (decl && DECL_ONE_ONLY (decl))
4546 flags |= SECTION_LINKONCE;
4548 if (decl && TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
4549 flags |= SECTION_TLS | SECTION_WRITE;
4551 if (strcmp (name, ".bss") == 0
4552 || strncmp (name, ".bss.", 5) == 0
4553 || strncmp (name, ".gnu.linkonce.b.", 16) == 0
4554 || strcmp (name, ".sbss") == 0
4555 || strncmp (name, ".sbss.", 6) == 0
4556 || strncmp (name, ".gnu.linkonce.sb.", 17) == 0
4557 || strcmp (name, ".tbss") == 0
4558 || strncmp (name, ".gnu.linkonce.tb.", 17) == 0)
4559 flags |= SECTION_BSS;
4561 if (strcmp (name, ".tdata") == 0
4562 || strcmp (name, ".tbss") == 0
4563 || strncmp (name, ".gnu.linkonce.td.", 17) == 0
4564 || strncmp (name, ".gnu.linkonce.tb.", 17) == 0)
4565 flags |= SECTION_TLS;
4567 /* These three sections have special ELF types. They are neither
4568 SHT_PROGBITS nor SHT_NOBITS, so when changing sections we don't
4569 want to print a section type (@progbits or @nobits). If someone
4570 is silly enough to emit code or TLS variables to one of these
4571 sections, then don't handle them specially. */
4572 if (!(flags & (SECTION_CODE | SECTION_BSS | SECTION_TLS))
4573 && (strcmp (name, ".init_array") == 0
4574 || strcmp (name, ".fini_array") == 0
4575 || strcmp (name, ".preinit_array") == 0))
4576 flags |= SECTION_NOTYPE;
4578 return flags;
4581 /* Output assembly to switch to section NAME with attribute FLAGS.
4582 Four variants for common object file formats. */
4584 void
4585 default_no_named_section (const char *name ATTRIBUTE_UNUSED,
4586 unsigned int flags ATTRIBUTE_UNUSED,
4587 tree decl ATTRIBUTE_UNUSED)
4589 /* Some object formats don't support named sections at all. The
4590 front-end should already have flagged this as an error. */
4591 abort ();
4594 void
4595 default_elf_asm_named_section (const char *name, unsigned int flags,
4596 tree decl ATTRIBUTE_UNUSED)
4598 char flagchars[10], *f = flagchars;
4600 /* If we have already declared this section, we can use an
4601 abbreviated form to switch back to it -- unless this section is
4602 part of a COMDAT groups, in which case GAS requires the full
4603 declaration every time. */
4604 if (!(HAVE_GAS_COMDAT_GROUP && (flags & SECTION_LINKONCE))
4605 && ! named_section_first_declaration (name))
4607 fprintf (asm_out_file, "\t.section\t%s\n", name);
4608 return;
4611 if (!(flags & SECTION_DEBUG))
4612 *f++ = 'a';
4613 if (flags & SECTION_WRITE)
4614 *f++ = 'w';
4615 if (flags & SECTION_CODE)
4616 *f++ = 'x';
4617 if (flags & SECTION_SMALL)
4618 *f++ = 's';
4619 if (flags & SECTION_MERGE)
4620 *f++ = 'M';
4621 if (flags & SECTION_STRINGS)
4622 *f++ = 'S';
4623 if (flags & SECTION_TLS)
4624 *f++ = 'T';
4625 if (HAVE_GAS_COMDAT_GROUP && (flags & SECTION_LINKONCE))
4626 *f++ = 'G';
4627 *f = '\0';
4629 fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars);
4631 if (!(flags & SECTION_NOTYPE))
4633 const char *type;
4634 const char *format;
4636 if (flags & SECTION_BSS)
4637 type = "nobits";
4638 else
4639 type = "progbits";
4641 format = ",@%s";
4642 #ifdef ASM_COMMENT_START
4643 /* On platforms that use "@" as the assembly comment character,
4644 use "%" instead. */
4645 if (strcmp (ASM_COMMENT_START, "@") == 0)
4646 format = ",%%%s";
4647 #endif
4648 fprintf (asm_out_file, format, type);
4650 if (flags & SECTION_ENTSIZE)
4651 fprintf (asm_out_file, ",%d", flags & SECTION_ENTSIZE);
4652 if (HAVE_GAS_COMDAT_GROUP && (flags & SECTION_LINKONCE))
4653 fprintf (asm_out_file, ",%s,comdat",
4654 lang_hooks.decls.comdat_group (decl));
4657 putc ('\n', asm_out_file);
4660 void
4661 default_coff_asm_named_section (const char *name, unsigned int flags,
4662 tree decl ATTRIBUTE_UNUSED)
4664 char flagchars[8], *f = flagchars;
4666 if (flags & SECTION_WRITE)
4667 *f++ = 'w';
4668 if (flags & SECTION_CODE)
4669 *f++ = 'x';
4670 *f = '\0';
4672 fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars);
4675 void
4676 default_pe_asm_named_section (const char *name, unsigned int flags,
4677 tree decl)
4679 default_coff_asm_named_section (name, flags, decl);
4681 if (flags & SECTION_LINKONCE)
4683 /* Functions may have been compiled at various levels of
4684 optimization so we can't use `same_size' here.
4685 Instead, have the linker pick one. */
4686 fprintf (asm_out_file, "\t.linkonce %s\n",
4687 (flags & SECTION_CODE ? "discard" : "same_size"));
4691 /* The lame default section selector. */
4693 void
4694 default_select_section (tree decl, int reloc,
4695 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
4697 bool readonly = false;
4699 if (DECL_P (decl))
4701 if (decl_readonly_section (decl, reloc))
4702 readonly = true;
4704 else if (TREE_CODE (decl) == CONSTRUCTOR)
4706 if (! ((flag_pic && reloc)
4707 || !TREE_READONLY (decl)
4708 || TREE_SIDE_EFFECTS (decl)
4709 || !TREE_CONSTANT (decl)))
4710 readonly = true;
4712 else if (TREE_CODE (decl) == STRING_CST)
4713 readonly = true;
4714 else if (! (flag_pic && reloc))
4715 readonly = true;
4717 if (readonly)
4718 readonly_data_section ();
4719 else
4720 data_section ();
4723 /* A helper function for default_elf_select_section and
4724 default_elf_unique_section. Categorizes the DECL. */
4726 enum section_category
4728 SECCAT_TEXT,
4730 SECCAT_RODATA,
4731 SECCAT_RODATA_MERGE_STR,
4732 SECCAT_RODATA_MERGE_STR_INIT,
4733 SECCAT_RODATA_MERGE_CONST,
4734 SECCAT_SRODATA,
4736 SECCAT_DATA,
4738 /* To optimize loading of shared programs, define following subsections
4739 of data section:
4740 _REL Contains data that has relocations, so they get grouped
4741 together and dynamic linker will visit fewer pages in memory.
4742 _RO Contains data that is otherwise read-only. This is useful
4743 with prelinking as most relocations won't be dynamically
4744 linked and thus stay read only.
4745 _LOCAL Marks data containing relocations only to local objects.
4746 These relocations will get fully resolved by prelinking. */
4747 SECCAT_DATA_REL,
4748 SECCAT_DATA_REL_LOCAL,
4749 SECCAT_DATA_REL_RO,
4750 SECCAT_DATA_REL_RO_LOCAL,
4752 SECCAT_SDATA,
4753 SECCAT_TDATA,
4755 SECCAT_BSS,
4756 SECCAT_SBSS,
4757 SECCAT_TBSS
4760 static enum section_category
4761 categorize_decl_for_section (tree, int, int);
4763 static enum section_category
4764 categorize_decl_for_section (tree decl, int reloc, int shlib)
4766 enum section_category ret;
4768 if (TREE_CODE (decl) == FUNCTION_DECL)
4769 return SECCAT_TEXT;
4770 else if (TREE_CODE (decl) == STRING_CST)
4772 if (flag_mudflap) /* or !flag_merge_constants */
4773 return SECCAT_RODATA;
4774 else
4775 return SECCAT_RODATA_MERGE_STR;
4777 else if (TREE_CODE (decl) == VAR_DECL)
4779 if (DECL_INITIAL (decl) == NULL
4780 || DECL_INITIAL (decl) == error_mark_node
4781 || (flag_zero_initialized_in_bss
4782 /* Leave constant zeroes in .rodata so they can be shared. */
4783 && !TREE_READONLY (decl)
4784 && initializer_zerop (DECL_INITIAL (decl))))
4785 ret = SECCAT_BSS;
4786 else if (! TREE_READONLY (decl)
4787 || TREE_SIDE_EFFECTS (decl)
4788 || ! TREE_CONSTANT (DECL_INITIAL (decl)))
4790 if (shlib && (reloc & 2))
4791 ret = SECCAT_DATA_REL;
4792 else if (shlib && reloc)
4793 ret = SECCAT_DATA_REL_LOCAL;
4794 else
4795 ret = SECCAT_DATA;
4797 else if (shlib && (reloc & 2))
4798 ret = SECCAT_DATA_REL_RO;
4799 else if (shlib && reloc)
4800 ret = SECCAT_DATA_REL_RO_LOCAL;
4801 else if (reloc || flag_merge_constants < 2)
4802 /* C and C++ don't allow different variables to share the same
4803 location. -fmerge-all-constants allows even that (at the
4804 expense of not conforming). */
4805 ret = SECCAT_RODATA;
4806 else if (TREE_CODE (DECL_INITIAL (decl)) == STRING_CST)
4807 ret = SECCAT_RODATA_MERGE_STR_INIT;
4808 else
4809 ret = SECCAT_RODATA_MERGE_CONST;
4811 else if (TREE_CODE (decl) == CONSTRUCTOR)
4813 if ((shlib && reloc)
4814 || TREE_SIDE_EFFECTS (decl)
4815 || ! TREE_CONSTANT (decl))
4816 ret = SECCAT_DATA;
4817 else
4818 ret = SECCAT_RODATA;
4820 else
4821 ret = SECCAT_RODATA;
4823 /* There are no read-only thread-local sections. */
4824 if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
4826 /* Note that this would be *just* SECCAT_BSS, except that there's
4827 no concept of a read-only thread-local-data section. */
4828 if (ret == SECCAT_BSS
4829 || (flag_zero_initialized_in_bss
4830 && initializer_zerop (DECL_INITIAL (decl))))
4831 ret = SECCAT_TBSS;
4832 else
4833 ret = SECCAT_TDATA;
4836 /* If the target uses small data sections, select it. */
4837 else if (targetm.in_small_data_p (decl))
4839 if (ret == SECCAT_BSS)
4840 ret = SECCAT_SBSS;
4841 else if (targetm.have_srodata_section && ret == SECCAT_RODATA)
4842 ret = SECCAT_SRODATA;
4843 else
4844 ret = SECCAT_SDATA;
4847 return ret;
4850 bool
4851 decl_readonly_section (tree decl, int reloc)
4853 return decl_readonly_section_1 (decl, reloc, flag_pic);
4856 bool
4857 decl_readonly_section_1 (tree decl, int reloc, int shlib)
4859 switch (categorize_decl_for_section (decl, reloc, shlib))
4861 case SECCAT_RODATA:
4862 case SECCAT_RODATA_MERGE_STR:
4863 case SECCAT_RODATA_MERGE_STR_INIT:
4864 case SECCAT_RODATA_MERGE_CONST:
4865 case SECCAT_SRODATA:
4866 return true;
4867 break;
4868 default:
4869 return false;
4870 break;
4874 /* Select a section based on the above categorization. */
4876 void
4877 default_elf_select_section (tree decl, int reloc,
4878 unsigned HOST_WIDE_INT align)
4880 default_elf_select_section_1 (decl, reloc, align, flag_pic);
4883 void
4884 default_elf_select_section_1 (tree decl, int reloc,
4885 unsigned HOST_WIDE_INT align, int shlib)
4887 switch (categorize_decl_for_section (decl, reloc, shlib))
4889 case SECCAT_TEXT:
4890 /* We're not supposed to be called on FUNCTION_DECLs. */
4891 abort ();
4892 case SECCAT_RODATA:
4893 readonly_data_section ();
4894 break;
4895 case SECCAT_RODATA_MERGE_STR:
4896 mergeable_string_section (decl, align, 0);
4897 break;
4898 case SECCAT_RODATA_MERGE_STR_INIT:
4899 mergeable_string_section (DECL_INITIAL (decl), align, 0);
4900 break;
4901 case SECCAT_RODATA_MERGE_CONST:
4902 mergeable_constant_section (DECL_MODE (decl), align, 0);
4903 break;
4904 case SECCAT_SRODATA:
4905 named_section (NULL_TREE, ".sdata2", reloc);
4906 break;
4907 case SECCAT_DATA:
4908 data_section ();
4909 break;
4910 case SECCAT_DATA_REL:
4911 named_section (NULL_TREE, ".data.rel", reloc);
4912 break;
4913 case SECCAT_DATA_REL_LOCAL:
4914 named_section (NULL_TREE, ".data.rel.local", reloc);
4915 break;
4916 case SECCAT_DATA_REL_RO:
4917 named_section (NULL_TREE, ".data.rel.ro", reloc);
4918 break;
4919 case SECCAT_DATA_REL_RO_LOCAL:
4920 named_section (NULL_TREE, ".data.rel.ro.local", reloc);
4921 break;
4922 case SECCAT_SDATA:
4923 named_section (NULL_TREE, ".sdata", reloc);
4924 break;
4925 case SECCAT_TDATA:
4926 named_section (NULL_TREE, ".tdata", reloc);
4927 break;
4928 case SECCAT_BSS:
4929 #ifdef BSS_SECTION_ASM_OP
4930 bss_section ();
4931 #else
4932 named_section (NULL_TREE, ".bss", reloc);
4933 #endif
4934 break;
4935 case SECCAT_SBSS:
4936 named_section (NULL_TREE, ".sbss", reloc);
4937 break;
4938 case SECCAT_TBSS:
4939 named_section (NULL_TREE, ".tbss", reloc);
4940 break;
4941 default:
4942 abort ();
4946 /* Construct a unique section name based on the decl name and the
4947 categorization performed above. */
4949 void
4950 default_unique_section (tree decl, int reloc)
4952 default_unique_section_1 (decl, reloc, flag_pic);
4955 void
4956 default_unique_section_1 (tree decl, int reloc, int shlib)
4958 bool one_only = DECL_ONE_ONLY (decl);
4959 const char *prefix, *name;
4960 size_t nlen, plen;
4961 char *string;
4963 switch (categorize_decl_for_section (decl, reloc, shlib))
4965 case SECCAT_TEXT:
4966 prefix = one_only ? ".gnu.linkonce.t." : ".text.";
4967 break;
4968 case SECCAT_RODATA:
4969 case SECCAT_RODATA_MERGE_STR:
4970 case SECCAT_RODATA_MERGE_STR_INIT:
4971 case SECCAT_RODATA_MERGE_CONST:
4972 prefix = one_only ? ".gnu.linkonce.r." : ".rodata.";
4973 break;
4974 case SECCAT_SRODATA:
4975 prefix = one_only ? ".gnu.linkonce.s2." : ".sdata2.";
4976 break;
4977 case SECCAT_DATA:
4978 case SECCAT_DATA_REL:
4979 case SECCAT_DATA_REL_LOCAL:
4980 case SECCAT_DATA_REL_RO:
4981 case SECCAT_DATA_REL_RO_LOCAL:
4982 prefix = one_only ? ".gnu.linkonce.d." : ".data.";
4983 break;
4984 case SECCAT_SDATA:
4985 prefix = one_only ? ".gnu.linkonce.s." : ".sdata.";
4986 break;
4987 case SECCAT_BSS:
4988 prefix = one_only ? ".gnu.linkonce.b." : ".bss.";
4989 break;
4990 case SECCAT_SBSS:
4991 prefix = one_only ? ".gnu.linkonce.sb." : ".sbss.";
4992 break;
4993 case SECCAT_TDATA:
4994 prefix = one_only ? ".gnu.linkonce.td." : ".tdata.";
4995 break;
4996 case SECCAT_TBSS:
4997 prefix = one_only ? ".gnu.linkonce.tb." : ".tbss.";
4998 break;
4999 default:
5000 abort ();
5002 plen = strlen (prefix);
5004 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
5005 name = targetm.strip_name_encoding (name);
5006 nlen = strlen (name);
5008 string = alloca (nlen + plen + 1);
5009 memcpy (string, prefix, plen);
5010 memcpy (string + plen, name, nlen + 1);
5012 DECL_SECTION_NAME (decl) = build_string (nlen + plen, string);
5015 void
5016 default_select_rtx_section (enum machine_mode mode ATTRIBUTE_UNUSED,
5017 rtx x,
5018 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
5020 if (flag_pic)
5021 switch (GET_CODE (x))
5023 case CONST:
5024 case SYMBOL_REF:
5025 case LABEL_REF:
5026 data_section ();
5027 return;
5029 default:
5030 break;
5033 readonly_data_section ();
5036 void
5037 default_elf_select_rtx_section (enum machine_mode mode, rtx x,
5038 unsigned HOST_WIDE_INT align)
5040 /* ??? Handle small data here somehow. */
5042 if (flag_pic)
5043 switch (GET_CODE (x))
5045 case CONST:
5046 case SYMBOL_REF:
5047 named_section (NULL_TREE, ".data.rel.ro", 3);
5048 return;
5050 case LABEL_REF:
5051 named_section (NULL_TREE, ".data.rel.ro.local", 1);
5052 return;
5054 default:
5055 break;
5058 mergeable_constant_section (mode, align, 0);
5061 /* Set the generally applicable flags on the SYMBOL_REF for EXP. */
5063 void
5064 default_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
5066 rtx symbol;
5067 int flags;
5069 /* Careful not to prod global register variables. */
5070 if (!MEM_P (rtl))
5071 return;
5072 symbol = XEXP (rtl, 0);
5073 if (GET_CODE (symbol) != SYMBOL_REF)
5074 return;
5076 flags = 0;
5077 if (TREE_CODE (decl) == FUNCTION_DECL)
5078 flags |= SYMBOL_FLAG_FUNCTION;
5079 if (targetm.binds_local_p (decl))
5080 flags |= SYMBOL_FLAG_LOCAL;
5081 if (targetm.in_small_data_p (decl))
5082 flags |= SYMBOL_FLAG_SMALL;
5083 if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL (decl))
5084 flags |= decl_tls_model (decl) << SYMBOL_FLAG_TLS_SHIFT;
5085 /* ??? Why is DECL_EXTERNAL ever set for non-PUBLIC names? Without
5086 being PUBLIC, the thing *must* be defined in this translation unit.
5087 Prevent this buglet from being propagated into rtl code as well. */
5088 if (DECL_P (decl) && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
5089 flags |= SYMBOL_FLAG_EXTERNAL;
5091 SYMBOL_REF_FLAGS (symbol) = flags;
5094 /* By default, we do nothing for encode_section_info, so we need not
5095 do anything but discard the '*' marker. */
5097 const char *
5098 default_strip_name_encoding (const char *str)
5100 return str + (*str == '*');
5103 /* Assume ELF-ish defaults, since that's pretty much the most liberal
5104 wrt cross-module name binding. */
5106 bool
5107 default_binds_local_p (tree exp)
5109 return default_binds_local_p_1 (exp, flag_shlib);
5112 bool
5113 default_binds_local_p_1 (tree exp, int shlib)
5115 bool local_p;
5117 /* A non-decl is an entry in the constant pool. */
5118 if (!DECL_P (exp))
5119 local_p = true;
5120 /* Static variables are always local. */
5121 else if (! TREE_PUBLIC (exp))
5122 local_p = true;
5123 /* A variable is local if the user explicitly tells us so. */
5124 else if (DECL_VISIBILITY_SPECIFIED (exp) && DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
5125 local_p = true;
5126 /* Otherwise, variables defined outside this object may not be local. */
5127 else if (DECL_EXTERNAL (exp))
5128 local_p = false;
5129 /* Linkonce and weak data are never local. */
5130 else if (DECL_ONE_ONLY (exp) || DECL_WEAK (exp))
5131 local_p = false;
5132 /* If none of the above and visibility is not default, make local. */
5133 else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
5134 local_p = true;
5135 /* If PIC, then assume that any global name can be overridden by
5136 symbols resolved from other modules. */
5137 else if (shlib)
5138 local_p = false;
5139 /* Uninitialized COMMON variable may be unified with symbols
5140 resolved from other modules. */
5141 else if (DECL_COMMON (exp)
5142 && (DECL_INITIAL (exp) == NULL
5143 || DECL_INITIAL (exp) == error_mark_node))
5144 local_p = false;
5145 /* Otherwise we're left with initialized (or non-common) global data
5146 which is of necessity defined locally. */
5147 else
5148 local_p = true;
5150 return local_p;
5153 /* Determine whether or not a pointer mode is valid. Assume defaults
5154 of ptr_mode or Pmode - can be overridden. */
5155 bool
5156 default_valid_pointer_mode (enum machine_mode mode)
5158 return (mode == ptr_mode || mode == Pmode);
5161 /* Default function to output code that will globalize a label. A
5162 target must define GLOBAL_ASM_OP or provide it's own function to
5163 globalize a label. */
5164 #ifdef GLOBAL_ASM_OP
5165 void
5166 default_globalize_label (FILE * stream, const char *name)
5168 fputs (GLOBAL_ASM_OP, stream);
5169 assemble_name (stream, name);
5170 putc ('\n', stream);
5172 #endif /* GLOBAL_ASM_OP */
5174 /* Default function to output a label for unwind information. The
5175 default is to do nothing. A target that needs nonlocal labels for
5176 unwind information must provide its own function to do this. */
5177 void
5178 default_emit_unwind_label (FILE * stream ATTRIBUTE_UNUSED,
5179 tree decl ATTRIBUTE_UNUSED,
5180 int for_eh ATTRIBUTE_UNUSED,
5181 int empty ATTRIBUTE_UNUSED)
5185 /* This is how to output an internal numbered label where PREFIX is
5186 the class of label and LABELNO is the number within the class. */
5188 void
5189 default_internal_label (FILE *stream, const char *prefix,
5190 unsigned long labelno)
5192 char *const buf = alloca (40 + strlen (prefix));
5193 ASM_GENERATE_INTERNAL_LABEL (buf, prefix, labelno);
5194 ASM_OUTPUT_LABEL (stream, buf);
5197 /* This is the default behavior at the beginning of a file. It's
5198 controlled by two other target-hook toggles. */
5199 void
5200 default_file_start (void)
5202 if (targetm.file_start_app_off && !flag_verbose_asm)
5203 fputs (ASM_APP_OFF, asm_out_file);
5205 if (targetm.file_start_file_directive)
5206 output_file_directive (asm_out_file, main_input_filename);
5209 /* This is a generic routine suitable for use as TARGET_ASM_FILE_END
5210 which emits a special section directive used to indicate whether or
5211 not this object file needs an executable stack. This is primarily
5212 a GNU extension to ELF but could be used on other targets. */
5214 int trampolines_created;
5216 void
5217 file_end_indicate_exec_stack (void)
5219 unsigned int flags = SECTION_DEBUG;
5220 if (trampolines_created)
5221 flags |= SECTION_CODE;
5223 named_section_flags (".note.GNU-stack", flags);
5226 #include "gt-varasm.h"