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 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
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
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
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. */
37 #include "hard-reg-set.h"
50 #ifdef XCOFF_DEBUGGING_INFO
51 #include "xcoffout.h" /* Needed for external data
52 declarations for e.g. AIX 4.x. */
55 #ifndef TRAMPOLINE_ALIGNMENT
56 #define TRAMPOLINE_ALIGNMENT FUNCTION_BOUNDARY
60 #define ASM_STABS_OP "\t.stabs\t"
63 /* Define the prefix to use when check_memory_usage_flag is enable. */
64 #define CHKR_PREFIX "_CHKR_"
65 #define CHKR_PREFIX_SIZE (sizeof (CHKR_PREFIX) - 1)
67 /* The (assembler) name of the first globally-visible object output. */
68 const char *first_global_object_name;
69 const char *weak_global_object_name;
71 extern struct obstack permanent_obstack;
72 #define obstack_chunk_alloc xmalloc
75 struct constant_descriptor;
79 #define MAX_RTX_HASH_TABLE 61
83 /* Hash facility for making memory-constants
84 from constant rtl-expressions. It is used on RISC machines
85 where immediate integer arguments and constant addresses are restricted
86 so that such constants must be stored in memory.
88 This pool of constants is reinitialized for each function
89 so each function gets its own constants-pool that comes right before
91 struct constant_descriptor **x_const_rtx_hash_table;
92 struct pool_constant **x_const_rtx_sym_hash_table;
94 /* Pointers to first and last constant in pool. */
95 struct pool_constant *x_first_pool, *x_last_pool;
97 /* Current offset in constant pool (does not include any machine-specific
101 /* Chain of all CONST_DOUBLE rtx's constructed for the current function.
102 They are chained through the CONST_DOUBLE_CHAIN.
103 A CONST_DOUBLE rtx has CONST_DOUBLE_MEM != cc0_rtx iff it is on this chain.
104 In that case, CONST_DOUBLE_MEM is either a MEM,
105 or const0_rtx if no MEM has been made for this CONST_DOUBLE yet. */
106 rtx x_const_double_chain;
109 #define const_rtx_hash_table (cfun->varasm->x_const_rtx_hash_table)
110 #define const_rtx_sym_hash_table (cfun->varasm->x_const_rtx_sym_hash_table)
111 #define first_pool (cfun->varasm->x_first_pool)
112 #define last_pool (cfun->varasm->x_last_pool)
113 #define pool_offset (cfun->varasm->x_pool_offset)
114 #define const_double_chain (cfun->varasm->x_const_double_chain)
116 /* Number for making the label on the next
117 constant that is stored in memory. */
121 /* Number for making the label on the next
122 static variable internal to a function. */
126 /* Carry information from ASM_DECLARE_OBJECT_NAME
127 to ASM_FINISH_DECLARE_OBJECT. */
129 int size_directive_output;
131 /* The last decl for which assemble_variable was called,
132 if it did ASM_DECLARE_OBJECT_NAME.
133 If the last call to assemble_variable didn't do that,
136 tree last_assemble_variable_decl;
138 static const char *strip_reg_name PARAMS ((const char *));
139 static int contains_pointers_p PARAMS ((tree));
140 static void assemble_real_1 PARAMS ((PTR));
141 static void decode_addr_const PARAMS ((tree, struct addr_const *));
142 static int const_hash PARAMS ((tree));
143 static int compare_constant PARAMS ((tree,
144 struct constant_descriptor *));
145 static const unsigned char *compare_constant_1 PARAMS ((tree, const unsigned char *));
146 static struct constant_descriptor *record_constant PARAMS ((tree));
147 static void record_constant_1 PARAMS ((tree));
148 static tree copy_constant PARAMS ((tree));
149 static void output_constant_def_contents PARAMS ((tree, int, int));
150 static void decode_rtx_const PARAMS ((enum machine_mode, rtx,
151 struct rtx_const *));
152 static int const_hash_rtx PARAMS ((enum machine_mode, rtx));
153 static int compare_constant_rtx PARAMS ((enum machine_mode, rtx,
154 struct constant_descriptor *));
155 static struct constant_descriptor *record_constant_rtx PARAMS ((enum machine_mode,
157 static struct pool_constant *find_pool_constant PARAMS ((struct function *, rtx));
158 static void mark_constant_pool PARAMS ((void));
159 static void mark_constants PARAMS ((rtx));
160 static int mark_constant PARAMS ((rtx *current_rtx, void *data));
161 static int output_addressed_constants PARAMS ((tree));
162 static void output_after_function_constants PARAMS ((void));
163 static unsigned HOST_WIDE_INT array_size_for_constructor PARAMS ((tree));
164 static unsigned min_align PARAMS ((unsigned, unsigned));
165 static void output_constructor PARAMS ((tree, int, unsigned));
166 static void remove_from_pending_weak_list PARAMS ((const char *));
167 static int in_named_entry_eq PARAMS ((const PTR, const PTR));
168 static hashval_t in_named_entry_hash PARAMS ((const PTR));
169 #ifdef ASM_OUTPUT_BSS
170 static void asm_output_bss PARAMS ((FILE *, tree, const char *, int, int));
172 #ifdef BSS_SECTION_ASM_OP
173 #ifdef ASM_OUTPUT_ALIGNED_BSS
174 static void asm_output_aligned_bss PARAMS ((FILE *, tree, const char *,
177 #endif /* BSS_SECTION_ASM_OP */
178 static void mark_pool_constant PARAMS ((struct pool_constant *));
179 static void mark_const_hash_entry PARAMS ((void *));
180 static int mark_const_str_htab_1 PARAMS ((void **, void *));
181 static void mark_const_str_htab PARAMS ((void *));
182 static hashval_t const_str_htab_hash PARAMS ((const void *x));
183 static int const_str_htab_eq PARAMS ((const void *x, const void *y));
184 static void const_str_htab_del PARAMS ((void *));
185 static void asm_emit_uninitialised PARAMS ((tree, const char*, int, int));
186 static void resolve_unique_section PARAMS ((tree, int));
188 static enum in_section { no_section, in_text, in_data, in_named
189 #ifdef BSS_SECTION_ASM_OP
192 #ifdef CTORS_SECTION_ASM_OP
195 #ifdef DTORS_SECTION_ASM_OP
198 #ifdef EXTRA_SECTIONS
201 } in_section = no_section;
203 /* Return a non-zero value if DECL has a section attribute. */
204 #ifndef IN_NAMED_SECTION
205 #define IN_NAMED_SECTION(DECL) \
206 ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \
207 && DECL_SECTION_NAME (DECL) != NULL_TREE)
210 /* Text of section name when in_section == in_named. */
211 static const char *in_named_name;
213 /* Hash table of flags that have been used for a particular named section. */
215 struct in_named_entry
221 static htab_t in_named_htab;
223 /* Define functions like text_section for any extra sections. */
224 #ifdef EXTRA_SECTION_FUNCTIONS
225 EXTRA_SECTION_FUNCTIONS
228 /* Tell assembler to switch to text section. */
233 if (in_section != in_text)
238 fprintf (asm_out_file, "%s\n", TEXT_SECTION_ASM_OP);
240 in_section = in_text;
244 /* Tell assembler to switch to data section. */
249 if (in_section != in_data)
251 if (flag_shared_data)
253 #ifdef SHARED_SECTION_ASM_OP
254 fprintf (asm_out_file, "%s\n", SHARED_SECTION_ASM_OP);
256 fprintf (asm_out_file, "%s\n", DATA_SECTION_ASM_OP);
260 fprintf (asm_out_file, "%s\n", DATA_SECTION_ASM_OP);
262 in_section = in_data;
265 /* Tell assembler to ALWAYS switch to data section, in case
266 it's not sure where it is. */
269 force_data_section ()
271 in_section = no_section;
275 /* Tell assembler to switch to read-only data section. This is normally
279 readonly_data_section ()
281 #ifdef READONLY_DATA_SECTION
282 READONLY_DATA_SECTION (); /* Note this can call data_section. */
288 /* Determine if we're in the text section. */
293 return in_section == in_text;
296 /* Determine if we're in the data section. */
301 return in_section == in_data;
304 /* Helper routines for maintaining in_named_htab. */
307 in_named_entry_eq (p1, p2)
311 const struct in_named_entry *old = p1;
312 const char *new = p2;
314 return strcmp (old->name, new) == 0;
318 in_named_entry_hash (p)
321 const struct in_named_entry *old = p;
322 return htab_hash_string (old->name);
325 /* If SECTION has been seen before as a named section, return the flags
326 that were used. Otherwise, return 0. Note, that 0 is a perfectly valid
327 set of flags for a section to have, so 0 does not mean that the section
328 has not been seen. */
331 get_named_section_flags (section)
334 struct in_named_entry **slot;
336 slot = (struct in_named_entry**)
337 htab_find_slot_with_hash (in_named_htab, section,
338 htab_hash_string (section), NO_INSERT);
340 return slot ? (*slot)->flags : 0;
343 /* Record FLAGS for SECTION. If SECTION was previously recorded with a
344 different set of flags, return false. */
347 set_named_section_flags (section, flags)
351 struct in_named_entry **slot, *entry;
353 slot = (struct in_named_entry**)
354 htab_find_slot_with_hash (in_named_htab, section,
355 htab_hash_string (section), INSERT);
360 entry = (struct in_named_entry *) xmalloc (sizeof (*entry));
362 entry->name = ggc_strdup (section);
363 entry->flags = flags;
365 else if (entry->flags != flags)
371 /* Tell assembler to change to section NAME with attributes FLAGS. */
374 named_section_flags (name, flags)
378 if (in_section != in_named || strcmp (name, in_named_name) != 0)
380 if (! set_named_section_flags (name, flags))
383 (* targetm.asm_out.named_section) (name, flags);
385 if (flags & SECTION_FORGET)
386 in_section = no_section;
389 in_named_name = ggc_strdup (name);
390 in_section = in_named;
395 /* Tell assembler to change to section NAME for DECL.
396 If DECL is NULL, just switch to section NAME.
397 If NAME is NULL, get the name from DECL.
398 If RELOC is 1, the initializer for DECL contains relocs. */
401 named_section (decl, name, reloc)
408 if (decl != NULL_TREE && !DECL_P (decl))
411 name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
413 flags = (* targetm.section_type_flags) (decl, name, reloc);
415 /* Sanity check user variables for flag changes. Non-user
416 section flag changes will abort in named_section_flags. */
417 if (decl && ! set_named_section_flags (name, flags))
419 error_with_decl (decl, "%s causes a section type conflict");
420 flags = get_named_section_flags (name);
423 named_section_flags (name, flags);
426 /* If required, set DECL_SECTION_NAME to a unique name. */
429 resolve_unique_section (decl, reloc)
431 int reloc ATTRIBUTE_UNUSED;
433 if (DECL_SECTION_NAME (decl) == NULL_TREE
434 && (flag_function_sections
435 || (targetm.have_named_sections
436 && DECL_ONE_ONLY (decl))))
437 UNIQUE_SECTION (decl, reloc);
440 #ifdef BSS_SECTION_ASM_OP
442 /* Tell the assembler to switch to the bss section. */
447 if (in_section != in_bss)
449 #ifdef SHARED_BSS_SECTION_ASM_OP
450 if (flag_shared_data)
451 fprintf (asm_out_file, "%s\n", SHARED_BSS_SECTION_ASM_OP);
454 fprintf (asm_out_file, "%s\n", BSS_SECTION_ASM_OP);
460 #ifdef ASM_OUTPUT_BSS
462 /* Utility function for ASM_OUTPUT_BSS for targets to use if
463 they don't support alignments in .bss.
464 ??? It is believed that this function will work in most cases so such
465 support is localized here. */
468 asm_output_bss (file, decl, name, size, rounded)
470 tree decl ATTRIBUTE_UNUSED;
472 int size ATTRIBUTE_UNUSED, rounded;
474 ASM_GLOBALIZE_LABEL (file, name);
476 #ifdef ASM_DECLARE_OBJECT_NAME
477 last_assemble_variable_decl = decl;
478 ASM_DECLARE_OBJECT_NAME (file, name, decl);
480 /* Standard thing is just output label for the object. */
481 ASM_OUTPUT_LABEL (file, name);
482 #endif /* ASM_DECLARE_OBJECT_NAME */
483 ASM_OUTPUT_SKIP (file, rounded);
488 #ifdef ASM_OUTPUT_ALIGNED_BSS
490 /* Utility function for targets to use in implementing
491 ASM_OUTPUT_ALIGNED_BSS.
492 ??? It is believed that this function will work in most cases so such
493 support is localized here. */
496 asm_output_aligned_bss (file, decl, name, size, align)
502 ASM_GLOBALIZE_LABEL (file, name);
504 ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
505 #ifdef ASM_DECLARE_OBJECT_NAME
506 last_assemble_variable_decl = decl;
507 ASM_DECLARE_OBJECT_NAME (file, name, decl);
509 /* Standard thing is just output label for the object. */
510 ASM_OUTPUT_LABEL (file, name);
511 #endif /* ASM_DECLARE_OBJECT_NAME */
512 ASM_OUTPUT_SKIP (file, size ? size : 1);
517 #endif /* BSS_SECTION_ASM_OP */
519 /* Switch to the section for function DECL.
521 If DECL is NULL_TREE, switch to the text section.
522 ??? It's not clear that we will ever be passed NULL_TREE, but it's
523 safer to handle it. */
526 function_section (decl)
529 if (decl != NULL_TREE
530 && DECL_SECTION_NAME (decl) != NULL_TREE)
531 named_section (decl, (char *) 0, 0);
536 /* Switch to section for variable DECL.
538 RELOC is the `reloc' argument to SELECT_SECTION. */
541 variable_section (decl, reloc)
545 if (IN_NAMED_SECTION (decl))
546 named_section (decl, NULL, reloc);
549 /* C++ can have const variables that get initialized from constructors,
550 and thus can not be in a readonly section. We prevent this by
551 verifying that the initial value is constant for objects put in a
554 error_mark_node is used by the C front end to indicate that the
555 initializer has not been seen yet. In this case, we assume that
556 the initializer must be constant.
558 C++ uses error_mark_node for variables that have complicated
559 initializers, but these variables go in BSS so we won't be called
562 #ifdef SELECT_SECTION
563 SELECT_SECTION (decl, reloc, DECL_ALIGN (decl));
565 if (DECL_READONLY_SECTION (decl, reloc))
566 readonly_data_section ();
573 /* Tell assembler to switch to the section for the exception handling
579 #if defined (EXCEPTION_SECTION)
580 EXCEPTION_SECTION ();
582 if (targetm.have_named_sections)
583 named_section (NULL_TREE, ".gcc_except_table", 0);
587 readonly_data_section ();
591 /* Tell assembler to switch to the section for string merging. */
594 mergeable_string_section (decl, align, flags)
595 tree decl ATTRIBUTE_UNUSED;
596 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED;
597 unsigned int flags ATTRIBUTE_UNUSED;
599 #ifdef HAVE_GAS_SHF_MERGE
600 if (flag_merge_constants
601 && TREE_CODE (decl) == STRING_CST
602 && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
604 && TREE_STRING_LENGTH (decl) >= int_size_in_bytes (TREE_TYPE (decl)))
606 enum machine_mode mode;
607 unsigned int modesize;
612 mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (decl)));
613 modesize = GET_MODE_BITSIZE (mode);
614 if (modesize >= 8 && modesize <= 256
615 && (modesize & (modesize - 1)) == 0)
617 if (align < modesize)
620 str = TREE_STRING_POINTER (decl);
621 len = TREE_STRING_LENGTH (decl);
622 unit = GET_MODE_SIZE (mode);
624 /* Check for embedded NUL characters. */
625 for (i = 0; i < len; i += unit)
627 for (j = 0; j < unit; j++)
628 if (str [i + j] != '\0')
635 sprintf (name, ".rodata.str%d.%d", modesize / 8,
637 flags |= (modesize / 8) | SECTION_MERGE | SECTION_STRINGS;
638 if (!i && modesize < align)
640 /* A "" string with requested alignment greater than
641 character size might cause a problem:
642 if some other string required even bigger
643 alignment than "", then linker might think the
644 "" is just part of padding after some other string
645 and not put it into the hash table initially.
646 But this means "" could have smaller alignment
648 #ifdef ASM_OUTPUT_SECTION_START
649 named_section_flags (name, flags);
650 ASM_OUTPUT_SECTION_START (asm_out_file);
652 readonly_data_section ();
657 named_section_flags (name, flags);
663 readonly_data_section ();
666 /* Tell assembler to switch to the section for constant merging. */
669 mergeable_constant_section (mode, align, flags)
670 enum machine_mode mode ATTRIBUTE_UNUSED;
671 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED;
672 unsigned int flags ATTRIBUTE_UNUSED;
674 #ifdef HAVE_GAS_SHF_MERGE
675 unsigned int modesize = GET_MODE_BITSIZE (mode);
677 if (flag_merge_constants
683 && (align & (align - 1)) == 0)
687 sprintf (name, ".rodata.cst%d", (int) (align / 8));
688 flags |= (align / 8) | SECTION_MERGE;
689 named_section_flags (name, flags);
693 readonly_data_section ();
696 /* Given NAME, a putative register name, discard any customary prefixes. */
699 strip_reg_name (name)
702 #ifdef REGISTER_PREFIX
703 if (!strncmp (name, REGISTER_PREFIX, strlen (REGISTER_PREFIX)))
704 name += strlen (REGISTER_PREFIX);
706 if (name[0] == '%' || name[0] == '#')
711 /* Decode an `asm' spec for a declaration as a register name.
712 Return the register number, or -1 if nothing specified,
713 or -2 if the ASMSPEC is not `cc' or `memory' and is not recognized,
714 or -3 if ASMSPEC is `cc' and is not recognized,
715 or -4 if ASMSPEC is `memory' and is not recognized.
716 Accept an exact spelling or a decimal number.
717 Prefixes such as % are optional. */
720 decode_reg_name (asmspec)
727 /* Get rid of confusing prefixes. */
728 asmspec = strip_reg_name (asmspec);
730 /* Allow a decimal number as a "register name". */
731 for (i = strlen (asmspec) - 1; i >= 0; i--)
732 if (! (asmspec[i] >= '0' && asmspec[i] <= '9'))
734 if (asmspec[0] != 0 && i < 0)
737 if (i < FIRST_PSEUDO_REGISTER && i >= 0)
743 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
745 && ! strcmp (asmspec, strip_reg_name (reg_names[i])))
748 #ifdef ADDITIONAL_REGISTER_NAMES
750 static const struct { const char *const name; const int number; } table[]
751 = ADDITIONAL_REGISTER_NAMES;
753 for (i = 0; i < (int) ARRAY_SIZE (table); i++)
754 if (! strcmp (asmspec, table[i].name))
755 return table[i].number;
757 #endif /* ADDITIONAL_REGISTER_NAMES */
759 if (!strcmp (asmspec, "memory"))
762 if (!strcmp (asmspec, "cc"))
771 /* Create the DECL_RTL for a VAR_DECL or FUNCTION_DECL. DECL should
772 have static storage duration. In other words, it should not be an
773 automatic variable, including PARM_DECLs.
775 There is, however, one exception: this function handles variables
776 explicitly placed in a particular register by the user.
778 ASMSPEC, if not 0, is the string which the user specified as the
779 assembler symbol name.
781 This is never called for PARM_DECL nodes. */
784 make_decl_rtl (decl, asmspec)
788 int top_level = (DECL_CONTEXT (decl) == NULL_TREE);
789 const char *name = 0;
790 const char *new_name = 0;
794 /* Check that we are not being given an automatic variable. */
795 /* A weak alias has TREE_PUBLIC set but not the other bits. */
796 if (TREE_CODE (decl) == PARM_DECL
797 || TREE_CODE (decl) == RESULT_DECL
798 || (TREE_CODE (decl) == VAR_DECL
799 && !TREE_STATIC (decl)
800 && !TREE_PUBLIC (decl)
801 && !DECL_EXTERNAL (decl)
802 && !DECL_REGISTER (decl)))
804 /* And that we were not given a type or a label. */
805 else if (TREE_CODE (decl) == TYPE_DECL
806 || TREE_CODE (decl) == LABEL_DECL)
809 /* For a duplicate declaration, we can be called twice on the
810 same DECL node. Don't discard the RTL already made. */
811 if (DECL_RTL_SET_P (decl))
813 /* If the old RTL had the wrong mode, fix the mode. */
814 if (GET_MODE (DECL_RTL (decl)) != DECL_MODE (decl))
816 rtx rtl = DECL_RTL (decl);
817 PUT_MODE (rtl, DECL_MODE (decl));
820 /* ??? Another way to do this would be to do what halfpic.c does
821 and maintain a hashed table of such critters. */
822 /* ??? Another way to do this would be to pass a flag bit to
823 ENCODE_SECTION_INFO saying whether this is a new decl or not. */
824 /* Let the target reassign the RTL if it wants.
825 This is necessary, for example, when one machine specific
826 decl attribute overrides another. */
827 #ifdef REDO_SECTION_INFO_P
828 if (REDO_SECTION_INFO_P (decl))
829 ENCODE_SECTION_INFO (decl);
834 new_name = name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
836 reg_number = decode_reg_name (asmspec);
837 if (reg_number == -2)
839 /* ASMSPEC is given, and not the name of a register. Mark the
840 name with a star so assemble_name won't munge it. */
841 char *starred = alloca (strlen (asmspec) + 2);
843 strcpy (starred + 1, asmspec);
847 if (TREE_CODE (decl) != FUNCTION_DECL && DECL_REGISTER (decl))
849 /* First detect errors in declaring global registers. */
850 if (reg_number == -1)
851 error_with_decl (decl, "register name not specified for `%s'");
852 else if (reg_number < 0)
853 error_with_decl (decl, "invalid register name for `%s'");
854 else if (TYPE_MODE (TREE_TYPE (decl)) == BLKmode)
855 error_with_decl (decl,
856 "data type of `%s' isn't suitable for a register");
857 else if (! HARD_REGNO_MODE_OK (reg_number, TYPE_MODE (TREE_TYPE (decl))))
858 error_with_decl (decl,
859 "register specified for `%s' isn't suitable for data type");
860 /* Now handle properly declared static register variables. */
865 if (DECL_INITIAL (decl) != 0 && TREE_STATIC (decl))
867 DECL_INITIAL (decl) = 0;
868 error ("global register variable has initial value");
870 if (TREE_THIS_VOLATILE (decl))
871 warning ("volatile register variables don't work as you might wish");
873 /* If the user specified one of the eliminables registers here,
874 e.g., FRAME_POINTER_REGNUM, we don't want to get this variable
875 confused with that register and be eliminated. Although this
876 usage is somewhat suspect, we nevertheless use the following
877 kludge to avoid setting DECL_RTL to frame_pointer_rtx. */
880 gen_rtx_REG (DECL_MODE (decl),
881 FIRST_PSEUDO_REGISTER));
882 REGNO (DECL_RTL (decl)) = reg_number;
883 REG_USERVAR_P (DECL_RTL (decl)) = 1;
885 if (TREE_STATIC (decl))
887 /* Make this register global, so not usable for anything
889 #ifdef ASM_DECLARE_REGISTER_GLOBAL
890 ASM_DECLARE_REGISTER_GLOBAL (asm_out_file, decl, reg_number, name);
892 nregs = HARD_REGNO_NREGS (reg_number, DECL_MODE (decl));
894 globalize_reg (reg_number + --nregs);
897 /* As a register variable, it has no section. */
902 /* Now handle ordinary static variables and functions (in memory).
903 Also handle vars declared register invalidly. */
905 if (reg_number >= 0 || reg_number == -3)
906 error_with_decl (decl,
907 "register name given for non-register variable `%s'");
909 /* Specifying a section attribute on a variable forces it into a
910 non-.bss section, and thus it cannot be common. */
911 if (TREE_CODE (decl) == VAR_DECL
912 && DECL_SECTION_NAME (decl) != NULL_TREE
913 && DECL_INITIAL (decl) == NULL_TREE
914 && DECL_COMMON (decl))
915 DECL_COMMON (decl) = 0;
917 /* Can't use just the variable's own name for a variable
918 whose scope is less than the whole file, unless it's a member
919 of a local class (which will already be unambiguous).
920 Concatenate a distinguishing number. */
921 if (!top_level && !TREE_PUBLIC (decl)
922 && ! (DECL_CONTEXT (decl) && TYPE_P (DECL_CONTEXT (decl)))
924 && name == IDENTIFIER_POINTER (DECL_NAME (decl)))
927 ASM_FORMAT_PRIVATE_NAME (label, name, var_labelno);
932 /* When -fprefix-function-name is used, the functions
933 names are prefixed. Only nested function names are not
935 else if (flag_prefix_function_name && TREE_CODE (decl) == FUNCTION_DECL)
937 size_t name_len = IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (decl));
940 pname = alloca (name_len + CHKR_PREFIX_SIZE + 1);
941 memcpy (pname, CHKR_PREFIX, CHKR_PREFIX_SIZE);
942 memcpy (pname + CHKR_PREFIX_SIZE, name, name_len + 1);
946 if (name != new_name)
948 SET_DECL_ASSEMBLER_NAME (decl, get_identifier (new_name));
949 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
952 /* If this variable is to be treated as volatile, show its
953 tree node has side effects. */
954 if ((flag_volatile_global && TREE_CODE (decl) == VAR_DECL
955 && TREE_PUBLIC (decl))
956 || ((flag_volatile_static && TREE_CODE (decl) == VAR_DECL
957 && (TREE_PUBLIC (decl) || TREE_STATIC (decl)))))
958 TREE_SIDE_EFFECTS (decl) = 1;
960 x = gen_rtx_MEM (DECL_MODE (decl), gen_rtx_SYMBOL_REF (Pmode, name));
961 SYMBOL_REF_WEAK (XEXP (x, 0)) = DECL_WEAK (decl);
962 if (TREE_CODE (decl) != FUNCTION_DECL)
963 set_mem_attributes (x, decl, 1);
964 SET_DECL_RTL (decl, x);
966 /* Optionally set flags or add text to the name to record information
967 such as that it is a function name.
968 If the name is changed, the macro ASM_OUTPUT_LABELREF
969 will have to know how to strip this information. */
970 #ifdef ENCODE_SECTION_INFO
971 ENCODE_SECTION_INFO (decl);
975 /* Make the rtl for variable VAR be volatile.
976 Use this only for static variables. */
979 make_var_volatile (var)
982 if (GET_CODE (DECL_RTL (var)) != MEM)
985 MEM_VOLATILE_P (DECL_RTL (var)) = 1;
988 /* Output alignment directive to align for constant expression EXP. */
991 assemble_constant_align (exp)
996 /* Align the location counter as required by EXP's data type. */
997 align = TYPE_ALIGN (TREE_TYPE (exp));
998 #ifdef CONSTANT_ALIGNMENT
999 align = CONSTANT_ALIGNMENT (exp, align);
1002 if (align > BITS_PER_UNIT)
1003 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
1006 /* Output a string of literal assembler code
1007 for an `asm' keyword used between functions. */
1010 assemble_asm (string)
1015 if (TREE_CODE (string) == ADDR_EXPR)
1016 string = TREE_OPERAND (string, 0);
1018 fprintf (asm_out_file, "\t%s\n", TREE_STRING_POINTER (string));
1021 /* Record an element in the table of global destructors. SYMBOL is
1022 a SYMBOL_REF of the function to be called; PRIORITY is a number
1023 between 0 and MAX_INIT_PRIORITY. */
1026 default_stabs_asm_out_destructor (symbol, priority)
1028 int priority ATTRIBUTE_UNUSED;
1030 /* Tell GNU LD that this is part of the static destructor set.
1031 This will work for any system that uses stabs, most usefully
1033 fprintf (asm_out_file, "%s\"___DTOR_LIST__\",22,0,0,", ASM_STABS_OP);
1034 assemble_name (asm_out_file, XSTR (symbol, 0));
1035 fputc ('\n', asm_out_file);
1039 default_named_section_asm_out_destructor (symbol, priority)
1043 const char *section = ".dtors";
1046 /* ??? This only works reliably with the GNU linker. */
1047 if (priority != DEFAULT_INIT_PRIORITY)
1049 sprintf (buf, ".dtors.%.5u",
1050 /* Invert the numbering so the linker puts us in the proper
1051 order; constructors are run from right to left, and the
1052 linker sorts in increasing order. */
1053 MAX_INIT_PRIORITY - priority);
1057 named_section_flags (section, SECTION_WRITE);
1058 assemble_align (POINTER_SIZE);
1059 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1062 #ifdef DTORS_SECTION_ASM_OP
1066 if (in_section != in_dtors)
1068 in_section = in_dtors;
1069 fputs (DTORS_SECTION_ASM_OP, asm_out_file);
1070 fputc ('\n', asm_out_file);
1075 default_dtor_section_asm_out_destructor (symbol, priority)
1077 int priority ATTRIBUTE_UNUSED;
1080 assemble_align (POINTER_SIZE);
1081 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1085 /* Likewise for global constructors. */
1088 default_stabs_asm_out_constructor (symbol, priority)
1090 int priority ATTRIBUTE_UNUSED;
1092 /* Tell GNU LD that this is part of the static destructor set.
1093 This will work for any system that uses stabs, most usefully
1095 fprintf (asm_out_file, "%s\"___CTOR_LIST__\",22,0,0,", ASM_STABS_OP);
1096 assemble_name (asm_out_file, XSTR (symbol, 0));
1097 fputc ('\n', asm_out_file);
1101 default_named_section_asm_out_constructor (symbol, priority)
1105 const char *section = ".ctors";
1108 /* ??? This only works reliably with the GNU linker. */
1109 if (priority != DEFAULT_INIT_PRIORITY)
1111 sprintf (buf, ".ctors.%.5u",
1112 /* Invert the numbering so the linker puts us in the proper
1113 order; constructors are run from right to left, and the
1114 linker sorts in increasing order. */
1115 MAX_INIT_PRIORITY - priority);
1119 named_section_flags (section, SECTION_WRITE);
1120 assemble_align (POINTER_SIZE);
1121 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1124 #ifdef CTORS_SECTION_ASM_OP
1128 if (in_section != in_ctors)
1130 in_section = in_ctors;
1131 fputs (CTORS_SECTION_ASM_OP, asm_out_file);
1132 fputc ('\n', asm_out_file);
1137 default_ctor_section_asm_out_constructor (symbol, priority)
1139 int priority ATTRIBUTE_UNUSED;
1142 assemble_align (POINTER_SIZE);
1143 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1147 /* CONSTANT_POOL_BEFORE_FUNCTION may be defined as an expression with
1148 a non-zero value if the constant pool should be output before the
1149 start of the function, or a zero value if the pool should output
1150 after the end of the function. The default is to put it before the
1153 #ifndef CONSTANT_POOL_BEFORE_FUNCTION
1154 #define CONSTANT_POOL_BEFORE_FUNCTION 1
1157 /* Output assembler code for the constant pool of a function and associated
1158 with defining the name of the function. DECL describes the function.
1159 NAME is the function's name. For the constant pool, we use the current
1160 constant pool data. */
1163 assemble_start_function (decl, fnname)
1169 /* The following code does not need preprocessing in the assembler. */
1173 if (CONSTANT_POOL_BEFORE_FUNCTION)
1174 output_constant_pool (fnname, decl);
1176 resolve_unique_section (decl, 0);
1177 function_section (decl);
1179 /* Tell assembler to move to target machine's alignment for functions. */
1180 align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
1182 ASM_OUTPUT_ALIGN (asm_out_file, align);
1184 /* Handle a user-specified function alignment.
1185 Note that we still need to align to FUNCTION_BOUNDARY, as above,
1186 because ASM_OUTPUT_MAX_SKIP_ALIGN might not do any alignment at all. */
1187 if (align_functions_log > align)
1189 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
1190 ASM_OUTPUT_MAX_SKIP_ALIGN (asm_out_file,
1191 align_functions_log, align_functions-1);
1193 ASM_OUTPUT_ALIGN (asm_out_file, align_functions_log);
1197 #ifdef ASM_OUTPUT_FUNCTION_PREFIX
1198 ASM_OUTPUT_FUNCTION_PREFIX (asm_out_file, fnname);
1201 (*debug_hooks->begin_function) (decl);
1203 /* Make function name accessible from other files, if appropriate. */
1205 if (TREE_PUBLIC (decl))
1207 if (! first_global_object_name)
1212 STRIP_NAME_ENCODING (p, fnname);
1213 name = permalloc (strlen (p) + 1);
1216 if (! DECL_WEAK (decl) && ! DECL_ONE_ONLY (decl))
1217 first_global_object_name = name;
1219 weak_global_object_name = name;
1222 #ifdef ASM_WEAKEN_LABEL
1223 if (DECL_WEAK (decl))
1225 ASM_WEAKEN_LABEL (asm_out_file, fnname);
1226 /* Remove this function from the pending weak list so that
1227 we do not emit multiple .weak directives for it. */
1228 remove_from_pending_weak_list
1229 (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
1233 ASM_GLOBALIZE_LABEL (asm_out_file, fnname);
1236 /* Do any machine/system dependent processing of the function name */
1237 #ifdef ASM_DECLARE_FUNCTION_NAME
1238 ASM_DECLARE_FUNCTION_NAME (asm_out_file, fnname, current_function_decl);
1240 /* Standard thing is just output label for the function. */
1241 ASM_OUTPUT_LABEL (asm_out_file, fnname);
1242 #endif /* ASM_DECLARE_FUNCTION_NAME */
1245 /* Output assembler code associated with defining the size of the
1246 function. DECL describes the function. NAME is the function's name. */
1249 assemble_end_function (decl, fnname)
1253 #ifdef ASM_DECLARE_FUNCTION_SIZE
1254 ASM_DECLARE_FUNCTION_SIZE (asm_out_file, fnname, decl);
1256 if (! CONSTANT_POOL_BEFORE_FUNCTION)
1258 output_constant_pool (fnname, decl);
1259 function_section (decl); /* need to switch back */
1262 /* Output any constants which should appear after the function. */
1263 output_after_function_constants ();
1266 /* Assemble code to leave SIZE bytes of zeros. */
1269 assemble_zeros (size)
1272 /* Do no output if -fsyntax-only. */
1273 if (flag_syntax_only)
1276 #ifdef ASM_NO_SKIP_IN_TEXT
1277 /* The `space' pseudo in the text section outputs nop insns rather than 0s,
1278 so we must output 0s explicitly in the text section. */
1279 if (ASM_NO_SKIP_IN_TEXT && in_text_section ())
1282 for (i = 0; i < size; i++)
1283 assemble_integer (const0_rtx, 1, BITS_PER_UNIT, 1);
1288 ASM_OUTPUT_SKIP (asm_out_file, size);
1291 /* Assemble an alignment pseudo op for an ALIGN-bit boundary. */
1294 assemble_align (align)
1297 if (align > BITS_PER_UNIT)
1298 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
1301 /* Assemble a string constant with the specified C string as contents. */
1304 assemble_string (p, size)
1311 /* If the string is very long, split it up. */
1315 int thissize = size - pos;
1316 if (thissize > maximum)
1319 ASM_OUTPUT_ASCII (asm_out_file, p, thissize);
1327 #if defined ASM_OUTPUT_ALIGNED_DECL_LOCAL
1328 #define ASM_EMIT_LOCAL(decl, name, size, rounded) \
1329 ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, decl, name, size, DECL_ALIGN (decl))
1331 #if defined ASM_OUTPUT_ALIGNED_LOCAL
1332 #define ASM_EMIT_LOCAL(decl, name, size, rounded) \
1333 ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, DECL_ALIGN (decl))
1335 #define ASM_EMIT_LOCAL(decl, name, size, rounded) \
1336 ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded)
1340 #if defined ASM_OUTPUT_ALIGNED_BSS
1341 #define ASM_EMIT_BSS(decl, name, size, rounded) \
1342 ASM_OUTPUT_ALIGNED_BSS (asm_out_file, decl, name, size, DECL_ALIGN (decl))
1344 #if defined ASM_OUTPUT_BSS
1345 #define ASM_EMIT_BSS(decl, name, size, rounded) \
1346 ASM_OUTPUT_BSS (asm_out_file, decl, name, size, rounded)
1352 #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON
1353 #define ASM_EMIT_COMMON(decl, name, size, rounded) \
1354 ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, decl, name, size, DECL_ALIGN (decl))
1356 #if defined ASM_OUTPUT_ALIGNED_COMMON
1357 #define ASM_EMIT_COMMON(decl, name, size, rounded) \
1358 ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, name, size, DECL_ALIGN (decl))
1360 #define ASM_EMIT_COMMON(decl, name, size, rounded) \
1361 ASM_OUTPUT_COMMON (asm_out_file, name, size, rounded)
1366 asm_emit_uninitialised (decl, name, size, rounded)
1369 int size ATTRIBUTE_UNUSED;
1370 int rounded ATTRIBUTE_UNUSED;
1378 destination = asm_dest_local;
1380 if (TREE_PUBLIC (decl))
1382 #if defined ASM_EMIT_BSS
1383 if (! DECL_COMMON (decl))
1384 destination = asm_dest_bss;
1387 destination = asm_dest_common;
1390 if (flag_shared_data)
1392 switch (destination)
1394 #ifdef ASM_OUTPUT_SHARED_BSS
1396 ASM_OUTPUT_SHARED_BSS (asm_out_file, decl, name, size, rounded);
1399 #ifdef ASM_OUTPUT_SHARED_COMMON
1400 case asm_dest_common:
1401 ASM_OUTPUT_SHARED_COMMON (asm_out_file, name, size, rounded);
1404 #ifdef ASM_OUTPUT_SHARED_LOCAL
1405 case asm_dest_local:
1406 ASM_OUTPUT_SHARED_LOCAL (asm_out_file, name, size, rounded);
1414 resolve_unique_section (decl, 0);
1416 switch (destination)
1420 ASM_EMIT_BSS (decl, name, size, rounded);
1423 case asm_dest_common:
1424 ASM_EMIT_COMMON (decl, name, size, rounded);
1426 case asm_dest_local:
1427 ASM_EMIT_LOCAL (decl, name, size, rounded);
1436 /* Assemble everything that is needed for a variable or function declaration.
1437 Not used for automatic variables, and not used for function definitions.
1438 Should not be called for variables of incomplete structure type.
1440 TOP_LEVEL is nonzero if this variable has file scope.
1441 AT_END is nonzero if this is the special handling, at end of compilation,
1442 to define things that have had only tentative definitions.
1443 DONT_OUTPUT_DATA if nonzero means don't actually output the
1444 initial value (that will be done by the caller). */
1447 assemble_variable (decl, top_level, at_end, dont_output_data)
1449 int top_level ATTRIBUTE_UNUSED;
1450 int at_end ATTRIBUTE_UNUSED;
1451 int dont_output_data;
1453 register const char *name;
1458 last_assemble_variable_decl = 0;
1460 /* Normally no need to say anything here for external references,
1461 since assemble_external is called by the language-specific code
1462 when a declaration is first seen. */
1464 if (DECL_EXTERNAL (decl))
1467 /* Output no assembler code for a function declaration.
1468 Only definitions of functions output anything. */
1470 if (TREE_CODE (decl) == FUNCTION_DECL)
1473 /* Do nothing for global register variables. */
1474 if (DECL_RTL_SET_P (decl) && GET_CODE (DECL_RTL (decl)) == REG)
1476 TREE_ASM_WRITTEN (decl) = 1;
1480 /* If type was incomplete when the variable was declared,
1481 see if it is complete now. */
1483 if (DECL_SIZE (decl) == 0)
1484 layout_decl (decl, 0);
1486 /* Still incomplete => don't allocate it; treat the tentative defn
1487 (which is what it must have been) as an `extern' reference. */
1489 if (!dont_output_data && DECL_SIZE (decl) == 0)
1491 error_with_file_and_line (DECL_SOURCE_FILE (decl),
1492 DECL_SOURCE_LINE (decl),
1493 "storage size of `%s' isn't known",
1494 IDENTIFIER_POINTER (DECL_NAME (decl)));
1495 TREE_ASM_WRITTEN (decl) = 1;
1499 /* The first declaration of a variable that comes through this function
1500 decides whether it is global (in C, has external linkage)
1501 or local (in C, has internal linkage). So do nothing more
1502 if this function has already run. */
1504 if (TREE_ASM_WRITTEN (decl))
1507 /* Make sure ENCODE_SECTION_INFO is invoked before we set ASM_WRITTEN. */
1508 decl_rtl = DECL_RTL (decl);
1510 TREE_ASM_WRITTEN (decl) = 1;
1512 /* Do no output if -fsyntax-only. */
1513 if (flag_syntax_only)
1518 if (! dont_output_data
1519 && ! host_integerp (DECL_SIZE_UNIT (decl), 1))
1521 error_with_decl (decl, "size of variable `%s' is too large");
1525 name = XSTR (XEXP (decl_rtl, 0), 0);
1526 if (TREE_PUBLIC (decl) && DECL_NAME (decl)
1527 && ! first_global_object_name
1528 && ! (DECL_COMMON (decl) && (DECL_INITIAL (decl) == 0
1529 || DECL_INITIAL (decl) == error_mark_node))
1530 && ! DECL_WEAK (decl)
1531 && ! DECL_ONE_ONLY (decl))
1536 STRIP_NAME_ENCODING (p, name);
1537 xname = permalloc (strlen (p) + 1);
1539 first_global_object_name = xname;
1542 /* Compute the alignment of this data. */
1544 align = DECL_ALIGN (decl);
1546 /* In the case for initialing an array whose length isn't specified,
1547 where we have not yet been able to do the layout,
1548 figure out the proper alignment now. */
1549 if (dont_output_data && DECL_SIZE (decl) == 0
1550 && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
1551 align = MAX (align, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl))));
1553 /* Some object file formats have a maximum alignment which they support.
1554 In particular, a.out format supports a maximum alignment of 4. */
1555 #ifndef MAX_OFILE_ALIGNMENT
1556 #define MAX_OFILE_ALIGNMENT BIGGEST_ALIGNMENT
1558 if (align > MAX_OFILE_ALIGNMENT)
1560 warning_with_decl (decl,
1561 "alignment of `%s' is greater than maximum object file alignment. Using %d.",
1562 MAX_OFILE_ALIGNMENT/BITS_PER_UNIT);
1563 align = MAX_OFILE_ALIGNMENT;
1566 /* On some machines, it is good to increase alignment sometimes. */
1567 if (! DECL_USER_ALIGN (decl))
1569 #ifdef DATA_ALIGNMENT
1570 align = DATA_ALIGNMENT (TREE_TYPE (decl), align);
1572 #ifdef CONSTANT_ALIGNMENT
1573 if (DECL_INITIAL (decl) != 0 && DECL_INITIAL (decl) != error_mark_node)
1574 align = CONSTANT_ALIGNMENT (DECL_INITIAL (decl), align);
1578 /* Reset the alignment in case we have made it tighter, so we can benefit
1579 from it in get_pointer_alignment. */
1580 DECL_ALIGN (decl) = align;
1582 /* Handle uninitialized definitions. */
1584 if ((DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node)
1585 /* If the target can't output uninitialized but not common global data
1586 in .bss, then we have to use .data. */
1587 #if ! defined ASM_EMIT_BSS
1588 && DECL_COMMON (decl)
1590 && DECL_SECTION_NAME (decl) == NULL_TREE
1591 && ! dont_output_data)
1593 unsigned HOST_WIDE_INT size = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
1594 unsigned HOST_WIDE_INT rounded = size;
1596 /* Don't allocate zero bytes of common,
1597 since that means "undefined external" in the linker. */
1601 /* Round size up to multiple of BIGGEST_ALIGNMENT bits
1602 so that each uninitialized object starts on such a boundary. */
1603 rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1;
1604 rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
1605 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
1607 /* Don't continue this line--convex cc version 4.1 would lose. */
1608 #if !defined(ASM_OUTPUT_ALIGNED_COMMON) && !defined(ASM_OUTPUT_ALIGNED_DECL_COMMON) && !defined(ASM_OUTPUT_ALIGNED_BSS)
1609 if ((unsigned HOST_WIDE_INT) DECL_ALIGN (decl) / BITS_PER_UNIT > rounded)
1611 (decl, "requested alignment for %s is greater than implemented alignment of %d.",rounded);
1614 asm_emit_uninitialised (decl, name, size, rounded);
1619 /* Handle initialized definitions.
1620 Also handle uninitialized global definitions if -fno-common and the
1621 target doesn't support ASM_OUTPUT_BSS. */
1623 /* First make the assembler name(s) global if appropriate. */
1624 if (TREE_PUBLIC (decl) && DECL_NAME (decl))
1626 #ifdef ASM_WEAKEN_LABEL
1627 if (DECL_WEAK (decl))
1629 ASM_WEAKEN_LABEL (asm_out_file, name);
1630 /* Remove this variable from the pending weak list so that
1631 we do not emit multiple .weak directives for it. */
1632 remove_from_pending_weak_list
1633 (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
1637 ASM_GLOBALIZE_LABEL (asm_out_file, name);
1640 /* Output any data that we will need to use the address of. */
1641 if (DECL_INITIAL (decl) == error_mark_node)
1642 reloc = contains_pointers_p (TREE_TYPE (decl));
1643 else if (DECL_INITIAL (decl))
1644 reloc = output_addressed_constants (DECL_INITIAL (decl));
1646 /* Switch to the appropriate section. */
1647 resolve_unique_section (decl, reloc);
1648 variable_section (decl, reloc);
1650 /* dbxout.c needs to know this. */
1651 if (in_text_section ())
1652 DECL_IN_TEXT_SECTION (decl) = 1;
1654 /* Output the alignment of this data. */
1655 if (align > BITS_PER_UNIT)
1656 ASM_OUTPUT_ALIGN (asm_out_file,
1657 floor_log2 (DECL_ALIGN (decl) / BITS_PER_UNIT));
1659 /* Do any machine/system dependent processing of the object. */
1660 #ifdef ASM_DECLARE_OBJECT_NAME
1661 last_assemble_variable_decl = decl;
1662 ASM_DECLARE_OBJECT_NAME (asm_out_file, name, decl);
1664 /* Standard thing is just output label for the object. */
1665 ASM_OUTPUT_LABEL (asm_out_file, name);
1666 #endif /* ASM_DECLARE_OBJECT_NAME */
1668 if (!dont_output_data)
1670 if (DECL_INITIAL (decl))
1671 /* Output the actual data. */
1672 output_constant (DECL_INITIAL (decl),
1673 tree_low_cst (DECL_SIZE_UNIT (decl), 1),
1676 /* Leave space for it. */
1677 assemble_zeros (tree_low_cst (DECL_SIZE_UNIT (decl), 1));
1681 /* Return 1 if type TYPE contains any pointers. */
1684 contains_pointers_p (type)
1687 switch (TREE_CODE (type))
1690 case REFERENCE_TYPE:
1691 /* I'm not sure whether OFFSET_TYPE needs this treatment,
1692 so I'll play safe and return 1. */
1698 case QUAL_UNION_TYPE:
1701 /* For a type that has fields, see if the fields have pointers. */
1702 for (fields = TYPE_FIELDS (type); fields; fields = TREE_CHAIN (fields))
1703 if (TREE_CODE (fields) == FIELD_DECL
1704 && contains_pointers_p (TREE_TYPE (fields)))
1710 /* An array type contains pointers if its element type does. */
1711 return contains_pointers_p (TREE_TYPE (type));
1718 /* Output something to declare an external symbol to the assembler.
1719 (Most assemblers don't need this, so we normally output nothing.)
1720 Do nothing if DECL is not external. */
1723 assemble_external (decl)
1724 tree decl ATTRIBUTE_UNUSED;
1726 /* Because most platforms do not define ASM_OUTPUT_EXTERNAL, the
1727 main body of this code is only rarely exercised. To provide some
1728 testing, on all platforms, we make sure that the ASM_OUT_FILE is
1729 open. If it's not, we should not be calling this function. */
1733 #ifdef ASM_OUTPUT_EXTERNAL
1734 if (DECL_P (decl) && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl))
1736 rtx rtl = DECL_RTL (decl);
1738 if (GET_CODE (rtl) == MEM && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF
1739 && ! SYMBOL_REF_USED (XEXP (rtl, 0)))
1741 /* Some systems do require some output. */
1742 SYMBOL_REF_USED (XEXP (rtl, 0)) = 1;
1743 ASM_OUTPUT_EXTERNAL (asm_out_file, decl, XSTR (XEXP (rtl, 0), 0));
1749 /* Similar, for calling a library function FUN. */
1752 assemble_external_libcall (fun)
1753 rtx fun ATTRIBUTE_UNUSED;
1755 #ifdef ASM_OUTPUT_EXTERNAL_LIBCALL
1756 /* Declare library function name external when first used, if nec. */
1757 if (! SYMBOL_REF_USED (fun))
1759 SYMBOL_REF_USED (fun) = 1;
1760 ASM_OUTPUT_EXTERNAL_LIBCALL (asm_out_file, fun);
1765 /* Declare the label NAME global. */
1768 assemble_global (name)
1771 ASM_GLOBALIZE_LABEL (asm_out_file, name);
1774 /* Assemble a label named NAME. */
1777 assemble_label (name)
1780 ASM_OUTPUT_LABEL (asm_out_file, name);
1783 /* Output to FILE a reference to the assembler name of a C-level name NAME.
1784 If NAME starts with a *, the rest of NAME is output verbatim.
1785 Otherwise NAME is transformed in an implementation-defined way
1786 (usually by the addition of an underscore).
1787 Many macros in the tm file are defined to call this function. */
1790 assemble_name (file, name)
1794 const char *real_name;
1797 STRIP_NAME_ENCODING (real_name, name);
1798 if (flag_prefix_function_name
1799 && ! memcmp (real_name, CHKR_PREFIX, CHKR_PREFIX_SIZE))
1800 real_name = real_name + CHKR_PREFIX_SIZE;
1802 id = maybe_get_identifier (real_name);
1804 TREE_SYMBOL_REFERENCED (id) = 1;
1807 fputs (&name[1], file);
1809 ASM_OUTPUT_LABELREF (file, name);
1812 /* Allocate SIZE bytes writable static space with a gensym name
1813 and return an RTX to refer to its address. */
1816 assemble_static_space (size)
1820 const char *namestring;
1824 if (flag_shared_data)
1828 ASM_GENERATE_INTERNAL_LABEL (name, "LF", const_labelno);
1830 namestring = ggc_strdup (name);
1832 x = gen_rtx_SYMBOL_REF (Pmode, namestring);
1834 #ifdef ASM_OUTPUT_ALIGNED_DECL_LOCAL
1835 ASM_OUTPUT_ALIGNED_DECL_LOCAL (asm_out_file, NULL_TREE, name, size,
1838 #ifdef ASM_OUTPUT_ALIGNED_LOCAL
1839 ASM_OUTPUT_ALIGNED_LOCAL (asm_out_file, name, size, BIGGEST_ALIGNMENT);
1842 /* Round size up to multiple of BIGGEST_ALIGNMENT bits
1843 so that each uninitialized object starts on such a boundary. */
1844 /* Variable `rounded' might or might not be used in ASM_OUTPUT_LOCAL. */
1845 int rounded ATTRIBUTE_UNUSED
1846 = ((size + (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1)
1847 / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)
1848 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
1849 ASM_OUTPUT_LOCAL (asm_out_file, name, size, rounded);
1856 /* Assemble the static constant template for function entry trampolines.
1857 This is done at most once per compilation.
1858 Returns an RTX for the address of the template. */
1860 #ifdef TRAMPOLINE_TEMPLATE
1862 assemble_trampoline_template ()
1868 /* By default, put trampoline templates in read-only data section. */
1870 #ifdef TRAMPOLINE_SECTION
1871 TRAMPOLINE_SECTION ();
1873 readonly_data_section ();
1876 /* Write the assembler code to define one. */
1877 align = floor_log2 (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT);
1879 ASM_OUTPUT_ALIGN (asm_out_file, align);
1881 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LTRAMP", 0);
1882 TRAMPOLINE_TEMPLATE (asm_out_file);
1884 /* Record the rtl to refer to it. */
1885 ASM_GENERATE_INTERNAL_LABEL (label, "LTRAMP", 0);
1886 name = ggc_strdup (label);
1887 return gen_rtx_SYMBOL_REF (Pmode, name);
1891 /* A and B are either alignments or offsets. Return the minimum alignment
1892 that may be assumed after adding the two together. */
1894 static inline unsigned
1898 return (a | b) & -(a | b);
1901 /* Assemble the integer constant X into an object of SIZE bytes. ALIGN is
1902 the alignment of the integer in bits. Return 1 if we were able to output
1903 the constant, otherwise 0. If FORCE is non-zero, abort if we can't output
1907 assemble_integer (x, size, align, force)
1913 /* First try to use the standard 1, 2, 4, 8, and 16 byte
1914 ASM_OUTPUT... macros. */
1916 if (align >= MIN (size * BITS_PER_UNIT, BIGGEST_ALIGNMENT))
1919 #ifdef ASM_OUTPUT_CHAR
1921 ASM_OUTPUT_CHAR (asm_out_file, x);
1924 #ifdef ASM_OUTPUT_SHORT
1926 ASM_OUTPUT_SHORT (asm_out_file, x);
1929 #ifdef ASM_OUTPUT_INT
1931 ASM_OUTPUT_INT (asm_out_file, x);
1934 #ifdef ASM_OUTPUT_DOUBLE_INT
1936 ASM_OUTPUT_DOUBLE_INT (asm_out_file, x);
1939 #ifdef ASM_OUTPUT_QUADRUPLE_INT
1941 ASM_OUTPUT_QUADRUPLE_INT (asm_out_file, x);
1947 const char *asm_op = NULL;
1949 /* ??? This isn't quite as flexible as the ASM_OUTPUT_INT type hooks.
1950 At present powerpc-eabi can't jump -mrelocatable hoops, so you can
1951 get assembler errors from symbolic references in packed structs. */
1954 #ifdef UNALIGNED_SHORT_ASM_OP
1956 asm_op = UNALIGNED_SHORT_ASM_OP;
1959 #ifdef UNALIGNED_INT_ASM_OP
1961 asm_op = UNALIGNED_INT_ASM_OP;
1964 #ifdef UNALIGNED_DOUBLE_INT_ASM_OP
1966 asm_op = UNALIGNED_DOUBLE_INT_ASM_OP;
1973 fputs (asm_op, asm_out_file);
1974 output_addr_const (asm_out_file, x);
1975 fputc ('\n', asm_out_file);
1980 /* If we couldn't do it that way, there are two other possibilities: First,
1981 if the machine can output an explicit byte and this is a 1 byte constant,
1982 we can use ASM_OUTPUT_BYTE. */
1984 #ifdef ASM_OUTPUT_BYTE
1985 if (size == 1 && GET_CODE (x) == CONST_INT)
1987 ASM_OUTPUT_BYTE (asm_out_file, INTVAL (x));
1992 /* If SIZE is larger than a single word, try to output the constant
1993 one word at a time. */
1995 if (size > UNITS_PER_WORD)
1997 enum machine_mode mode
1998 = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
1999 unsigned align2 = min_align (align, BITS_PER_WORD);
2002 for (i = 0; i < size / UNITS_PER_WORD; i++)
2004 rtx word = operand_subword (x, i, 0, mode);
2007 if (! assemble_integer (word, UNITS_PER_WORD, align2, 0))
2011 if (i == size / UNITS_PER_WORD)
2013 /* If we output at least one word and then could not finish,
2014 there is no valid way to continue. */
2019 /* If unaligned, and this is a constant, emit it one byte at a time. */
2020 if (align < size * BITS_PER_UNIT)
2022 enum machine_mode omode, imode;
2025 omode = mode_for_size (BITS_PER_UNIT, MODE_INT, 0);
2026 imode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
2028 for (i = 0; i < size; i++)
2030 rtx byte = simplify_subreg (omode, x, imode, i);
2033 if (! assemble_integer (byte, 1, BITS_PER_UNIT, 0))
2039 /* If we output at least one byte and then could not finish,
2040 there is no valid way to continue. */
2051 /* Assemble the floating-point constant D into an object of size MODE. */
2052 struct assemble_real_args
2055 enum machine_mode mode;
2062 struct assemble_real_args *args = (struct assemble_real_args *) p;
2063 REAL_VALUE_TYPE *d = args->d;
2064 enum machine_mode mode = args->mode;
2068 #ifdef ASM_OUTPUT_BYTE_FLOAT
2070 ASM_OUTPUT_BYTE_FLOAT (asm_out_file, *d);
2073 #ifdef ASM_OUTPUT_SHORT_FLOAT
2075 ASM_OUTPUT_SHORT_FLOAT (asm_out_file, *d);
2078 #ifdef ASM_OUTPUT_THREE_QUARTER_FLOAT
2080 ASM_OUTPUT_THREE_QUARTER_FLOAT (asm_out_file, *d);
2083 #ifdef ASM_OUTPUT_FLOAT
2085 ASM_OUTPUT_FLOAT (asm_out_file, *d);
2089 #ifdef ASM_OUTPUT_DOUBLE
2091 ASM_OUTPUT_DOUBLE (asm_out_file, *d);
2095 #ifdef ASM_OUTPUT_LONG_DOUBLE
2098 ASM_OUTPUT_LONG_DOUBLE (asm_out_file, *d);
2108 assemble_real (d, mode, align)
2110 enum machine_mode mode;
2113 struct assemble_real_args args;
2117 /* We cannot emit unaligned floating point constants. This is slightly
2118 complicated in that we don't know what "unaligned" means exactly. */
2119 #ifdef BIGGEST_FIELD_ALIGNMENT
2120 if (align >= BIGGEST_FIELD_ALIGNMENT)
2124 if (align < GET_MODE_ALIGNMENT (mode))
2127 if (do_float_handler (assemble_real_1, (PTR) &args))
2130 internal_error ("floating point trap outputting a constant");
2133 /* Here we combine duplicate floating constants to make
2134 CONST_DOUBLE rtx's, and force those out to memory when necessary. */
2136 /* Return a CONST_DOUBLE or CONST_INT for a value specified as a pair of ints.
2137 For an integer, I0 is the low-order word and I1 is the high-order word.
2138 For a real number, I0 is the word with the low address
2139 and I1 is the word with the high address. */
2142 immed_double_const (i0, i1, mode)
2143 HOST_WIDE_INT i0, i1;
2144 enum machine_mode mode;
2148 if (GET_MODE_CLASS (mode) == MODE_INT
2149 || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
2151 /* We clear out all bits that don't belong in MODE, unless they and our
2152 sign bit are all one. So we get either a reasonable negative value
2153 or a reasonable unsigned value for this mode. */
2154 int width = GET_MODE_BITSIZE (mode);
2155 if (width < HOST_BITS_PER_WIDE_INT
2156 && ((i0 & ((HOST_WIDE_INT) (-1) << (width - 1)))
2157 != ((HOST_WIDE_INT) (-1) << (width - 1))))
2158 i0 &= ((HOST_WIDE_INT) 1 << width) - 1, i1 = 0;
2159 else if (width == HOST_BITS_PER_WIDE_INT
2160 && ! (i1 == ~0 && i0 < 0))
2162 else if (width > 2 * HOST_BITS_PER_WIDE_INT)
2163 /* We cannot represent this value as a constant. */
2166 /* If this would be an entire word for the target, but is not for
2167 the host, then sign-extend on the host so that the number will look
2168 the same way on the host that it would on the target.
2170 For example, when building a 64 bit alpha hosted 32 bit sparc
2171 targeted compiler, then we want the 32 bit unsigned value -1 to be
2172 represented as a 64 bit value -1, and not as 0x00000000ffffffff.
2173 The later confuses the sparc backend. */
2175 if (width < HOST_BITS_PER_WIDE_INT
2176 && (i0 & ((HOST_WIDE_INT) 1 << (width - 1))))
2177 i0 |= ((HOST_WIDE_INT) (-1) << width);
2179 /* If MODE fits within HOST_BITS_PER_WIDE_INT, always use a CONST_INT.
2181 ??? Strictly speaking, this is wrong if we create a CONST_INT
2182 for a large unsigned constant with the size of MODE being
2183 HOST_BITS_PER_WIDE_INT and later try to interpret that constant in a
2184 wider mode. In that case we will mis-interpret it as a negative
2187 Unfortunately, the only alternative is to make a CONST_DOUBLE
2188 for any constant in any mode if it is an unsigned constant larger
2189 than the maximum signed integer in an int on the host. However,
2190 doing this will break everyone that always expects to see a CONST_INT
2191 for SImode and smaller.
2193 We have always been making CONST_INTs in this case, so nothing new
2196 if (width <= HOST_BITS_PER_WIDE_INT)
2197 i1 = (i0 < 0) ? ~(HOST_WIDE_INT) 0 : 0;
2199 /* If this integer fits in one word, return a CONST_INT. */
2200 if ((i1 == 0 && i0 >= 0)
2201 || (i1 == ~0 && i0 < 0))
2202 return GEN_INT (i0);
2204 /* We use VOIDmode for integers. */
2208 /* Search the chain for an existing CONST_DOUBLE with the right value.
2209 If one is found, return it. */
2211 for (r = const_double_chain; r; r = CONST_DOUBLE_CHAIN (r))
2212 if (CONST_DOUBLE_LOW (r) == i0 && CONST_DOUBLE_HIGH (r) == i1
2213 && GET_MODE (r) == mode)
2216 /* No; make a new one and add it to the chain. */
2217 r = gen_rtx_CONST_DOUBLE (mode, const0_rtx, i0, i1);
2219 /* Don't touch const_double_chain if not inside any function. */
2220 if (current_function_decl != 0)
2222 CONST_DOUBLE_CHAIN (r) = const_double_chain;
2223 const_double_chain = r;
2229 /* Return a CONST_DOUBLE for a specified `double' value
2230 and machine mode. */
2233 immed_real_const_1 (d, mode)
2235 enum machine_mode mode;
2237 union real_extract u;
2240 /* Get the desired `double' value as a sequence of ints
2241 since that is how they are stored in a CONST_DOUBLE. */
2245 /* Detect special cases. */
2246 if (REAL_VALUES_IDENTICAL (dconst0, d))
2247 return CONST0_RTX (mode);
2249 /* Check for NaN first, because some ports (specifically the i386) do not
2250 emit correct ieee-fp code by default, and thus will generate a core
2251 dump here if we pass a NaN to REAL_VALUES_EQUAL and if REAL_VALUES_EQUAL
2252 does a floating point comparison. */
2253 else if (! REAL_VALUE_ISNAN (d) && REAL_VALUES_EQUAL (dconst1, d))
2254 return CONST1_RTX (mode);
2256 if (sizeof u == sizeof (HOST_WIDE_INT))
2257 return immed_double_const (u.i[0], 0, mode);
2258 if (sizeof u == 2 * sizeof (HOST_WIDE_INT))
2259 return immed_double_const (u.i[0], u.i[1], mode);
2261 /* The rest of this function handles the case where
2262 a float value requires more than 2 ints of space.
2263 It will be deleted as dead code on machines that don't need it. */
2265 /* Search the chain for an existing CONST_DOUBLE with the right value.
2266 If one is found, return it. */
2268 for (r = const_double_chain; r; r = CONST_DOUBLE_CHAIN (r))
2269 if (! memcmp ((char *) &CONST_DOUBLE_LOW (r), (char *) &u, sizeof u)
2270 && GET_MODE (r) == mode)
2273 /* No; make a new one and add it to the chain.
2275 We may be called by an optimizer which may be discarding any memory
2276 allocated during its processing (such as combine and loop). However,
2277 we will be leaving this constant on the chain, so we cannot tolerate
2279 r = rtx_alloc (CONST_DOUBLE);
2281 memcpy ((char *) &CONST_DOUBLE_LOW (r), (char *) &u, sizeof u);
2283 /* If we aren't inside a function, don't put r on the
2284 const_double_chain. */
2285 if (current_function_decl != 0)
2287 CONST_DOUBLE_CHAIN (r) = const_double_chain;
2288 const_double_chain = r;
2291 CONST_DOUBLE_CHAIN (r) = NULL_RTX;
2293 /* Store const0_rtx in CONST_DOUBLE_MEM since this CONST_DOUBLE is on the
2294 chain, but has not been allocated memory. Actual use of CONST_DOUBLE_MEM
2295 is only through force_const_mem. */
2297 CONST_DOUBLE_MEM (r) = const0_rtx;
2302 /* Return a CONST_DOUBLE rtx for a value specified by EXP,
2303 which must be a REAL_CST tree node. */
2306 immed_real_const (exp)
2309 return immed_real_const_1 (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)));
2312 /* At the end of a function, forget the memory-constants
2313 previously made for CONST_DOUBLEs. Mark them as not on real_constant_chain.
2314 Also clear out real_constant_chain and clear out all the chain-pointers. */
2317 clear_const_double_mem ()
2319 register rtx r, next;
2320 enum machine_mode mode;
2323 for (r = const_double_chain; r; r = next)
2325 next = CONST_DOUBLE_CHAIN (r);
2326 CONST_DOUBLE_CHAIN (r) = 0;
2327 CONST_DOUBLE_MEM (r) = cc0_rtx;
2329 const_double_chain = 0;
2331 for (i = 0; i <= 2; i++)
2332 for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
2333 mode = GET_MODE_WIDER_MODE (mode))
2335 r = const_tiny_rtx[i][(int) mode];
2336 CONST_DOUBLE_CHAIN (r) = 0;
2337 CONST_DOUBLE_MEM (r) = cc0_rtx;
2341 /* Given an expression EXP with a constant value,
2342 reduce it to the sum of an assembler symbol and an integer.
2343 Store them both in the structure *VALUE.
2344 Abort if EXP does not reduce. */
2349 HOST_WIDE_INT offset;
2353 decode_addr_const (exp, value)
2355 struct addr_const *value;
2357 register tree target = TREE_OPERAND (exp, 0);
2358 register int offset = 0;
2363 if (TREE_CODE (target) == COMPONENT_REF
2364 && host_integerp (byte_position (TREE_OPERAND (target, 1)), 0))
2367 offset += int_byte_position (TREE_OPERAND (target, 1));
2368 target = TREE_OPERAND (target, 0);
2370 else if (TREE_CODE (target) == ARRAY_REF
2371 || TREE_CODE (target) == ARRAY_RANGE_REF)
2373 offset += (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (target)), 1)
2374 * tree_low_cst (TREE_OPERAND (target, 1), 0));
2375 target = TREE_OPERAND (target, 0);
2381 switch (TREE_CODE (target))
2385 x = DECL_RTL (target);
2389 x = gen_rtx_MEM (FUNCTION_MODE,
2390 gen_rtx_LABEL_REF (VOIDmode,
2391 label_rtx (TREE_OPERAND (exp, 0))));
2399 x = TREE_CST_RTL (target);
2406 if (GET_CODE (x) != MEM)
2411 value->offset = offset;
2414 enum kind { RTX_DOUBLE, RTX_INT };
2417 ENUM_BITFIELD(kind) kind : 16;
2418 ENUM_BITFIELD(machine_mode) mode : 16;
2420 union real_extract du;
2421 struct addr_const addr;
2422 struct {HOST_WIDE_INT high, low;} di;
2426 /* Uniquize all constants that appear in memory.
2427 Each constant in memory thus far output is recorded
2428 in `const_hash_table' with a `struct constant_descriptor'
2429 that contains a polish representation of the value of
2432 We cannot store the trees in the hash table
2433 because the trees may be temporary. */
2435 struct constant_descriptor
2437 struct constant_descriptor *next;
2440 /* Make sure the data is reasonably aligned. */
2443 unsigned char contents[1];
2444 #ifdef HAVE_LONG_DOUBLE
2453 #define MAX_HASH_TABLE 1009
2454 static struct constant_descriptor *const_hash_table[MAX_HASH_TABLE];
2456 #define STRHASH(x) ((hashval_t)((long)(x) >> 3))
2458 struct deferred_string
2465 static htab_t const_str_htab;
2467 /* Mark a const_hash_table descriptor for GC. */
2470 mark_const_hash_entry (ptr)
2473 struct constant_descriptor *desc = * (struct constant_descriptor **) ptr;
2477 ggc_mark_rtx (desc->rtl);
2482 /* Mark the hash-table element X (which is really a pointer to an
2483 struct deferred_string *). */
2486 mark_const_str_htab_1 (x, data)
2488 void *data ATTRIBUTE_UNUSED;
2490 ggc_mark_tree (((struct deferred_string *) *x)->exp);
2494 /* Mark a const_str_htab for GC. */
2497 mark_const_str_htab (htab)
2500 htab_traverse (*((htab_t *) htab), mark_const_str_htab_1, NULL);
2503 /* Returns a hash code for X (which is a really a
2504 struct deferred_string *). */
2507 const_str_htab_hash (x)
2510 return STRHASH (((const struct deferred_string *) x)->label);
2513 /* Returns non-zero if the value represented by X (which is really a
2514 struct deferred_string *) is the same as that given by Y
2515 (which is really a char *). */
2518 const_str_htab_eq (x, y)
2522 return (((const struct deferred_string *) x)->label == (const char *) y);
2525 /* Delete the hash table entry dfsp. */
2528 const_str_htab_del (dfsp)
2534 /* Compute a hash code for a constant expression. */
2540 register const char *p;
2541 register int len, hi, i;
2542 register enum tree_code code = TREE_CODE (exp);
2544 /* Either set P and LEN to the address and len of something to hash and
2545 exit the switch or return a value. */
2550 p = (char *) &TREE_INT_CST (exp);
2551 len = sizeof TREE_INT_CST (exp);
2555 p = (char *) &TREE_REAL_CST (exp);
2556 len = sizeof TREE_REAL_CST (exp);
2560 p = TREE_STRING_POINTER (exp);
2561 len = TREE_STRING_LENGTH (exp);
2565 return (const_hash (TREE_REALPART (exp)) * 5
2566 + const_hash (TREE_IMAGPART (exp)));
2569 if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
2573 len = int_size_in_bytes (TREE_TYPE (exp));
2574 tmp = (char *) alloca (len);
2575 get_set_constructor_bytes (exp, (unsigned char *) tmp, len);
2583 /* For record type, include the type in the hashing.
2584 We do not do so for array types
2585 because (1) the sizes of the elements are sufficient
2586 and (2) distinct array types can have the same constructor.
2587 Instead, we include the array size because the constructor could
2589 if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
2590 hi = ((unsigned long) TREE_TYPE (exp) & ((1 << HASHBITS) - 1))
2593 hi = ((5 + int_size_in_bytes (TREE_TYPE (exp)))
2594 & ((1 << HASHBITS) - 1)) % MAX_HASH_TABLE;
2596 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2597 if (TREE_VALUE (link))
2599 = (hi * 603 + const_hash (TREE_VALUE (link))) % MAX_HASH_TABLE;
2606 struct addr_const value;
2608 decode_addr_const (exp, &value);
2609 if (GET_CODE (value.base) == SYMBOL_REF)
2611 /* Don't hash the address of the SYMBOL_REF;
2612 only use the offset and the symbol name. */
2614 p = XSTR (value.base, 0);
2615 for (i = 0; p[i] != 0; i++)
2616 hi = ((hi * 613) + (unsigned) (p[i]));
2618 else if (GET_CODE (value.base) == LABEL_REF)
2619 hi = value.offset + CODE_LABEL_NUMBER (XEXP (value.base, 0)) * 13;
2623 hi &= (1 << HASHBITS) - 1;
2624 hi %= MAX_HASH_TABLE;
2630 return (const_hash (TREE_OPERAND (exp, 0)) * 9
2631 + const_hash (TREE_OPERAND (exp, 1)));
2635 case NON_LVALUE_EXPR:
2636 return const_hash (TREE_OPERAND (exp, 0)) * 7 + 2;
2639 /* A language specific constant. Just hash the code. */
2640 return (int) code % MAX_HASH_TABLE;
2643 /* Compute hashing function */
2645 for (i = 0; i < len; i++)
2646 hi = ((hi * 613) + (unsigned) (p[i]));
2648 hi &= (1 << HASHBITS) - 1;
2649 hi %= MAX_HASH_TABLE;
2653 /* Compare a constant expression EXP with a constant-descriptor DESC.
2654 Return 1 if DESC describes a constant with the same value as EXP. */
2657 compare_constant (exp, desc)
2659 struct constant_descriptor *desc;
2661 return 0 != compare_constant_1 (exp, desc->u.contents);
2664 /* Compare constant expression EXP with a substring P of a constant descriptor.
2665 If they match, return a pointer to the end of the substring matched.
2666 If they do not match, return 0.
2668 Since descriptors are written in polish prefix notation,
2669 this function can be used recursively to test one operand of EXP
2670 against a subdescriptor, and if it succeeds it returns the
2671 address of the subdescriptor for the next operand. */
2673 static const unsigned char *
2674 compare_constant_1 (exp, p)
2676 const unsigned char *p;
2678 register const unsigned char *strp;
2680 register enum tree_code code = TREE_CODE (exp);
2682 if (code != (enum tree_code) *p++)
2685 /* Either set STRP, P and LEN to pointers and length to compare and exit the
2686 switch, or return the result of the comparison. */
2691 /* Integer constants are the same only if the same width of type. */
2692 if (*p++ != TYPE_PRECISION (TREE_TYPE (exp)))
2695 strp = (unsigned char *) &TREE_INT_CST (exp);
2696 len = sizeof TREE_INT_CST (exp);
2700 /* Real constants are the same only if the same width of type. */
2701 if (*p++ != TYPE_PRECISION (TREE_TYPE (exp)))
2704 strp = (unsigned char *) &TREE_REAL_CST (exp);
2705 len = sizeof TREE_REAL_CST (exp);
2709 if (flag_writable_strings)
2712 if ((enum machine_mode) *p++ != TYPE_MODE (TREE_TYPE (exp)))
2715 strp = (const unsigned char *)TREE_STRING_POINTER (exp);
2716 len = TREE_STRING_LENGTH (exp);
2717 if (memcmp ((char *) &TREE_STRING_LENGTH (exp), p,
2718 sizeof TREE_STRING_LENGTH (exp)))
2721 p += sizeof TREE_STRING_LENGTH (exp);
2725 p = compare_constant_1 (TREE_REALPART (exp), p);
2729 return compare_constant_1 (TREE_IMAGPART (exp), p);
2732 if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
2734 int xlen = len = int_size_in_bytes (TREE_TYPE (exp));
2735 unsigned char *tmp = (unsigned char *) alloca (len);
2737 get_set_constructor_bytes (exp, tmp, len);
2738 strp = (unsigned char *) tmp;
2739 if (memcmp ((char *) &xlen, p, sizeof xlen))
2748 int length = list_length (CONSTRUCTOR_ELTS (exp));
2750 enum machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
2751 int have_purpose = 0;
2753 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2754 if (TREE_PURPOSE (link))
2757 if (memcmp ((char *) &length, p, sizeof length))
2762 /* For record constructors, insist that the types match.
2763 For arrays, just verify both constructors are for arrays.
2764 Then insist that either both or none have any TREE_PURPOSE
2766 if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
2767 type = TREE_TYPE (exp);
2771 if (memcmp ((char *) &type, p, sizeof type))
2774 if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
2776 if (memcmp ((char *) &mode, p, sizeof mode))
2784 if (memcmp ((char *) &have_purpose, p, sizeof have_purpose))
2787 p += sizeof have_purpose;
2789 /* For arrays, insist that the size in bytes match. */
2790 if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
2792 HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
2794 if (memcmp ((char *) &size, p, sizeof size))
2800 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2802 if (TREE_VALUE (link))
2804 if ((p = compare_constant_1 (TREE_VALUE (link), p)) == 0)
2811 if (memcmp ((char *) &zero, p, sizeof zero))
2817 if (TREE_PURPOSE (link)
2818 && TREE_CODE (TREE_PURPOSE (link)) == FIELD_DECL)
2820 if (memcmp ((char *) &TREE_PURPOSE (link), p,
2821 sizeof TREE_PURPOSE (link)))
2824 p += sizeof TREE_PURPOSE (link);
2826 else if (TREE_PURPOSE (link))
2828 if ((p = compare_constant_1 (TREE_PURPOSE (link), p)) == 0)
2831 else if (have_purpose)
2835 if (memcmp ((char *) &zero, p, sizeof zero))
2847 struct addr_const value;
2849 decode_addr_const (exp, &value);
2850 strp = (unsigned char *) &value.offset;
2851 len = sizeof value.offset;
2852 /* Compare the offset. */
2854 if (*p++ != *strp++)
2857 /* Compare symbol name. */
2858 strp = (const unsigned char *) XSTR (value.base, 0);
2859 len = strlen ((const char *) strp) + 1;
2866 p = compare_constant_1 (TREE_OPERAND (exp, 0), p);
2870 return compare_constant_1 (TREE_OPERAND (exp, 1), p);
2874 case NON_LVALUE_EXPR:
2875 return compare_constant_1 (TREE_OPERAND (exp, 0), p);
2878 if (lang_expand_constant)
2880 exp = (*lang_expand_constant) (exp);
2881 return compare_constant_1 (exp, p);
2886 /* Compare constant contents. */
2888 if (*p++ != *strp++)
2894 /* Construct a constant descriptor for the expression EXP.
2895 It is up to the caller to enter the descriptor in the hash table. */
2897 static struct constant_descriptor *
2898 record_constant (exp)
2901 struct constant_descriptor *next = 0;
2906 /* Make a struct constant_descriptor. The first three pointers will
2907 be filled in later. Here we just leave space for them. */
2909 obstack_grow (&permanent_obstack, (char *) &next, sizeof next);
2910 obstack_grow (&permanent_obstack, (char *) &label, sizeof label);
2911 obstack_grow (&permanent_obstack, (char *) &rtl, sizeof rtl);
2913 /* Align the descriptor for the data payload. */
2914 pad = (offsetof (struct constant_descriptor, u)
2915 - offsetof(struct constant_descriptor, rtl)
2916 - sizeof(next->rtl));
2918 obstack_blank (&permanent_obstack, pad);
2920 record_constant_1 (exp);
2921 return (struct constant_descriptor *) obstack_finish (&permanent_obstack);
2924 /* Add a description of constant expression EXP
2925 to the object growing in `permanent_obstack'.
2926 No need to return its address; the caller will get that
2927 from the obstack when the object is complete. */
2930 record_constant_1 (exp)
2933 register const unsigned char *strp;
2935 register enum tree_code code = TREE_CODE (exp);
2937 obstack_1grow (&permanent_obstack, (unsigned int) code);
2942 obstack_1grow (&permanent_obstack, TYPE_PRECISION (TREE_TYPE (exp)));
2943 strp = (unsigned char *) &TREE_INT_CST (exp);
2944 len = sizeof TREE_INT_CST (exp);
2948 obstack_1grow (&permanent_obstack, TYPE_PRECISION (TREE_TYPE (exp)));
2949 strp = (unsigned char *) &TREE_REAL_CST (exp);
2950 len = sizeof TREE_REAL_CST (exp);
2954 if (flag_writable_strings)
2957 obstack_1grow (&permanent_obstack, TYPE_MODE (TREE_TYPE (exp)));
2958 strp = (const unsigned char *) TREE_STRING_POINTER (exp);
2959 len = TREE_STRING_LENGTH (exp);
2960 obstack_grow (&permanent_obstack, (char *) &TREE_STRING_LENGTH (exp),
2961 sizeof TREE_STRING_LENGTH (exp));
2965 record_constant_1 (TREE_REALPART (exp));
2966 record_constant_1 (TREE_IMAGPART (exp));
2970 if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
2972 int nbytes = int_size_in_bytes (TREE_TYPE (exp));
2973 obstack_grow (&permanent_obstack, &nbytes, sizeof (nbytes));
2974 obstack_blank (&permanent_obstack, nbytes);
2975 get_set_constructor_bytes
2976 (exp, (unsigned char *) permanent_obstack.next_free-nbytes,
2983 int length = list_length (CONSTRUCTOR_ELTS (exp));
2984 enum machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
2986 int have_purpose = 0;
2988 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
2989 if (TREE_PURPOSE (link))
2992 obstack_grow (&permanent_obstack, (char *) &length, sizeof length);
2994 /* For record constructors, insist that the types match.
2995 For arrays, just verify both constructors are for arrays
2996 of the same mode. Then insist that either both or none
2997 have any TREE_PURPOSE values. */
2998 if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
2999 type = TREE_TYPE (exp);
3003 obstack_grow (&permanent_obstack, (char *) &type, sizeof type);
3004 if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
3005 obstack_grow (&permanent_obstack, &mode, sizeof mode);
3007 obstack_grow (&permanent_obstack, (char *) &have_purpose,
3008 sizeof have_purpose);
3010 /* For arrays, insist that the size in bytes match. */
3011 if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
3013 HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
3014 obstack_grow (&permanent_obstack, (char *) &size, sizeof size);
3017 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
3019 if (TREE_VALUE (link))
3020 record_constant_1 (TREE_VALUE (link));
3025 obstack_grow (&permanent_obstack,
3026 (char *) &zero, sizeof zero);
3029 if (TREE_PURPOSE (link)
3030 && TREE_CODE (TREE_PURPOSE (link)) == FIELD_DECL)
3031 obstack_grow (&permanent_obstack,
3032 (char *) &TREE_PURPOSE (link),
3033 sizeof TREE_PURPOSE (link));
3034 else if (TREE_PURPOSE (link))
3035 record_constant_1 (TREE_PURPOSE (link));
3036 else if (have_purpose)
3040 obstack_grow (&permanent_obstack,
3041 (char *) &zero, sizeof zero);
3049 struct addr_const value;
3051 decode_addr_const (exp, &value);
3052 /* Record the offset. */
3053 obstack_grow (&permanent_obstack,
3054 (char *) &value.offset, sizeof value.offset);
3056 switch (GET_CODE (value.base))
3059 /* Record the symbol name. */
3060 obstack_grow (&permanent_obstack, XSTR (value.base, 0),
3061 strlen (XSTR (value.base, 0)) + 1);
3064 /* Record the address of the CODE_LABEL. It may not have
3065 been emitted yet, so it's UID may be zero. But pointer
3066 identity is good enough. */
3067 obstack_grow (&permanent_obstack, &XEXP (value.base, 0),
3079 record_constant_1 (TREE_OPERAND (exp, 0));
3080 record_constant_1 (TREE_OPERAND (exp, 1));
3085 case NON_LVALUE_EXPR:
3086 record_constant_1 (TREE_OPERAND (exp, 0));
3090 if (lang_expand_constant)
3092 exp = (*lang_expand_constant) (exp);
3093 record_constant_1 (exp);
3098 /* Record constant contents. */
3099 obstack_grow (&permanent_obstack, strp, len);
3102 /* Record a list of constant expressions that were passed to
3103 output_constant_def but that could not be output right away. */
3105 struct deferred_constant
3107 struct deferred_constant *next;
3113 static struct deferred_constant *deferred_constants;
3115 /* Another list of constants which should be output after the
3117 static struct deferred_constant *after_function_constants;
3119 /* Nonzero means defer output of addressed subconstants
3120 (i.e., those for which output_constant_def is called.) */
3121 static int defer_addressed_constants_flag;
3123 /* Start deferring output of subconstants. */
3126 defer_addressed_constants ()
3128 defer_addressed_constants_flag++;
3131 /* Stop deferring output of subconstants,
3132 and output now all those that have been deferred. */
3135 output_deferred_addressed_constants ()
3137 struct deferred_constant *p, *next;
3139 defer_addressed_constants_flag--;
3141 if (defer_addressed_constants_flag > 0)
3144 for (p = deferred_constants; p; p = next)
3146 output_constant_def_contents (p->exp, p->reloc, p->labelno);
3151 deferred_constants = 0;
3154 /* Output any constants which should appear after a function. */
3157 output_after_function_constants ()
3159 struct deferred_constant *p, *next;
3161 for (p = after_function_constants; p; p = next)
3163 output_constant_def_contents (p->exp, p->reloc, p->labelno);
3168 after_function_constants = 0;
3171 /* Make a copy of the whole tree structure for a constant.
3172 This handles the same types of nodes that compare_constant
3173 and record_constant handle. */
3179 switch (TREE_CODE (exp))
3182 /* For ADDR_EXPR, we do not want to copy the decl whose address
3183 is requested. We do want to copy constants though. */
3184 if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, 0))) == 'c')
3185 return build1 (TREE_CODE (exp), TREE_TYPE (exp),
3186 copy_constant (TREE_OPERAND (exp, 0)));
3188 return copy_node (exp);
3193 return copy_node (exp);
3196 return build_complex (TREE_TYPE (exp),
3197 copy_constant (TREE_REALPART (exp)),
3198 copy_constant (TREE_IMAGPART (exp)));
3202 return build (TREE_CODE (exp), TREE_TYPE (exp),
3203 copy_constant (TREE_OPERAND (exp, 0)),
3204 copy_constant (TREE_OPERAND (exp, 1)));
3208 case NON_LVALUE_EXPR:
3209 return build1 (TREE_CODE (exp), TREE_TYPE (exp),
3210 copy_constant (TREE_OPERAND (exp, 0)));
3214 tree copy = copy_node (exp);
3215 tree list = copy_list (CONSTRUCTOR_ELTS (exp));
3218 CONSTRUCTOR_ELTS (copy) = list;
3219 for (tail = list; tail; tail = TREE_CHAIN (tail))
3220 TREE_VALUE (tail) = copy_constant (TREE_VALUE (tail));
3221 if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
3222 for (tail = list; tail; tail = TREE_CHAIN (tail))
3223 TREE_PURPOSE (tail) = copy_constant (TREE_PURPOSE (tail));
3233 /* Return an rtx representing a reference to constant data in memory
3234 for the constant expression EXP.
3236 If assembler code for such a constant has already been output,
3237 return an rtx to refer to it.
3238 Otherwise, output such a constant in memory (or defer it for later)
3239 and generate an rtx for it.
3241 If DEFER is non-zero, the output of string constants can be deferred
3242 and output only if referenced in the function after all optimizations.
3244 The TREE_CST_RTL of EXP is set up to point to that rtx.
3245 The const_hash_table records which constants already have label strings. */
3248 output_constant_def (exp, defer)
3253 register struct constant_descriptor *desc;
3254 struct deferred_string **defstr;
3258 int after_function = 0;
3261 if (TREE_CST_RTL (exp))
3262 return TREE_CST_RTL (exp);
3264 /* Make sure any other constants whose addresses appear in EXP
3265 are assigned label numbers. */
3267 reloc = output_addressed_constants (exp);
3269 /* Compute hash code of EXP. Search the descriptors for that hash code
3270 to see if any of them describes EXP. If yes, the descriptor records
3271 the label number already assigned. */
3273 hash = const_hash (exp) % MAX_HASH_TABLE;
3275 for (desc = const_hash_table[hash]; desc; desc = desc->next)
3276 if (compare_constant (exp, desc))
3281 /* No constant equal to EXP is known to have been output.
3282 Make a constant descriptor to enter EXP in the hash table.
3283 Assign the label number and record it in the descriptor for
3284 future calls to this function to find. */
3286 /* Create a string containing the label name, in LABEL. */
3287 labelno = const_labelno++;
3288 ASM_GENERATE_INTERNAL_LABEL (label, "LC", labelno);
3290 desc = record_constant (exp);
3291 desc->next = const_hash_table[hash];
3292 desc->label = ggc_strdup (label);
3293 const_hash_table[hash] = desc;
3295 /* We have a symbol name; construct the SYMBOL_REF and the MEM. */
3297 = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (exp)),
3298 gen_rtx_SYMBOL_REF (Pmode, desc->label));
3300 set_mem_attributes (desc->rtl, exp, 1);
3305 TREE_CST_RTL (exp) = desc->rtl;
3307 /* Optionally set flags or add text to the name to record information
3308 such as that it is a function name. If the name is changed, the macro
3309 ASM_OUTPUT_LABELREF will have to know how to strip this information. */
3310 #ifdef ENCODE_SECTION_INFO
3311 /* A previously-processed constant would already have section info
3315 ENCODE_SECTION_INFO (exp);
3316 desc->rtl = TREE_CST_RTL (exp);
3317 desc->label = XSTR (XEXP (desc->rtl, 0), 0);
3321 #ifdef CONSTANT_AFTER_FUNCTION_P
3322 if (current_function_decl != 0
3323 && CONSTANT_AFTER_FUNCTION_P (exp))
3328 && STRING_POOL_ADDRESS_P (XEXP (desc->rtl, 0))
3329 && (!defer || defer_addressed_constants_flag || after_function))
3331 defstr = (struct deferred_string **)
3332 htab_find_slot_with_hash (const_str_htab, desc->label,
3333 STRHASH (desc->label), NO_INSERT);
3336 /* If the string is currently deferred but we need to output it now,
3337 remove it from deferred string hash table. */
3339 labelno = (*defstr)->labelno;
3340 STRING_POOL_ADDRESS_P (XEXP (desc->rtl, 0)) = 0;
3341 htab_clear_slot (const_str_htab, (void **) defstr);
3345 /* If this is the first time we've seen this particular constant,
3346 output it (or defer its output for later). */
3349 if (defer_addressed_constants_flag || after_function)
3351 struct deferred_constant *p;
3352 p = (struct deferred_constant *) xmalloc (sizeof (struct deferred_constant));
3354 p->exp = copy_constant (exp);
3356 p->labelno = labelno;
3359 p->next = after_function_constants;
3360 after_function_constants = p;
3364 p->next = deferred_constants;
3365 deferred_constants = p;
3370 /* Do no output if -fsyntax-only. */
3371 if (! flag_syntax_only)
3373 if (TREE_CODE (exp) != STRING_CST
3375 || flag_writable_strings
3376 || (defstr = (struct deferred_string **)
3377 htab_find_slot_with_hash (const_str_htab,
3379 STRHASH (desc->label),
3381 output_constant_def_contents (exp, reloc, labelno);
3384 struct deferred_string *p;
3386 p = (struct deferred_string *)
3387 xmalloc (sizeof (struct deferred_string));
3389 p->exp = copy_constant (exp);
3390 p->label = desc->label;
3391 p->labelno = labelno;
3393 STRING_POOL_ADDRESS_P (XEXP (desc->rtl, 0)) = 1;
3399 return TREE_CST_RTL (exp);
3402 /* Now output assembler code to define the label for EXP,
3403 and follow it with the data of EXP. */
3406 output_constant_def_contents (exp, reloc, labelno)
3413 /* Align the location counter as required by EXP's data type. */
3414 align = TYPE_ALIGN (TREE_TYPE (exp));
3415 #ifdef CONSTANT_ALIGNMENT
3416 align = CONSTANT_ALIGNMENT (exp, align);
3419 if (IN_NAMED_SECTION (exp))
3420 named_section (exp, NULL, reloc);
3423 /* First switch to text section, except for writable strings. */
3424 #ifdef SELECT_SECTION
3425 SELECT_SECTION (exp, reloc, align);
3427 if (((TREE_CODE (exp) == STRING_CST) && flag_writable_strings)
3428 || (flag_pic && reloc))
3431 readonly_data_section ();
3435 if (align > BITS_PER_UNIT)
3436 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (align / BITS_PER_UNIT));
3438 /* Output the label itself. */
3439 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LC", labelno);
3441 /* Output the value of EXP. */
3442 output_constant (exp,
3443 (TREE_CODE (exp) == STRING_CST
3444 ? MAX (TREE_STRING_LENGTH (exp),
3445 int_size_in_bytes (TREE_TYPE (exp)))
3446 : int_size_in_bytes (TREE_TYPE (exp))),
3451 /* Structure to represent sufficient information about a constant so that
3452 it can be output when the constant pool is output, so that function
3453 integration can be done, and to simplify handling on machines that reference
3454 constant pool as base+displacement. */
3456 struct pool_constant
3458 struct constant_descriptor *desc;
3459 struct pool_constant *next, *next_sym;
3462 enum machine_mode mode;
3469 /* Hash code for a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true.
3470 The argument is XSTR (... , 0) */
3472 #define SYMHASH(LABEL) \
3473 ((((unsigned long) (LABEL)) & ((1 << HASHBITS) - 1)) % MAX_RTX_HASH_TABLE)
3475 /* Initialize constant pool hashing for a new function. */
3478 init_varasm_status (f)
3481 struct varasm_status *p;
3482 p = (struct varasm_status *) xmalloc (sizeof (struct varasm_status));
3484 p->x_const_rtx_hash_table
3485 = ((struct constant_descriptor **)
3486 xcalloc (MAX_RTX_HASH_TABLE, sizeof (struct constant_descriptor *)));
3487 p->x_const_rtx_sym_hash_table
3488 = ((struct pool_constant **)
3489 xcalloc (MAX_RTX_HASH_TABLE, sizeof (struct pool_constant *)));
3491 p->x_first_pool = p->x_last_pool = 0;
3492 p->x_pool_offset = 0;
3493 p->x_const_double_chain = 0;
3496 /* Mark PC for GC. */
3499 mark_pool_constant (pc)
3500 struct pool_constant *pc;
3505 ggc_mark_rtx (pc->constant);
3510 /* Mark P for GC. */
3513 mark_varasm_status (p)
3514 struct varasm_status *p;
3519 mark_pool_constant (p->x_first_pool);
3520 ggc_mark_rtx (p->x_const_double_chain);
3523 /* Clear out all parts of the state in F that can safely be discarded
3524 after the function has been compiled, to let garbage collection
3525 reclaim the memory. */
3528 free_varasm_status (f)
3531 struct varasm_status *p;
3536 /* Clear out the hash tables. */
3537 for (i = 0; i < MAX_RTX_HASH_TABLE; ++i)
3539 struct constant_descriptor* cd;
3541 cd = p->x_const_rtx_hash_table[i];
3543 struct constant_descriptor* next = cd->next;
3549 free (p->x_const_rtx_hash_table);
3550 free (p->x_const_rtx_sym_hash_table);
3556 /* Express an rtx for a constant integer (perhaps symbolic)
3557 as the sum of a symbol or label plus an explicit integer.
3558 They are stored into VALUE. */
3561 decode_rtx_const (mode, x, value)
3562 enum machine_mode mode;
3564 struct rtx_const *value;
3566 /* Clear the whole structure, including any gaps. */
3567 memset (value, 0, sizeof (struct rtx_const));
3569 value->kind = RTX_INT; /* Most usual kind. */
3572 switch (GET_CODE (x))
3575 value->kind = RTX_DOUBLE;
3576 if (GET_MODE (x) != VOIDmode)
3578 value->mode = GET_MODE (x);
3579 memcpy ((char *) &value->un.du,
3580 (char *) &CONST_DOUBLE_LOW (x), sizeof value->un.du);
3584 value->un.di.low = CONST_DOUBLE_LOW (x);
3585 value->un.di.high = CONST_DOUBLE_HIGH (x);
3590 value->un.addr.offset = INTVAL (x);
3596 value->un.addr.base = x;
3601 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
3603 value->un.addr.base = XEXP (x, 0);
3604 value->un.addr.offset = INTVAL (XEXP (x, 1));
3606 else if (GET_CODE (x) == MINUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
3608 value->un.addr.base = XEXP (x, 0);
3609 value->un.addr.offset = - INTVAL (XEXP (x, 1));
3613 value->un.addr.base = x;
3614 value->un.addr.offset = 0;
3622 if (value->kind == RTX_INT && value->un.addr.base != 0)
3623 switch (GET_CODE (value->un.addr.base))
3626 /* Use the string's address, not the SYMBOL_REF's address,
3627 for the sake of addresses of library routines. */
3628 value->un.addr.base = (rtx) XSTR (value->un.addr.base, 0);
3632 /* For a LABEL_REF, compare labels. */
3633 value->un.addr.base = XEXP (value->un.addr.base, 0);
3640 /* Given a MINUS expression, simplify it if both sides
3641 include the same symbol. */
3644 simplify_subtraction (x)
3647 struct rtx_const val0, val1;
3649 decode_rtx_const (GET_MODE (x), XEXP (x, 0), &val0);
3650 decode_rtx_const (GET_MODE (x), XEXP (x, 1), &val1);
3652 if (val0.un.addr.base == val1.un.addr.base)
3653 return GEN_INT (val0.un.addr.offset - val1.un.addr.offset);
3657 /* Compute a hash code for a constant RTL expression. */
3660 const_hash_rtx (mode, x)
3661 enum machine_mode mode;
3667 struct rtx_const value;
3668 decode_rtx_const (mode, x, &value);
3670 /* Compute hashing function */
3672 for (i = 0; i < sizeof value / sizeof (int); i++)
3673 hi += ((int *) &value)[i];
3675 hi &= (1 << HASHBITS) - 1;
3676 hi %= MAX_RTX_HASH_TABLE;
3680 /* Compare a constant rtl object X with a constant-descriptor DESC.
3681 Return 1 if DESC describes a constant with the same value as X. */
3684 compare_constant_rtx (mode, x, desc)
3685 enum machine_mode mode;
3687 struct constant_descriptor *desc;
3689 register int *p = (int *) desc->u.contents;
3692 struct rtx_const value;
3694 decode_rtx_const (mode, x, &value);
3695 strp = (int *) &value;
3696 len = sizeof value / sizeof (int);
3698 /* Compare constant contents. */
3700 if (*p++ != *strp++)
3706 /* Construct a constant descriptor for the rtl-expression X.
3707 It is up to the caller to enter the descriptor in the hash table. */
3709 static struct constant_descriptor *
3710 record_constant_rtx (mode, x)
3711 enum machine_mode mode;
3714 struct constant_descriptor *ptr;
3716 ptr = ((struct constant_descriptor *)
3717 xcalloc (1, (offsetof (struct constant_descriptor, u)
3718 + sizeof (struct rtx_const))));
3719 decode_rtx_const (mode, x, (struct rtx_const *) ptr->u.contents);
3724 /* Given a constant rtx X, make (or find) a memory constant for its value
3725 and return a MEM rtx to refer to it in memory. */
3728 force_const_mem (mode, x)
3729 enum machine_mode mode;
3733 register struct constant_descriptor *desc;
3735 const char *found = 0;
3738 /* If we want this CONST_DOUBLE in the same mode as it is in memory
3739 (this will always be true for floating CONST_DOUBLEs that have been
3740 placed in memory, but not for VOIDmode (integer) CONST_DOUBLEs),
3741 use the previous copy. Otherwise, make a new one. Note that in
3742 the unlikely event that this same CONST_DOUBLE is used in two different
3743 modes in an alternating fashion, we will allocate a lot of different
3744 memory locations, but this should be extremely rare. */
3746 if (GET_CODE (x) == CONST_DOUBLE
3747 && GET_CODE (CONST_DOUBLE_MEM (x)) == MEM
3748 && GET_MODE (CONST_DOUBLE_MEM (x)) == mode)
3749 return CONST_DOUBLE_MEM (x);
3751 /* Compute hash code of X. Search the descriptors for that hash code
3752 to see if any of them describes X. If yes, the descriptor records
3753 the label number already assigned. */
3755 hash = const_hash_rtx (mode, x);
3757 for (desc = const_rtx_hash_table[hash]; desc; desc = desc->next)
3758 if (compare_constant_rtx (mode, x, desc))
3760 found = desc->label;
3766 register struct pool_constant *pool;
3769 /* No constant equal to X is known to have been output.
3770 Make a constant descriptor to enter X in the hash table.
3771 Assign the label number and record it in the descriptor for
3772 future calls to this function to find. */
3774 desc = record_constant_rtx (mode, x);
3775 desc->next = const_rtx_hash_table[hash];
3776 const_rtx_hash_table[hash] = desc;
3778 /* Align the location counter as required by EXP's data type. */
3779 align = GET_MODE_ALIGNMENT (mode == VOIDmode ? word_mode : mode);
3780 #ifdef CONSTANT_ALIGNMENT
3781 align = CONSTANT_ALIGNMENT (make_tree (type_for_mode (mode, 0), x),
3785 pool_offset += (align / BITS_PER_UNIT) - 1;
3786 pool_offset &= ~ ((align / BITS_PER_UNIT) - 1);
3788 if (GET_CODE (x) == LABEL_REF)
3789 LABEL_PRESERVE_P (XEXP (x, 0)) = 1;
3791 /* Allocate a pool constant descriptor, fill it in, and chain it in. */
3793 pool = (struct pool_constant *) ggc_alloc (sizeof (struct pool_constant));
3797 pool->labelno = const_labelno;
3798 pool->align = align;
3799 pool->offset = pool_offset;
3806 last_pool->next = pool;
3809 pool_offset += GET_MODE_SIZE (mode);
3811 /* Create a string containing the label name, in LABEL. */
3812 ASM_GENERATE_INTERNAL_LABEL (label, "LC", const_labelno);
3816 desc->label = found = ggc_strdup (label);
3818 /* Add label to symbol hash table. */
3819 hash = SYMHASH (found);
3820 pool->label = found;
3821 pool->next_sym = const_rtx_sym_hash_table[hash];
3822 const_rtx_sym_hash_table[hash] = pool;
3825 /* We have a symbol name; construct the SYMBOL_REF and the MEM. */
3827 def = gen_rtx_MEM (mode, gen_rtx_SYMBOL_REF (Pmode, found));
3828 set_mem_attributes (def, type_for_mode (mode, 0), 1);
3829 RTX_UNCHANGING_P (def) = 1;
3831 /* Mark the symbol_ref as belonging to this constants pool. */
3832 CONSTANT_POOL_ADDRESS_P (XEXP (def, 0)) = 1;
3833 current_function_uses_const_pool = 1;
3835 if (GET_CODE (x) == CONST_DOUBLE)
3837 if (CONST_DOUBLE_MEM (x) == cc0_rtx)
3839 CONST_DOUBLE_CHAIN (x) = const_double_chain;
3840 const_double_chain = x;
3842 CONST_DOUBLE_MEM (x) = def;
3848 /* Given a SYMBOL_REF with CONSTANT_POOL_ADDRESS_P true, return a pointer to
3849 the corresponding pool_constant structure. */
3851 static struct pool_constant *
3852 find_pool_constant (f, addr)
3856 struct pool_constant *pool;
3857 const char *label = XSTR (addr, 0);
3859 for (pool = f->varasm->x_const_rtx_sym_hash_table[SYMHASH (label)]; pool;
3860 pool = pool->next_sym)
3861 if (pool->label == label)
3867 /* Given a constant pool SYMBOL_REF, return the corresponding constant. */
3870 get_pool_constant (addr)
3873 return (find_pool_constant (cfun, addr))->constant;
3876 /* Likewise, but for the constant pool of a specific function. */
3879 get_pool_constant_for_function (f, addr)
3883 return (find_pool_constant (f, addr))->constant;
3886 /* Similar, return the mode. */
3889 get_pool_mode (addr)
3892 return (find_pool_constant (cfun, addr))->mode;
3896 get_pool_mode_for_function (f, addr)
3900 return (find_pool_constant (f, addr))->mode;
3903 /* Similar, return the offset in the constant pool. */
3906 get_pool_offset (addr)
3909 return (find_pool_constant (cfun, addr))->offset;
3912 /* Return the size of the constant pool. */
3920 /* Write all the constants in the constant pool. */
3923 output_constant_pool (fnname, fndecl)
3924 const char *fnname ATTRIBUTE_UNUSED;
3925 tree fndecl ATTRIBUTE_UNUSED;
3927 struct pool_constant *pool;
3929 union real_extract u;
3931 /* It is possible for gcc to call force_const_mem and then to later
3932 discard the instructions which refer to the constant. In such a
3933 case we do not need to output the constant. */
3934 mark_constant_pool ();
3936 #ifdef ASM_OUTPUT_POOL_PROLOGUE
3937 ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool_offset);
3940 for (pool = first_pool; pool; pool = pool->next)
3949 /* See if X is a LABEL_REF (or a CONST referring to a LABEL_REF)
3950 whose CODE_LABEL has been deleted. This can occur if a jump table
3951 is eliminated by optimization. If so, write a constant of zero
3952 instead. Note that this can also happen by turning the
3953 CODE_LABEL into a NOTE. */
3954 /* ??? This seems completely and utterly wrong. Certainly it's
3955 not true for NOTE_INSN_DELETED_LABEL, but I disbelieve proper
3956 functioning even with INSN_DELETED_P and friends. */
3959 switch (GET_CODE (x))
3962 if (GET_CODE (XEXP (x, 0)) != PLUS
3963 || GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
3965 tmp = XEXP (XEXP (x, 0), 0);
3970 if (INSN_DELETED_P (tmp)
3971 || (GET_CODE (tmp) == NOTE
3972 && NOTE_LINE_NUMBER (tmp) == NOTE_INSN_DELETED))
3983 /* First switch to correct section. */
3984 #ifdef SELECT_RTX_SECTION
3985 SELECT_RTX_SECTION (pool->mode, x, pool->align);
3987 readonly_data_section ();
3990 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
3991 ASM_OUTPUT_SPECIAL_POOL_ENTRY (asm_out_file, x, pool->mode,
3992 pool->align, pool->labelno, done);
3995 assemble_align (pool->align);
3997 /* Output the label. */
3998 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LC", pool->labelno);
4000 /* Output the value of the constant itself. */
4001 switch (GET_MODE_CLASS (pool->mode))
4004 if (GET_CODE (x) != CONST_DOUBLE)
4007 memcpy ((char *) &u, (char *) &CONST_DOUBLE_LOW (x), sizeof u);
4008 assemble_real (u.d, pool->mode, pool->align);
4012 case MODE_PARTIAL_INT:
4013 assemble_integer (x, GET_MODE_SIZE (pool->mode), pool->align, 1);
4020 #ifdef ASM_OUTPUT_SPECIAL_POOL_ENTRY
4025 #ifdef ASM_OUTPUT_POOL_EPILOGUE
4026 ASM_OUTPUT_POOL_EPILOGUE (asm_out_file, fnname, fndecl, pool_offset);
4029 /* Done with this pool. */
4030 first_pool = last_pool = 0;
4033 /* Look through the instructions for this function, and mark all the
4034 entries in the constant pool which are actually being used.
4035 Emit used deferred strings. */
4038 mark_constant_pool ()
4041 struct pool_constant *pool;
4043 if (first_pool == 0 && htab_elements (const_str_htab) == 0)
4046 for (pool = first_pool; pool; pool = pool->next)
4049 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
4051 mark_constants (PATTERN (insn));
4053 for (insn = current_function_epilogue_delay_list;
4055 insn = XEXP (insn, 1))
4057 mark_constants (PATTERN (insn));
4060 /* Look through appropriate parts of X, marking all entries in the
4061 constant pool which are actually being used. Entries that are only
4062 referenced by other constants are also marked as used. Emit
4063 deferred strings that are used. */
4070 register const char *format_ptr;
4075 if (GET_CODE (x) == SYMBOL_REF)
4077 mark_constant (&x, NULL);
4080 /* Never search inside a CONST_DOUBLE, because CONST_DOUBLE_MEM may be
4081 a MEM, but does not constitute a use of that MEM. */
4082 else if (GET_CODE (x) == CONST_DOUBLE)
4085 /* Insns may appear inside a SEQUENCE. Only check the patterns of
4086 insns, not any notes that may be attached. We don't want to mark
4087 a constant just because it happens to appear in a REG_EQUIV note. */
4090 mark_constants (PATTERN (x));
4094 format_ptr = GET_RTX_FORMAT (GET_CODE (x));
4096 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (x)); i++)
4098 switch (*format_ptr++)
4101 mark_constants (XEXP (x, i));
4105 if (XVEC (x, i) != 0)
4109 for (j = 0; j < XVECLEN (x, i); j++)
4110 mark_constants (XVECEXP (x, i, j));
4129 /* Given a SYMBOL_REF CURRENT_RTX, mark it and all constants it refers
4130 to as used. Emit referenced deferred strings. This function can
4131 be used with for_each_rtx () to mark all SYMBOL_REFs in an rtx. */
4134 mark_constant (current_rtx, data)
4136 void *data ATTRIBUTE_UNUSED;
4138 rtx x = *current_rtx;
4142 else if (GET_CODE(x) == CONST_DOUBLE)
4143 /* Never search inside a CONST_DOUBLE because CONST_DOUBLE_MEM may
4144 be a MEM but does not constitute a use of that MEM. */
4146 else if (GET_CODE (x) == SYMBOL_REF)
4148 if (CONSTANT_POOL_ADDRESS_P (x))
4150 struct pool_constant *pool = find_pool_constant (cfun, x);
4151 if (pool->mark == 0) {
4153 for_each_rtx (&(pool->constant), &mark_constant, NULL);
4158 else if (STRING_POOL_ADDRESS_P (x))
4160 struct deferred_string **defstr;
4162 defstr = (struct deferred_string **)
4163 htab_find_slot_with_hash (const_str_htab, XSTR (x, 0),
4164 STRHASH (XSTR (x, 0)), NO_INSERT);
4167 struct deferred_string *p = *defstr;
4169 STRING_POOL_ADDRESS_P (x) = 0;
4170 output_constant_def_contents (p->exp, 0, p->labelno);
4171 htab_clear_slot (const_str_htab, (void **) defstr);
4178 /* Find all the constants whose addresses are referenced inside of EXP,
4179 and make sure assembler code with a label has been output for each one.
4180 Indicate whether an ADDR_EXPR has been encountered. */
4183 output_addressed_constants (exp)
4188 /* Give the front-end a chance to convert VALUE to something that
4189 looks more like a constant to the back-end. */
4190 if (lang_expand_constant)
4191 exp = (*lang_expand_constant) (exp);
4193 switch (TREE_CODE (exp))
4197 register tree constant = TREE_OPERAND (exp, 0);
4199 while (TREE_CODE (constant) == COMPONENT_REF)
4201 constant = TREE_OPERAND (constant, 0);
4204 if (TREE_CODE_CLASS (TREE_CODE (constant)) == 'c'
4205 || TREE_CODE (constant) == CONSTRUCTOR)
4206 /* No need to do anything here
4207 for addresses of variables or functions. */
4208 output_constant_def (constant, 0);
4215 reloc = output_addressed_constants (TREE_OPERAND (exp, 0));
4216 reloc |= output_addressed_constants (TREE_OPERAND (exp, 1));
4221 case NON_LVALUE_EXPR:
4222 reloc = output_addressed_constants (TREE_OPERAND (exp, 0));
4228 for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
4229 if (TREE_VALUE (link) != 0)
4230 reloc |= output_addressed_constants (TREE_VALUE (link));
4240 /* Return nonzero if VALUE is a valid constant-valued expression
4241 for use in initializing a static variable; one that can be an
4242 element of a "constant" initializer.
4244 Return null_pointer_node if the value is absolute;
4245 if it is relocatable, return the variable that determines the relocation.
4246 We assume that VALUE has been folded as much as possible;
4247 therefore, we do not need to check for such things as
4248 arithmetic-combinations of integers. */
4251 initializer_constant_valid_p (value, endtype)
4255 /* Give the front-end a chance to convert VALUE to something that
4256 looks more like a constant to the back-end. */
4257 if (lang_expand_constant)
4258 value = (*lang_expand_constant) (value);
4260 switch (TREE_CODE (value))
4263 if ((TREE_CODE (TREE_TYPE (value)) == UNION_TYPE
4264 || TREE_CODE (TREE_TYPE (value)) == RECORD_TYPE)
4265 && TREE_CONSTANT (value)
4266 && CONSTRUCTOR_ELTS (value))
4268 initializer_constant_valid_p (TREE_VALUE (CONSTRUCTOR_ELTS (value)),
4271 return TREE_STATIC (value) ? null_pointer_node : 0;
4277 return null_pointer_node;
4281 return staticp (TREE_OPERAND (value, 0)) ? TREE_OPERAND (value, 0) : 0;
4283 case NON_LVALUE_EXPR:
4284 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
4288 /* Allow conversions between pointer types. */
4289 if (POINTER_TYPE_P (TREE_TYPE (value))
4290 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
4291 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
4293 /* Allow conversions between real types. */
4294 if (FLOAT_TYPE_P (TREE_TYPE (value))
4295 && FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
4296 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
4298 /* Allow length-preserving conversions between integer types. */
4299 if (INTEGRAL_TYPE_P (TREE_TYPE (value))
4300 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0)))
4301 && (TYPE_PRECISION (TREE_TYPE (value))
4302 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0)))))
4303 return initializer_constant_valid_p (TREE_OPERAND (value, 0), endtype);
4305 /* Allow conversions between other integer types only if
4307 if (INTEGRAL_TYPE_P (TREE_TYPE (value))
4308 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
4310 tree inner = initializer_constant_valid_p (TREE_OPERAND (value, 0),
4312 if (inner == null_pointer_node)
4313 return null_pointer_node;
4317 /* Allow (int) &foo provided int is as wide as a pointer. */
4318 if (INTEGRAL_TYPE_P (TREE_TYPE (value))
4319 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0)))
4320 && (TYPE_PRECISION (TREE_TYPE (value))
4321 >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0)))))
4322 return initializer_constant_valid_p (TREE_OPERAND (value, 0),
4325 /* Likewise conversions from int to pointers, but also allow
4326 conversions from 0. */
4327 if (POINTER_TYPE_P (TREE_TYPE (value))
4328 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (value, 0))))
4330 if (integer_zerop (TREE_OPERAND (value, 0)))
4331 return null_pointer_node;
4332 else if (TYPE_PRECISION (TREE_TYPE (value))
4333 <= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (value, 0))))
4334 return initializer_constant_valid_p (TREE_OPERAND (value, 0),
4338 /* Allow conversions to union types if the value inside is okay. */
4339 if (TREE_CODE (TREE_TYPE (value)) == UNION_TYPE)
4340 return initializer_constant_valid_p (TREE_OPERAND (value, 0),
4345 if (! INTEGRAL_TYPE_P (endtype)
4346 || TYPE_PRECISION (endtype) >= POINTER_SIZE)
4348 tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
4350 tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
4352 /* If either term is absolute, use the other terms relocation. */
4353 if (valid0 == null_pointer_node)
4355 if (valid1 == null_pointer_node)
4361 if (! INTEGRAL_TYPE_P (endtype)
4362 || TYPE_PRECISION (endtype) >= POINTER_SIZE)
4364 tree valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0),
4366 tree valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1),
4368 /* Win if second argument is absolute. */
4369 if (valid1 == null_pointer_node)
4371 /* Win if both arguments have the same relocation.
4372 Then the value is absolute. */
4373 if (valid0 == valid1 && valid0 != 0)
4374 return null_pointer_node;
4376 /* Since GCC guarantees that string constants are unique in the
4377 generated code, a subtraction between two copies of the same
4378 constant string is absolute. */
4379 if (valid0 && TREE_CODE (valid0) == STRING_CST &&
4380 valid1 && TREE_CODE (valid1) == STRING_CST &&
4381 TREE_STRING_POINTER (valid0) == TREE_STRING_POINTER (valid1))
4382 return null_pointer_node;
4385 /* Support differences between labels. */
4386 if (INTEGRAL_TYPE_P (endtype))
4389 op0 = TREE_OPERAND (value, 0);
4390 op1 = TREE_OPERAND (value, 1);
4394 if (TREE_CODE (op0) == ADDR_EXPR
4395 && TREE_CODE (TREE_OPERAND (op0, 0)) == LABEL_DECL
4396 && TREE_CODE (op1) == ADDR_EXPR
4397 && TREE_CODE (TREE_OPERAND (op1, 0)) == LABEL_DECL)
4398 return null_pointer_node;
4409 /* Output assembler code for constant EXP to FILE, with no label.
4410 This includes the pseudo-op such as ".int" or ".byte", and a newline.
4411 Assumes output_addressed_constants has been done on EXP already.
4413 Generate exactly SIZE bytes of assembler data, padding at the end
4414 with zeros if necessary. SIZE must always be specified.
4416 SIZE is important for structure constructors,
4417 since trailing members may have been omitted from the constructor.
4418 It is also important for initialization of arrays from string constants
4419 since the full length of the string constant might not be wanted.
4420 It is also needed for initialization of unions, where the initializer's
4421 type is just one member, and that may not be as long as the union.
4423 There a case in which we would fail to output exactly SIZE bytes:
4424 for a structure constructor that wants to produce more than SIZE bytes.
4425 But such constructors will never be generated for any possible input.
4427 ALIGN is the alignment of the data in bits. */
4430 output_constant (exp, size, align)
4435 register enum tree_code code = TREE_CODE (TREE_TYPE (exp));
4437 /* Some front-ends use constants other than the standard
4438 language-indepdent varieties, but which may still be output
4439 directly. Give the front-end a chance to convert EXP to a
4440 language-independent representation. */
4441 if (lang_expand_constant)
4443 exp = (*lang_expand_constant) (exp);
4444 code = TREE_CODE (TREE_TYPE (exp));
4447 if (size == 0 || flag_syntax_only)
4450 /* Eliminate the NON_LVALUE_EXPR_EXPR that makes a cast not be an lvalue.
4451 That way we get the constant (we hope) inside it. Also, strip off any
4452 NOP_EXPR that converts between two record, union, array, or set types
4453 or a CONVERT_EXPR that converts to a union TYPE. */
4454 while ((TREE_CODE (exp) == NOP_EXPR
4455 && (TREE_TYPE (exp) == TREE_TYPE (TREE_OPERAND (exp, 0))
4456 || AGGREGATE_TYPE_P (TREE_TYPE (exp))))
4457 || (TREE_CODE (exp) == CONVERT_EXPR
4458 && code == UNION_TYPE)
4459 || TREE_CODE (exp) == NON_LVALUE_EXPR)
4461 exp = TREE_OPERAND (exp, 0);
4462 code = TREE_CODE (TREE_TYPE (exp));
4465 /* Allow a constructor with no elements for any data type.
4466 This means to fill the space with zeros. */
4467 if (TREE_CODE (exp) == CONSTRUCTOR && CONSTRUCTOR_ELTS (exp) == 0)
4469 assemble_zeros (size);
4473 if (TREE_CODE (exp) == FDESC_EXPR)
4475 #ifdef ASM_OUTPUT_FDESC
4476 HOST_WIDE_INT part = tree_low_cst (TREE_OPERAND (exp, 1), 0);
4477 tree decl = TREE_OPERAND (exp, 0);
4478 ASM_OUTPUT_FDESC (asm_out_file, decl, part);
4492 case REFERENCE_TYPE:
4493 /* ??? What about (int)((float)(int)&foo + 4) */
4494 while (TREE_CODE (exp) == NOP_EXPR || TREE_CODE (exp) == CONVERT_EXPR
4495 || TREE_CODE (exp) == NON_LVALUE_EXPR)
4496 exp = TREE_OPERAND (exp, 0);
4498 if (! assemble_integer (expand_expr (exp, NULL_RTX, VOIDmode,
4499 EXPAND_INITIALIZER),
4501 error ("initializer for integer value is too complicated");
4506 if (TREE_CODE (exp) != REAL_CST)
4507 error ("initializer for floating value is not a floating constant");
4509 assemble_real (TREE_REAL_CST (exp),
4510 mode_for_size (size * BITS_PER_UNIT, MODE_FLOAT, 0),
4516 output_constant (TREE_REALPART (exp), size / 2, align);
4517 output_constant (TREE_IMAGPART (exp), size / 2,
4518 min_align (align, BITS_PER_UNIT * (size / 2)));
4519 size -= (size / 2) * 2;
4523 if (TREE_CODE (exp) == CONSTRUCTOR)
4525 output_constructor (exp, size, align);
4528 else if (TREE_CODE (exp) == STRING_CST)
4532 if (size > TREE_STRING_LENGTH (exp))
4534 excess = size - TREE_STRING_LENGTH (exp);
4535 size = TREE_STRING_LENGTH (exp);
4538 assemble_string (TREE_STRING_POINTER (exp), size);
4547 if (TREE_CODE (exp) == CONSTRUCTOR)
4548 output_constructor (exp, size, align);
4554 if (TREE_CODE (exp) == INTEGER_CST)
4555 assemble_integer (expand_expr (exp, NULL_RTX,
4556 VOIDmode, EXPAND_INITIALIZER),
4558 else if (TREE_CODE (exp) == CONSTRUCTOR)
4560 unsigned char *buffer = (unsigned char *) alloca (size);
4561 if (get_set_constructor_bytes (exp, buffer, size))
4563 assemble_string ((char *) buffer, size);
4566 error ("unknown set constructor type");
4574 assemble_zeros (size);
4578 /* Subroutine of output_constructor, used for computing the size of
4579 arrays of unspecified length. VAL must be a CONSTRUCTOR of an array
4580 type with an unspecified upper bound. */
4582 static unsigned HOST_WIDE_INT
4583 array_size_for_constructor (val)
4588 if (TREE_CODE (val) == STRING_CST)
4590 HOST_WIDE_INT len = TREE_STRING_LENGTH(val);
4591 HOST_WIDE_INT esz = int_size_in_bytes (TREE_TYPE (TREE_TYPE (val)));
4592 HOST_WIDE_INT tsz = len * esz;
4595 max_index = NULL_TREE;
4596 for (i = CONSTRUCTOR_ELTS (val); i ; i = TREE_CHAIN (i))
4598 tree index = TREE_PURPOSE (i);
4600 if (TREE_CODE (index) == RANGE_EXPR)
4601 index = TREE_OPERAND (index, 1);
4602 if (max_index == NULL_TREE || tree_int_cst_lt (max_index, index))
4606 if (max_index == NULL_TREE)
4609 /* Compute the total number of array elements. */
4610 i = size_binop (MINUS_EXPR, convert (sizetype, max_index),
4612 TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (val)))));
4613 i = size_binop (PLUS_EXPR, i, convert (sizetype, integer_one_node));
4615 /* Multiply by the array element unit size to find number of bytes. */
4616 i = size_binop (MULT_EXPR, i, TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (val))));
4618 return tree_low_cst (i, 1);
4621 /* Subroutine of output_constant, used for CONSTRUCTORs (aggregate constants).
4622 Generate at least SIZE bytes, padding if necessary. */
4625 output_constructor (exp, size, align)
4630 tree type = TREE_TYPE (exp);
4631 register tree link, field = 0;
4633 /* Number of bytes output or skipped so far.
4634 In other words, current position within the constructor. */
4635 HOST_WIDE_INT total_bytes = 0;
4636 /* Non-zero means BYTE contains part of a byte, to be output. */
4637 int byte_buffer_in_use = 0;
4638 register int byte = 0;
4640 if (HOST_BITS_PER_WIDE_INT < BITS_PER_UNIT)
4643 if (TREE_CODE (type) == RECORD_TYPE)
4644 field = TYPE_FIELDS (type);
4646 if (TREE_CODE (type) == ARRAY_TYPE
4647 && TYPE_DOMAIN (type) != 0)
4648 min_index = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
4650 /* As LINK goes through the elements of the constant,
4651 FIELD goes through the structure fields, if the constant is a structure.
4652 if the constant is a union, then we override this,
4653 by getting the field from the TREE_LIST element.
4654 But the constant could also be an array. Then FIELD is zero.
4656 There is always a maximum of one element in the chain LINK for unions
4657 (even if the initializer in a source program incorrectly contains
4659 for (link = CONSTRUCTOR_ELTS (exp);
4661 link = TREE_CHAIN (link),
4662 field = field ? TREE_CHAIN (field) : 0)
4664 tree val = TREE_VALUE (link);
4667 /* The element in a union constructor specifies the proper field
4669 if ((TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE
4670 || TREE_CODE (type) == QUAL_UNION_TYPE)
4671 && TREE_PURPOSE (link) != 0)
4672 field = TREE_PURPOSE (link);
4674 else if (TREE_CODE (type) == ARRAY_TYPE)
4675 index = TREE_PURPOSE (link);
4677 /* Eliminate the marker that makes a cast not be an lvalue. */
4681 if (index && TREE_CODE (index) == RANGE_EXPR)
4683 unsigned HOST_WIDE_INT fieldsize
4684 = int_size_in_bytes (TREE_TYPE (type));
4685 HOST_WIDE_INT lo_index = tree_low_cst (TREE_OPERAND (index, 0), 0);
4686 HOST_WIDE_INT hi_index = tree_low_cst (TREE_OPERAND (index, 1), 0);
4687 HOST_WIDE_INT index;
4688 unsigned int align2 = min_align (align, fieldsize * BITS_PER_UNIT);
4690 for (index = lo_index; index <= hi_index; index++)
4692 /* Output the element's initial value. */
4694 assemble_zeros (fieldsize);
4696 output_constant (val, fieldsize, align2);
4698 /* Count its size. */
4699 total_bytes += fieldsize;
4702 else if (field == 0 || !DECL_BIT_FIELD (field))
4704 /* An element that is not a bit-field. */
4706 unsigned HOST_WIDE_INT fieldsize;
4707 /* Since this structure is static,
4708 we know the positions are constant. */
4709 HOST_WIDE_INT pos = field ? int_byte_position (field) : 0;
4710 unsigned int align2;
4713 pos = (tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (val)), 1)
4714 * (tree_low_cst (index, 0) - tree_low_cst (min_index, 0)));
4716 /* Output any buffered-up bit-fields preceding this element. */
4717 if (byte_buffer_in_use)
4719 ASM_OUTPUT_BYTE (asm_out_file, byte);
4721 byte_buffer_in_use = 0;
4724 /* Advance to offset of this element.
4725 Note no alignment needed in an array, since that is guaranteed
4726 if each element has the proper size. */
4727 if ((field != 0 || index != 0) && pos != total_bytes)
4729 assemble_zeros (pos - total_bytes);
4733 /* Find the alignment of this element. */
4734 align2 = min_align (align, BITS_PER_UNIT * pos);
4736 /* Determine size this element should occupy. */
4741 /* If this is an array with an unspecified upper bound,
4742 the initializer determines the size. */
4743 /* ??? This ought to only checked if DECL_SIZE_UNIT is NULL,
4744 but we cannot do this until the deprecated support for
4745 initializing zero-length array members is removed. */
4746 if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE
4747 && TYPE_DOMAIN (TREE_TYPE (field))
4748 && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (field))))
4750 fieldsize = array_size_for_constructor (val);
4751 /* Given a non-empty initialization, this field had
4753 if (fieldsize != 0 && TREE_CHAIN (field) != NULL_TREE)
4756 else if (DECL_SIZE_UNIT (field))
4758 /* ??? This can't be right. If the decl size overflows
4759 a host integer we will silently emit no data. */
4760 if (host_integerp (DECL_SIZE_UNIT (field), 1))
4761 fieldsize = tree_low_cst (DECL_SIZE_UNIT (field), 1);
4765 fieldsize = int_size_in_bytes (TREE_TYPE (type));
4767 /* Output the element's initial value. */
4769 assemble_zeros (fieldsize);
4771 output_constant (val, fieldsize, align2);
4773 /* Count its size. */
4774 total_bytes += fieldsize;
4776 else if (val != 0 && TREE_CODE (val) != INTEGER_CST)
4777 error ("invalid initial value for member `%s'",
4778 IDENTIFIER_POINTER (DECL_NAME (field)));
4781 /* Element that is a bit-field. */
4783 HOST_WIDE_INT next_offset = int_bit_position (field);
4784 HOST_WIDE_INT end_offset
4785 = (next_offset + tree_low_cst (DECL_SIZE (field), 1));
4788 val = integer_zero_node;
4790 /* If this field does not start in this (or, next) byte,
4792 if (next_offset / BITS_PER_UNIT != total_bytes)
4794 /* Output remnant of any bit field in previous bytes. */
4795 if (byte_buffer_in_use)
4797 ASM_OUTPUT_BYTE (asm_out_file, byte);
4799 byte_buffer_in_use = 0;
4802 /* If still not at proper byte, advance to there. */
4803 if (next_offset / BITS_PER_UNIT != total_bytes)
4805 assemble_zeros (next_offset / BITS_PER_UNIT - total_bytes);
4806 total_bytes = next_offset / BITS_PER_UNIT;
4810 if (! byte_buffer_in_use)
4813 /* We must split the element into pieces that fall within
4814 separate bytes, and combine each byte with previous or
4815 following bit-fields. */
4817 /* next_offset is the offset n fbits from the beginning of
4818 the structure to the next bit of this element to be processed.
4819 end_offset is the offset of the first bit past the end of
4821 while (next_offset < end_offset)
4825 HOST_WIDE_INT value;
4826 HOST_WIDE_INT next_byte = next_offset / BITS_PER_UNIT;
4827 HOST_WIDE_INT next_bit = next_offset % BITS_PER_UNIT;
4829 /* Advance from byte to byte
4830 within this element when necessary. */
4831 while (next_byte != total_bytes)
4833 ASM_OUTPUT_BYTE (asm_out_file, byte);
4838 /* Number of bits we can process at once
4839 (all part of the same byte). */
4840 this_time = MIN (end_offset - next_offset,
4841 BITS_PER_UNIT - next_bit);
4842 if (BYTES_BIG_ENDIAN)
4844 /* On big-endian machine, take the most significant bits
4845 first (of the bits that are significant)
4846 and put them into bytes from the most significant end. */
4847 shift = end_offset - next_offset - this_time;
4849 /* Don't try to take a bunch of bits that cross
4850 the word boundary in the INTEGER_CST. We can
4851 only select bits from the LOW or HIGH part
4853 if (shift < HOST_BITS_PER_WIDE_INT
4854 && shift + this_time > HOST_BITS_PER_WIDE_INT)
4856 this_time = shift + this_time - HOST_BITS_PER_WIDE_INT;
4857 shift = HOST_BITS_PER_WIDE_INT;
4860 /* Now get the bits from the appropriate constant word. */
4861 if (shift < HOST_BITS_PER_WIDE_INT)
4862 value = TREE_INT_CST_LOW (val);
4863 else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
4865 value = TREE_INT_CST_HIGH (val);
4866 shift -= HOST_BITS_PER_WIDE_INT;
4871 /* Get the result. This works only when:
4872 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
4873 byte |= (((value >> shift)
4874 & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
4875 << (BITS_PER_UNIT - this_time - next_bit));
4879 /* On little-endian machines,
4880 take first the least significant bits of the value
4881 and pack them starting at the least significant
4882 bits of the bytes. */
4883 shift = next_offset - int_bit_position (field);
4885 /* Don't try to take a bunch of bits that cross
4886 the word boundary in the INTEGER_CST. We can
4887 only select bits from the LOW or HIGH part
4889 if (shift < HOST_BITS_PER_WIDE_INT
4890 && shift + this_time > HOST_BITS_PER_WIDE_INT)
4891 this_time = (HOST_BITS_PER_WIDE_INT - shift);
4893 /* Now get the bits from the appropriate constant word. */
4894 if (shift < HOST_BITS_PER_WIDE_INT)
4895 value = TREE_INT_CST_LOW (val);
4896 else if (shift < 2 * HOST_BITS_PER_WIDE_INT)
4898 value = TREE_INT_CST_HIGH (val);
4899 shift -= HOST_BITS_PER_WIDE_INT;
4904 /* Get the result. This works only when:
4905 1 <= this_time <= HOST_BITS_PER_WIDE_INT. */
4906 byte |= (((value >> shift)
4907 & (((HOST_WIDE_INT) 2 << (this_time - 1)) - 1))
4911 next_offset += this_time;
4912 byte_buffer_in_use = 1;
4917 if (byte_buffer_in_use)
4919 ASM_OUTPUT_BYTE (asm_out_file, byte);
4923 if (total_bytes < size)
4924 assemble_zeros (size - total_bytes);
4928 /* This structure contains any weak symbol declarations waiting
4932 struct weak_syms * next;
4937 static struct weak_syms * weak_decls;
4939 /* Add function NAME to the weak symbols list. VALUE is a weak alias
4940 associated with NAME. */
4943 add_weak (name, value)
4947 struct weak_syms *weak;
4949 weak = (struct weak_syms *) xmalloc (sizeof (struct weak_syms));
4954 weak->next = weak_decls;
4956 weak->value = value;
4962 /* Declare DECL to be a weak symbol. */
4968 if (! TREE_PUBLIC (decl))
4969 error_with_decl (decl, "weak declaration of `%s' must be public");
4970 else if (TREE_ASM_WRITTEN (decl))
4971 error_with_decl (decl, "weak declaration of `%s' must precede definition");
4972 else if (SUPPORTS_WEAK)
4973 add_weak (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), NULL);
4975 warning_with_decl (decl, "weak declaration of `%s' not supported");
4977 DECL_WEAK (decl) = 1;
4980 /* Emit any pending weak declarations. */
4987 struct weak_syms *t;
4988 for (t = weak_decls; t; t = t->next)
4990 #ifdef ASM_OUTPUT_WEAK_ALIAS
4991 ASM_OUTPUT_WEAK_ALIAS (asm_out_file, t->name, t->value);
4993 #ifdef ASM_WEAKEN_LABEL
4996 ASM_WEAKEN_LABEL (asm_out_file, t->name);
5003 /* Remove NAME from the pending list of weak symbols. This prevents
5004 the compiler from emitting multiple .weak directives which confuses
5007 remove_from_pending_weak_list (name)
5010 struct weak_syms *t;
5011 struct weak_syms **p;
5013 for (p = &weak_decls; *p; )
5016 if (strcmp (name, t->name) == 0)
5026 /* Emit an assembler directive to make the symbol for DECL an alias to
5027 the symbol for TARGET. */
5030 assemble_alias (decl, target)
5031 tree decl, target ATTRIBUTE_UNUSED;
5035 /* We must force creation of DECL_RTL for debug info generation, even though
5036 we don't use it here. */
5037 make_decl_rtl (decl, NULL);
5039 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
5041 #ifdef ASM_OUTPUT_DEF
5042 /* Make name accessible from other files, if appropriate. */
5044 if (TREE_PUBLIC (decl))
5046 #ifdef ASM_WEAKEN_LABEL
5047 if (DECL_WEAK (decl))
5049 ASM_WEAKEN_LABEL (asm_out_file, name);
5050 /* Remove this function from the pending weak list so that
5051 we do not emit multiple .weak directives for it. */
5052 remove_from_pending_weak_list
5053 (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
5057 ASM_GLOBALIZE_LABEL (asm_out_file, name);
5060 #ifdef ASM_OUTPUT_DEF_FROM_DECLS
5061 ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file, decl, target);
5063 ASM_OUTPUT_DEF (asm_out_file, name, IDENTIFIER_POINTER (target));
5065 TREE_ASM_WRITTEN (decl) = 1;
5067 #ifdef ASM_OUTPUT_WEAK_ALIAS
5068 if (! DECL_WEAK (decl))
5069 warning ("only weak aliases are supported in this configuration");
5071 ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target));
5072 TREE_ASM_WRITTEN (decl) = 1;
5074 warning ("alias definitions not supported in this configuration; ignored");
5079 /* Returns 1 if the target configuration supports defining public symbols
5080 so that one of them will be chosen at link time instead of generating a
5081 multiply-defined symbol error, whether through the use of weak symbols or
5082 a target-specific mechanism for having duplicates discarded. */
5085 supports_one_only ()
5087 if (SUPPORTS_ONE_ONLY)
5089 return SUPPORTS_WEAK;
5092 /* Set up DECL as a public symbol that can be defined in multiple
5093 translation units without generating a linker error. */
5096 make_decl_one_only (decl)
5099 if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL)
5102 TREE_PUBLIC (decl) = 1;
5104 if (TREE_CODE (decl) == VAR_DECL
5105 && (DECL_INITIAL (decl) == 0 || DECL_INITIAL (decl) == error_mark_node))
5106 DECL_COMMON (decl) = 1;
5107 else if (SUPPORTS_ONE_ONLY)
5109 #ifdef MAKE_DECL_ONE_ONLY
5110 MAKE_DECL_ONE_ONLY (decl);
5112 DECL_ONE_ONLY (decl) = 1;
5114 else if (SUPPORTS_WEAK)
5115 DECL_WEAK (decl) = 1;
5123 const_str_htab = htab_create (128, const_str_htab_hash, const_str_htab_eq,
5124 const_str_htab_del);
5125 in_named_htab = htab_create (31, in_named_entry_hash,
5126 in_named_entry_eq, NULL);
5128 ggc_add_root (const_hash_table, MAX_HASH_TABLE, sizeof const_hash_table[0],
5129 mark_const_hash_entry);
5130 ggc_add_root (&const_str_htab, 1, sizeof const_str_htab,
5131 mark_const_str_htab);
5134 /* Select a set of attributes for section NAME based on the properties
5135 of DECL and whether or not RELOC indicates that DECL's initializer
5136 might contain runtime relocations.
5138 We make the section read-only and executable for a function decl,
5139 read-only for a const data decl, and writable for a non-const data decl. */
5142 default_section_type_flags (decl, name, reloc)
5149 if (decl && TREE_CODE (decl) == FUNCTION_DECL)
5150 flags = SECTION_CODE;
5151 else if (decl && DECL_READONLY_SECTION (decl, reloc))
5154 flags = SECTION_WRITE;
5156 if (decl && DECL_ONE_ONLY (decl))
5157 flags |= SECTION_LINKONCE;
5159 if (strcmp (name, ".bss") == 0
5160 || strncmp (name, ".bss.", 5) == 0
5161 || strncmp (name, ".gnu.linkonce.b.", 16) == 0
5162 || strcmp (name, ".sbss") == 0
5163 || strncmp (name, ".sbss.", 6) == 0
5164 || strncmp (name, ".gnu.linkonce.sb.", 17) == 0)
5165 flags |= SECTION_BSS;
5170 /* Output assembly to switch to section NAME with attribute FLAGS.
5171 Four variants for common object file formats. */
5174 default_no_named_section (name, flags)
5175 const char *name ATTRIBUTE_UNUSED;
5176 unsigned int flags ATTRIBUTE_UNUSED;
5178 /* Some object formats don't support named sections at all. The
5179 front-end should already have flagged this as an error. */
5184 default_elf_asm_named_section (name, flags)
5188 char flagchars[10], *f = flagchars;
5191 if (!(flags & SECTION_DEBUG))
5193 if (flags & SECTION_WRITE)
5195 if (flags & SECTION_CODE)
5197 if (flags & SECTION_SMALL)
5199 if (flags & SECTION_MERGE)
5201 if (flags & SECTION_STRINGS)
5205 if (flags & SECTION_BSS)
5210 if (flags & SECTION_ENTSIZE)
5211 fprintf (asm_out_file, "\t.section\t%s,\"%s\",@%s,%d\n",
5212 name, flagchars, type, flags & SECTION_ENTSIZE);
5214 fprintf (asm_out_file, "\t.section\t%s,\"%s\",@%s\n",
5215 name, flagchars, type);
5219 default_coff_asm_named_section (name, flags)
5223 char flagchars[8], *f = flagchars;
5225 if (flags & SECTION_WRITE)
5227 if (flags & SECTION_CODE)
5231 fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars);
5235 default_pe_asm_named_section (name, flags)
5239 default_coff_asm_named_section (name, flags);
5241 if (flags & SECTION_LINKONCE)
5243 /* Functions may have been compiled at various levels of
5244 optimization so we can't use `same_size' here.
5245 Instead, have the linker pick one. */
5246 fprintf (asm_out_file, "\t.linkonce %s\n",
5247 (flags & SECTION_CODE ? "discard" : "same_size"));